MQTT 是一种轻量级的、基于发布/订阅模式的消息传输协议。它专为在低带宽、高延迟或不稳定的网络环境中进行高效、可靠的通信而设计。
全称: Message Queuing Telemetry Transport,但现在的官方解释是 MQ Telemetry Transport。
核心思想:将消息的发送者(发布者)与接收者(订阅者)解耦。发布者不关心谁接收消息,订阅者也不关心消息从哪里来,双方只与一个中间代理(Broker)通信。
设计目标:
简单轻量:协议头部很小,最小只有2字节,节省网络流量和设备功耗。
易于实现:客户端库非常小巧,适合嵌入式设备(如单片机)。
可靠性:提供三种服务质量等级,确保消息可靠传递。
双向通信:通过 Broker 可以轻松实现设备到云、云到设备、设备到设备的消息传递。
MQTT 架构包含三个核心角色:
发布者:将消息发送到特定主题的客户端。
订阅者:订阅感兴趣的主题以接收消息的客户端。
代理:MQTT Broker,是整个系统的核心枢纽。它负责接收来自发布者的消息,并根据主题将消息转发给所有订阅了该主题的订阅者。
核心概念:
主题:一个UTF-8字符串,用于标识消息的分类。Broker 根据主题进行消息路由。
结构:层级结构,用斜杠 / 分隔。例如:home/livingroom/temperature, sensor/+/data。
通配符:
+:单层通配符。例如:sensor/+/data 匹配 sensor/1/data,但不匹配 sensor/1/2/data。
#:多层通配符。只能放在末尾。例如:home/# 匹配 home/livingroom/temperature 和 home/kitchen/light。
客户端:任何运行 MQTT 库并连接到 Broker 的设备或应用程序(可以是发布者、订阅者或两者兼有)。
消息:传输的数据载荷,可以是任何格式(JSON, 二进制, 文本等)。
图解工作流程:
发布者 (Publisher) --发布消息到 "topic/A" --> 代理 (Broker) --将消息推送给--> 订阅了 "topic/A" 的订阅者 (Subscriber 1, Subscriber 2)
这是 MQTT 可靠性的核心,定义了消息传递的保证级别。
| QoS 等级 | 名称 | 描述 | 最少次数 | 典型应用场景 |
|---|---|---|---|---|
| QoS 0 | 至多一次 | “发完即忘”。不保证送达,不保证去重。 | 1 | 不重要的数据,如周期性的传感器读数(允许丢失) |
| QoS 1 | 至少一次 | 保证消息至少送达一次,但可能重复。需要确认。 | 2 | 需要确保送达,但可以容忍重复,如控制命令 |
| QoS 2 | 恰好一次 | 最高等级,保证消息有且仅有一次送达。流程最复杂。 | 4 | 非常重要的数据,绝对不能丢失或重复,如金融交易、关键状态更新 |
持久会话:客户端连接时,可以设置 Clean Session = false。这样,当客户端断开连接后,Broker 会为其保留订阅信息和可能的离线消息(QoS 1/2)。客户端重连后能恢复状态并收到离线期间的消息。
遗嘱消息:客户端在连接时可以设置一个“遗嘱”。如果客户端非正常断开(如网络故障),Broker 会自动将这条遗嘱消息发布到指定主题,通知其他客户端该设备已离线。
发布者可以设置消息为“保留”消息。Broker 会为每个主题保存最后一条保留消息。当有新客户端订阅该主题时,它会立即收到这条保留消息,而不必等待下一次发布。这对于获取设备最新状态非常有用。
MQTT 5.0 在 3.1.1 的基础上,增加了大量企业级特性和增强功能,但保持核心协议不变,完全兼容其思想。
| 特性 | MQTT 3.1.1 | MQTT 5.0 |
|---|---|---|
| 原因码 | 连接返回码简单 | 每个操作(连接、发布、订阅等)都有详细的原因码,便于诊断。 |
| 共享订阅 | 不支持 | 支持,可将一个主题的消息负载均衡到一组订阅者,实现水平扩展。 |
| 消息过期 | 不支持 | 消息可以设置生命周期,过期后 Broker 自动丢弃。 |
| 主题别名 | 不支持 | 可以用一个短数字ID(如 1)代替长主题名(如 very/long/topic/name),节省带宽。 |
| 用户属性 | 不支持 | 可以为消息或连接附加自定义键值对元数据,实现更灵活的业务逻辑。 |
| 流量控制 | 较弱 | 新增“接收最大值”等属性,帮助客户端控制接收速度。 |
| 会话过期间隔 | 固定 | 客户端可以指定会话在断开后保留多久。 |
建议:新项目应优先考虑 MQTT 5.0。
物联网:最主要、最经典的应用领域。智能家居(灯光、温控器)、工业物联网(设备监控)、可穿戴设备等。
移动推送:替代部分HTTP长连接,实现 App 的实时消息推送(如聊天、新闻)。
车联网:车辆与云平台之间传输状态、位置、诊断数据。
即时通讯:轻量级的聊天应用。
微服务通信:在服务网格内部,作为轻量级的异步事件总线。
Broker(服务器):
EMQX: 高性能、分布式、云原生的开源 Broker,功能强大,支持 MQTT 5.0。
Mosquitto: Eclipse 基金会的轻量级开源 Broker,非常流行,适合学习和中小型部署。
HiveMQ: 企业级商业 Broker,提供高可靠性和丰富功能。
NanoMQ: 边缘计算场景下的超轻量级 Broker。
云服务商: AWS IoT Core, Azure IoT Hub, 阿里云物联网平台, 腾讯云物联网通信等,都内置了 MQTT Broker 服务。
客户端库:
几乎所有编程语言都有成熟的库:Paho(Python, Java, C等), Eclipse Mosquitto Client Library(C/C++), MQTT.js(JavaScript), MQTTnet(.NET)等。
优点:
极低的开销: 协议头小,省电省流量。
高可扩展性: 发布/订阅模式天然解耦,易于水平扩展。
灵活可靠: 三种 QoS 满足不同场景需求。
双向实时通信: 非常适合设备与云的交互。
生态成熟: 广泛的客户端、Broker 和云服务支持。
缺点:
不适合点对点: 所有通信必须通过 Broker。
安全性依赖实现: 协议本身支持 TLS/SSL 和用户名密码,但需要正确配置。
无内置数据格式: 消息载荷格式需自行定义(通常用 JSON)。
你可以立即在公共 Broker 上体验 MQTT:
工具:使用 MQTTX(桌面客户端)或在线 MQTT 调试工具。
公共 Broker:broker.hivemq.com(端口 1883), test.mosquitto.org(端口 1883)。
简单测试:
用两个客户端连接到同一个公共 Broker。
客户端A订阅主题 my/test/topic。
客户端B向主题 my/test/topic 发布一条消息。
观察客户端A是否立刻收到消息。
MQTT 是物联网和需要高效、异步、双向通信场景下的事实标准协议。它的轻量、可靠、灵活和可扩展性使其在资源受限的环境中表现出色,成为连接物理世界与数字世界的桥梁。
在选择时,如果你需要极致的轻量和简单,或与老旧系统兼容,可选 MQTT 3.1.1。对于新项目,尤其是需要企业级特性的,强烈推荐 MQTT 5.0。
扫描上方二维码,关注撼动科技