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

实际上就是要编译,图片红框中的两个项目:
image


四、添加依赖到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 文件夹,需要手动新建

image


4.2 添加 lib 静态链接库

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

注意:如果不要求 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")

image

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

4.3.2 方法二:在设置里添加 lib 文件:

将 lib 添加到配置里链接器的附加依赖项里,编译链接时候就能知到要用哪个文件
image

image

4.4 添加 dll 运行依赖库

将 paho.mqtt.c\src\Debug 下的 dll 动态库文件,复制到 D:\vstudio 2013\MFC_MQTT_Client\Debug 目录下
image

需要的依赖库就放置完成,下面就开始写 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 添加)



posted @   悟透  阅读(196)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
历史上的今天:
2023-07-25 lftp命令参数详解
2023-07-25 python flask 后台运行 关闭终端不退出
2021-07-25 git本地仓库提交到远程
点击右上角即可分享
微信分享提示