基于STM32F746的MQTT实现
一.简述
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。标准MQTT协议包括连接,连接确认,发布消息,发布确认,发布收到,发布释放,发布完成,订阅主题,订阅确认,取消订阅,取消确认,心跳请求,心跳响应,断开连接。标准MQTT协议基于TCP的socket连接。
二.具体实现
1.报文帧格式
包括: 固定报头 + 可变报头 +有效载荷
固定报头:
可变报头:
包括:
协议名(00 04 ‘M’ ‘Q’ ‘T’ ‘T’)+协议级别(3.1.1版本尾0x04)+连接标志(0xC2)+保持连接(保持连接秒数, 2字节,一般120秒,即0x00 0x78)
连接标志包括:用户名标志,密码标志,遗嘱保留,遗嘱QoS,遗嘱标志,清除会话。
有效载荷:
2.连接
客户端和服务器的底层网络连接建立后,客户端需要发送的第一帧报文。
固定报头: 0x10 +长度(一般2字节,低位在前,见上面截图)
可变报头:00 04 4D 51 54 54 04 C0 00 78 或 00 04 4D 51 54 54 04 C2 00 78
有效载荷:客户端标识符长度+客户端标识符内容+用户名长度+用户名内容+密码长度+密码内容
例如:
10 25 00 04 4D 51 54 54 04 C0 00 78 00 09 35 34 34 39 34 32 32 36 37 00 06 32 37 35 35 39 35 00 06 31 32 33 34 35 36
其中客户端标识符长度9,内容 35 34 34 39 34 32 32 36 37
用户名长度6,内容 32 37 35 35 39 35
密码长度6,内容 31 32 33 34 35 36
3.取消/确认连接
确认连接:服务器返回 20 02 00 00 或 20 02 01 00 (受清理会话标志的影响)
断开连接:重复发送连接报文,或发送 E0 00 即表示客户端断开连接,服务器不响应。
4.客户端订阅主题
固定报头(2字节)+可变报头(2字节报文标识符)+有效载荷
有效载荷=主题名称(2字节的主题字符串长度+字符串内容)+服务质量要求(0,1,2)
示例:(订阅“abc”主题的消息)
82 08 00 0A 00 03 61 62 63 00
服务器订阅确认:
固定报头(2字节)+可变报头(2字节报文标识符)+有效载荷(1字节,0x00表示最大QoS0)
90 03 00 0A 00
5.客户端取消订阅
固定报头(2字节)+可变报头(2字节报文标识符)+有效载荷(长度+主题)
示例:(取消订阅“abc”主题的消息)
A2 07 00 0A 00 03 61 62 63
服务器取消订阅确认:
固定报头(2字节)+可变报头(2字节报文标识符)
B0 02 00 0A
6.客户端发布消息
客户端向服务端传输一个应用消息
固定报头+可变报头+有效载荷
DUP为重发标志,第一次发时置0。RETAIN为保留标志。
剩余长度=可变报头长度+有效载荷的长度。
可变报头=主题名(长度+主题内容)+报文标识符(QoS等级为1或2时才存在)
有效载荷:所发布消息的内容
示例:发布abc主题的内容:12345
30 0A 00 03 61 62 63 31 32 33 34 35
7.心跳请求/响应
客户端发送: C0 00
服务器响应: D0 00