vs2019创建QT工程调用paho.mqtt.c库的异步收发示例及部分库方法说明

关于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、心跳间隔、清除会话标志等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值