最后更新:2022-03-25 04:32:37 手机定位技术交流文章
MQTT 是一个信息传输协议,使客户能够发送和订阅信件。它是明亮的,开放的,直截了当的。并且设计易于实施。应用这些特点,这些特点非常适合用于各种情况。包括受限制的环境,例如,在环境方面,机器到机器(M2M)和物联网(IoT)通信。对小型代码足迹和(或)网络带宽的要求很重要。
该协议使用TCP/IP或其他网络协议执行,这些协议提供定购、无损、双向通信。
字节中的位数从 7 到 0 编号。 第 7 位是最有效的位置, 第 0 位是最低的可接受位置 。
整数数据值为16位长:高位位居第一,然后是低位位。这意味着网络上显示的16位位是最大有效位位(MSB),其次是最低有效位位(LSB) 。
例如,16位数整数 1 的代码值为 0x00x01, 之前的高度为 0x00, 之后的低位置为 0x01 。
前两个字节标出长度,长度编码规则与2.2定义、UTF-8代码字符串符合RFC 3629规格。

编码规则:
U+00..U+10(UTF-16可访问范围)中的字符用1至4 8位数的序列编码为 UTF-8 。
特别强调的是,收到的编码数据范围如下,服务/客户必须终止链接。
- 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字逐字编码。
MQTT 协议通过交换 MQTT 控制数据包的指定序列来运行。这些数据包的结构在本节中提供。 MQTT 控制包最多由三块组成,始终按图中显示的顺序排列。
每个MQTT控制包包括一个固定信头,见图2.2 -- -- 固定信头格式。
字节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
下图说明可支持的剩余长度范围:
在 MQTT 控制数据包的某些类型中可以找到变量页眉组件。 它们位于固定和有效载荷之间。 变量页眉的内容根据软件包的类型而变化。 变量页眉的数据包识别字段在许多数据包类型中可以找到。
2字节数据包识别字段包括在控制包类型若干可变页头组件中。这些控制数据包是 PUBLISH(其中 QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK。
订阅、取消订阅和发布(在 QoS > 0 的情况下)控制数据包必须包含非零的 16 位数据包标识符 [MQTT-2.3.1-1]。
如果 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总协定结构大大简化,随后是特别协定指示。
参考链接:
本文由 在线网速测试 整理编辑,转载请注明出处。