本文演示C语言如何使用eclipse-paho.mqtt.c库,包含自行编译库的步骤或者下载编译好的文件。
1. 下载paho.mqtt.c库源码( zip 文件)
到官网选择C版本的paho源码进行下载
Eclipse Paho | The Eclipse Foundation
或者到下述连接下载
Releases · eclipse/paho.mqtt.c · GitHub
2. 编译 paho.mqtt.c 库(下述步骤不支持生成 SSL 的文件)
2.1. windows 下编译所需环境
a. cmake(可参考文章【windows下cmake的小白级入门使用教程(hello world)】(windows下cmake的小白级入门使用教程(hello world)_cmake windows_西晋的no1的博客-CSDN博客 )
b. vistual studio(如下图是vs2022必须的组件,cmake支持哪个版本的vs,可参照文章【查看当前cmake版本支持哪些版本的Visual Studio】( 查看当前cmake版本支持哪些版本的Visual Studio-CSDN博客 )进行确定)
2.2. 编译过程
a.如果是下载的 zip 文件,先解压代码,进入代码文件夹 paho.mqtt.c-1.3.9,在当前文件夹的地址栏中输入cmd,然后回车,调出命令行窗口。
b.在命令行窗口中依次输入下述3行内容:
m d build
cd build
cmake -G " Visual Studio 1 7" ..
注:需要根据电脑上安装的cmake和vs版本进行填写,如有些低版本的cmake不支持Visual Studio 2022(升级cmake版本),有的电脑上没有安装Visual Studio 2022(安装Visual Studio 2022,或者选择电脑上有的版本)
vs版本对应
|--------------------------------|-----------------------------------------------------------|
| Visual Studio 17 2022 | = Generates Visual Studio 2022 project files. |
| | Use -A option to specify architecture. |
| Visual Studio 16 2019 | = Generates Visual Studio 2019 project files. |
| | Use -A option to specify architecture. |
| Visual Studio 15 2017 [arch] | = Generates Visual Studio 2017 project files. |
| | Optional [arch] can be "Win64" or "ARM". |
| Visual Studio 14 2015 [arch] | = Generates Visual Studio 2015 project files. |
| | Optional [arch] can be "Win64" or "ARM". |
| Visual Studio 12 2013 [arch] | = Generates Visual Studio 2013 project files. |
| | Optional [arch] can be "Win64" or "ARM". |
| Visual Studio 11 2012 [arch] | = Generates Visual Studio 2012 project files. |
| | Optional [arch] can be "Win64" or "ARM". |
| Visual Studio 10 2010 [arch] | = Deprecated. Generates Visual Studio 2010 project files. |
| | Optional [arch] can be "Win64" or "IA64". |
| Visual Studio 9 2008 [arch] | = Generates Visual Studio 2008 project files. |
| | Optional [arch] can be "Win64" or "IA64". |
编译成功之后,在build文件夹下会生成Eclipse Paho C.sln
c.用Visual Studio2022打开build文件夹下的Eclipse Paho C.sln
d.根据实际使用场景选择合适的版本(Debug或Release),然后选择生成->重新生成解决方案,等待一段时间,可以看到0失败
e.此时可以在build文件夹下看到src文件夹下有个Debug或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而已(本文步骤无法生成)。
3. 使用示例
3.1 新建 C 语言工程
具体操作过程可以参考文件【VS2022 和 VS2010 C语言控制台输出 Hello World】(https://blog.csdn.net/xijinno1/article/details/127826231)
3.2 在 demo.cpp 文件的同文件夹下新建一个文件夹,命名为【 pahoC 】
3.3 将源代码 src 文件夹下所有 .h 的文件 和 build\src\Debug ( 或Release ) 文件夹下的 4 个文件( p aho-mqtt3a.dll、paho-mqtt3a. lib 、paho-mqtt3c.dll、paho-mqtt3c. lib )粘贴到 p aho C 文件夹下
注意:后续3步的操作,一定要在与编译pahoC的配置一样,否则程序将不可使用paho-mqtt3a.lib、paho-mqtt3c.lib。
3.4 在 demo 工程属性中添加包含目录
$(LocalDebuggerWorkingDirectory)pahoC
3.5 在 demo 工程属性中添加附加库目录
$(LocalDebuggerWorkingDirectory)pahoC
3.6 在 demo 工程属性中添加附加依赖项
paho-mqtt3a.lib、paho-mqtt3c.lib
3.7 将下述示例代码覆盖 demo.cpp 中的所有内容
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#define ADDRESS "tcp://localhost:1883"
#define CLIENTID "ExampleClientPub"
#define TOPIC "MQTT Examples"
#define PAYLOAD "Hello World!"
#define QOS 111
#define TIMEOUT 10000L
int main(int argc, char* argv[]) {
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);
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS) {
printf("Failed to connect, return code %d\n", rc);
exit(EXIT_FAILURE);
}
pubmsg.payload = (void*)PAYLOAD;
pubmsg.payloadlen = strlen(PAYLOAD);
pubmsg.qos = QOS;
pubmsg.retained = 0;
MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);
printf("Waiting for up to %d seconds for publication of %s\n"
"on topic %s for client with ClientID: %s\n",
(int)(TIMEOUT / 1000), PAYLOAD, TOPIC, CLIENTID);
rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
printf("Message with delivery token %d delivered\n", token);
MQTTClient_disconnect(client, 10000);
MQTTClient_destroy(&client);
return rc;
}
3.8 运行测试程序
程序正常运行,将有如下输出,是正常现象:
运行程序过程中可能出现下面的报错,只需要将编译生成的paho-mqtt3a.dll、paho-mqtt3c.dll放于测试程序生成的exe所在的文件夹下即可。