前言全局说明
MFC制作MQTT客户端(附源码)
一、说明
环境:
Windows 7 旗舰版
Visual Studio 2013
CMake version 3.19.8
paho.mqtt.c V1.3.13
二、说明、约定:
说明:
因为 MFC 调用 paho.mqtt.c 的 API 所以,要把编译出来的相关文件,放到MFC的工程中,方便调用
约定:
为了方便后续描述,和读者理解,这里将路径特别说明一下:
MQTT 编译的API 路径
D:\smart-homes\paho.mqtt.c
MQTT 编译的 API 生成的 h 头文件路径
D:\smart-homes\paho.mqtt.c\src
MQTT 编译的 API 生成的 lib 、dll 路径
D:\smart-homes\paho.mqtt.c\src\Debug
sln 项目入口文件目录:
D:\vstudio 2013\MFC_MQTT_Client\MFC_MQTT_Client.sln
cpp 和 h 文件目录:
D:\vstudio 2013\MFC_MQTT_Client\mfc_mqtt-client-power-on-off
编译后 Debug 版 exe 文件目录:
D:\vstudio 2013\MFC_MQTT_Client\mfc_mqtt-client-power-on-off\Debug
三、添加依赖到MFC工程中:
3.1 添加 .h 头文件
将 paho.mqtt.c\src 下的 .h 头文件,复制到 MFC 项目的 include (D:\vstudio 2013\MFC_MQTT_Client\mfc_mqtt-client-power-on-off\include)
include 文件夹,需要手动新建
3.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 文件
3.3 项目里 lib 添加
将 lib 添加到配置的附加依赖项里,编译链接时候就能找到要用哪个文件
3.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