介绍

术语说明:

术语

说明

MUST

必须

MUST NOT

不能

REQUIRED

要求

SHALL

将会

SHALL NOT

不会

SHOULD

应该

SHOULD NOT

不应该

RECOMMENDED

推荐

MAY

可以

OPTIONAL

可选

  1. 客户端Client:使用MQTT 的程序或设备;
  2. 服务端Server:一个程序或设备,作为发送信息的客户端和请求订阅的客户端之间的中介;
  3. 订阅Subscription:订阅包含一个主题过滤器(Topic Filter)和一个最大的服务质量等级(Qos)。订阅与单个会话(Session)关联;
  4. 主题名Topic Name:附加在应用消息上的一个标签。

MQTT 控制报文的结构

MQTT控制报文由三部分组成:

java MQTT消息总线CPU占用过高 mqtt消息长度_mqtt

固定报头 Fixed header

每个MQTT控制报文都包含一个固定报头。

java MQTT消息总线CPU占用过高 mqtt消息长度_控制报文_02

MQTT控制报文的类型

java MQTT消息总线CPU占用过高 mqtt消息长度_控制报文_03

标志 Flags

java MQTT消息总线CPU占用过高 mqtt消息长度_字段_04

剩余长度

剩余长度(Remaining Length)表示当前报文剩余部分的字节数,包括可变报头和负载的数据。剩余长度不包括用于编码剩余长度字段本身的字节数。

剩余长度字段使用一个变长度编码方案,对小于128的值它使用单字节编码。更大的值按下面的方式处理。低7位有效位用于编码数据,最高有效位用于指示是否有更多的字节,且按照大端方式进行编码。因此每个字节可以编码128个数值和一个延续位(continuation bit)。剩余长度字段最大4个字节。

例如,十进制数64会被编码为一个字节,数值是64,十六进制表示为0x40,。十进制数字321(=65+2*128)被编码为两个字节,最低有效位在前。第一个字节是 65+128=193。注意最高位为1表示后面至少还有一个字节。第二个字节是2。

十进制数321=0xC1,0x02

注意(上面没看懂的看这)
还是拿321举例,十进制321 转换成二进制就是101000001,即0x0141。由于101000001 超过7位,已经不能用一个字节表示了(一个字节的最高位是指示位,故一个字节只有7位数据位)。所以我们就要将这个二进制数切割成10 和1000001,然后低位加上一个为1 的符号为成为11000001,即0xC1,然后放在前面,高位的10 直接写在后面,符号为为0,即0x02。

所以,最终十进制的321 化为剩余长度形式就是0xC1,0x02。

剩余长度字段的大小:

java MQTT消息总线CPU占用过高 mqtt消息长度_格式_05

可变报头 Variable header

某些MQTT控制报文包含一个可变报头部分。它在固定报头和负载之间。
可变报头的内容根据报文类型的不同而不同。可变报头的报文标识符(Packet Identifier)字段存在于在多个类型的报文里。

报文标识符

注意报文标识符的作用就是为一个报文标记其响应报文

java MQTT消息总线CPU占用过高 mqtt消息长度_控制报文_06


很多控制报文的可变报头部分包含一个两字节的报文标识符字段。这些报文是PUBLISH(QoS > 0时), PUBACK,PUBREC,PUBREL,PUBCOMP,SUBSCRIBE,SUBACK,UNSUBSCRIBE,UNSUBACK。

SUBSCRIBE,UNSUBSCRIBE和PUBLISH(QoS大于0)控制报文必须包含一个非零的16位报文标识符。

客户端每次发送一个新的这些类型的报文时都必须分配一个当前未使用的报文标识符。如果一个客户端要重发这个特殊的控制报文,在随后重发那个报文时,它必须使用相同的标识符。当客户端处理完这个报文对应的确认后,这个报文标识符就释放可重用

QoS 1的PUBLISH对应的是PUBACK,QoS 2的PUBLISH对应的是PUBCOMP,与SUBSCRIBE或UNSUBSCRIBE对应的分别是SUBACK或UNSUBACK。
PUBACK, PUBREC, PUBREL报文必须包含与最初发送的PUBLISH报文相同的报文标识符。类似地,SUBACK和UNSUBACK必须包含在对应的SUBSCRIBE和UNSUBSCRIBE报文中使用的报文标识符

QoS等于0的PUBLISH报文不能包含报文标识符

包含报文标识符的控制报文:

java MQTT消息总线CPU占用过高 mqtt消息长度_字段_07

有效载荷 Payload

对于PUBLISH来说有效载荷就是应用消息。

包含有效载荷的控制报文:

java MQTT消息总线CPU占用过高 mqtt消息长度_控制报文_08