STM32之MQTT

1. MQTT(物联网协议)是什么(提供稳定,可靠,简单易用的通信基础)

  • MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)协议是基于TCP/IP 协议栈构建的异步 通信消息协议,是一种轻量级的、客户端服务端架构的、发布/订阅模式的消息传输协议。
  • MQTT协议的特点:
    • 简单易用,方便集成。
    • 安全可靠,支持TLS/SSL加密和认证机制。
    • 轻量级,占用带宽小,支持多种消息传输模式。
    • 灵活性,可知设备连接状态,可控数据传输质量。

**2.**MQTT原理

  • 在 MQTT 协议通讯中,最重要的两个角色是服务端和客户端客户端 向一**「主题」「发布」** 消息,服务端 处理并推送给**「订阅」了该「主题」** 的其他客户端
  • 例子:张三(客户端)在美食区(主题)发布了视频,李四关注了张三并且还特别关注(订阅)了张三的美食区(主题)的视频,只要李四一上线服务器会推送关于美食的视频给他,但是,如果张三发布的其他视频,那么李四将不会收到。
  • 服务端
    • MQTT 服务端通常是一台服务器,它充当着 MQTT 信息传输的中心节点 。其主要功能是接收来自 MQTT 客户端的信息并将其传递给其他 MQTT 客户端。此外,MQTT 服务端还负责管理客户端 ,确保客户端之间的通信畅通无阻,并确保 MQTT 消息被正确接收和准确投递。
    • 如图
    • 注:服务端一般就是云平台,OneNET、阿里云、腾讯云等;也可以用 EMQ 或 Mosquitto 自己搭建服务端。
  • 客户端:
    • MQTT 客户端可以向服务端通过「发布」发送信息,也可以从服务端「订阅」来收取信息。
    • 客户端一般就是我们的单片机。
  • 主题:
    • 在 MQTT 通讯中,客户端订阅的是一个个**「主题」** 。MQTT 服务端在管理信息通讯时,使用「主题」来控制。
  • 发布与订阅的特点:
    • 相互独立:客户端相互独立,彼此没有直接联系,不用知道对方的任何状态、情况。(通过服务端关联的,彼此是不会关联)
    • 空间分离:客户端只要连接同一个 MQTT 通讯网络,无论是互联网或者局域网都可以通讯。
    • 时间异步 :客户端的发布与订阅无需同步。若有客户端断连,服务端将保存信息,待客户端上线后推送。

3. MQTT报文

  • MQTT 协议通过交换预定义的 MQTT 控制报文来通信。MQTT 控制报文简称 MQTT 报文。
  • 报文结构:一个 MQTT 报文由固定报头、可变报头、有效载荷 三部分组成。
    • 固定报头(Fixed header),所有 MQTT 报文,表示报文类型报文的分组类标识
    • 可变报头(Variable header),部分 MQTT 报文有,报文类型决定了可变头是否存在及其具体内容
    • 有效载荷/消息体(Payload),部分 MQTT 报文有,存放报文的具体内容
  • 如图:

  • 固定报头**:4-7bit** 是报文类型0-3bit 是控制报文类型的标识符 (DUP,QoS,RET)

    • 报文类型:4-7Bit,如下图
  • 标志位(DUP,Qos,RET)

    • 位于 byte 1 的第 3-0 位,表示 MQTT 报文的分组类标识在不使用标识位的报文类型中,标识位被做为保留位。如果收到无效的标志时,接收端必须关闭网络连接。
    • DUP:发送消息的副本,通常是0
    • Qos:发布消息的服务质量
    • RETAIN:发布保留标识,通常也是0
    • DUP 位和 RET 位在 MQTT 协议中具有特定的作用,默认情况下它们通常设置为 0 ,以符合大多数应用场景的需求。只有在特定情况下,如需要重传或保留消息时,才会将这些标志位设置为 1
  • 图:

  • 剩余长度:位于 byte 2 的 3~0 ,表示当前剩余字节数 ,包括可变报头和有效载荷的数据。
  • 可变报头

    • 某些 MQTT 报文有可变头。它在固定报头和有效载荷之间。可变头的内容根据报文类型 的不同而不同。可变头的报文标识符字段存在于在多个类型的报文里。
  • 有效载荷

    • 有效载荷就是应用消息,但并不是所有的报文都有有效载荷,只有部分 MQTT 报文有有效载荷。

4. 服务质量

  • QoS(Quality of Service,服务质量)。在数据通信的过程中,有的消息很重要,不可以丢失;有的消息不重要,丢了也没关系。所以在 MQTT 中可以配置 QoS,给不同重要程度的消息设置不同的服务质量。

  • MQTT 协议有三种服务质量级别:

    • QoS = 0:最多发一次
    • QoS = 1:最少发一次
    • QoS = 2:保证收一次
  • 对于不同重要级的消息选择不同的 QoS,较为重要消息的使用 QoS = 1 和 QoS = 2。

    • QoS = 0:最多发送一次
      • 这种服务质量消息最多只发送一次。接收者不会发送响应,发送者也不会重发。消息可能送达一次也可能根本没送达。
  • 如图

  • QoS = 1:最少发送一次

    • 服务质量确保消息至少送达一次 。QoS 1 的 PUBLISH 报文的可变报头中包含一个报文标识符,需要 PUBACK 报文确认
    • 消息会被传递至少一次。
    • 如果客户端没有在规定时间内确认收到消息,消息将被重新发送
    • 可能会出现消息重复的情况。
  • 如图:

  • QoS = 2:保证收一次

    • 这是最高等级的服务质量,消息丢失和重复 都是不可接受的 。使用这个服务质量等级会有额外的开销。QoS 2 的消息可变报头中有报文标识符。QoS 2 的 PUBLISH 报文的接收者使用一个两步确认过程来确认收到
    • 消息会被传递恰好一次
    • 使用两阶段提交协议来确保消息不会重复
    • 提供最高的消息服务质量
  • QoS 1 和QoS2区别:

    • QoS 1:消息会被传递至少一次,可能出现重复
    • QoS 2:消息会被传递恰好一次,不会出现重复

5. MQTT心跳机制

  • 由于客户端和服务端在没有数据传输的时候,双方是不知道之间的状态的,不知道是不是还在连接还是已经断连,这时候需要客户端定期发送一些数据包,也可以说是心跳包给服务端,告诉服务端还连接着,然后服务端也回发一条报文,告知客户端

6. MQTT遗嘱

  • 在连接成功的时候,客户端先把自己的遗嘱给服务端,万一客户端意外断连了,服务端就可以执行遗嘱了,公布遗嘱。
  • 意外断线 指的是当客户端在没有发送DISCONNECT 报文的情况下失去了心跳信号,这通常发生在网络故障或电池耗尽等情况下。此时,服务端会察觉到客户端的异常断开,并将客户端的遗嘱消息发布出来。然而,如果客户端正常断开连接并发送了 DISCONNECT 报文,遗嘱则不会启动,服务端也不会发布客户端的遗嘱消息。
相关推荐
Zeku2 小时前
TCP交错传输多通道实现原理
stm32·freertos·linux应用开发
嵌入式×边缘AI:打怪升级日志7 小时前
C语言算术赋值运算复习笔记
c语言·stm32·单片机·算法·51单片机·proteus·代码
LCG元8 小时前
智能农业灌溉:STM32+NB-IoT+土壤湿度传感器,自动控制实战
stm32·物联网·mongodb
光子物联单片机9 小时前
STM32传感器模块编程实践(十八)DIY电子游戏机模型
stm32·单片机·嵌入式硬件
古译汉书9 小时前
【IoT死磕系列】Day 3:学习HTTP!实战:STM32手写GET请求获取天气实战(附源码+八股文)
数据结构·stm32·物联网·网络协议·学习·算法·http
風清掦10 小时前
【江科大STM32学习笔记-06】TIM 定时器 - 6.2 定时器的输出比较功能
笔记·stm32·单片机·嵌入式硬件·学习
uran18 小时前
从电磁兼容到代码优化:STM32 GPIO速度与EMI的隐秘关联
stm32·gpio·emc·嵌入式优化
想放学的刺客18 小时前
整理了120道单片机嵌入式面试题与答案,覆盖了硬件电路和C语言等核心领域。
c语言·c++·stm32·单片机·嵌入式硬件·mcu·51单片机
Decksweeper18 小时前
【大一做毕设?十二天四人从零开始手搓智能小车!(基于rdk x5、stm32与yolo v5,小车可实现巡线,避障,识别与夹取特定物块)】
stm32·嵌入式硬件·yolo·课程设计