MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传递协议,是基于TCP/IP协议栈构建的异步通信消息协议,专为低带宽、不可靠或高延迟的网络环境设计,适用于设备硬件存储空间有限或网络带宽有限的场景,适合需要实时控制的场合,例如常用于物联网(IoT)设备的通信。物联网平台支持设备使用MQTT协议接入MQTT,其优点是可以保持长连接,具有一定的实时性,云端向设备端发送消息,设备端可以在最短的时间内接收到并作出响应。
1. MQTT协议特点
- 轻量级和高效性:MQTT协议非常轻量级,占用带宽极小,适合资源受限的设备。
- 发布/订阅模式:采用发布/订阅(Publish/Subscribe)模式,设备可以发布消息到特定的主题(Topic),其他订阅该主题的设备就能接收到消息。
- 可靠性:提供三种服务质量(QoS)级别,保证消息的可靠传递。
- QoS 0: 至多一次,消息发送即视为成功,不保证到达。
- QoS 1: 至少一次,保证消息至少到达一次,但可能重复。
- QoS 2: 仅一次,确保消息仅到达一次,且不会重复。
2. MQTT的架构
- 客户端(Client):任何发布或订阅消息的设备或应用程序。客户端可以是传感器、手机应用、服务器等。
- 发布其他客户端可能会订阅的信息。
- 订阅其它客户端发布的消息。
- 退订或删除应用程序的消息。
- 断开与服务器连接
- 代理(Broker):服务器端,负责接收、过滤和分发消息给订阅者。常见的开源代理有Eclipse Mosquitto、HiveMQ等。
- 接受来自客户的网络连接。
- 接受客户发布的应用信息。
- 处理来自客户端的订阅和退订请求。
- 向订阅的客户转发应用程序消息。
- MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
- MQTT传输的消息分为:主题(Topic)和负载(payload)两部分
- Topic:可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)。
- Payload:可以理解为消息的内容,是指订阅者具体要使用的内容。
3. 工作流程
-
连接(Connect)
- 客户端初始化连接:客户端向代理发送连接请求(CONNECT报文),包括客户端ID、用户名、密码(如果需要认证)、保持连接时间(Keep Alive)等信息。
- 代理响应连接:代理接收到连接请求后,进行验证并返回连接确认(CONNACK报文)。如果连接成功,客户端与代理之间的连接就建立起来了。
2. 订阅(Subscribe)
- 客户端订阅主题:客户端发送订阅请求(SUBSCRIBE报文)到代理,指定要订阅的主题和服务质量(QoS)等级。
- 代理确认订阅:代理接收到订阅请求后,记录订阅信息,并返回订阅确认(SUBACK报文),确认订阅成功。
3. 发布(Publish)
- 发布者发布消息:发布者客户端发送发布请求(PUBLISH报文)到代理,消息包含主题、消息内容以及QoS等级。
- 代理处理消息:
- 根据消息的QoS等级,决定如何处理消息的确认。
- 将消息转发给所有订阅了该主题的订阅者客户端。
4. 消息分发(Message Distribution)
- 分发消息:代理接收到发布者的消息后,将消息分发给所有订阅了该主题的客户端。
- QoS保证:根据不同的QoS等级,代理和客户端之间会有不同的消息确认机制:
- QoS 0:无需确认,消息尽力发送,不保证到达。
- QoS 1:需要接收者确认(PUBACK报文),确保消息至少到达一次。
- QoS 2:通过四步握手(PUBREC、PUBREL、PUBCOMP报文)确保消息仅到达一次。
5. 保持连接(Keep Alive)
- 保持连接:为了检测客户端与代理之间的连接状态,双方会定期发送心跳(PINGREQ和PINGRESP报文)以维持连接。如果在保持连接时间内未收到心跳消息,连接会被视为断开。
6. 断开连接(Disconnect)
- 客户端断开连接:客户端发送断开请求(DISCONNECT报文)通知代理断开连接。
- 代理处理断开请求:代理接收到断开请求后,释放相关资源,并停止向该客户端发送消息。
4. 应用场景
- 物联网:传感器数据采集和传输。
- 智能家居:设备状态监控与控制。
- 移动消息推送:低延迟的消息推送服务。
- 车联网:车辆状态监控与数据传输。
5. 优点
- 轻量级。MQTT协议的数据包头很小,通信负载也较小,适用于各种网络环境。
- 发布/订阅模式。MQTT采用发布/订阅模式,可以实现多个客户端之间的消息传递。
- 支持不同的服务质量级别。MQTT协议支持三种不同的服务质量级别(QoS),可以根据需求选择适当的级别。
- 保留消息。MQTT支持保留消息,可以将最新的消息保留在服务器上,新的订阅者可以获取最新的消息。
- 遗嘱消息。MQTT支持遗嘱消息,可以在客户端异常断开连接时自动发送一条消息。
- 安全性。MQTT支持TLS/SSL加密,可以保证通信的安全性。
- 易于实现和部署。MQTT的实现和部署都非常容易,可以适用于各种物联网应用场景。
- 开放性。MQTT是一个开放的标准,可以与其他协议和系统进行集成。
- 适用于物联网、小型设备、移动应用。MQTT以极少的代码和有限的带宽为连接远程设备提供实时可靠的消息服务,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
6. 缺点
- 安全性:本身不提供加密,需要额外的安全措施(如TLS)。
- 不适合长时间连接的客户端:虽然支持持久会话,但需要较高的代理端资源。
7. 常见实现
- Eclipse Mosquitto:一个开源的MQTT代理,适合轻量级和嵌入式应用。
- HiveMQ:商业级MQTT代理,提供高可用性和扩展性。
- EMQX:高性能、分布式的MQTT代理,支持大规模设备接入。