什么是 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

适用场景

大规模物联网、全球分布式设备、需要弹性扩展

优势

  • 高可用性(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

适用场景

工业控制、低延迟要求、数据主权敏感、弱网环境

优势

  • 超低延迟:本地处理 < 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

数据流向

层级 延迟 用途
现场设备 → 现场 Broker ms 级 实时控制
现场 Broker → 边缘 Broker 10ms 级 区域协同
边缘 Broker → 云端 Broker 100ms 级 全局优化
云端存储 秒级 AI 训练/BI

MQTT 底层传输协议

核心答案:TCP/IP 为主,WebSocket 为辅

应用层 MQTT 协议(发布订阅/遗嘱/QoS/保持会话)
传输层 TCP / WebSocket(可靠传输/端口 1883/8883/8083)
网络层 IP(IPv4/IPv6)

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

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 确认

PUBLISHPUBACK

QoS 2

Exactly once

消息恰好传递一次,最可靠但开销最大

PUBLISHPUBRECPUBRELPUBCOMP