MQTT协议
MQTT是一种极其轻量级的消息传输协议,专为低带宽、高延迟或不稳定的网络环境(如物联网IoT)而设计,它采用发布/订阅模式,非常适合 设备与服务器之前的通信。
一、MQTT是什么
MQTT 的全称是 Message Queuing Telemetry Transport(消息队列遥测传输)。
Message Queuing: 最初与 IBM 的 WebSphere MQ(一种消息队列产品)集成。
Telemetry Transport: 主要用于远程监测和传输数据(遥测)。
它由 IBM 的 Andy Stanford-Clark 和 Arcom(现为 Cirrus Link)的 Arlen Nipper 在 1999 年发明,最初用于通过卫星连接石油管道传感器。现在,它已成为 OASIS 标准,是物联网领域最主流的通信协议。
二、核心特点和设计理念
- 极度轻量且高效:
- 协议头非常小(最小只有 2 字节),最大限度地减少了网络带宽消耗。
- 消息内容可以被有效编码,减少传输数据量。
- 基于发布/订阅(Pub/Sub)模式:
- 在 C/S 模式中,客户端直接与特定的服务器地址通信。而在 Pub/Sub 模式中,通信由一个代理服务器(Broker)中转。
- 发布者(Publisher):负责产生并发送消息的客户端(例如,一个温度传感器)。
- 订阅者(Subscriber):负责接收消息的客户端(例如,一个手机App或服务器)。
- 主题(Topic): 消息的分类标识符,类似于一个“频道”或“地址”。发布者和订阅者都通过主题来路由消息,而不需要知道彼此的存在。例如,传感器可以向主题 `home/livingroom/temperature` 发布温度数据,而任何订阅了这个主题的客户端都会收到数据。
- 对不稳定网络的友好支持:
- MQTT 提供了服务质量(QoS)等级,允许开发者根据场景在“传输可靠性”和“网络负载”之间进行权衡:
- QoS 0(最多一次): 消息最多交付一次,可能会丢失。速度最快。
- QoS 1(至少一次): 消息至少交付一次,但可能会重复。
- QoS 2(确保一次): 消息确保只交付一次。最可靠,但也最慢。为此,带有唯一消息 ID 的消息会存储两次,首先来自发送者,然后是接收者。QoS 级别 2 在网络中具有最高的开销,因为在发送方和接收方之间需要两个流
- 持久会话与遗嘱消息:
- 持久会话: 客户端可以要求 Broker 保存其订阅信息和可能错过的消息(当它离线时),以便重连后恢复,减少重复通信的开销。
- 遗嘱消息(Last Will and Testament, LWT): 客户端在连接时可以设置一个“遗嘱”。如果它意外断开连接(例如网络故障),Broker 会自动代表它向指定主题发布这条遗嘱消息,通知其他设备该客户端异常离线了。
三、核心概念与工作流程
- MQTT 代理(Broker):
-
- 这是整个协议的核心,是一个服务器(例如 `mqtt.eclipse.org` 或 `test.mosquitto.org` 是公共测试 Broker)。
- 所有客户端都连接到 Broker。
- 负责接收发布者的消息,并根据主题将其转发给所有订阅了该主题的订阅者。
- MQTT 客户端:
-
- 任何运行 MQTT 库的设备或应用,可以是发布者、订阅者,或两者皆是。
- 从微控制器(如 Arduino)到大型服务器、手机App,都可以是 MQTT 客户端。
- 工作流程:
- 所有客户端(发布者和订阅者)都与 Broker 建立连接。
- 订阅者向 Broker 订阅它感兴趣的主题(例如 `sensor/temperature`)。
- 发布者向 Broker 的某个主题发布一条消息。
- Broker 收到消息后,会立即将其转发给所有订阅了该主题的客户端(订阅者)。
- 发布者和订阅者之间完全解耦,互不知晓对方的存在。
四、主要优点
低功耗:适用于电池供电的设备。
带宽占用少:适合窄带物联网(NB-IoT)等按数据流量计费的网络。
实时性好:消息推送延迟低。
语言和平台无关性:有各种编程语言(C, C++, Java, Python, JavaScript...)的实现库。
可扩展性强:一个 Broker 可以轻松连接成千上万的客户端。
五、典型应用场景
1、物联网(IoT): 智能家居(控制灯光、空调,接收传感器数据)、智能农业、工业 4.0(设备监控)。
2、移动应用: 聊天App、推送通知。
3、车联网(V2X): 车辆与基础设施之间的通信。
4、即时通讯: 虽然不常见,但也可以用于构建简单的聊天应用。
MQTT 是一个为资源受限环境和分布式系统而生的高效、异步消息通信协议。其发布/订阅模式和服务质量等级使其成为物联网设备间通信的事实标准,完美解决了在不稳定网络中高效、可靠传输数据的问题。在物联网中很常见。