1 什么是MQTT协议
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅(publish/subscribe)模式的消息协议。它被设计为一种轻量级协议,特别适用于对带宽和功耗要求较高的物联网(IoT)设备和应用。MQTT协议通过尽量减少传输数据量和协议开销,确保在低带宽、不可靠网络环境下可靠传输消息。
1 MQTT的主要特性
- 轻量级和高效:MQTT设计简洁,报文头部最小仅为2字节,非常适合嵌入式设备和低带宽网络。
- 发布/订阅模式:通过主题(Topic)进行消息的发布和订阅,使得消息发送者和接收者解耦。
- 质量服务等级(QoS):支持不同级别的消息传递服务,确保消息的传递可靠性。
- 持久会话:支持会话持久化,可以在客户端断开连接后继续接收消息。
- 遗嘱消息:在客户端异常断开时,服务器可以发布预定义的遗嘱消息,通知其他客户端。
2 MQTT协议的发展历史
2.1 协议的起源
MQTT协议最早由IBM的Andy Stanford-Clark和Arcom(后来的Eurotech)的Arlen Nipper在1999年共同设计。最初设计的目标是用于石油管道的远程监控,因为这个场景要求使用低带宽和高可靠性的通信协议。
2.2 版本演进
- MQTT 3.1:这是最早被广泛采用的版本,定义了基础的协议结构和功能。
- MQTT 3.1:于2014年正式成为OASIS标准(ISO/IEC 20922),在3.1版本的基础上进行了改进,增强了兼容性和稳定性。
- MQTT 5.0:于2018年发布,是对3.1版本的重大升级,增加了许多新特性,如消息属性、改进的错误处理和扩展的认证机制。
3 MQTT的应用场景
MQTT协议由于其轻量级和高效性,被广泛应用于各种物联网场景中。以下是一些典型的应用场景:
3.1 智能家居
在智能家居系统中,MQTT协议被用于连接和控制各种家电设备,如灯光、温控器、门锁等。通过MQTT,用户可以实现设备的远程控制和状态监测,提升生活的便利性和安全性。
3.2 工业物联网(IIoT)
工业物联网中,MQTT被用于监控和控制工业设备、传感器和机器。其低延迟和高可靠性特性,确保了工业系统的实时数据采集和指令传输,提高了生产效率和安全性。
3.3 车联网
在车联网中,MQTT协议用于车辆与服务器之间的数据通信。它可以实现车辆状态监测、远程诊断和信息推送,为车主和服务提供商提供实时数据支持。
3.4 医疗健康
MQTT协议在医疗健康领域也有广泛应用,如远程病人监护和健康设备的数据传输。它可以确保患者数据的实时传递,帮助医疗人员进行远程诊断和监护。
3.5 农业物联网
在农业物联网中,MQTT协议用于连接各种农业传感器和设备,如土壤湿度传感器、天气站和灌溉系统。通过MQTT,可以实现对农田环境的实时监测和自动化管理,提升农业生产效率。
MQTT5 的新特性
MQTT 5.0 相比较 MQTT 3.1.1 增加了许多新特性,以下是一些主要的新特性:
用户属性(User Properties):可以在 publish、connect 和带有 return code 的数据包中夹带一个或多个用户自定义的 key-value 属性。这使得在消息中能够包含更多的相关信息,方便接收方进行处理和识别消息来源等。
主题别名(Topic Alias):允许使用一个双字节整数来替代较长且常用的主题名,从而降低发布消息时的带宽消耗,尤其适用于主题名较长且重复发布的情况。
会话过期(Session Expiry):支持设置在设备离线时,保留设备端与服务端之间会话信息的时间。
消息过期(Publication Expiry Interval):发布消息时可设置消息的过期时间,避免订阅端收到过期消息。这样可以更好地处理网络不稳定或设备离线后重新连接时的消息时效性问题。
遗嘱消息增强:遗嘱消息字段变为遗嘱载荷,并新增了遗嘱属性,可更详细地定义遗嘱消息的行为。
保留消息:设备发布的消息可以设置为保留,新的订阅者在订阅时能接收到之前保留的消息。
共享订阅(Shared Subscriptions):多个订阅者可以共同消费同一个主题的消息,实现订阅者的负载均衡,有助于搭建更灵活的系统架构。
订阅选项(Subscription Options):在 subscribe 报文中增加了订阅选项,例如可指定服务器能发送给客户端应用消息的最大 QoS 等级,还能设置非本地选项、保留为已发布、保留处理等相关参数。
请求与响应模式扩展:扩展了请求/响应模式,类似于 HTTP 协议的 RPC 调用,使通信模式更加丰富。
消息格式描述:消息增加了 payload 格式说明,有助于实现消息的透明流转,支持可变的消息负载。
增强端云交互:支持功能参数协商、增强错误码、服务端主动断开等特性,提高了问题排查效率。例如,服务端拥有了主动断开连接的能力,并通过 disconnect 报文的 reason code 标识断开原因;增强认证包含质询/响应风格的认证,可实现对客户端和服务器的双向认证。
流量控制(Flow Control):发送端有初始发送配额,发送 QoS 大于 0 的 publish 报文时发送配额相应减少,收到响应报文(如 puback、pubcomp 或 pubrec)时发送配额增加。同时新增了 receive maximum 属性,用于限制接收端同时处理的 QoS 为 1 和 2 的 publish 报文最大数量。
原因码与 ACK:将返回码改名为原因码,并增加了更多表示错误类型的原因码,使操作结果的表示更清晰明确。connack、puback、pubrec、pubrel、pubcomp、disconnect 和 auth 控制报文的原因码存在可变报头中,而 suback 和 unsuback 报文在有效载荷中包含了原因码列表。
Broker 能力查询:connack 报文包含了一些预定义的头部数据,用于标识 Broker 支持的 MQTT 协议功能,方便客户端了解 Broker 是否支持自己所需的功能。