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 剩余长度字段的大小
字节数 | 最小值 | 最大值 |
1 | 0 (0x00) | 127 (0x7F) |
2 | 128 (0x80, 0x01) | 16 383 (0xFF, 0x7F) |
3 | 16 384 (0x80, 0x80, 0x01) | 2 097 151 (0xFF, 0xFF, 0x7F) |
4 | 2 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通信协议 剩余长度总结的主要内容,如果未能解决你的问题,请参考以下文章