关于MQTT服务,EMQX给出了一套完整的解决方法,包括:消息转发规则、设备鉴权、设备上下线状态管理等,见EMQX Cloud 文档中心(https://docs.emqx.com/zh/cloud/latest/),可以参考。
一、vs2019用QT调用paho.mqtt.c库的异步收发示例
#include <QDebug>
#include <QThread>
#include "MQTTAsync.h"
#pragma comment(lib, "paho-mqtt3a.lib")
#pragma comment(lib, "paho-mqtt3a-static.lib")
#define ADDRESS "tcp://broker.emqx.io:1883"
#define CLIENTID "mqtt_42aa9e50"
#define TOPIC_SUBSCRIBE "1/1"//订阅主题
#define TOPIC_PUBLISH "2/vs"//发送主题
#define PAYLOAD "Hello World!"
#define QOS 1
#define TIMEOUT 10000L
volatile int finished = 0;
char* topicName = NULL;
void onDisconnect(void* context, MQTTAsync_successData* response)
{
qDebug() << "Successful disconnection";
finished = 1;
}
void onSend(void* context, MQTTAsync_successData* response)
{
qDebug() << QString("Message with token value %1 delivery confirmed").arg(response->token);
}
int messageArrived(void* context, char* topicName, int topicLen, MQTTAsync_message* message)
{
qDebug() << "Message arrived";
qDebug() << QString(" topic: %1").arg(topicName);
qDebug() << QString(" message(%1): %2").arg(message->payloadlen).arg((char*)message->payload);
MQTTAsync_freeMessage(&message);
MQTTAsync_free(topicName);
return 1;
}
void onSubscribe(void* context, MQTTAsync_successData* response)
{
qDebug() << "Subscribe succeeded";
}
void onSubscribeFailure(void* context, MQTTAsync_failureData* response)
{
qDebug() << "Subscribe failed, rc " << (response ? response->code : 0);
finished = 1;
}
void onConnectFailure(void* context, MQTTAsync_failureData* response)
{
qDebug() << "Connect failed, rc " << (response ? response->code : 0);
finished = 1;
}
void onConnect(void* context, MQTTAsync_successData* response)
{
MQTTAsync client = (MQTTAsync)context;
MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
int rc;
qDebug() << "Successful connection";
// 订阅主题
opts.onSuccess = onSubscribe;
opts.onFailure = onSubscribeFailure;
opts.context = client;
if ((rc = MQTTAsync_subscribe(client, TOPIC_SUBSCRIBE, QOS, &opts)) != MQTTASYNC_SUCCESS)
{
qDebug() << "Failed to start subscribe, return code " << rc;
}
}
int main(int argc, char* argv[])
{
MQTTAsync client;
MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
int rc;
if ((rc = MQTTAsync_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL))
!= MQTTASYNC_SUCCESS)
{
qDebug() << QString("Failed to create client, return code %1").arg(rc);
}
// 设置回调函数
rc = MQTTAsync_setCallbacks(client, client, NULL, messageArrived, NULL);
if (rc != MQTTASYNC_SUCCESS)
{
qDebug() << QString("Failed to set callbacks, return code %1").arg(rc);
}
conn_opts.keepAliveInterval = 60;
conn_opts.cleansession = 1;
conn_opts.onSuccess = onConnect;
conn_opts.onFailure = onConnectFailure;
conn_opts.context = client;
if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS)
{
qDebug() << "Failed to start connect, return code " << rc;
}
while (!finished)
{
// 发布消息
pubmsg.payload = (void*)PAYLOAD;
pubmsg.payloadlen = strlen(PAYLOAD);
pubmsg.qos = QOS;
pubmsg.retained = 0;
opts.onSuccess = onSend;
opts.onFailure = NULL;
opts.context = client;
if ((rc = MQTTAsync_sendMessage(client, TOPIC_PUBLISH, &pubmsg, &opts)) != MQTTASYNC_SUCCESS)
{
qDebug() << "Failed to start sendMessage, return code " << rc;
}
qDebug() << QString("Waiting for publication of %1 on topic %2 for client with ClientID: %3").arg(PAYLOAD).arg(TOPIC_PUBLISH).arg(CLIENTID);
QThread::sleep(10);// 每隔10秒发送一次消息
}
MQTTAsync_destroy(&client);
return rc;
}
二、paho.mqtt.c部分方法说明
1. 同步 API (MQTTClient) 方法
客户端创建与销毁
- MQTTClient_create()
- 功能:创建 MQTT 客户端实例
- 参数:服务器地址、客户端 ID、持久化选项等
- 说明:初始化客户端句柄,用于后续操作
- MQTTClient_destroy()
- 功能:销毁客户端实例
- 参数:客户端指针
- 说明:释放客户端相关资源
连接管理
- MQTTClient_connect()
- 功能:建立与 MQTT 代理的连接
- 参数:客户端实例、连接选项
- 说明:支持用户名密码认证,返回连接状态码
- MQTTClient_disconnect()
- 功能:断开与 MQTT 代理的连接
- 参数:客户端实例、超时时间
- 说明:优雅关闭连接
消息发布
- MQTTClient_publish()
- 功能:发布消息到指定主题
- 参数:客户端实例、主题名、消息内容、QoS 级别、保留标志
- 说明:支持 QoS 0/1/2 三种服务质量等级
消息订阅
- MQTTClient_subscribe()
- 功能:订阅指定主题
- 参数:客户端实例、主题名、QoS 级别
- 说明:设置消息到达时的回调函数
- MQTTClient_unsubscribe()
- 功能:取消订阅主题
- 参数:客户端实例、主题名
- 说明:停止接收指定主题的消息
2. 异步 API (MQTTAsync) 方法
客户端创建与销毁
- MQTTAsync_create()
- 功能:创建异步客户端实例
- 参数:客户端指针、服务器地址、客户端 ID、持久化选项等
- 说明:与同步 API 类似,但支持回调机制
- MQTTAsync_destroy()
- 功能:销毁异步客户端实例
- 参数:客户端指针
- 说明:释放相关资源
连接管理
- MQTTAsync_connect()
- 功能:异步建立连接
- 参数:客户端实例、连接选项
- 说明:连接成功或失败时通过回调通知
- MQTTAsync_disconnect()
- 功能:异步断开连接
- 参数:客户端实例、超时时间
- 说明:异步关闭连接
消息发布
- MQTTAsync_send()
- 功能:异步发送消息
- 参数:客户端实例、主题名、消息内容、发送选项
- 说明:发送后通过回调确认
- MQTTAsync_sendMessage()
- 功能:发送消息并设置回调
- 参数:客户端实例、主题名、消息结构体、发送选项
- 说明:支持更详细的发送控制
消息订阅
- MQTTAsync_subscribe()
- 功能:异步订阅主题
- 参数:客户端实例、主题名、QoS 级别、订阅选项
- 说明:通过回调处理收到的消息
- MQTTAsync_unsubscribe()
- 功能:异步取消订阅
- 参数:客户端实例、主题名、取消订阅选项
- 说明:异步取消订阅主题
3. 嵌入式 C API (MQTTClient-C) 方法
网络连接
- NetworkInit()
- 功能:初始化网络连接
- 参数:网络对象指针
- 说明:为后续网络通信做准备
- NetworkConnect()
- 功能:建立网络连接
- 参数:网络对象、服务器地址、端口号
- 说明:连接到 MQTT 服务器
客户端初始化
- MQTTClientInit()
- 功能:初始化 MQTT 客户端
- 参数:客户端对象、网络对象、超时时间、发送/接收缓冲区
- 说明:设置客户端的基本参数
连接与订阅
- MQTTConnect()
- 功能:建立 MQTT 连接
- 参数:客户端实例、连接参数
- 说明:使用指定参数连接到 MQTT 服务器
- MQTTSubscribe()
- 功能:订阅主题
- 参数:客户端实例、主题名、QoS 级别、消息回调函数
- 说明:订阅指定主题并设置消息处理函数
消息处理
- MQTTYield()
- 功能:处理网络消息
- 参数:客户端实例、超时时间
- 说明:处理接收的消息和发送确认
4. 通用配置与控制方法
回调设置
- MQTTClient_setCallbacks()
- 功能:设置客户端回调函数
- 参数:客户端实例、上下文、连接丢失回调、消息到达回调、消息发送完成回调
- 说明:配置事件处理函数
- MQTTAsync_setCallbacks()
- 功能:设置异步客户端回调函数
- 参数:客户端实例、上下文、连接丢失回调、消息到达回调、消息发送完成回调
- 说明:配置异步事件处理函数
重连设置
- MQTTClient_setReconnectInterval()
- 功能:设置重连间隔
- 参数:客户端实例、重连间隔时间
- 说明:配置断线重连的时间间隔
连接选项配置
- MQTTClient_connectOptions_initializer
- 功能:初始化连接选项结构体
- 说明:用于配置连接参数
- MQTTAsync_responseOptions_initializer
- 功能:初始化异步响应选项结构体
- 说明:用于异步操作的配置
5. 消息结构体定义
消息对象
- MQTTClient_message
- 功能:定义消息结构体
- 成员:负载内容、负载长度、QoS 级别、保留标志等
- MQTTAsync_message
- 功能:定义异步消息结构体
- 成员:负载内容、负载长度、QoS 级别、保留标志等
连接参数
- MQTTPacket_connectData
- 功能:定义连接数据结构体
- 成员:客户端 ID、心跳间隔、清除会话标志等

1752

被折叠的 条评论
为什么被折叠?



