基于STM32F746的MQTT实现

一.简述

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。标准MQTT协议包括连接,连接确认,发布消息,发布确认,发布收到,发布释放,发布完成,订阅主题,订阅确认,取消订阅,取消确认,心跳请求,心跳响应,断开连接。标准MQTT协议基于TCP的socket连接。

基于STM32F746的MQTT实现_第1张图片

 

二.具体实现

1.报文帧格式

包括: 固定报头 + 可变报头 +有效载荷

固定报头:

 

基于STM32F746的MQTT实现_第2张图片基于STM32F746的MQTT实现_第3张图片基于STM32F746的MQTT实现_第4张图片

可变报头:

包括:

协议名(00 04 ‘M’ ‘Q’ ‘T’ ‘T’)+协议级别(3.1.1版本尾0x04)+连接标志(0xC2)+保持连接(保持连接秒数, 2字节,一般120秒,即0x00 0x78)

连接标志包括:用户名标志,密码标志,遗嘱保留,遗嘱QoS,遗嘱标志,清除会话。

基于STM32F746的MQTT实现_第5张图片

 

有效载荷:

基于STM32F746的MQTT实现_第6张图片

 

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.客户端发布消息

客户端向服务端传输一个应用消息

固定报头+可变报头+有效载荷

基于STM32F746的MQTT实现_第7张图片

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

 

 

 

 

 

 

 

 

你可能感兴趣的:(STM32F7之HAL库学习)