MFC制作MQTT(EMQX)客户端 - paho.mqtt.c 依赖编译、设置、文件放置(附源码)
前言全局说明
MFC制作MQTT客户端(附源码)
一、说明
环境:
Windows 7 旗舰版
Visual Studio 2013
CMake version 3.19.8
paho.mqtt.c V1.3.13
二、编译依赖说明
MFC 只是个图形框架,就是用来画界面的GUI,需要调用 paho.mqtt.c 提供的API,来完成相关命令。
paho.mqtt.c 是 C 语言写的,MCF要调用,必须要在相同环境下编译才行。
但是 paho.mqtt.c 并没有直接在仓库里,直接提供 Visual Studio 工程解决方案 sln 等文件。
所以,要使用 CMake 读取配置文件 CMakeLists.txt 来生成,VS 工程 sln 等文件。
有了工程,就可以在 VS 里,直接打开并编译 paho.mqtt.c 相关API接口,从而可以被 MFC 程序调用。
三、编译依赖文件
3.1 CMake 生成 Visual Studio 解决方案项目工程
https://www.cnblogs.com/wutou/p/18323170
3.2 编译依赖的静态文件 lib
https://www.cnblogs.com/wutou/p/18320684
实际上就是要编译,图片红框中的两个项目:

四、添加依赖到MFC工程中:
4.1 添加 .h 头文件
将 paho.mqtt.c\src 下的 .h 头文件,复制到 MFC 项目的 include (D:\vstudio 2013\MFC_MQTT_Client\mfc_mqtt-client-power-on-off\include)
include 文件夹,需要手动新建

4.2 添加 lib 静态链接库
将 paho.mqtt.c\src\Debug 下的 lib 静态库文件,复制到 D:\vstudio 2013\MFC_MQTT_Client\mfc_mqtt-client-power-on-off 和 .cpp 同级目录

注意:如果不要求 lib 在其他目录,则可以不用设置路径,VS会优先查找项目下和cpp同目录是否有 lib 文件
自定义 dll 存放路径:https://www.cnblogs.com/wutou/p/18367404
4.3 项目里 lib 添加
以下方法,二选一
4.3.1 方法一: 在代码里引入 lib 文件:
#pragma comment(lib,"paho-mqtt3c.lib")
#pragma comment(lib,"paho-mqtt3a.lib")

链接器里要指定 lib 文件所在路径,如果是在源码路径,就不用指定了。
这里的 lib 文件夹 和 cpp 是同级目录

4.3.2 方法二:在设置里添加 lib 文件:
将 lib 添加到配置里链接器的附加依赖项里,编译链接时候就能知到要用哪个文件


4.4 添加 dll 运行依赖库
将 paho.mqtt.c\src\Debug 下的 dll 动态库文件,复制到 D:\vstudio 2013\MFC_MQTT_Client\Debug 目录下

需要的依赖库就放置完成,下面就开始写 MFC 功能代码。
五、官方C代码示例:
https://docs.emqx.com/zh/emqx/v5.0/connect-emqx/c.html
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "MQTTClient.h"
#define ADDRESS "tcp://broker.emqx.io:1883"
#define CLIENTID "emqx_test"
#define TOPIC "testtopic/1"
#define PAYLOAD "Hello World!"
#define QOS 1
#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);
// MQTT 连接参数
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(-1);
}
// 发布消息
pubmsg.payload = 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;
}
免责声明:本号所涉及内容仅供安全研究与教学使用,如出现其他风险,后果自负。
参考、来源:
https://hellobug.blog.csdn.net/article/details/108272834
https://blog.csdn.net/chenmoderen604/article/details/128199906 (4.3 项目里 lib 添加)
浙公网安备 33010602011771号