MQTT详细介绍
MQTT (Message Queuing Telemetry Transport)详细介绍
MQTT 是一种轻量级的、基于发布/订阅模式的消息传输协议,专为低带宽、高延迟或不可靠的网络环境设计。它由 IBM 的 Andy Stanford-Clark 和 Arlen Nipper 在 1999 年首次设计,最初用于监控通过卫星连接的石油管道。如今,它已成为物联网(IoT)领域消息传递的事实标准,并于 2014 年成为 OASIS 开放标准。
核心概念
-
发布/订阅模式 (Publish/Subscribe Pattern):
- 发布者 (Publisher):消息的发送方。它将消息发布到一个特定的“主题”(Topic)。发布者不直接与订阅者通信,它只关心将消息发送到 Broker。
- 订阅者 (Subscriber):消息的接收方。它向 Broker 订阅感兴趣的“主题”。当有消息发布到这些主题时,Broker 会将消息推送给订阅者。订阅者不直接与发布者通信。
- 代理/中间件 (Broker):核心组件,负责接收来自发布者的消息,并根据订阅关系将消息路由(转发)给相应的订阅者。Broker 解耦了发布者和订阅者。
- 主题 (Topic):消息的“地址”或“标签”。主题是分层结构的字符串,使用
/
作为分隔符(例如home/livingroom/temperature
或sensor/+/data
)。订阅者可以订阅精确的主题,也可以使用通配符来订阅多个主题。
-
客户端 (Client):
- 任何连接到 Broker 并能发布或订阅消息的设备或应用程序都可以称为客户端。一个客户端既可以是发布者,也可以是订阅者,或者两者都是。
主要特点和优势
-
轻量级和高效:
- 消息头部小:MQTT 消息的固定头部只有 2 字节,非常小,减少了网络开销。
- 协议命令简单:定义的命令数量有限(如 CONNECT, PUBLISH, SUBSCRIBE 等),易于实现和理解。
-
低带宽占用:由于消息头部小和协议简洁,非常适合带宽受限的环境。
-
低功耗:对设备端的计算和内存资源要求低,适合电池供电的设备。
-
可靠的消息传递 (Quality of Service - QoS):MQTT 提供了三种不同的服务质量等级,以平衡消息传递的可靠性和网络开销:
- QoS 0 (At most once - 最多一次):消息尽力发送,不保证送达,也不保证仅送达一次(可能丢失,也可能重复)。这是最快的传输方式,开销最小。相当于“发后不管”。
- QoS 1 (At least once - 至少一次):保证消息至少送达一次。接收方需要确认收到消息(PUBACK)。如果发送方没有收到确认,会重发消息,这可能导致消息重复。
- QoS 2 (Exactly once - 精确一次):保证消息仅送达一次。这是最可靠的级别,但也是开销最大、最慢的。它通过一个四步握手机制(PUBREC, PUBREL, PUBCOMP)来确保不丢失也不重复。
-
会话感知 (Session Awareness):
- Clean Session (清理会话):当客户端连接 Broker 时,可以设置
CleanSession
标志。CleanSession = true
:客户端断开连接后,Broker 会清除其所有会话信息(包括订阅关系和未发送的 QoS 1/2 消息)。客户端重新连接时,需要重新订阅。CleanSession = false
(Persistent Session - 持久会话):客户端断开连接后,Broker 会保留其会话信息。当客户端(使用相同的 Client ID)重新连接时,Broker 会将会话期间错过的 QoS 1 和 QoS 2 消息发送给它,并且订阅关系也会被保留。这对于网络不稳定的客户端非常重要。
- Clean Session (清理会话):当客户端连接 Broker 时,可以设置
-
遗嘱机制 (Last Will and Testament - LWT):
- 客户端在连接 Broker 时可以指定一个“遗嘱”消息。如果客户端异常断开(例如掉电、网络故障,而不是正常发送 DISCONNECT 包),Broker 会自动将这个遗嘱消息发布到指定的主题。这使得其他客户端可以感知到某个设备意外离线。
-
保留消息 (Retained Messages):
- 当发布者向某个主题发布一条消息时,可以将该消息标记为“保留消息”。Broker 会存储这条被标记为“保留”的最新消息。当有新的订阅者订阅这个主题时,Broker 会立即将这条保留消息发送给它,这样新的订阅者就能立刻获取到该主题的最新状态,而无需等待下一次发布。
-
Keep Alive (心跳机制):
- 客户端在连接时可以设置一个 Keep Alive 时间间隔。在此间隔内,如果客户端没有发送任何其他控制报文,它必须发送一个 PINGREQ 报文给 Broker,Broker 会响应 PINGRESP。这使得双方能够检测到连接是否仍然有效,防止因中间网络设备超时而断开连接。
MQTT 报文结构
MQTT 报文由三部分组成:
- 固定报头 (Fixed Header):所有 MQTT 报文都包含。包含报文类型、标志位(如 DUP, QoS, RETAIN)和剩余长度。
- 可变报头 (Variable Header):某些报文类型包含。例如,PUBLISH 报文的可变报头包含主题名和报文标识符(用于 QoS 1 和 2)。
- 有效载荷 (Payload):消息的实际内容。对于 PUBLISH 报文,这是应用程序数据。Broker 不关心 Payload 的具体格式,它可以是 JSON、XML、二进制数据等。其最大长度可达 256MB,但通常远小于此值。
常用的 MQTT 控制报文类型
CONNECT
:客户端请求连接到 Broker。CONNACK
:Broker 响应连接请求。PUBLISH
:发布消息。PUBACK
:发布回执 (QoS 1)。PUBREC
:发布收到 (QoS 2 第一步)。PUBREL
:发布释放 (QoS 2 第二步)。PUBCOMP
:发布完成 (QoS 2 第三步)。SUBSCRIBE
:客户端订阅主题。SUBACK
:订阅回执。UNSUBSCRIBE
:客户端取消订阅主题。UNSUBACK
:取消订阅回执。PINGREQ
:心跳请求。PINGRESP
:心跳响应。DISCONNECT
:客户端请求断开连接。
工作流程示例
- 连接:客户端 A 和 B 都向 Broker 发送
CONNECT
请求。Broker 回复CONNACK
。 - 订阅:客户端 B 向 Broker 发送
SUBSCRIBE
请求,订阅主题sensor/temp
。Broker 回复SUBACK
。 - 发布:客户端 A 向 Broker 发送
PUBLISH
请求,将消息(例如温度数据)发布到主题sensor/temp
。 - 转发:Broker 收到来自客户端 A 的消息后,检查其订阅列表,发现客户端 B 订阅了
sensor/temp
主题,于是将该消息转发给客户端 B。
主题通配符 (Topic Wildcards)
MQTT 订阅时支持两种通配符:
- 单层通配符
+
:匹配主题层级中的单个层级。- 例如:
sensor/+/temperature
可以匹配sensor/livingroom/temperature
和sensor/bedroom/temperature
,但不能匹配sensor/temperature
或sensor/livingroom/office/temperature
。
- 例如:
- 多层通配符
#
:匹配主题层级中的任意数量的层级(包括零层),并且必须是主题的最后一级。- 例如:
sensor/bedroom/#
可以匹配sensor/bedroom/temperature
、sensor/bedroom/humidity/raw
甚至sensor/bedroom
(如果 Broker 支持)。 #
单独使用表示订阅所有主题(通常不推荐,可能导致 Broker 和客户端负载过高)。
- 例如:
安全性
MQTT 本身协议层面提供的安全机制比较基础,但可以通过以下方式增强:
- 网络层安全:使用 TLS/SSL (MQTT over TLS/SSL,通常端口为 8883) 对通信数据进行加密,防止窃听和篡改。
- 应用层认证:
- Client ID:每个连接到 Broker 的客户端必须有唯一的 Client ID。
- 用户名/密码:
CONNECT
报文中可以包含用户名和密码,Broker 可以据此进行认证。
- 授权 (ACL - Access Control Lists):Broker 可以配置 ACL,限制特定用户(或 Client ID)对特定主题的发布和订阅权限。
- 消息加密:Payload 本身可以由应用程序进行加密,Broker 不感知其内容。
常见的 MQTT Broker 实现
- Mosquitto:一个流行的开源 MQTT Broker,轻量级且易于部署。
- EMQX:一个大规模分布式 MQTT Broker,功能丰富,支持海量并发连接。
- HiveMQ:一个企业级的 MQTT Broker,提供商业支持和高级特性。
- VerneMQ:另一个高性能、可扩展的开源 MQTT Broker。
- 云服务商提供的 MQTT 服务:如 AWS IoT Core, Azure IoT Hub, Google Cloud IoT (虽然 Google Cloud IoT 将停用,但曾是选项) 等,它们通常集成了 MQTT Broker 功能,并提供了设备管理、数据处理等附加服务。
应用场景
MQTT 因其特性被广泛应用于:
- 物联网 (IoT):智能家居、工业自动化 (IIoT)、智慧城市、可穿戴设备、环境监测、车联网等。
- 移动应用:消息推送(如 Facebook Messenger 曾使用 MQTT)。
- SCADA 系统:监控和数据采集。
- 遥测:收集和传输来自远程设备的数据。
总结
MQTT 是一种简单、轻量、灵活且可靠的消息协议,通过其发布/订阅模型和不同级别的服务质量,能够有效地在各种网络条件下连接设备和应用。其对资源的高效利用使其成为物联网通信的理想选择。理解其核心概念(Broker、发布/订阅、主题、QoS、会话)是使用和部署 MQTT 的关键。