参考
创建个目录
mkdir mqtt_demo
cd mqtt_demo
把source code拉下来
git clone /eclipse/paho.mqtt.c.git
导出交叉编译工具链
export PATH=/home/xxx/tools/gcc-linaro-6.3.1-.05-x86_64_arm-linux-gnueabihf/bin:$PATH
设定cmake参数
cmake -DPAHO_WITH_SSL=TRUE -DPAHO_BUILD_SAMPLES=TRUE -DOPENSSL_SEARCH_PATH=/home/xxx/openssl/lib-DOPENSSL_INCLUDE_DIR=/home/xxx/openssl/include -DCMAKE_TOOLCHAIN_FILE=/home/xxx/mqtt_demo/paho.mqtt.c/cmake/toolchain.linux-arm11.cmake ./paho.mqtt.c
编译
make
生成的lib在 ./src
基于paho.mqtt.c/src/samples/MQTTClient_publish.c,修改了一些代码,使得其支持ssl访问mqtt服务器(此demo无需证书认证)
/*******************************************************************************
* Copyright (c) , IBM Corp.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* /legal/epl-v10.html
* and the Eclipse Distribution License is available at
* /org/documents/edl-v10.php.
*
* Contributors:
* Ian Craggs - initial contribution
*******************************************************************************/
#include
#include
#include
#include "MQTTClient.h"
#define ADDRESS "ssl://localhost:1883"
#define CLIENTID "ExampleClientPub"
#define TOPIC "MQTT Examples"
#define PAYLOAD "Hello World!"
#define USERNAME "you_name"
#define PASSWORD "you_password"
#define QOS 1
#define TIMEOUT 10000L
int main(int argc, char* argv[])
{
MQTTClient_SSLOptions ssl = MQTTClient_SSLOptions_initializer;
ssl.enableServerCertAuth = 0; //disable certificate
ssl.sslVersion = MQTT_SSL_VERSION_TLS_1_0;
MQTTClient client;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
MQTTClient_message pubmsg = MQTTClient_message_initializer;
MQTTClient_deliveryToken token;
int rc;
MQTTClient_create(&client, ADDRESS, CLIENTID,
MQTTCLIENT_PERSISTENCE_NONE, NULL);
if(!client)
{
printf("MQTTClient_create == NULLn");
exit(EXIT_FAILURE);
}
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
conn_opts.username = USERNAME;
conn_opts.password = PASSWORD;
conn_opts.ssl = &ssl;
if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
{
printf("Failed to connect, return code %dn", rc);
exit(EXIT_FAILURE);
}
pubmsg.payload = PAYLOAD;
pubmsg.payloadlen = (int)strlen(PAYLOAD);
pubmsg.qos = QOS;
pubmsg.retained = 0;
MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);
printf("Waiting for up to %d seconds for publication of %sn"
"on topic %s for client with ClientID: %sn",
(int)(TIMEOUT/1000), PAYLOAD, TOPIC, CLIENTID);
rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
printf("Message with delivery token %d deliveredn", token);
MQTTClient_disconnect(client, 10000);
MQTTClient_destroy(&client);
return rc;
}
修改paho.mqtt.c/src/samples/CMakeLists.txt,让MQTTClient_publish.c去链接libpaho-mqtt3cs.so这个库,这些库的区别如下:
libpaho-mqtt3a.so - asynchronous
libpaho-mqtt3as.so - asynchronous with SSL
libpaho-mqtt3c.so - "classic" / synchronous
libpaho-mqtt3cs.so - "classic" / synchronous with SSL
编译
make -f src/samples/Makefile
bin文件生成在./src/samples/,可以拿到板子运行
注:代码里的这些定义是根据你具体的项目来配的,这里仅供demo
ADDRESS
CLIENTID
TOPIC
PAYLOAD
USERNAME
PASSWORD