什么是 MQTT?
MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅模式的轻量级消息传输协议,专为低带宽、高延迟或不可靠的网络环境设计。
📡 发布/订阅模式
解耦消息生产者和消费者,通过主题(Topic)进行消息路由
🪶 轻量级
最小数据包仅 2 字节,适合资源受限的 IoT 设备
🔌 三种 QoS 级别
QoS 0(最多一次)、QoS 1(至少一次)、QoS 2(恰好一次)
🔄 持久会话
支持离线消息和遗嘱消息(Last Will)
MQTT Broker
Broker 是 MQTT 架构的核心,负责接收、过滤、存储和转发所有消息。
📬 消息路由
根据主题将消息分发给所有订阅的客户端
💾 会话管理
维护客户端连接状态和订阅关系
📮 离线消息
为离线客户端缓存 QoS 1/2 消息
🔒 安全认证
支持用户名密码、TLS、客户端证书等
常见 Broker 实现
| Broker | 语言 | 特点 | 适用场景 |
|---|---|---|---|
| Eclipse Mosquitto | C |
轻量级、低功耗、Eclipse 基金会项目 | 嵌入式设备、边缘计算 |
| EMQX | Erlang |
高并发、分布式、支持百万连接 | 大规模 IoT 平台 |
| HiveMQ | Java |
企业级、可扩展、支持集群 | 企业应用 |
| VerneMQ | Erlang |
分布式、高可用、开源 | 云原生应用 |
| RabbitMQ | Erlang |
多协议支持、成熟稳定 | 通用消息队列 |
| NanoMQ | C |
超轻量、边缘计算优化 | 边缘网关 |
部署位置
☁️ 公有云
- AWS IoT Core
- Azure IoT Hub
- 阿里云 IoT Platform
- 腾讯云 IoT Explorer
✅ 免运维、弹性扩展、全球可用
❌ 成本较高、数据出域
🏢 私有化部署
- 自建数据中心
- 私有云环境
- Kubernetes 集群
✅ 数据可控、定制灵活、合规
❌ 需运维、初期投入大
🖥️ 边缘部署
- 工业网关
- 边缘服务器
- 树莓派等设备
✅ 低延迟、离线可用、带宽节省
❌ 资源受限、管理分散
快速开始:使用 Mosquitto
# 安装 Mosquitto (macOS)
brew install mosquitto
# 安装 Mosquitto (Ubuntu/Debian)
sudo apt-get install mosquitto mosquitto-clients
# 启动 Broker
mosquitto -c /etc/mosquitto/mosquitto.conf
# 测试:终端 1 - 订阅
mosquitto_sub -h localhost -t "test/topic" -v
# 测试:终端 2 - 发布
mosquitto_pub -h localhost -t "test/topic" -m "Hello MQTT"
配置示例:mosquitto.conf
# 监听端口
listener 1883
# 匿名访问(生产环境建议关闭)
allow_anonymous false
# 密码文件
password_file /etc/mosquitto/passwd
# TLS 加密
listener 8883
cafile /etc/mosquitto/ca.crt
certfile /etc/mosquitto/server.crt
keyfile /etc/mosquitto/server.key
# 持久化
persistence true
persistence_location /var/lib/mosquitto/
# 日志
log_dest file /var/log/mosquitto/mosquitto.log
log_type error
log_type warning
MQTT Broker 部署架构
1. 云端部署(Cloud)
graph TB
subgraph Cloud["公有云/私有云"]
LB["负载均衡器"]
subgraph Cluster["MQTT Broker 集群"]
N1["节点 1"]
N2["节点 2"]
N3["节点 3"]
end
DB[("时序数据库")]
RULE["规则引擎"]
end
LB --> N1
LB --> N2
LB --> N3
N1 --> DB
N2 --> DB
N3 --> DB
N1 --> RULE
N2 --> RULE
N3 --> RULE
DeviceA["设备 A
传感器"] --> LB DeviceB["设备 B
摄像头"] --> LB DeviceC["设备 C
控制器"] --> LB
传感器"] --> LB DeviceB["设备 B
摄像头"] --> LB DeviceC["设备 C
控制器"] --> LB
适用场景
大规模物联网、全球分布式设备、需要弹性扩展
优势
- 高可用性(99.99%+ SLA)
- 弹性伸缩(百万级并发)
- 免运维(托管服务)
- 全球 CDN 加速
主流云服务商
| 服务商 | 产品名称 | 特点 |
|---|---|---|
| AWS | AWS IoT Core | 与 AWS 生态深度集成 |
| Azure | Azure IoT Hub | 企业级安全合规 |
| 阿里云 | 物联网平台 | 国内低延迟,中文支持 |
| 华为云 | IoTDA | 边缘协同能力强 |
2. 边缘部署(Edge)
graph TB
subgraph Edge["工厂/园区/楼宇"]
EB["边缘 MQTT Broker
Mosquitto/EMQX Edge"] Local["本地处理
实时控制"] Bridge["云端桥接
数据同步"] EB --> Local EB --> Bridge end subgraph Devices["现场设备层"] PLC["PLC 控制器
Modbus/OPC UA"] Sensor["传感器
温度/压力"] AGV["AGV 小车
MQTT over 5G"] Arm["机械臂
实时控制"] end PLC --> EB Sensor --> EB AGV --> EB Arm --> EB
Mosquitto/EMQX Edge"] Local["本地处理
实时控制"] Bridge["云端桥接
数据同步"] EB --> Local EB --> Bridge end subgraph Devices["现场设备层"] PLC["PLC 控制器
Modbus/OPC UA"] Sensor["传感器
温度/压力"] AGV["AGV 小车
MQTT over 5G"] Arm["机械臂
实时控制"] end PLC --> EB Sensor --> EB AGV --> EB Arm --> EB
适用场景
工业控制、低延迟要求、数据主权敏感、弱网环境
优势
- 超低延迟:本地处理 < 10ms
- 离线自治:断网时继续工作
- 数据安全:敏感数据不出厂
- 带宽节省:仅上传汇总数据
硬件形态
- 工业网关(研华/研祥)
- 边缘服务器(戴尔 Edge 系列)
- ARM 盒子(树莓派集群)
- 5G MEC 节点
3. 边云协同(混合部署)
graph TB
subgraph Cloud["云端中心"]
CB["云端 MQTT Broker 集群
全局管理/AI 训练/大数据分析"] Rule["规则引擎
数据流转"] DW[("数据仓库
时序 DB")] CB --> Rule CB --> DW end subgraph Edge["边缘层"] EB["边缘 MQTT Broker
区域汇聚/本地决策"] end subgraph Field["现场层"] FB["现场 MQTT Broker
产线级/设备级"] end subgraph Devices["终端设备"] D1["传感器"] D2["执行器"] D3["HMI 屏"] end Cloud <-->|加密隧道/SD-WAN| Edge Edge <--> Field Field --> D1 Field --> D2 Field --> D3
全局管理/AI 训练/大数据分析"] Rule["规则引擎
数据流转"] DW[("数据仓库
时序 DB")] CB --> Rule CB --> DW end subgraph Edge["边缘层"] EB["边缘 MQTT Broker
区域汇聚/本地决策"] end subgraph Field["现场层"] FB["现场 MQTT Broker
产线级/设备级"] end subgraph Devices["终端设备"] D1["传感器"] D2["执行器"] D3["HMI 屏"] end Cloud <-->|加密隧道/SD-WAN| Edge Edge <--> Field Field --> D1 Field --> D2 Field --> D3
数据流向
| 层级 | 延迟 | 用途 |
|---|---|---|
| 现场设备 → 现场 Broker | ms 级 | 实时控制 |
| 现场 Broker → 边缘 Broker | 10ms 级 | 区域协同 |
| 边缘 Broker → 云端 Broker | 100ms 级 | 全局优化 |
| 云端存储 | 秒级 | AI 训练/BI |
MQTT 底层传输协议
核心答案:TCP/IP 为主,WebSocket 为辅
应用层
MQTT 协议(发布订阅/遗嘱/QoS/保持会话)
传输层
TCP / WebSocket(可靠传输/端口 1883/8883/8083)
网络层
IP(IPv4/IPv6)
数据链路层/物理层
以太网/WiFi/4G/5G/LoRa/Zigbee
1. TCP(主要方式)
sequenceDiagram
participant C as 客户端
participant B as Broker
Note over C,B: TCP 三次握手
C->>B: SYN
B-->>C: SYN-ACK
C->>B: ACK
Note over C,B: MQTT 连接建立
C->>B: CONNECT
B-->>C: CONNACK
Note over C,B: 保持长连接(心跳)
loop 每 60 秒
C->>B: PINGREQ
B-->>C: PINGRESP
end
默认端口
| 端口 | 协议 | 说明 |
|---|---|---|
1883 |
MQTT over TCP | 明文传输 |
8883 |
MQTT over TLS/SSL | 加密传输 |
8083 |
MQTT over WebSocket | 浏览器连接 |
8084 |
MQTT over WebSocket Secure | 加密 Web 连接 |
为什么选择 TCP?
- 可靠传输:内置重传机制,保证数据不丢
- 有序到达:消息按发送顺序到达
- 长连接支持:适合物联网设备持续在线
- 流量控制:防止网络拥塞
2. TLS/SSL(安全加密层)
sequenceDiagram
participant C as 客户端
participant B as Broker
Note over C,B: TLS 握手阶段
C->>B: Client Hello
B-->>C: Server Hello + Certificate
C->>B: Client Key Exchange
B-->>C: Change Cipher Spec
Note over C,B: 加密 MQTT 通信
C->>B: CONNECT (加密)
B-->>C: CONNACK (加密)
C->>B: PUBLISH/SUBSCRIBE (加密)
加密内容
- 设备证书(X.509)双向认证
- 用户名/密码加密传输
- 所有 MQTT 报文 AES 加密
- 防止中间人攻击/窃听
3. WebSocket(浏览器支持)
graph LR
subgraph Browser["浏览器/小程序"]
JS["JavaScript MQTT Client
MQTT.js / Paho"] end subgraph WS["WebSocket 帧封装"] Header["WebSocket Header
FIN, OPCODE, MASK..."] Payload["MQTT Packet
PUBLISH/SUBSCRIBE..."] end subgraph Broker["MQTT Broker"] TCP1883["1883/TCP"] WS8083["8083/WebSocket"] end JS -->|ws://broker:8083/mqtt| WS WS -->|TCP 传输 | Broker WS --> Header WS --> Payload
MQTT.js / Paho"] end subgraph WS["WebSocket 帧封装"] Header["WebSocket Header
FIN, OPCODE, MASK..."] Payload["MQTT Packet
PUBLISH/SUBSCRIBE..."] end subgraph Broker["MQTT Broker"] TCP1883["1883/TCP"] WS8083["8083/WebSocket"] end JS -->|ws://broker:8083/mqtt| WS WS -->|TCP 传输 | Broker WS --> Header WS --> Payload
WebSocket 优势
- 浏览器原生支持,无需插件
- 穿透防火墙(使用 80/443 端口)
- 与 HTTP 共享服务器端口
4. 其他底层协议
| 协议 | 端口 | 适用场景 | 特点 |
|---|---|---|---|
| TCP | 1883 | 标准物联网设备 | 最常用,成熟稳定 |
| TLS | 8883 | 安全敏感场景 | 金融/医疗/政府 |
| WebSocket | 8083 | Web 应用/小程序 | 浏览器直接连接 |
| WSS | 8084 | 安全 Web 应用 | WebSocket over TLS |
| QUIC | 8884 | 低延迟移动场景 | 基于 UDP,抗弱网 |
| MQTT-SN | 1884 | 极受限传感器 | 无 TCP 开销,更轻量 |
MQTT 架构
发布者
发送消息的客户端
→
Broker
消息代理服务器
Mosquitto, EMQX, HiveMQ
→
订阅者
接收消息的客户端
图 1: MQTT 基本架构 - 所有消息通过 Broker 中转
主题(Topic)
主题是 UTF-8 编码的字符串,使用斜杠分隔层级:
home/living-room/temperature
factory/line-1/sensor/pressure
device/001/status
通配符
| 通配符 | 说明 | 示例 |
|---|---|---|
+ |
单层通配符 | home/+/temperature |
# |
多层通配符 | home/# |
服务质量(QoS)
QoS 0
At most once
消息最多传递一次,不保证送达,无确认机制
PUBLISH
QoS 1
At least once
消息至少传递一次,可能重复,需要 PUBACK 确认
PUBLISH → PUBACK
QoS 2
Exactly once
消息恰好传递一次,最可靠但开销最大
PUBLISH → PUBREC → PUBREL → PUBCOMP