STM32玩转物联网实战篇:4.Mqtt通信详解(从通信原理到报文组包再到通信实战)

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

      引入了《MQTT协议》

      Mqtt协议简介

      MQTT是一个机器对机器(M2M)/材料联网(IOT)连接协议,目的是一个轻量级分布/订阅电文运输系统。特别有利于要求较小的代码占用空间和(或)在网络能力方面非常重要的远程连接,专门为受限制设备和低带宽、超长或不可靠的网络而建造。
      MQTT 是一个为客户服务架构的分布/订阅模式所建的信息传输协议 。明亮、开放、不复杂、有控制和容易达到这些品质使得它成为广泛应用的极佳解决办法,特别是在机器对机器通信和物联网等有限情况下。

      MQTT 消息质量

      QQTT建立了一个系统,确保信息持续传递,包括信息响应、存储和转播,该机制提供了三种不同程度的 " 质量服务 " 。

      MQTT消息质量
      QoS0 只能一次发一次发一次发一次;
      QoS1 视MQTT标准而定,是否在发送后至少启动一次再传送;
      QoS2 发送后, 依赖 MQTT 信息系统只保证一次 。

      MQTT 协议方法

      MQTT 协议规定了客户连接服务器、订阅主题、公布主题等机制。

      MQTT方法
      Connect 等待服务器连接 。
      Disconnect 等待 MQTT 客户端完成任务,然后与服务器终止 TCP/ IP 会话 。
      Subscribe 等待完成订阅。
      UnSubscribe 等待服务器取消客户的一个或多个主题订阅 。
      Publish 在发送信件请求后, MQTT 客户端返回程序线索 。

      MQTT 工作原理

      MQTT 协议需要完成客户端和服务器连接, MQTT 协议中有三个身份,在整个通信过程中使用:订户(订阅)、出版商(出版)、代理(印刷)(服务员)发件人和订户都是客户,电文代理是服务器,信息出版商既可以是发件人,也可以是订户。
      MQTT 信息分类如下:主题和内容(有效载荷)两部分:
      (1) 当订阅者订阅(订阅)时,可被视为通信类型的专题将接收关于该主题的信息(有效载荷)。
      (2) 有效载荷,又称电文的内容,系指特别是用户将使用的内容。

      Mqtt 客户请求/回应的步骤
      公布其他客户可能希望收到的信息;
      2. 订阅其他客户的电文;
      3. 通知你已撤回或删除申请;
      4. 从服务器上拔出插件。
      MQTT 服务器请求/回复程序
      1. 接受客户网络连接;
      2. 接受客户提供的应用程序信息;
      3. 客户订阅和退款申请得到处理。
      4. 向用户发送应用程序信息。

      2. Mqtt包装条例

      当你读过简介后 我会教你如何安装MQTT软件包一串十六进制,并通过一个捆绑的程序连接到我们的服务器,实现主题订阅和发布。我将不详细讨论以下各点,但将侧重于几个有充分根据的朋友。别这么残忍,因为我花了一天一小时的时间 来起草这个小组的规则,还有一个星期的时间在肝脏里。谢谢你的帮助。

      (1) MQTT 连接设置

      下面就是我们三个法医小组需要与MQTT联系我们的MQTT服务器就是这样运作的。

      鉴权三元组
      CLIENTID 111|hmvcfu
      USERNAME hmvcfu
      PASSWORD a02d6361531c2dae941d5b022982d944

      MQTT 连接报文

      Bit 描述 HEX 7 6 5 4 3 2 1 0
      固定报头
      byte1 固定报头 0x10 0 0 0 1 0 0 0 0
      剩余长度
      byte2 Length MSB 0x40 0 1 0 0 0 0 0 0
      byte3 Length LSB 0x00 0 0 0 0 0 0 0 0
      协议名称
      byte4 'M' 0x4D 0 1 0 0 1 1 0 1
      byte5 'Q' 0x51 0 1 0 1 0 0 0 1
      byte6 'T' 0x54 0 1 0 1 0 1 0 0
      byte7 'T' 0x54 0 1 0 1 0 1 0 0
      协议级别
      byte8 四(4)级 0x04 0 0 0 0 0 1 0 0
      连接连接的旗帜
      User Name Flag Password Flag Will Retain Will QoS Will Flag Clean Session Reserved
      byte9 连接标志位 0xC0 1 1 0 0 0 0 0 0
      保活时间
      byte10 Length MSB 0x00 0 0 0 0 0 0 0 0
      byte11 Length LSB 0x78 0 1 1 1 1 0 0 0
      客户端ID长度
      byte12 Length MSB 0x00 0 0 0 0 0 0 0 0
      byte13 Length LSB 0x0A 0 0 0 0 1 0 1 0
      客户端ID数据部分
      byte31 如果长度不为零, 这是数据部分 。 0x31 0x31 0x31 0x7C 0x68 0x6D 0x76 0x63 0x66 0x75 0x00 0x06 0x68 0x6D 0x76 0x63 0x66 0x75
      用户名长度
      byte32 Length MSB 0x00 0 0 0 0 0 0 0 0
      byte33 Length LSB 0x06 0 0 0 0 0 1 1 0
      用户名数据部分
      byte39 如果长度不为零, 这是数据部分 。 0x68 0x6D 0x76 0x63 0x66 0x75
      密码长度
      byte40 Length MSB 00 0 0 0 0 0 0 0 0
      byte41 Length LSB 20 0 0 1 0 0 0 0 0
      密码数据部分
      byte69 如果长度不为零, 这是数据部分 。 0x61 0x30 0x32 0x64 0x36 0x33 0x36 0x31 0x35 0x33 0x31 0x63 0x32 0x64 0x61 0x65 0x39 0x34 0x31 0x64 0x35 0x62 0x30 0x32 0x32 0x39 0x38 0x32 0x64 0x39 0x34 0x34

      (2) MQTT订阅主题开发

      在我们订阅该主题之前,我们需要构建一个订阅主题(Topic),以便当订阅者订阅该主题(订阅)时,他将得到关于该主题(有效载荷)的信息。

      订阅主题
      主题名称 sys/hmvcfu/control

      订阅主题报文

      Bit 描述 HEX 7 6 5 4 3 2 1 0
      固定报头
      byte1 固定报头 82 1 0 0 0 0 0 1 0
      变量头长+主题名称长度+服务级别字节=剩余长度
      byte2 Length 17 1 0 0 0 0 0 1 0
      变量头长 = 主题名称长度,以字节为字节+主题名称长度,以字节为字节
      byte3 Length MSB 0x00 0 1 0 0 0 0 0 0
      byte4 Length LSB 0x14 0 0 0 0 0 0 0 0
      主题名称长度
      byte5 Length MSB 0x00 1 0 0 0 0 0 1 0
      byte6 Length LSB 0x12 1 0 0 0 0 0 1 0
      byte24 如果长度不为零, 这是数据部分 。 0x73 0x79 0x73 0x2F 0x68 0x6D 0x76 0x63 0x66 0x75 0x2F 0x63 0x6F 0x6E 0x74 0x72 0x6F 0x6C
      服务质量等级
      byte25 服务质量等级 0x00 0 0 0 0 0 0 0 0

      (3)发布主题准备

      在公布该主题之前,我们必须首先指定一个出版主题(Topic),在包装密封后,信息内容(有效载荷)将送交订阅该主题的订阅者。

      发布主题
      主题名称 sys/hmvcfu/post
      数据包 {“msg”:{“paramdata”:[{“temp”:20,“humi”:98}]}}

      发布主题报文

      Bit 描述 HEX 7 6 5 4 3 2 1 0
      固定报头
      byte1 固定报头 0x30 0 0 1 1 0 0 0 0
      主题名称 长度+包件长度 = 剩余长度
      byte2 Length 0x3E 0 0 1 1 1 1 1 0
      主题名称长度
      byte3 Length MSB 0x30 0 0 1 1 0 0 0 0
      byte4 Length LSB 0x07 0 0 0 0 0 1 1 1
      主题名称
      byte19 紧跟着的是主题名称 0x73 0x79 0x73 0x2F 0x68 0x6D 0x76 0x63 0x66 0x75 0x2F 0x70 0x6F 0x73 0x74
      数据包
      byte64 紧跟着的是数据包 0x7B 0x22 0x6D 0x73 0x67 0x22 0x3A 0x7B 0x22 0x70 0x61 0x72 0x61 0x6D 0x64 0x61 0x74 0x61 0x22 0x3A 0x5B 0x7B 0x22 0x74 0x65 0x6D 0x70 0x22 0x3A 0x32 0x30 0x2C 0x22 0x68 0x75 0x6D 0x69 0x22 0x3A 0x39 0x38 0x7D 0x5D 0x7D 0x7D

      3. 正在打击MQTT通信。

      这是我们将要使用的 MQTT 服务器。 这是由 EMQ 建立的官方的公共 MQTT 服务器, 可以自由使用 。

      MQTT服务器
      IP地址 broker-cn.emqx.io
      端口号 1883

      (1) MQTT.fx 工具(模拟客户端)建立与服务器的连接。

      为了连接到 MQTT 服务器, 我们打开 MQTT.fx 工具, 输入 IP 地址, 以及三组法医( 事实上, 它可能没有连接到这三组, 而是模仿三个组的存在 ) 。
      在这里插入图片描述

      连接服务器

      在这里插入图片描述

      已抓获 MQTT 连接消息

      在这里插入图片描述

      收集的 MQTT 连接成功回复了此信件 。

      在这里插入图片描述

      订阅主题

      在这里插入图片描述

      记录了 MQTT 订阅量

      在这里插入图片描述

      已成功捕捉到的 MQTT 用户响应此信息 。

      在这里插入图片描述

      发布主题

      在这里插入图片描述

      捕获的 MQTT 释放(未成功回应)

      在这里插入图片描述

      断开连接

      在这里插入图片描述

      已抓获 MQTT 断开消息

      在这里插入图片描述

      (2) 网络调试协助(模拟器)建立了与服务器的连接。

      模仿一个视频机, 我们可以通过网络调试辅助工具传输十六进制数据, 将服务器连接起来。

      网络调试协助连接到服务器 。

      在这里插入图片描述

      网络调试助理订阅主题

      在这里插入图片描述

      网络调试助理发布主题

      在这里插入图片描述

      服务器被网络调试协助断开 。

      在这里插入图片描述

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

          热门文章

          文章分类