最后更新:2022-04-07 14:11:56 手机定位技术交流文章
MQTT是用于分发和订阅客户服务结构的信息传输协议。它的用意是明亮、开放、基本和指令。易于实现。由于这些特点,它对许多局势来说是一个极好的选择。特别是在机器对机器通讯(M2M)和物联网(IoT)等受限制地区。
简单和可实现的开放式信息通讯协议
MQTT协议广泛用于实体联网、移动互联网、智能硬件、汽车连接、发电和其他领域。
MQTT的基本传输协议(TCP)结构。
MQTT 协议通过网络发送数据。 使用 MQTT 时, 信件会与服务的质量和主题事项挂钩 。
使用 MQTT 的软件或设备。 客户端总是通过网络连接到服务。 这样可以 。
一种软件或设备,作为发送信息的客户和需要订阅的客户之间的中间人。
订阅内容包括主题过滤器(Topic过滤器)和最高服务质量水平(Qos)。
将一个标签附加到符合订阅条件且为服务器所知的应用程序消息上。服务器向每个匹配客户端发送一份应用程序消息副本。
服务对象与服务对象之间的状态沟通:有些课程仍无限期地与网络连接,而另一些课程则可能在服务对象和服务对象的许多连续网络连接中进行扩展。
MQTT 管理信件结构 。
| 所有控制都限制在一个固定页眉内。 |
|---|
| 部分控制可变信头 。 |
| 有效载荷有效载荷,部分列入控制报告 |
固定报头的格式
报告的管制类型如下:

最常见和最关键的报告类型是Centure、Connack、PUBLIS、SubCRBE、SubACK、PINGREQ、PINGRESP和Discontect。
在此不显示定义控制电文类型所需的路标, 并摘要列出每份提交文件 。
剩余长度( 保存长度) 代表当前提交文件剩余部分的字节, 包括可变页眉和负载数据。 剩余长度不包含编码剩余长度字段本身所需的字节 。
以下是剩余长度的编码 :
剩余长度字段使用变量长度编码算法。如果值小于128,则由单字节编码。更大的价值处理如下。用于数据编码的低 7 位有效比特,如果有更多字节,则使用最有效的最高职位来表示这一点。因此,每个字节可以编码128数据加一个扩展位。其余的长度字段可保持最多4字节。
例如,小数64将以64和十六进制0x40值的字节编码为字节。
321(=65+2*128) 代号为两个字节, 有效位置最低。 第一个字节是 65+128 = 193. 注意最高位置 。
1表示至少缺少一个字节,第二个字节为2。
剩余长度的范围:
编码伪代码如下:
以下是相关的解码方法:
每份报告将覆盖下一个变数信头和有效载荷。
编码剩余长度
解码剩余长度
我将只报道几篇最重要和经常使用的文章, 并以实例来解释这些文章。
在建立客户对服务网络连接时,客户向服务发送的第一个信息必须是CONECT信息。
第一个字节无疑是 0x10;剩余的长度 = 变量页眉+有效载荷,因此剩余长度在计算后确定;剩余长度最多可达四个字节,因此我们保留四个字节。
| byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 |
|---|---|---|---|---|---|---|---|
| 10 | ? | ? | ? | ? | ? | ? | ? |
应当指出,上表中的数据为16位数。
CONNECT提交文件的变量页眉按以下顺序有四个字段:礼宾级别,保持连接( 保持生命), 通过连接旗牌 。
协议名字节构成

协议名称数据是固定的,直接转换为以16伏为基础的输入数据。
| byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 |
|---|---|---|---|---|---|---|---|
| 10 | ? | ? | ? | ? | 00 | 04 | 4D(‘M’) |
| 51(‘Q’) | 54(‘T’) | 54(‘T’) | ? | ? | ? | ? | ? |
协议级别字节构成
| byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 |
|---|---|---|---|---|---|---|---|
| 10 | ? | ? | ? | ? | 00 | 04 | 4D(‘M’) |
| 51(‘Q’) | 54(‘T’) | 54(‘T’) | 04 | ? | ? | ? | ? |
连接标志
如MQTT协议(通常使用用户名和密码)所述,匹配位置视需要设为1个,以便第六和第七位按要求设为1个,其余位设为0xC2。
| byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 |
|---|---|---|---|---|---|---|---|
| 10 | ? | ? | ? | ? | 00 | 04 | 4D(‘M’) |
| 51(‘Q’) | 54(‘T’) | 54(‘T’) | 04 | C2 | ? | ? | ? |
保持连接时间
在这里,我设定它为300秒, 转换成16位数的01 2C, 并警告你 高位字节即将来临。
| byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 |
|---|---|---|---|---|---|---|---|
| 10 | ? | ? | ? | ? | 00 | 04 | 4D(‘M’) |
| 51(‘Q’) | 54(‘T’) | 54(‘T’) | 04 | C2 | 01 | 2C | ? |
CONNECT报告的有效载荷(有效载荷)有一个或一个以上的字段,其长度预先固定,而目前的载荷(有效载荷)包含以下信息:变量页眉表示是否应该包括这些字段。如果包含的话,客户身份识别、客户身份识别、客户身份识别、客户身份识别、客户身份识别、客户身份识别、客户身份识别、客户身份识别遗嘱主题,遗嘱消息,用户名,密码。
字段的格式
在连接符号中,我只使用用户名和密码,因此我们必须提供客户身份识别资料、用户名和密码。
假如客户端标识是"Client1"它转换为16位数的系统,数据长度为4,6C 69,65,6E 74 31,数据长度为7,16位数的系统为00,07(注意到数据长度占两个字节,前面的字节更高)。
| byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 |
|---|---|---|---|---|---|---|---|
| 10 | ? | ? | ? | ? | 00 | 04 | 4D(‘M’) |
| 51(‘Q’) | 54(‘T’) | 54(‘T’) | 04 | C2 | 01 | 2C | 00 |
| 07 | 43 | 6C | 69 | 65 | 6E | 74 | 31 |
也就是说,如果用户名和密码字段相同。
剩余长度计算如下:剩余长度=可变页眉+有效载荷,剩余长度为19字节,随后编码为0x13。
其结果是,最近提交的 " 良心 " 报告是:
| byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 |
|---|---|---|---|---|---|---|---|
| 10 | 13 | 00 | 04 | 4D(‘M’) | 51(‘Q’) | 54(‘T’) | 54(‘T’) |
| 04 | C2 | 01 | 2C | 00 | 07 | 43 | 6C |
| 69 | 65 | 6E | 74 | 31 |
CONNACC 连接确认请求是服务端发给客户端的报文。
第一个字节为 0x20, 确定长度后计算为 0x20 。
| byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 |
|---|---|---|---|---|---|---|---|
| 20 | ? | ? | ? | ? | ? | ? | ? |
在MQTT协议中,连接确认标记具有特殊意义。
连接到返回代码的值在下面显示。 如果服务发送客户端 0x00, 连接成功; 否则, 连接是一个错误 。
是的,如果连接由服务提供人向我们提出并得到服务提供人承认。
| byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 |
|---|---|---|---|---|---|---|---|
| 20 | ? | ? | ? | ? | 00 | 00 | ? |
报告内没有有效载荷。
论文直截了当,当翻译成十六进制 0x02时,剩下的长度等于2。
最后得到就是下表。
| byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 |
|---|---|---|---|---|---|---|---|
| 20 | 02 | 00 | 00 |
服务器向客户端发送信息,或服务器向客户端发送信息。
以下是客户与服务器沟通的例子。
第一个字节为 0x30, 其余的标记设为 0, 相同的字节设为 0 或 1, 视具体情况而定 。
| byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 |
|---|---|---|---|---|---|---|---|
| 30 | ? | ? | ? | ? | ? | ? | ? |
按顺序排列,变量页眉包括主题名称和电文标识。
只有当质保等级为1或2时,才在普巴利西什报告中显示纸张识别栏。
假设主题为ABCQOS 水平 0; 主题名称长度 3; 翻译为十六进制003; 是
| byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 |
|---|---|---|---|---|---|---|---|
| 30 | ? | ? | ? | ? | 00 | 03 | 41(A) |
| 42(B) | 43(C) | ? | ? | ? | ? | ? | ? |
有效载荷包含将要广播的应用信息。数据内容和格式是独一无二的。
如果我们要发送信息..Hello是,转换为48 65 65 6C 6C 6F
| byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 |
|---|---|---|---|---|---|---|---|
| 30 | ? | ? | ? | ? | 00 | 03 | 41(A) |
| 42(B) | 43(C) | 48(H) | 65(e) | 6C(l) | 6C(l) | 6F(o) | ? |
剩余总长度为10,即0xA0。
| byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 |
|---|---|---|---|---|---|---|---|
| 30 | A0 | 00 | 03 | 41(A) | 42(B) | 43(C) | 48(H) |
| 65(e) | 6C(l) | 6C(l) | 6F(o) |
客户端向服务器发送 ApplyCRBE 信件, 以创建一个或多个订阅。 每个订阅者注册的客户端都有一个或多个感兴趣的主题 。
注意第一个字节为 0x82 。
| byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 |
|---|---|---|---|---|---|---|---|
| 82 | ? | ? | ? | ? | ? | ? | ? |
客户名 ID 存储在可变页眉中 。
假设我们的客户身份是12.34
| byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 |
|---|---|---|---|---|---|---|---|
| 82 | ? | ? | ? | ? | 12 | 34 | ? |
附属机构电文有效载荷必须至少有一对主题过滤器和QOS等级字段。
假设主题名是abc翻译为61,62,6363,长度00,03和质素服务水平
| byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 |
|---|---|---|---|---|---|---|---|
| 82 | ? | ? | ? | ? | 12 | 34 | 00 |
| 03 | 61 | 62 | 63 | 00 |
| byte1 | byte2 | byte3 | byte4 | byte5 | byte6 | byte7 | byte8 |
|---|---|---|---|---|---|---|---|
| 82 | 08 | 12 | 34 | 00 | 03 | 61 | 62 |
| 63 | 00 |
其余文件没有提交。
MQTT (一) C实现了翻译。
介绍MQTT (二) 《C语言实施协定》
C(三) 来源说明和将阿里云连接起来
源文件下载链接
本文由 在线网速测试 整理编辑,转载请注明出处。