一、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博客