这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STM32G070RB探测31-MQTT协议剖析1CONNECT②

共1条 1/1 1 跳转至

STM32G070RB探测31-MQTT协议剖析1CONNECT②

高工
2021-03-23 22:30:47     打赏
这篇对照协议详细剖析一下上篇中的神秘报文这个需要打开MQTT 3.1.1协议说明对照着看了

先了解一下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

对的



共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]