MQTT从入门到提高(三):MQTT3.1.1协议应用详解(1)- 协议框架

      最后更新:2022-03-25 04:32:37 手机定位技术交流文章

      文章目录

        • 1. 概述
        • 2. 数据编码规则
          • 2.1 位
          • 2.2 整数数据值
          • 2和3 UTF-8 编码字符串
        • MQTT 的三种控制包格式
          • MQTT 控制套件的结构 3.1
            • 3.1.1 固定头
              • MQTT 控制软件包类型
              • 标记 标记标记
              • 仍可用长度
          • 3.1.2 可变数据页眉
          • 三. 一. 三

      1. 概述

      MQTT 是一个信息传输协议,使客户能够发送和订阅信件。它是明亮的,开放的,直截了当的。并且设计易于实施。应用这些特点,这些特点非常适合用于各种情况。包括受限制的环境,例如,在环境方面,机器到机器(M2M)和物联网(IoT)通信。对小型代码足迹和(或)网络带宽的要求很重要。

      该协议使用TCP/IP或其他网络协议执行,这些协议提供定购、无损、双向通信。

      • 电文发布/订阅模式用于发送一对电文以及应用程序连接。
      • 无法启动 Evolution 的邮件组件 。
      • 三种信息提供方法的标准:
        • “ 最多一次” 以运行环境的最大努力为基础发送信号。 信息损失可能会发生。 例如, 这个水平可用于环境传感器数据, 是否丢失一个读数并不重要, 因为下一次读数会很快发布 。
        • “至少一次”以确保传递信息,但信息可以重复。
        • “ 仅仅一次” 就能确保信息只到达一次。 例如, 可以用这一水平来避免信息重复或丢失, 这可能导致使用不准确的成本计算系统。
      • 降低传输成本和交换协议以尽量减少网络通信量
      • 如果出现异常中断,这一制度应通知有关各方。

      2. 数据编码规则

      2.1 位

      字节中的位数从 7 到 0 编号。 第 7 位是最有效的位置, 第 0 位是最低的可接受位置 。

      2.2 整数数据值

      整数数据值为16位长:高位位居第一,然后是低位位。这意味着网络上显示的16位位是最大有效位位(MSB),其次是最低有效位位(LSB) 。

      例如,16位数整数 1 的代码值为 0x00x01, 之前的高度为 0x00, 之后的低位置为 0x01 。

      2和3 UTF-8 编码字符串

      • 以下是UTF-8编码字符串的规则:
        在这里插入图片描述 前两个字节标出长度,长度编码规则与2.2定义、UTF-8代码字符串符合RFC 3629规格。
        在这里插入图片描述

      编码规则:
      U+00..U+10(UTF-16可访问范围)中的字符用1至4 8位数的序列编码为 UTF-8 。

      • 只有一个序列的八位数字节将高度设为0,而其余的七位则用于编码字符编号。
      • 在n-bit 序列内,n>1,n 高度在前八位数组中设定为 1。然后将比特设为零。以下八位位元字节包含字符数的位元编码。以下八字节分别将上一级设置为1,底部位置设定为0。保留 6 位元, 其中每个位元包含要编码的字符的位元 。

      特别强调的是,收到的编码数据范围如下,服务/客户必须终止链接。
      - UTF-8编码字符串不应包含 U+D800 和 U+DFF 之间的任何字符。
      - UTF-8 编码字符串不应包含任何空字符 U+00 。
      - 控制字符 U+001.. U+001F
      - 控制字符 U+007F.. U+009F
      - Unicode 代码点[Unicode]是非字符(例如U+0)

      例如,考虑字母A,然后是代码点U+2A6D4:
      在这里插入图片描述

      UTF-8 编码数据 :
      0x41 0xF0 0xAA 0x9B 0x94
      转换为二进制---->
      0100 0001 1111 0000 1010 1010 1001 1011 1001 0100
      (0x41) (0xF0) (0xAA) (0x9B) (0x94)
      Utf-8编码解析---->
      0100 0001 11110 ‾ underline{1111 0} 1 1 1 1 0 000 10 ‾ underline{10} 1 0 10 1010 10 ‾ underline{10} 1 0 01 1011 10 ‾ underline{10} 1 0 01 0100
      解析规则:
      UTF-8 的字符串编码指南如下:
      0x41: 0字节高, 7个有效数据槽剩余, 其值为 0x41 。
      字节 4 是 0xF0 中的 11 。UTF-8 代码字符串的长度为 4 字节, 正如所解释的 。前缀是110下列千个数据位置是有效的 。之后的字节 10 是前缀 。接下来的六个数据位置是有效的。它价值0010,1010,010,110,1101,0100。以十六进制写成,值为 0x2A6D4。
      最后,原值为 0x2A6D4。

      • UTF-8 字符串用作协议的标识符 。
        • 用户名和密码
        • PUBLISH有一个主题名称。
        • UNSUBSCRSBE 主题过滤器

      为了帮助解码,这些字段尽可能采用UTF-8字逐字编码。

      MQTT 的三种控制包格式

      MQTT 控制套件的结构 3.1

      MQTT 协议通过交换 MQTT 控制数据包的指定序列来运行。这些数据包的结构在本节中提供。 MQTT 控制包最多由三块组成,始终按图中显示的顺序排列。
      在这里插入图片描述

      3.1.1 固定头

      每个MQTT控制包包括一个固定信头,见图2.2 -- -- 固定信头格式。
      在这里插入图片描述

      MQTT 控制软件包类型

      字节1赢了7 -6分
      以4个无符号值表示,见表2.1 - 控制包类型。
      在这里插入图片描述

      标记 标记标记

      目前只支持 PUBLISH 的标识配置, 其余则保存下来, 供未来使用 。
      在这里插入图片描述

      • DUP
        如果 DUP 标识设为 0, 这意味着这是客户端或服务器首次尝试传输此 MQTT PUBLISH 数据包。 如果 DUP 标识设为 1, 这意味着这可能是先前发送数据包时的再传输 。
        当客户端或服务器试图重新传输 PUBLISH 数据包时 [MQTT-3].DUP指标必须定为1。[MQTT-3]. 三. 1- 2DUP 符号必须设定为零值 。

      • QoS

      • RETAIN
        如果保留标识设置为 1, 服务器必须保存客户向服务器提供的 PUBLISH 数据包中的应用程序消息和 QOS, 以便传递给符合其主题名称的未来用户 。

      仍可用长度

      开始用字节 2 和工作你的方式上去。

      剩下的长度是当前数据包中剩下的字节数,包括变量页眉和有效载荷中的数据。它不包含编码剩余长度所需的字节数。

      剩余长度使用变量长度编码算法编码。此选项使用单个字节表示最高值127。以下列方式处理更大的价值。数据的编码使用每个字节最小的七位元。表达式的最大值表示表达式中有一个以下字节。因此,字节有128个代码值加上“连续位元 ” 。剩余长度字段的字节最多为四个字节。

      已达到:编码规则C语文:

      例如,请参考小数小数321 代号321 十六进制序列 0xC1 0x02。
      计算过程:
      X = 321
      code = X % 128 = 65
      X = X / 128 = 321 / 128 = 2
      Byte1:code | 128 = 65 | 128 = 0xC1
      code = X % 128 = 2 % 128 = 2
      Byte2:code = 2

      下图说明可支持的剩余长度范围:
      在这里插入图片描述

      3.1.2 可变数据页眉

      在 MQTT 控制数据包的某些类型中可以找到变量页眉组件。 它们位于固定和有效载荷之间。 变量页眉的内容根据软件包的类型而变化。 变量页眉的数据包识别字段在许多数据包类型中可以找到。
      在这里插入图片描述2字节数据包识别字段包括在控制包类型若干可变页头组件中。这些控制数据包是 PUBLISH(其中 QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK。

      订阅、取消订阅和发布(在 QoS > 0 的情况下)控制数据包必须包含非零的 16 位数据包标识符 [MQTT-2.3.1-1]。

      • 当客户提供其中一种类型的新数据集时,必须指定一个目前尚未使用的数据包识别码[MQTT-2]。
      • 如果客户再次发送特定控制软件包,则在随后重新发送该软件包时必须使用相同的软件包识别码。软件包识别码可在客户处理相关确认软件包后再使用。
      • 这是对QOS 1 PUBLISH的匹配的PUBACK;对QOS 2的匹配是PUBCOMP。
      • 与子包件或UBACK[MQTT-2].II.1-3有关,用于子包件或UNSUBICBE。
      • 当服务器发送具有 QoS > 0 [MQTT-2.3.1-4]的 PUBLISH 时,相同的条件适用于服务器。

      如果 PUBLISH 数据包的 QOS 值设为 0 [MQTT-2]. 3. 1- 5, PUBLISH 数据包不得包含数据包 ID 。

      PUBACK、PUBREC或PUBREL数据包必须具有与原始PUBLISH数据包相同的数据包识别码[MQTT-2]。同样,SubACK 和UNSUBACK 必须包含相关辅助计算器和UNSUBRICBE数据集中所使用的数据包识别码[MQTT-2]。

      在分发成套身份识别码时,客户和服务器彼此独立,因此,客户服务器参与并传递使用同一数据集识别码的可能性的信号。
      在这里插入图片描述

      三. 一. 三

      正如第3章所解释的,一些MQTT控制数据包将有效载荷列为包的最后部分,这是PUBLISH数据包中的应用信息。表2.6 - 包括有效载荷在内的控制包列出了需要有效载荷的控制包。
      在这里插入图片描述因此,MQTT总协定结构大大简化,随后是特别协定指示。

      参考链接:

      • MQTT Version 3.1.1 Plus Errata 01

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/20821.html

          热门文章

          文章分类