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)和剩余长度。

|-----------|---|---|---|---|---|---|---|---|
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Byte 1 | 报文类型 |||| 保留位 ||||
| | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
| Byte 2... | 剩余长度值 ||||||||

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

剩余长度

|-------|------|------|------|------|------|------|------|
| bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
| 进位标志位 | 数据位 |||||||

2、可变抱头

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

长度: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博客

相关推荐
三坛海会大神5551 小时前
计算机网络参考模型与子网划分
网络·计算机网络
云卓SKYDROID2 小时前
无人机激光测距技术应用与挑战
网络·无人机·吊舱·高科技·云卓科技
MX_93593 小时前
阿里云参数配置化
阿里云·云计算
AKAMAI3 小时前
通过自动化本地计算磁盘与块存储卷加密保护数据安全
人工智能·云计算
iナナ7 小时前
传输层协议——UDP和TCP
网络·网络协议·tcp/ip·udp
华强笔记9 小时前
Linux内存管理系统性总结
linux·运维·网络
iY_n11 小时前
Linux网络基础
linux·网络·arm开发
EggrollOrz11 小时前
网络编程day3
网络
想睡hhh12 小时前
网络基础——Socket编程预备
网络
zzc92112 小时前
Wireshark获取数据传输的码元速率
网络·测试工具·wifi·wireshark·路由器·802.11n·物理层参数