概念
| 特性 | 描述 |
|---|
| 协议类型 | 应用层协议(基于 TCP/IP) |
| 通信模式 | 发布/订阅(Publish/Subscribe) |
| 网络开销小 | 报文头仅 2 字节起,非常轻量 |
| 保持长连接 | 使用 Keep Alive 机制,适合持续连接的设备 |
| 面向物联网 | 广泛用于智能家居、传感器网络、车联网、工业自动化等 |
通信模型
三个核心角色:
| 角色 | 说明 |
|---|
| Client(客户端) | 连接到Broker,发布消息或订阅消息 |
| Broker(消息代理) | 中心节点,负责接收、过滤、分发消息 |
| Topic(主题) | 类似于路径字符串,如 home/temperature,用于消息分类 |
通信过程:
+---------+ publish(msg) +--------+ deliver(msg) +---------+
| ClientA | -------------------------> | Broker | -------------------------> | ClientB |
| | topic: /sensor/temp | | topic: /sensor/temp | |
+---------+ +--------+ +---------+
- ClientA 发布消息到主题
/sensor/temp - Broker 接收到消息后,将其转发给所有订阅该主题的客户端(如ClientB)
消息结构
MQTT 报文头部非常小,典型的报文格式包括:
+-----------+-------------+----------------+
| FixedHeader | VariableHeader | Payload |
+-----------+-------------+----------------+
- FixedHeader:消息类型、QoS 等信息,占 2 字节起
- VariableHeader:可选,如 Topic 名称、消息标识符
- Payload:消息实际内容
报文类型(固定14种)
| 报文类型 | 描述 |
|---|
| CONNECT | 客户端请求建立连接 |
| CONNACK | 连接确认 |
| PUBLISH | 发布消息 |
| PUBACK/PUBREC/… | QoS确认机制相关报文 |
| SUBSCRIBE | 订阅主题 |
| SUBACK | 订阅确认 |
| UNSUBSCRIBE | 取消订阅 |
| PINGREQ/PINGRESP | 保活机制 |
| DISCONNECT | 客户端断开连接 |
QoS 服务质量等级(Quality of Service)
| 等级 | 含义 | 说明 |
|---|
| 0 | 至多一次(at most once) | 不保证送达,可能丢失 |
| 1 | 至少一次(at least once) | 保证至少送达一次,可能重复 |
| 2 | 仅一次(exactly once) | 保证仅送达一次,最安全但最慢 |
MQTT 保持连接机制
- 使用
PINGREQ 和 PINGRESP 消息定期心跳检查 Keep Alive 超时时,Broker 可以主动断开连接
安全机制
| 机制 | 说明 |
|---|
| 用户名密码 | Client可在 CONNECT 报文中提供 |
| TLS/SSL | 支持基于 TLS 加密的连接 |
| ACL | Access Control List 控制发布/订阅权限 |
与其他协议比较
| 协议 | 优点 | 缺点 |
|---|
| MQTT | 轻量、低带宽、实时性好 | 需要保持长连接 |
| HTTP | 易用、成熟、兼容性强 | 不适合实时推送 |
| CoAP | 更轻、更适合资源受限设备 | 兼容性差、不如MQTT通用 |
| AMQP | 企业级功能强 | 复杂、开销大 |
常用工具/服务器
| 名称 | 类型 | 说明 |
|---|
| Mosquitto | Broker | 轻量级、开源、高性能 MQTT Broker |
| EMQX | Broker | 支持百万级连接,功能强大 |
| HiveMQ | 商业/企业级 | 可视化管理、集群支持 |
| MQTT.fx | 客户端工具 | 测试 MQTT 连接、发布、订阅 |