官方文档中对于MQTT协议包的结构有着具体的说明:http://mqtt.org/documentation
在
MQTT
协议中,一个
MQTT
数据包由:固定头(
Fixed header
)、可变头(
Variable header
)、消息体
(
payload
)三部分构成。
MQTT
数据包结构如下:
![](https://i-blog.csdnimg.cn/blog_migrate/26cf7a4e742655f48088e060b645c35e.png)
(
1
)固定头(
Fixed header
)。存在于所有
MQTT
数据包中,表示数据包类型及数据包的分组类标识, 如连接,发布,订阅,心跳等。其中固定头是必须的,所有类型的MQTT
协议中,都必须包含固定头。
(
2
)可变头(
Variable header
)。存在于部分
MQTT
数据包中,数据包类型决定了可变头是否存在及其具体内容。可变头部不是可选的意思,而是指这部分在有些协议类型中存在,在有些协议中不存在。
(3
)消息体(
Payload
)。存在于部分
MQTT
数据包中,表示客户端收到的具体内容。 与可变头一样, 在有些协议类型中有消息内容,有些协议类型中没有消息内容。
1 固定头(Fixed header)
固定头存在于所有MQTT数据包中, 固定头包含两部分内容,首字节(字节1)和剩余消息报文长度(从第二个字 节开始,长度为1-4字节),剩余长度是当前包中剩余内容长度的字节数,包括变量头和有效负载中的数据)。剩余长度不包含用来编码剩余长度的字节。
剩余长度使用了一种可变长度的结构来编码,这种结构使用单一字节表示
0-127
的值。大于
127
的值如下处 理。每个字节的低7
位用来编码数据,最高位用来表示是否还有后续字节。因此每个字节可以编码
128
个值,再加 上一个标识位。剩余长度最多可以用四个字节来表示。
数据包类型
位置:第一个字节
(Byte 1)
中的
7-4
个
bit
位
(Bit[7-4])
,表示
4
位无符号值
通过第一个字节的高
4
位确定消息报文的类型,
4
个
bit
位能确定
16
种类型,其中
0000
和
1111
是保留字段。
MQTT
消息报文类型如下:
![](https://i-blog.csdnimg.cn/blog_migrate/a43997c24b99b4a66139e71188c014fe.png)
标志位
位置:第一个字节中的
0-3
个
bit
位
(Bit[3-0])
。意思是字节位
Bit[3-0]
用作报文的标识。
首字节的低
4
位
(bit3~bit0)
用来表示某些报文类型的控制字段,实际上只有少数报文类型有控制位,如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/da3032618d7a03a7c8d27c86c61792d4.png)
(1):其中Bit[3]为DUP字段,如果该值为1,表明这个数据包是一条重复的消息;否则该数据包就是第一次
发布的消息。
(
2
):
Bit[2-1]
为
Qos
字段:
如果
Bit 1
和
Bit 2
都为
0
,表示
QoS 0
:至多一次;
如果
Bit 1
为
1
,表示
QoS 1
:至少一次;
如果
Bit 2
为
1
,表示
QoS 2
:只有一次;
如果同时将
Bit 1
和
Bit 2
都设置成
1
,那么客户端或服务器认为这是一条非法的消息,会关闭当前连接。
目前 Bit[3-0] 只在 PUBLISH 协议中使用有效,并且表中指明了是 MQTT 3.1.1 版本。对于其它 MQTT 协议版本,内容可能不同。所有固定头标记为 " 保留 " 的协议类型, Bit[3-0] 必须保持与表中保持一致,如 SUBSCRIBE协议,其 Bit 1 必须为 1 。如果接收方接收到非法的消息,会强行关闭当前连接。
MQTT消息QoS
MQTT
发布消息服务质量保证(
QoS
)不是端到端的,是客户端与服务器之间的。订阅者收到
MQTT
消息的
QoS
级别,最终取决于发布消息的
QoS
和主题订阅的
QoS
。