C语言实现MQTT协议(一)协议讲解

      最后更新:2022-04-07 14:11:56 手机定位技术交流文章

      MQTT介绍

      MQTT是用于分发和订阅客户服务结构的信息传输协议。它的用意是明亮、开放、基本和指令。易于实现。由于这些特点,它对许多局势来说是一个极好的选择。特别是在机器对机器通讯(M2M)和物联网(IoT)等受限制地区。

      特点

      简单和可实现的开放式信息通讯协议

      1. 订阅模式,多条消息发送
      2. 基于 TCP/IP 的网络连接
      3. 1字节固定页眉、2字节心跳和紧纸结构
      4. 信息 QOS 支持, 以及有保证的传输可靠性 。

      优点

      MQTT协议广泛用于实体联网、移动互联网、智能硬件、汽车连接、发电和其他领域。

      1. 材料联网中的M2M通信,材料联网中的大规模数据收集
      2. 关于Android的最新消息,WEB新闻
      3. 传输即时消息,例如Facebook Messenge
      4. 智能硬件、智能家具和智能电器都是智能技术的例子。
      5. 车辆对车辆的通信,以及在发电站收集立桩
      6. 远程医疗、远程教育和智能城市

      一些术语的解释

      网络连接

      MQTT的基本传输协议(TCP)结构。

      • 客户使用它连接到服务。
      • 它确保有秩序的、可靠的双向字节流动。

      应用消息

      MQTT 协议通过网络发送数据。 使用 MQTT 时, 信件会与服务的质量和主题事项挂钩 。

      客户端

      使用 MQTT 的软件或设备。 客户端总是通过网络连接到服务。 这样可以 。

      • 信息被发送到其他相关客户..
      • 无法关闭临时文件夹:%s。
      • 无法关闭临时文件夹:%s。
      • 从服务端断开连接。

      服务端

      一种软件或设备,作为发送信息的客户和需要订阅的客户之间的中间人。

      • 允许客户端网络连接
      • 应接受客户应用程序通信。
      • 处理客户的订阅要求并终止订阅。
      • 无法将信件附加到 mh 文件夹:%s:%s

      订阅

      订阅内容包括主题过滤器(Topic过滤器)和最高服务质量水平(Qos)。

      主题名

      将一个标签附加到符合订阅条件且为服务器所知的应用程序消息上。服务器向每个匹配客户端发送一份应用程序消息副本。

      会话

      服务对象与服务对象之间的状态沟通:有些课程仍无限期地与网络连接,而另一些课程则可能在服务对象和服务对象的许多连续网络连接中进行扩展。

      MQTT 控制报告格式

      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。

      剩余长度的范围:在这里插入图片描述
      编码伪代码如下:
      在这里插入图片描述
      以下是相关的解码方法:
      在这里插入图片描述
      每份报告将覆盖下一个变数信头和有效载荷。

      剩余长度的代码已被破译。

      编码剩余长度

      解码剩余长度

      控制报文

      我将只报道几篇最重要和经常使用的文章, 并以实例来解释这些文章。

      CONNECT 服务器连接

      在建立客户对服务网络连接时,客户向服务发送的第一个信息必须是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 连接确认请求

      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(三) 来源说明和将阿里云连接起来

      源文件下载链接

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

          热门文章

          文章分类