MQTT 固定报头中的剩余长度介绍

MQTT协议中的剩余长度(Remaining Length)是一个重要的概念,它表示当前报文剩余部分的字节数,包括可变报头和负载的数据,但不包括用于编码剩余长度字段本身的字节数。以下是对MQTT剩余长度的详细说明:

一、剩余长度的位置和表示

  • 位置:剩余长度从MQTT报文的第二个字节开始表示,即紧跟在固定报头之后。
  • 表示:剩余长度使用一个变长度编码方案,根据可变报头和负载数据的实际长度动态变化。它可以是一个字节、两个字节、三个字节或最多四个字节来表示。

二、剩余长度的编码方式

  • 单字节编码:对于小于128的剩余长度值,它使用单字节编码。在这个字节中,低7位(bit 0到bit 6)用于编码数据,最高位(bit 7)用作延续位(continuation bit)。如果最高位为0,表示剩余长度就是这一个字节所表示的值;如果最高位为1,则表示后续还有字节用于表示剩余长度。
  • 多字节编码:对于大于或等于128的剩余长度值,需要使用多个字节来表示。每个字节的低7位用于编码数据,最高位用作延续位。延续位为1表示后续还有字节,为0则表示这是最后一个字节。

三、剩余长度的取值范围

  • 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报文的剩余长度需要表示300个字节,由于300大于127,因此不能只用一个字节表示。需要使用两个字节来表示,计算过程如下::

  • 第一个字节:最高位为1(延续位),低7位表示1(因为300/128=2余44,商为2,二进制0000 0010,但因为是延续位,所以实际写入的是1000 0010,即十六进制的0x82)。
  • 第二个字节:表示余数44,即二进制0010 1100,十六进制为0x2C。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 05:58:02       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 05:58:02       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 05:58:02       57 阅读
  4. Python语言-面向对象

    2024-07-19 05:58:02       68 阅读

热门阅读

  1. uniapp自定义tabBar

    2024-07-19 05:58:02       21 阅读
  2. Redis

    2024-07-19 05:58:02       14 阅读
  3. 构建RSS订阅机器人:观察者模式的实践与创新

    2024-07-19 05:58:02       20 阅读
  4. 手机日历如何与Outlook同步

    2024-07-19 05:58:02       21 阅读
  5. IPython:提升Python编程体验的魔法工具

    2024-07-19 05:58:02       15 阅读
  6. Python中的构造方法、析构方法和__str__方法

    2024-07-19 05:58:02       18 阅读