Qt + mqtt对接阿里云平台(二)

一、MQTT协议

1、MQTT相关概念

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上。

在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

订阅(Subscription)

订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。

会话(Session)

每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可

主题名(Topic Name)

连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。

主题筛选器(Topic Filter)

一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。

负载(Payload)

消息订阅者所具体接收的内容。

二、CONNECT协议格式

格式:固定包头+可变包头+有效载体

1、固定包头

长度:2~5bytes

包括报文类型(1),固定保留位(0)和剩余长度。

Bit76543210
Byte 1                    报文类型                         保留位
00010000
Byte 2...                                                       剩余长度值

剩余长度等于可变报头的长度(10字节)加上有效载荷的长度。

剩余长度

bit7bit6bit5bit4bit3bit2bit1bit0
进位标志位                                                   数据位

2、可变抱头

描述76543210
协议名
Byte 1Length MsB (0)00000000
Byte 2Length LsB(4)00000100
Byte 3'M'01001101
Byte 4'Q'01010001
Byte 5'T'01010100
Byte 6'T'01010100
协议级别
Byte 7Level (4)级别00000100
连接标志 Connect Flags
Byte 8User Name Flag(1)用户名标志
Password Flag(1)密码标志
Wil Retain (0)Wi 保留标志
Will Qos (01)Wi 服务质量
保持连接时间
Wil Flag(1)Wi 标志
Clean Session(1)清理会话
Reserved(0)保留位
11001110
保持连接时间
Byte 9保持连接 MSB(0)00000000
Byte 10保持连接 LSB(10)00001010

长度:10bytes

Byte8 连接标志(Connect Flags)

连接标志字节包含一些用于指定MQTT连接行为的参数。它还指出有效载荷中的字段是否存在。

Byte9 Byte10 保持连接

长度:2bytes

保持连接(KeepAlive)是一个以秒为单位的时间间隔,表示为一个16位的字,它是指在客户端传输完成一个控制报文的时刻到发送下一个报文的时刻,两者之间允许空闲的最大时间间隔。如果在设置的时间的1.5倍内没有发送报文,则自动断开连接。
0x00 0x64表示100s。

3、有效载体

有效载体可以分为:ClientID+Username+Password
每个部分前面有2个字节是该部分的长度。表示16位的长度

2Byte(ClientID长度) + ClientID + 2Byte(Username长度) + Username + 2Byte(Password长度) + Password

三、QMqtt编译集成

1、源码下载

地址:点击跳转

2、打开工程qmqtt.pro进行编译

若报一下错误,则将client.pro里面的 qmqtt 注释掉

:-1: error: Project ERROR: Unknown module(s) in QT: qmqtt

3、集成QMqtt库

首先,新建一个项目工程,并在.pro文件添加如下信息:

QT       += network
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -lQt5Qmqtt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -lQt5Qmqtt
else:unix: LIBS += -L$$PWD/lib/ -lQt5Qmqtt

INCLUDEPATH += $$PWD/mqtt
DEPENDPATH += $$PWD/.

然后,将编译生成的lib以及源码src下的mqtt整个文件夹拷贝到当前工程目录下。

最后,在自己的源码添加以下头文件就可以使用qmqtt库的接口了。

#include "mqtt/qmqtt.h"

qmqtt对接阿里云例程:点击跳转

参考博客:ESP32/ESP8266 MQTT协议接入阿里云(二)_esp8266上传数据到阿里云的数据格式-CSDN博客

彻底搞懂Qt-MQTT开发_qt mqtt-CSDN博客

觉得有帮助的话,打赏一下呗。。

           

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,你需要在阿里云物联网平台上创建设备和产品,并获取设备的三元组(ProductKey、DeviceName、DeviceSecret)。 然后,你需要在QT中使用MQTT协议对接阿里云物联网平台。可以使用QT提供的QtMqtt模块,该模块提供了MQTT客户端实现,支持TLS加密连接和QoS级别2的消息传递。 以下是使用QtMqtt模块对接阿里云物联网平台的基本步骤: 1. 在QT项目中添加QtMqtt模块。在.pro文件中添加如下代码: QT += mqtt 2. 创建MQTT客户端并连接到阿里云物联网平台。示例代码如下: QtMqtt::Client *client = new QtMqtt::Client(this); client->setHostname("<your-product-key>.iot-as-mqtt.cn-shanghai.aliyuncs.com"); client->setPort(1883); client->setUsername("<your-device-name>&<your-product-key>"); client->setPassword("<your-device-secret>"); client->connectToHost(); // 等待连接成功 if (!client->waitForConnected()) { qDebug() << "Failed to connect to MQTT broker!"; return; } 3. 发布消息到阿里云物联网平台。示例代码如下: QMqttTopicName topicName("<your-product-key>/<your-device-name>/update"); QtMqtt::Message message("Hello World!"); client->publish(topicName, message); 4. 订阅阿里云物联网平台的消息。示例代码如下: QMqttTopicFilter topicFilter("<your-product-key>/<your-device-name>/get"); client->subscribe(topicFilter); connect(client, &QtMqtt::Client::messageReceived, this, [=](const QByteArray &message, const QMqttTopicName &topic) { qDebug() << "Received message:" << message << "on topic:" << topic.name(); }); 以上示例代码仅供参考,实际使用时需要根据阿里云物联网平台的要求进行相应的配置和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值