MQTT通信协议 剩余长度总结

Posted yuanmeixiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MQTT通信协议 剩余长度总结相关的知识,希望对你有一定的参考价值。

2.2.3 剩余长度
位置: 从第 2 个字节开始。
剩余长度(Remaining Length) 表示当前报文剩余部分的字节数, 包括可变报头和负载的数据。 剩余长度
不包括用于编码剩余长度字段本身的字节数。
剩余长度字段使用一个变长度编码方案, 对小于 128 的值它使用单字节编码。 更大的值按下面的方式处理。
低 7 位有效位用于编码数据,最高有效位用于指示是否有更多的字节。 因此每个字节可以编码 128 个数值
和一个延续位(continuation bit) 。 剩余长度字段最大 4 个字节。
非规范评注
例如, 十进制数 64 会被编码为一个字节, 数值是 64, 十六进制表示为 0x40,。十进制数字
321(=65+2*128)被编码为两个字节, 最低有效位在前。 第一个字节是 65+128=193。 注意最高位为
1 表示后面至少还有一个字节。 第二个字节是 2。
非规范评注
这允许应用发送最大 256MB(268,435,455)大小的控制报文。这个数值在报文中的表示是:
0xFF,0xFF,0xFF,0x7F。
表格 2.4 剩余长度字段的大小展示了剩余长度字段所表示的值随字节增长。
表格 2.4 剩余长度字段的大小

字节数最小值最大值
10 (0x00)127 (0x7F)
2128 (0x80, 0x01)16 383 (0xFF, 0x7F)
316 384 (0x80, 0x80, 0x01)2 097 151 (0xFF, 0xFF, 0x7F)
42 097 152 (0x80, 0x80, 0x80, 0x01)268 435 455 (0xFF, 0xFF, 0xFF, 0x7F)

分别表示(每个字节的低 7 位用于编码数据, 最高位是标志位) :
1 个字节时, 从 0(0x00)到 127(0x7f)
2 个字节时, 从 128(0x80,0x01)到 16383(0Xff,0x7f)
3 个字节时, 从 16384(0x80,0x80,0x01)到 2097151(0xFF,0xFF,0x7F)
4 个字节时, 从 2097152(0x80,0x80,0x80,0x01)到 268435455(0xFF,0xFF,0xFF,0x7F)
MQTT-3.1.1-CN 17
非规范评注
非负整数 X 使用变长编码方案的算法如下:
do
encodedByte = X MOD 128
X = X DIV 128
// if there are more data to encode, set the top bit of this byte
if ( X > 0 )
encodedByte = encodedByte OR 128
endif
'output' encodedByte
while ( X > 0 )
MOD 是模运算, DIV 是整数除法, OR 是位操作或(C 语言中分别是%, /, |)
非规范评注
剩余长度字段的解码算法如下:
multiplier = 1
value = 0
do
encodedByte = 'next byte from stream'
value += (encodedByte AND 127) * multiplier
multiplier *= 128
if (multiplier > 128*128*128)
throw Error(Malformed Remaining Length)
while ((encodedByte AND 128) != 0)
AND 是位操作与(C 语言中的&)
这个算法终止时, value 包含的就是剩余长度的

主要是说数据字节长度的计算:

每个字节由1个持续位和7个数据位组成:如果持续位为1,表示接下来的一个字节仍然表示长度的一部分

7个数据位表示的数据     0-127   共计128个数字

所以如上图的表格所示 1个字节,2个字节,3个字节,4个字节的数据范围

切记:MQTT长度的表示范围 最多使用4个字节  故这里存在着数据长度的限制  (不过真心牛掰! 试试QQ你就知道,QQ能一次性传送的长度真没多长,有一次传了个代码,直接告诉我太长了,太,长,了`````) 256MB够你嗨的一塌糊涂了!  ibm开发的挺不错的协议!

然后举个栗子,比如信息数据的长度是367

367/128=2....111

111+128=239---》0xEF  (因为之后还有一个字节数据 2 ,所以需要加上128  mqtt采用的大端字节序)

2---》0x02

所以367--->0xEF 0x02

 

以上是关于MQTT通信协议 剩余长度总结的主要内容,如果未能解决你的问题,请参考以下文章

MQTT 单片机端讲解

网络编程——物联网利器MQTT通信协议详解

网络编程——物联网利器MQTT通信协议详解

物联网之MQTT3.1.1和MQTT5协议 (12) UNSUBACK 报文

MQTT - Connect报文解析

Linux应用开发第十六章MQTT协议分析应用开发