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 添加)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
2023-07-25 lftp命令参数详解
2023-07-25 python flask 后台运行 关闭终端不退出
2021-07-25 git本地仓库提交到远程