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 报文,遗嘱则不会启动,服务端也不会发布客户端的遗嘱消息。
相关推荐
LCG元19 小时前
固件加密保护:STM32F2 Flash读写保护,AES软件加密实现
stm32·嵌入式硬件·mongodb
F1372980155720 小时前
220V降5V,30MA封装SOP-8,WD5201应用于小家电消费类线性稳压器
stm32·单片机·嵌入式硬件·51单片机
泡泡糖的中文规格书21 小时前
STM32G030F6P6中文规格书开放获取(完整中英对照/ARM Cortex-M0+ MCU)
stm32·单片机·嵌入式硬件·pcb设计·硬件设计·中文数据手册
学嵌入式的小杨同学1 天前
STM32 进阶封神之路(十一):串口通信底层原理全解析 ——UART/USART 区别 + 电平标准 + 协议规范(面试重点)
stm32·单片机·嵌入式硬件·mcu·硬件架构·硬件工程·智能硬件
济6171 天前
STM32 I2C 总线通信实战|从原理到 OLED 屏数据收发(超详细)---STM32 HAL库专栏
stm32·嵌入式·stm32hal库编程
Hello_Embed1 天前
LVGL 入门(四):大小坐标与盒子模型
前端·笔记·stm32·单片机·嵌入式
風清掦1 天前
【江科大STM32学习笔记-08】DMA直接存储器存取
笔记·stm32·单片机·嵌入式硬件·学习
17(无规则自律)1 天前
嵌入式 Linux 启动:设备树的加载、传递和解析全流程分析
linux·stm32·嵌入式硬件·unix
爱倒腾的老唐1 天前
05、STM32 开发基础知识
stm32·单片机·嵌入式硬件
香水5只用六神1 天前
【RTOS快速入门】05_动态_静态创建任务(2)
c语言·stm32·单片机·嵌入式硬件·freertos·rtos·嵌入式软件