上篇讲了MQTT帧结构如下:
固定报头(Fixed Header)
可变报头(Variable Header)
有效载荷(Payload)
1.固定报头:
第1个字节是代表控制报文类型,从第2字节开始表示剩余长度,
剩余长度 = 可变报头 + 有效负载
剩余长度采用变长度编码方案,规定,一个字节bit7为1表示后面继续属于剩余长度字节,bit0~bit6
表示字节数,所以一个字节本身能表示0~127
,如果超过127,则要往后加一个字节。
例如:数字 321 编码规则如下
2.可变报头
可变报头字段有很多,比如
- 协议名 (Protocol Name)
- 协议级别 (Protocol Level)
- 连接标志 (Connect Flags)
- 保活时间 (Keep Alive)
- 连接标识符(Packet Identifier)
不同固定报头所搭配的可变报头的字段也不一样,这个在之后详细说到,这里先介绍下报文标识符(Packet Identifier)这个字段,该字段是占2字节的非零数。
客户端每次发送新类型报文时都必须分配一个已经释放的报文标识符,如果客户端要重发这个这个报文时,就必须使用相同的报文标识符,当客户端处理完这个重发报文对应的确认后,这个报文标识符就被释放可重用。服务端也是这样,但是客户端和服务端是彼此独立的分配报文标识符,因此有可能客户端服务端使用相同的报文标识符。
PUBACK, PUBREC, PUBREL 报文必须包含与最初发送的 PUBLISH 报文相同的报文标识符 。类似地, SUBACK 和 UNSUBACK 必须包含在对应的 SUBSCRIBE 和 UNSUBSCRIBE 报文中使用的报文标识符。
有效载荷
对于 PUBLISH 来说有效载荷就是应用消息。