MQTT 控制报文类型、功能及格式(报文结构) - 第2章

本文深入解析MQTT协议的控制报文结构,涵盖固定报头、可变报头、有效载荷等关键概念,以及控制报文类型和剩余长度的计算方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

2.1 MQTT 控制报文的结构

2.2 固定报头

2.2.1 控制报文的类型

2.2.2 控制报文类型的标志位

2.2.3 剩余长度

2.3 可变报头

2.4 有效载荷


2.1 MQTT 控制报文的结构

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

  • 固定报头
  • 可变报头
  • 有效载荷
MQTT 控制报文的结构
名称 EN名称 CN所属情况
Fixed Header固定报头所有控制报文都包含
Variable Header可变报头部分控制报文包含
Payload有效载荷部分控制报文包含

 

 

2.2 固定报头

每个 MQTT 控制报文都包含一个固定报头。固定报头的数据长度为 2~5字节。(Byte = 8bit)

固定报头的格式:(MSB,高位在前)

 

固定报头的数据格式
Byte - Bit76543210
Byte 1MQTT 控制报文的类型(1 ~ 14)指定控制报文类型的标志位
Byte 2~5剩余长度(1~4 Byte)
  • 剩余长度字段的长度,取决于帧长度,详细计算方法见 2.2.3章节。

 

2.2.1 控制报文的类型

位置:固定报头中,第 1 个字节的 Bit 7~4

控制报文的定义如下:(0/15是保留位,无用。有效类型为 1~14)

 

MQTT 控制报文的类型
报文类型功能描述流动方向固定报头可变报头报文标识符载荷
CONNECT客户端请求连接服务端C -> S1
CONNACK服务端确认连接建立S -> C2
PUBLISH发布消息C <=> S3有(Qos>0)
PUBACK收到发布消息确认(QoS1等级)C <=> S4
PUBREC发布消息收到(QoS2等级)C <=> S5
PUBREL发布消息释放(QoS2等级)C <=> S6
PUBCOMP发布消息完成(QoS2等级)C <=> S7
SUBSCRIBE订阅请求C -> S8
SUBACK订阅确认S -> C9
UNSUBSCRIBE取消订阅C -> S10
UNSUBACK取消订阅确认S -> C11
PINGREQ(保活)心跳请求C -> S12
PINGRESP心跳响应S -> C13
DISCONNECT客户端断开连接C -> S14
  • Qos:Quality of service,服务质量。Qos 0/1/2 为MQTT规定的服务质量等级,其代表消息传递时不同的可靠程度
  • 其中,5、6、7为 Qos2时才会有的控制报文

 

 

2.2.2 控制报文类型的标志位

位置:固定报头中,第 1 个字节的 Bit 3~0

 

报文类型-标志位
控制报文固定报头标志Bit 3Bit 2Bit 1Bit 0
CONNECTReserved0000
CONNACKReserved0000
PUBLISHUsed in MQTT 3.1.1DUP1QoS2QoS2RETAIN3
PUBACKReserved0000
PUBRECReserved0000
PUBRELReserved0000
PUBCOMPReserved0000
SUBSCRIBEReserved0000
SUBACKReserved0000
UNSUBSCRIBEReserved0000
UNSUBACKReserved0000
PINGREQReserved0000
PINGRESPReserved0000
DISCONNECTReserved0000
  • DUP1 =控制报文的重复分发标志
  • QoS2 = PUBLISH报文的服务质量等级
  • RETAIN3 = PUBLISH报文的保留标志
  • PUBLISH控制报文中的DUP, QoS和RETAIN标志的描述见 3.3.1节。

 

 

2.2.3 剩余长度

  • 位置:固定报头中,从第2个字节开始
  • 剩余长度等于可变报头的长度(10字节)加上有效载荷的长度
  • 剩余长度(Remaining Length)表示当前报文剩余部分的字节数,包括可变报头和负载的数据
  • 剩余长度不包括用于编码剩余长度字段本身的字节数。

 

剩余长度字段 的帧格式:

 

帧格式 - 剩余长度字段
第1个字节第2个字节...
Bit 7Bit 6:0Bit 7Bit 6:0...
进位标志位长度低字节进位标志位长度高字节...
  • 剩余长度字段 的字节长度:最少1个字节,最多4个字节。
  • 剩余长度字段 可以表示的长度:1个字节时,可以表示剩余 0~127 长度。4个字节时,最大表示长度为 2^(7*4) - 1 = 2^28 - 1 = 268435455 长度

 

剩余长度字段 表示的字节长度
字节数表示长度的最小值(字节)表示长度的最大值(字节)
102^7 - 1 = 127
22^7 = 1282^(7*2) - 1 = 16383
32^(7*2) = 163842^(7*3) - 1 = 2097151
42^(7*3) = 20971522^(7*4) - 1 = 268435455

 

  • 提示

之所以1个字节不能表示 2^8 - 1 = 255长度,是因为:每个字节的最高位 Bit7,并不表示数据,是进位标志位

 

  • 剩余长度的计算
  • 示例1

假设本帧剩余字节为 200,计算剩余长度字段。

  1. 使用电脑计算器,将 200 转换为二进制 1100 1000(MSB高位在前)
  2. 从右侧低位每7Bit进行一次拆分,依次拆分出:
  3. 第1个字节为 100 1000,有进位,高位加上进位1为 1100 1000 = 0xC8 (16进制)。
  4. 第2个字节为 1,无进位,为 1 = 0x01 (16进制)。

那么对应的 字节长度的帧格式如下表:

 第1个字节第2个字节
 Bit 7Bit 6:0Bit 7Bit 6:0
 进位标志位 进位标志位 
2进制1100 10000000 0001
2进制1100 10000000 0001
16进制0xC80x01

 

  • 示例2

假设本帧剩余字节为 1000,计算剩余长度字段。

  1. 使用电脑计算器,将 1000 转换为二进制 11 1110 1000(MSB高位在前)
  2. 从右侧低位每7Bit进行一次拆分,依次拆分出:
  3. 第1个字节为 110 1000,有进位,高位加上进位1为 1110 1000 = 0xE8 (16进制)。
  4. 第2个字节为 11 1,无进位,为 11 1 = 0x07 (16进制)。

那么对应的 字节长度的帧格式如下表:

 第1个字节第2个字节
 Bit 7Bit 6:0Bit 7Bit 6:0
 进位标志位 进位标志位 
2进制1110 10000000 0111
2进制1110 10000000 0111
16进制0xE80x07

 

  • 示例3

假设本帧剩余字节为 100,000,000,计算剩余长度字段。

  1. 使用电脑计算器,将 100,000,000 转换为二进制 101 1111 0101 1110 0001 0000 0000(MSB高位在前)
  2. 从右侧低位每7Bit进行一次拆分,依次拆分出:
  3. 第1个字节为 000 0000,有进位,高位加上进位1为 1000 0000 = 0x80 (16进制)。
  4. 第2个字节为 10 0001 0,有进位,高位加上进位1为 1100 0010 = 0xC2 (16进制)。
  5. 第3个字节为 1 0101 11,有进位,高位加上进位1为 1101 0111 = 0xD7 (16进制)。
  6. 第4个字节为 101 111 = 00,无进位,为 10 1111 = 0x2F (16进制)。

那么对应的 字节长度的帧格式如下表:

 第1个字节第2个字节第3个字节第4个字节
 Bit 7Bit 6:0Bit 7Bit 6:0Bit 7Bit 6:0Bit 7Bit 6:0
 进位标志位 进位标志位 进位标志位 进位标志位 
2进制1000 00001100 00101101 01110010 1111
2进制1000 00001100 00101101 01110010 1111
16进制0x800xC20xD70x2F

 

 

2.3 可变报头

某些 MQTT 控制报文包含一个可变报头部分。它在固定报头和负载之间。

可变报头的内容根据报文类型的不同而不同。

可变报头的报文标识符(Packet Identifier)字段存在于多个类型的报文里。

 

 

2.4 有效载荷

某些MQTT控制报文在报文的最后部分包含一个有效载荷。对于PUBLISH来说有效载荷就是应用消息。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值