https://github.com/emqx/MQTT-Client-Examples/tree/master/mqtt-client-C-paho
下载准备:
mqtt源码:
git clone https://github.com/eclipse/paho.mqtt.c.git
openssl的安装包下载地址:Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions
cmake:未安装自行安装
编译:
源码目录下创建 build文件路径。
cmke里面进行编译
注意:如果需要用到ssl相关,在cmake时必须勾选 "PAHO_WITH_SSL" 项,否则无法生成paho-mqtt3cs、paho-mqtt3as等相关工程
双击 生成的 Eclipse Paho C.sln
编译 release 、x64、MT版本的库文件,每个项目都需要设置
最后右键 ALL_BUILD 项目,点击生成,即可生成对应的库文件。
此时可以在build文件夹下看到src文件夹下Release文件夹,里面有编译后生成的文件:paho-mqtt3a.dll、paho-mqtt3a.lib、paho-mqtt3c.dll、paho-mqtt3c.lib。
paho-mqtt3a : 一般实际开发中就是使用这个,a表示的是异步消息推送(asynchronous)。
paho-mqtt3as : as表示的是 异步+加密(asynchronous+OpenSSL)(本文步骤无法生成)。
paho-mqtt3c : c 表示的应该是同步(Synchronize),一般性能较差,是发送+等待模式。
paho-mqtt3cs : 同上,增加了一个OpenSSL而已
mqtt的使用
#include "stdlib.h"
#include "string.h"
#include "Windows.h"
#include "MQTTClient.h"
#include <iostream>
//配置需根据自己的情况进行设置
#define ADDRESS "ssl:ip:port"
#define USERNAME "usename"
#define PASSWORD "password
#define CLIENTID "clientid"
#define QOS 0
#define TOPIC "topic"
#define TIMEOUT 10000L
#define CLIENTCERT "C:\\.......\\client.crt"
#define PRIVATEKEY "C:\\.......\\client.key"
/*
用于处理接收到的消息的回调函数:这个回调函数在接收到消息时被调用。
它从消息结构体中获取消息内容,并打印出来。然后使用MQTTClient_freeMessage
和MQTTClient_free函数释放相关资源。
*/
int on_message(void* context, char* topicName, int topicLen, MQTTClient_message* message)
{
char* payload = static_cast<char*>(message->payload);
printf("Received `%s` from `%s` topic \n", payload, topicName);
MQTTClient_freeMessage(&message);
MQTTClient_free(topicName);
return 1;
}
int main(int argc, char* argv[])
{
int rc;
MQTTClient client;
MQTTClient_createOptions createOpts = MQTTClient_createOptions_initializer;
int res_mqttclient_create = MQTTClient_create(&client, ADDRESS, CLIENTID, 0, NULL);
std::cout << "res_mqttclient_create = " << res_mqttclient_create << std::endl;
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
conn_opts.username = USERNAME;
conn_opts.password = PASSWORD;
MQTTClient_SSLOptions ssl_opts = MQTTClient_SSLOptions_initializer;
ssl_opts.verify = 0;
ssl_opts.privateKey = PRIVATEKEY;
ssl_opts.keyStore = CLIENTCERT;
ssl_opts.enableServerCertAuth = 0;
conn_opts.ssl = &ssl_opts;
int res_mqttclient_setcallbacks = MQTTClient_setCallbacks(client, NULL, NULL, on_message, NULL);//使用MQTTClient_setCallbacks函数设置回调函数,
//包括接收消息的回调函数on_message。
std::cout << "res_mqttclient_setcallbacks = " << res_mqttclient_setcallbacks << std::endl;
if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
{
printf("Failed to connect, return code %d\n", rc);
exit(-1);
}
else
{
printf("Connected to MQTT Broker!\n");
}
// subscribe topic
MQTTClient_subscribe(client, TOPIC, QOS);//订阅指定的主题,使用MQTTClient_subscribe函数进行订阅。
// 暂停程序,等待接收消息
getchar();
MQTTClient_disconnect(client, TIMEOUT);
MQTTClient_destroy(&client);
return rc;
}