
文章插图

文章插图
QoS2因此是最高质量的消息,就如我们本次使用的阿里云占时还在不支持这个等级的消息 。
3.2.1、固定报头

文章插图
1)第一字节:

文章插图
如截图,第一字节,一共8bit,分为两部分,4~7bit定义了每一包报文是一个什么类型,所有报文如表3.1中所示,下图是MQTT协议中对CONNECT报文的定义:

文章插图
由此我们可以确定整个报文的第一字节为0x10(为了书写方便后续将不在写0x这个十六进制的标号,将直接使用10标识) 。
2)第二字节(也有可能是第2到第3、或者2到4,或者2到5)为什么会有不同的选择,这是由于在第一字节确定了本包报文是什么类型后,会在后续告诉对方后面的可变报头和负载一共有多少字节,当后面只有120个字节时可以用一个字节就表示好,但是当有500,或者1000时就不是一个字节可以表示的长度了(二进制表示方式,不理解的这里可以自己百度) 。为什么会有500,或者1000的那么大的差别呢,这由于有些可选配置,如有需要可配置进去(然后再后面的可变报头给对应的bit位写1,表示我要使用改配置,那么服务端检测到该标志就可以知道说原来你本次有这个可选配置,我会在检测负载数据时进行检测读取的),然后就是如果你设置设备名字或者密码等时给了一个很长的名字,那数据不就是增加了,所以才在这把长度搞成这样的可选,然后还经过特殊的设置让接收设备可以很好的知道本次报文这部分到低是用几个字节表示后面数据的长度,接下来我们会详细讲解一下,先把截图放在下面,这就是为什么剩余长度bute2...有三个点的原因:

文章插图

文章插图
分别表示(每个字节的低 7 位用于编码数据,最高位是标志位) :1 个字节时(整个报文包的第2字节),从 0(0x00)到 127(0x7f)2 个字节时(整个报文包的第2字节和第3字节),从 128(0x80,0x01)到 16383(0Xff,0x7f)3 个字节时(整个报文包的第2、3、4字节),从 16384(0x80,0x80,0x01)到 2097151(0xFF,0xFF,0x7F)4 个字节时(整个报文包的第2、3、4、5字节),从 2097152(0x80,0x80,0x80,0x01)到 268435455(0xFF,0xFF,0xFF,0x7F))
长度计算方式:
