MQTT 通讯协议

MQTT通讯协议详解:核心原理与工作机制

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种轻量级、基于发布/订阅模式的消息传输协议,专为低带宽、高延迟、不稳定网络环境下的物联网设备通信设计。它由IBM于1999年发布,目前主流版本为3.1.1,最新版本为5.0(2019年发布)。

一、核心概念与组件

1. 三大核心角色

角色 功能 示例
客户端(Client) 发起连接、发布消息、订阅主题、接收消息 传感器、手机APP、PLC、嵌入式设备
代理服务器(Broker) 消息路由中心,接收、过滤、转发消息 EMQX、Mosquitto、AWS IoT、Azure IoT Hub
发布者(Publisher) 向Broker发布消息的客户端 温度传感器发布环境数据
订阅者(Subscriber) 向Broker订阅主题的客户端 手机APP接收智能家居状态更新

关键特性 :发布者和订阅者完全解耦,无需知道对方存在,仅通过主题(Topic)和Broker进行交互。

2. 核心通信模型:发布/订阅模式(Pub/Sub)

MQTT摒弃了传统的点对点通信模式,采用更灵活的发布/订阅模型

  • 发布者将消息发送到Broker指定主题,无需等待响应
  • 订阅者向Broker订阅感兴趣的主题,无需知道消息来源
  • Broker负责将消息准确分发给所有订阅该主题的客户端
  • 支持一对多多对多通信,极大降低系统耦合度

二、通讯原理:完整工作流程

1. 连接建立流程

MQTT基于TCP/IP协议(或WebSocket),必须先建立可靠的网络连接。

复制代码
客户端(Client)                 Broker(服务器)
    |                            |
    |-------- TCP连接请求 ------->|
    |<------- TCP连接确认 -------|
    |                            |
    |--------- CONNECT --------->|  客户端发送连接请求,包含:
    |                            |  - 客户端ID(Client ID)
    |                            |  - 用户名/密码(可选)
    |                            |  - 保持连接时间(Keep Alive)
    |                            |  - 遗嘱消息(Will Message,可选)
    |<-------- CONNACK ----------|  服务器返回连接确认,包含:
    |                            |  - 连接状态码(0=成功)
    |                            |  - 会话状态(是否恢复旧会话)

关键参数

  • 客户端ID:全局唯一标识,Broker通过它识别客户端
  • 保持连接时间:客户端需每隔该时间的一半发送PINGREQ心跳包,Broker返回PINGRESP确认连接有效
  • 遗嘱消息:客户端异常断开时,Broker自动发送的预设消息,用于通知其他客户端设备离线状态

2. 主题订阅流程

复制代码
客户端(Subscriber)             Broker
    |                            |
    |-------- SUBSCRIBE -------->|  订阅请求,包含:
    |                            |  - 一个或多个主题过滤器
    |                            |  - 每个主题的QoS等级
    |<-------- SUBACK ----------|  订阅确认,包含:
    |                            |  - 每个主题的最大QoS等级(由Broker决定)

主题(Topic)规则

  • 采用层级结构 ,用/分隔,如home/livingroom/temperature
  • 支持通配符
    • +:匹配单层主题,如home/+/temperature匹配home/bedroom/temperature
    • #:匹配多层主题(只能在末尾),如home/#匹配home/bedroom/temperaturehome/kitchen/humidity
  • 主题区分大小写,无预设主题,动态创建无需提前配置

3. 消息发布与路由流程

复制代码
客户端(Publisher)              Broker              客户端(Subscriber)
    |                            |                    |
    |--------- PUBLISH --------->|                    |  发布消息,包含:
    |                            |                    |  - 主题(Topic)
    |                            |                    |  - 消息负载(Payload)
    |                            |                    |  - QoS等级
    |                            |                    |  - 保留标志(Retain Flag)
    |                            |--------- PUBLISH ->|  Broker转发消息
    |                            |<-------- PUBACK ---|  (根据QoS等级可能有确认)
    |<-------- PUBACK -----------|                    |

保留消息(Retain Message)

  • 发布时设置RETAIN=1,Broker会保存该主题的最后一条保留消息
  • 新订阅者连接时,会立即收到该主题的保留消息,无需等待新消息发布

4. 连接断开流程

复制代码
客户端                          Broker
    |                            |
    |-------- DISCONNECT ------->|  客户端主动发送断开请求
    |                            |  (或网络异常断开)
    |<------- TCP断开 -----------|
  • 正常断开:客户端发送DISCONNECT报文,Broker清理会话资源
  • 异常断开:Broker在Keep Alive时间内未收到心跳,判定为离线,触发遗嘱消息(如有)

三、消息格式:控制报文结构

MQTT控制报文最小仅2字节,极大减少网络开销。

1. 固定头(Fixed Header) - 所有报文都有

含义
7-4 消息类型(1-14,共14种)
3 DUP标志(是否重发消息)
2-1 QoS等级(0-2)
0 RETAIN标志(是否保留消息)
剩余长度 可变字节编码,指示剩余数据长度(1-4字节)

14种消息类型

类型 名称 功能
1 CONNECT 客户端连接请求
2 CONNACK 连接确认
3 PUBLISH 发布消息
4 PUBACK QoS 1消息确认
5 PUBREC QoS 2消息接收确认
6 PUBREL QoS 2消息释放
7 PUBCOMP QoS 2消息完成
8 SUBSCRIBE 订阅请求
9 SUBACK 订阅确认
10 UNSUBSCRIBE 取消订阅
11 UNSUBACK 取消订阅确认
12 PINGREQ 心跳请求
13 PINGRESP 心跳响应
14 DISCONNECT 断开连接

2. 可变头(Variable Header) - 部分报文有

包含特定于消息类型的信息,如:

  • CONNECT:协议名称、版本、连接标志、保持连接时间
  • PUBLISH:主题名称、消息ID(仅QoS>0时)
  • SUBACK:消息ID、返回码数组

3. 有效载荷(Payload) - 部分报文有

实际传输的数据内容,如:

  • CONNECT:客户端ID、用户名、密码、遗嘱主题、遗嘱消息
  • PUBLISH:应用程序数据(任意格式,如JSON、二进制)
  • SUBSCRIBE:主题过滤器数组

四、服务质量(QoS)等级:消息可靠性机制

MQTT提供3种QoS等级,满足不同场景的可靠性需求。

QoS等级 名称 可靠性 实现机制 适用场景
0 至多一次(At most once) 低(可能丢失) 无确认机制,发送即丢弃 传感器数据、环境监测、非关键状态更新
1 至少一次(At least once) 中(确保到达,可能重复) 发送-确认机制(PUBLISH→PUBACK) 控制指令、报警信息、需确保送达的数据
2 仅一次(Exactly once) 高(确保到达且仅一次) 四步握手机制(PUBLISH→PUBREC→PUBREL→PUBCOMP) 计费系统、金融交易、关键命令执行

QoS 2详细流程(最高可靠性)

复制代码
发布者(Publisher)              Broker              订阅者(Subscriber)
    |                            |                    |
    |--------- PUBLISH(QoS2) --->|                    |  MsgID=123
    |<-------- PUBREC ----------|                    |  接收确认
    |                            |--------- PUBLISH(QoS2)--->|  MsgID=123
    |                            |<-------- PUBREC ----------|  接收确认
    |--------- PUBREL --------->|                    |  释放请求
    |                            |--------- PUBREL --------->|  释放请求
    |<-------- PUBCOMP ---------|                    |  完成确认
    |                            |<-------- PUBCOMP ---------|  完成确认

五、会话管理与会话持久化

MQTT支持会话(Session) 概念,用于在客户端断开连接后保留未完成的消息和订阅信息。

1. 会话类型

会话类型 特点 适用场景
清洁会话(Clean Session) 连接时设置Clean Session=1,断开后Broker删除所有会话数据 临时设备、一次性连接、无需恢复状态的场景
持久会话(Persistent Session) 连接时设置Clean Session=0,断开后Broker保留: - 未完成的QoS 1/2消息 - 订阅信息 - 遗嘱消息 长期运行设备、需要恢复连接状态的场景

2. 消息队列机制

  • 持久会话中,Broker为每个客户端维护两个队列:
    • 发送队列:等待客户端确认的消息
    • 接收队列:客户端离线时收到的消息,待重新连接后发送
  • 队列长度和消息保留时间由Broker配置决定

六、关键特性与设计原则

核心设计原则

  1. 精简:只保留必要功能,最小化协议开销
  2. 发布/订阅:解除应用耦合,支持灵活消息路由
  3. 动态主题:零运维成本,无需预先配置
  4. 低带宽优化:最小化数据包大小,提高传输效率
  5. 网络适应性:考虑低带宽、高延迟、不稳定网络
  6. 会话控制:支持持久会话,确保消息不丢失
  7. 资源友好:适合计算能力有限的嵌入式设备
  8. 服务质量:提供不同级别的可靠性选择
  9. 数据无关:不限制负载内容格式,保持灵活性

其他重要特性

  • 遗嘱机制(Will Message):客户端异常断开时,Broker自动发送预设消息,通知其他设备其离线状态
  • 心跳机制:客户端定期发送PINGREQ,Broker返回PINGRESP,确保连接有效性
  • 安全机制:支持用户名/密码认证、TLS/SSL加密(默认端口8883)、ACL访问控制
  • 跨平台:可运行于TCP、WebSocket,支持多种编程语言和操作系统

七、应用场景

MQTT广泛应用于以下领域:

  • 物联网(IoT):智能家居、工业物联网(IIoT)、智能农业、环境监测
  • 移动应用:即时通讯、消息推送、位置跟踪
  • 远程监控:医疗设备、能源管理系统、智能城市基础设施
  • 低带宽环境:卫星通信、偏远地区设备、移动网络(2G/3G)

总结

MQTT的核心优势在于轻量级、高可靠、低带宽消耗灵活的发布/订阅模型。它通过Broker作为消息枢纽,实现了设备间的解耦通信,同时提供QoS等级、会话管理、遗嘱消息等机制保障消息传递的可靠性和系统稳定性。这些特性使MQTT成为物联网领域事实上的标准协议,广泛应用于各种资源受限和网络不稳定的场景中。

相关推荐
钰珠AIOT2 小时前
在电源的滤波电路中10uf 和100nF 的电容滤波的频率大概是多少?如何计算?
单片机·物联网
Alonse_沃虎电子2 小时前
沃虎音频变压器:专业音频系统中的关键组件
网络·物联网·音视频·产品·方案·变压器·电子元器件
飞睿科技3 小时前
解析ESP-SparkBot开源大模型AI桌面机器人的ESP32-S3核心方案
人工智能·嵌入式硬件·物联网·机器人·esp32·乐鑫科技·ai交互
安科瑞刘鸿鹏173 小时前
电量和碳量如何建立关系?企业能碳管理的关键一步
运维·网络·物联网·安全
想放学的刺客4 小时前
单片机嵌入式试题(第20期)通信协议深度解析与系统调试实战
stm32·单片机·嵌入式硬件·物联网·51单片机
Tao____14 小时前
JAVA开源物联网平台
java·物联网·mqtt·开源·ruoyi
想放学的刺客16 小时前
单片机嵌入式嵌入式试题(第16期):硬件可靠性设计与复杂状态机架构设计
c语言·stm32·单片机·嵌入式硬件·物联网
北京耐用通信17 小时前
耐达讯自动化Profibus总线光纤中继器在轨道交通信号系统中的应用
网络·科技·物联网·自动化·信息与通信
云里物里18 小时前
物联网墨水屏电子价签可以支持NFC刷新吗?
物联网·电子价签·电子标签·电子墨水屏标签·电子标签系统