MQTT协议数据报解析
一、介绍
MQTT协议数据报由三部分组成:固定报头、可变报头、有效载荷
二、CONNECT数据报
固定报头
1、报文类型(一字节)
协议规定用0x10表示CONECT报文
2、剩余长度
由可变报头和负载的字节数和决定,剩余长度在一到四字节之间规则如下
字节数 最小值 最大值
1 0(0x00) 127(0x7F)
2 128(0x80,0x01) 163383(0xFF,0x7F)
3 16384(0x80,0x80,0x01) 2097151(0xFF,0xFF,0x7F)
4 2097152(0x80,0x80,0x80,0x01) 268435455(0xFF,0xFF,0xFF,0x7F)
可变报头
1、ProtocolNAME(6字节)
byte1 length MSB 0x00
byte2 length LSB 0x04
byte3~6 字符MQTT的十六进制 0x4D 0x51 0x54 0x54
2、Protocol LEVEL
byte7 Level(4) 0x04
3、Conect FLAG
byte8 0xc2
第7位表示username 使能
第6位表示passwordFlag 使能
第5位表示willretain
第4和3位表示willQos
第2位表示willflag
第1位表示cleanflag 使能
第0位表示reserved
4、Keep ALIVE
byte9 keep Alive MSB 0x00
byte10 keep Alive LSB 0x64(表示保活100秒)
有效载荷
将自己的客户端ID、用户名、密码依次上传
用以下三元组作为示例
{
“ProductKey”: “icou3LQjBDH”,
“DeviceName”: “test”,
“DeviceSecret”: “6fdfcf687621b7f184e7dc0a181b8ed5”
}
那么*是设备名称 #是ProductKey
客户端ID: *|securemode=3,signmethod=hmacsha1|
用户名: *&#
密码:加密网址选择加密http://encode.chahuo.com/这个字符串clientId *deviceName * productKey#
示例:
客户端ID: test|securemode=3,signmethod=hmacsha1|
用户名: test&icou3LQjBDH
密码:3f4d63ac4f78f725e1624146576bf8d1e8c6d059
将字符串转化成十六进制形式以00 数据字节作为头隔开
00 26 74 65 73 74 7C 73 65 63 75 72 65 6D 6F 64 65 3D 33 2C 73 69 67 6E 6D 65 74 68 6F 64 3D 68 6D 61 63 73 68 61 31 7C
00 10 74 65 73 74 26 69 63 6F 75 33 4C 51 6A 42 44 48
00 28 33 66 34 64 36 33 61 63 34 66 37 38 66 37 32 35 65 31 36 32 34 31 34 36 35 37 36 62 66 38 64 31 65 38 63 36 64 30 35 39
二、DISCONNECT数据报(2字节)
固定报头
1、报文类型(一字节)
协议规定用0xE0表示DISCONECT报文
2、剩余长度
没有剩余长度 0x00
三、CONACK响应报
固定报头
1、报文类型(一字节)
协议规定用0x20表示CONACK响应报
2、剩余长度
剩余长度 2字节 0x02
可变报头
四、PINGREQ数据报
固定报头
1、报文类型(一字节)
协议规定用0xC0表示PINGREQ数据报
2、剩余长度
剩余长度0字节 0x00
五、PINGRESP响应报
固定报头
1、报文类型(一字节)
协议规定用0xD0表示PINGRESP响应报
2、剩余长度
剩余长度0字节 0x00
六、SUBSCRIBE数据报(用来订阅主题)
固定报头
1、报文类型(一字节)
协议规定用0x82表示SUBSCRIBE数据报(
2、剩余长度
剩余长度xx字节
可变报头
报文标识符 (可以理解为一个报文的ID后续响应会有报文标识符所以用来区分订阅不同主题非常好,可以判断对应报文标识符的响应报来判断是否成功订阅)
byte1 MSB(报文标识符)0000 0000
byte2 LSB(报文标识符)0000 1010
有效载荷
订阅主题的十六进制格式加上Qos拼接而成
服务质量要求有三种分别为等级一、等级而、等级三,用0x00、0x01、0x02表示
七、SUBCK响应报
固定报头
1、报文类型(一字节)
协议规定用0x90表示SUBSCRIBE数据报(
2、剩余长度
剩余长度xx字节
可变报头
报文标识符(和订阅时的报文标识符一致)
byte1 MSB(报文标识符)0000 0000
byte2 LSB(报文标识符)0000 1010
有效载荷
返回码
阿里云通常只返回0x01表示成功
八、UNSUBSCRIBE数据报(用于取消订阅主题)
固定报头
1、报文类型(一字节)
协议规定用0xA2表示SUBSCRIBE数据报(
2、剩余长度
剩余长度xx字节
可变报头
报文标识符 (可以理解为一个报文的ID后续响应会有报文标识符所以用来区分订阅不同主题非常好,可以判断对应报文标识符的响应报来判断是否成功订阅)
byte1 MSB(报文标识符)0000 0000
byte2 LSB(报文标识符)0000 1010
有效载荷
取消订阅主题的十六进制格式加上Qos拼接而成响应
服务质量要求有三种分别为等级一、等级而、等级三,用0x00、0x01、0x02表示
九、UNSUBCK响应报
固定报头
1、报文类型(一字节)
协议规定用0xB0表示UNSUBCK响应报
2、剩余长度
剩余长度2字节 0x02
可变报头
报文标识符 (可以理解为一个报文的ID后续响应会有报文标识符所以用来区分订阅不同主题非常好,可以判断对应报文标识符的响应报来判断是否成功订阅)
byte1 MSB(报文标识符)0000 0000
byte2 LSB(报文标识符)0000 1010
有效载荷
无
十、PUBLISH数据报(用于发布消息的报文)
固定报头
1、报文类型(一字节)
第3位为重传标志,qos0以上的PUBLISH是要求对方返回ack的,没有收到ack时,会被重传,重传时,DUP位为1。所以qos不能传1。
第2-1位为Qos标志,用两位表示qos 0、1、2,与CONNECT可变报头的连接标志一样。
第0位为保留消息标志,同样1表示启用,0表示不启用。是指,要求服务端收到PUBLISH时,持久化最新的一条消息,以便后来订阅主题的连接能够收到最近的一条消息。
2、剩余长度
剩余长度xx字节
可变报头
报文标识符 (可以理解为一个报文的ID后续响应会有报文标识符所以用来区分订阅不同主题非常好,可以判断对应报文标识符的响应报来判断是否成功订阅)
byte1 MSB(报文标识符)0000 0000
byte2 LSB(报文标识符)0000 1010
有效载荷
有效载荷包含将被发布的应用消息。数据的内容和格式是应用特定的。有效载荷的长度这样计算:用固定报头中的剩余长度字段的值减去可变报头的长度。包含零长度有效载荷的PUBLISH报文是合法的。
3.4 PUBACK
PUBACK报文是对QoS 1等级的PUBLISH报文的响应。
3.4.1 固定报头(Fixed header)
3.4.2 可变报头(Variable header)
可变报头仅有报文标识符。
格式为 MSB+LSB。
3.4.3 有效载荷(Payload)
PUBACK报文没有有效载荷。
段的值减去可变报头的长度。包含零长度有效载荷的PUBLISH报文是合法的。
3.4 PUBACK
PUBACK报文是对QoS 1等级的PUBLISH报文的响应。
3.4.1 固定报头(Fixed header)
[外链图片转存中…(img-Revc2Ov8-1680425699049)]
3.4.2 可变报头(Variable header)
可变报头仅有报文标识符。
格式为 MSB+LSB。
3.4.3 有效载荷(Payload)
PUBACK报文没有有效载荷。