MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级的消息传输协议,专为物联网(IoT)设备设计。它基于发布/订阅模式,具有低带宽、低功耗、高可靠的特点,非常适合资源受限的设备和不稳定的网络环境。
MQTT能够在物联网领域广泛应用,得益于以下特点:
MQTT基于客户端-服务器架构,包含两种角色:
MQTT 发布/订阅模式
flowchart LR
P["发布者 Publisher"]
B["MQTT Broker
消息代理"]
S1["订阅者1 温度传感器"]
S2["订阅者2 手机App"]
P -->|发布主题| B
B -->|推送| S1
B -->|推送| S2
Broker是MQTT的核心,负责:
常见的MQTT Broker:
客户端可以是任何设备:传感器、手机、服务器等,负责:
MQTT的核心是发布/订阅模式,与传统的点对点通信不同:
graph TB
subgraph 发布者
SENSOR["🌡️ 温度传感器
发布: home/living/temp"]
DEVICE["🚪 门磁传感器
发布: home/door/status"]
end
subgraph Broker["MQTT Broker (代理服务器)"]
B["消息路由
主题订阅管理
QoS处理"]
end
subgraph 订阅者
APP["📱 手机APP
订阅: home/#"]
SERVER["🖥️ 家居服务器
订阅: home/living/temp"]
end
SENSOR -->|发布| B
DEVICE -->|发布| B
B -->|路由| APP
B -->|路由| SERVER
style Broker fill:#fff3e0
图1:MQTT 发布/订阅架构 — 解耦生产者和消费者
graph TB
subgraph QoS0["QoS 0 - 最多一次 (At most once)"]
P0["发布者"] -->|发送一次| B0["Broker"]
B0 -.->|"无确认
可能丢包"| S0["订阅者"]
end
subgraph QoS1["QoS 1 - 至少一次 (At least once)"]
P1["发布者"] -->|发送+等待| B1["Broker"]
B1 -->|PUBACK| P1
B1 -->|转发| S1["订阅者"]
S1 -.->|"无确认"| B1
end
subgraph QoS2["QoS 2 - 恰好一次 (Exactly once)"]
P2["发布者"] -->|PUBLISH| B2["Broker"]
B2 -->|PUBREC| P2
P2 -->|PUBREL| B2
B2 -->|PUBLISH| S2["订阅者"]
S2 -->|PUBCOMP| B2
B2 -->|PUBREC| P2
P2 -.->|"重复检测"| P2
end
style QoS0 fill:#ffcdd2
style QoS1 fill:#fff9c4
style QoS2 fill:#c8e6c9
图2:MQTT 三种 QoS 服务级别对比
**主题(Topic)**:消息的分类,类似文件路径,如 home/livingroom/temperature
**发布(Publish)**:客户端向Broker发送消息到指定主题
**订阅(Subscribe)**:客户端向Broker请求接收指定主题的消息
**通配符**:
+:单层通配符,如 home/+/temperature#:多层通配符,如 home/#MQTT提供3种QoS级别,确保消息可靠传输:
MQTT QoS 三个级别
stateDiagram-v2
Q0["QoS 0: At most once"]
Q1["QoS 1: At least once"]
Q2["QoS 2: Exactly once"]
Q0 --> Q1 --> Q2
MQTT定义了多种消息类型:
| 消息类型 | 方向 | 说明 |
| --- | --- | --- |
| CONNECT | 客户端→Broker | 连接请求 |
| CONNACK | Broker→客户端 | 连接确认 |
| PUBLISH | 双向 | 发布消息 |
| PUBACK | 双向 | QoS 1确认 |
| PUBREC | 双向 | QoS 2接收确认 |
| PUBREL | 双向 | QoS 2释放 |
| PUBCOMP | 双向 | QoS 2完成 |
| SUBSCRIBE | 客户端→Broker | 订阅请求 |
| SUBACK | Broker→客户端 | 订阅确认 |
| UNSUBSCRIBE | 客户端→Broker | 取消订阅 |
| UNSUBACK | Broker→客户端 | 取消订阅确认 |
| PINGREQ | 客户端→Broker | 心跳请求 |
| PINGRESP | Broker→客户端 | 心跳响应 |
| DISCONNECT | 双向 | 断开连接 |
MQTT 报文类型总览
flowchart LR
M1["CONNECT 建立连接"]
M2["PUBLISH 发布消息"]
M3["SUBSCRIBE 订阅主题"]
M4["UNSUBSCRIBE 取消订阅"]
M5["PINGREQ/RESP 心跳"]
M6["DISCONNECT 断开"]
当客户端异常断开时,Broker可以自动发布遗嘱消息:
遗嘱消息常用于设备状态监控。
MQTT使用心跳机制检测连接状态:
通常设置为30-60秒。
MQTT支持多种安全机制:
MQTT广泛应用于各种物联网场景:
| 特性 | MQTT | HTTP |
| --- | --- | --- |
| 模式 | 发布/订阅 | 请求/响应 |
| 开销 | 很小 | 较大 |
| 实时性 | 高 | 低 |
| 连接 | 长连接 | 短连接 |
| 适用场景 | 物联网、实时通信 | Web浏览、API |
---
**延伸阅读**:
**相关工具**: