mqtt协议详解_阿里云物联网平台使用心得(11)MQTT协议之详解剩余长度

d7d9fbb9dd966e32b7f757e49a3e132e.png

题目

大家好,物联网爱好小组成员超子,又和大家见面了,超子我能力有限,水平不高,有什么错误的地方,欢迎板砖。超子今天给大家详解一下固定报头中的剩余长度,上一篇文章中,超子给大家预告了。

剩余长度 = 可变报头长度 + 负载长度

MQTT协议中,剩余长度使用的是一种变长度的编码方案,所以剩余长度最少占用1个字节,最多占用4个字节。下图总结了,剩余长度不同的取值范围,对应所占用的字节数。

5d0f7e7cc9a98177b1d2db556c9c37ce.png

剩余长度字节数对应长度范围

一个字节包含8个二进制位,分别是Bit0~Bit7,在MQTT协议中都是无符号的。正常情况下,一个字节所表示的范围是0~255,但是在MQTT协议剩余长度中将一个字节分成了两个部分,看下图

d179cdc05e329aba39f500658f597d1c.png

剩余长度中字节分为两个部分使用

Bit7当做一个进位标志,Bit0~Bit6表示数值,所以一个字节表达的数值范围变成了0~127,接下来我们举几个例子,看看剩余长度是如何编码的。剩余长度是逢128的整数倍进位,进位就要多加一个字节。如果Bit7是1表示前面有进位,如果是0就表示没有进位。下面看例子。

(1)100,100/128=0,等于0无需进位,所以Bit7是0,然后100%128=100,所以Bit0~Bit6就是0x64,剩余长度就是1个字节。

(2)1000,1000/128=7,不等于0需要进位,然后7/128=0,等于0无需再进位,所以总体进1位,需要2个字节,第1个字节Bit7是1,第2个字节Bit7是0。然后1000%128=104,所以第1个字节Bit0~Bit6就是0x68,然后7%128=7,所以第2个字节Bit0~Bit6就是0x07,然后再结合上Bit7的话,就是 0xE8 和0x07

(3)100000,100000/128=781,不等于0需要进位,然后781/128=6,不等于0再进一位,6/128=0,等于0无需再进位了,所以总体进2位,需要3个字节。第1个字节Bit7是1,第2个字节Bit7是1,第3个字节Bit7是0。然后100000%128=32,所以第1个字节Bit0~Bit6就是0x20,然后781%128=13,所以第2个字节Bit0~Bit6就是0x0D,然后6%128=6,所以第3个字节Bit0~Bit6就是0x06,然后再结合上Bit7的话,就是 0xA0 0x8D 0x06。

(4)100000000,100000000/128=781250,不等于0需要进位,781250/128= 6103,不等于0需要再进位,6103/128=47,不等于0需要再进位,47/128=0,等于0无需再进位,所以总体进3位,需要4个字节,第1个字节Bit7是1,第2个字节Bit7是1,第3个字节Bit7是1,第4个字节Bit7是0。然后100000000%128=0, 所以第1个字节Bit0~Bit6就是0x00,然后781250%128=66,所以第2个字节Bit0~Bit6就是0x42,然后6103%128=87,所以第3个字节Bit0~Bit6就是0x57,然后47%128=47,所以第4个字节Bit0~Bit6就是0x2F,再结合上Bit7的话,就是0x80 0xC2 0xD7 0x2F

上面这4个例子,算是正向的,我们往服务器发数据,我们要统计剩余长度的数值,然后用上面的方法计算,然后才能往服务器发,那么要是服务器给我们推送数据的时候,我们怎么解析剩余长度的呢?我们就用上面第(3)例子 0xA0 0x8D 0x06,我们得分两步走

(1)判断有多少个字节,剩余长度最少1个字节最多4个字节,所以我们先看0xA0,Bit7是1,那么说明有进位,所以目前的情况,总共有2个字节,再看0x8D,Bit7又是1,那么现在的话,是3个字节了,再看0x06,Bit7是0,说明没有进位了,剩余长度到此为止,总共3个字节。

(2)计算剩余长度,注意不要把第1个和第2个字节的Bit7算进去,0x06*128*128+0x0D *128+0x20=100000

大家可以自己动手,实际算几个例子,相信大家很快就可以掌握剩余长度的计算和解析的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值