先了解一下mqtt的MQTT 控制报文格式
三部分组成:
1.固定报头(所有控制报文都包含)
2.可变报头(部分控制报文包含)
3.有效载荷(部分控制报文包含)
其中固定报头是必须要有的
固定报头固定报头也是三部分组成
1.控制报文类型
2.标志
3.剩余长度
其中的1,2为一个字节,控制报文类型为前4位标志为后四位
CONNECT的控制报文为1 标志位为0
所以第一个字节为10
看下之前抓的协议包里
对的上,证明是对的
然后就是剩余长度了,就是之后所有数据的长度
这个怎么计算呢,协议里给了个例子
321 = 65+2*128 即 321(十进制) = 0x41+0x02*0x80 所以剩余长度第一个字节等于0x41+0x80 第二个字节等于0x02 即 c1 02(十六进制)
是不是仿佛不明白? 再倒着推一遍
因为这个长度只有低7位是有效的,1个字节时,长度最长为0x7f,即127
而最高位则为延续位,当大于127时最高位为1,延续到第二位
当超过127时,比如129时,第一个字节最高位置1,第二个字节低七位为1,129-128=1,第一个字节低七位为1,即为11 01(十六进制) 拿上边的c1 02 推回去
即
2*128=256 0xc1-0x80=0x41=65 65+256=321
来看一下之前抓的协议包里
第一位0x92比0x80大,所以看第二位0x01比0x80小,所以到此结束 即剩余长度为92 01
再算一遍
(0x01*0x80)+(0x92-0x80) = 0x92 = 196(dec)
即长度为192,笨办法查一下
9*16+5-3 = 146
对的