MQTT 是一种基于发布/订阅模式的轻量级消息传输协议,专门为设备资源有限和低带宽、高延迟的不稳定网络环境的物联网场景应用而设计,可以用极少的代码为联网设备提供实时可靠的消息服务。MQTT 协议广泛应用于智能硬件、智慧城市、智慧农业、智慧医疗、新零售、新能源、新金融、车联网等物联网领域。
01、MQTT 协议发展史
MQTT 是在上世纪 90 年代末由 IBM 的 Andy Stanford-Clark 博士和 Arcom的 Arlen Nipper 开发,用于通过卫星网络监测石油管道。
2014 年发布 MQTT v3.1.1 版,增强了其清晰性和互操作性。它能够在资源有限的网络上高效地传输消息,因此在物联网应用中广受欢迎。
2019 年发布了 MQTT v5.0 版,在 v3.1.1 版本基础上增加了会话过期间隔、原因代码、主题别名、用户属性、订阅选项、指定请求/响应、共享订阅等更加符合现代物联网应用需求的特性,提高了大型系统的性能、稳定性与可扩展性,逐渐成为众多物联网企业的首选通信协议。
02、MQTT 5.0 新特性
会话过期间隔: 管理会话的生命周期
基于 MQTT 5.0 ,客户端通过Clean Start 与 Session Expiry Interval 指定服务器在客户端断开连接后应将会话保持多长时间。也就是说,您可以指定一个具体的时间段,在网络断开再连接后,会话仍然有效。这样可以更灵活地管理会话的生命周期,并节省服务器的资源。
原因代码: 了解断开连接或失败原因
在 MQTT 5.0 中,可用的 Reason Code 被扩充到了 43 个,并且规定了Reason Code < 0x80 用于表示成功,Reason Code ≥ 0x80 则用于表示失败,从而帮助我们了解断开连接或发生故障的原因。比如,如果客户端连接服务器失败,服务器会返回一个原因代码,解释连接不成功的原因,比如登录凭证错误或者服务器不在线。
主题别名: 减少消息头部的开销
在 MQTT 5.0 中,引入了主题别名 ( Topic Alias ),你可以为主题分配一个简短的数字别名。这个别名可以在后续的消息中替代完整的主题名称,大大减少了 MQTT 头部的大小,从而节省了网络带宽。
用户属性: MQTT 头部自定义元数据
在 MQTT 5.0 中,引入了用户属性(User Properties)其实是一种自定义属性,允许用户向 MQTT 消息添加自己的元数据,传输额外的自定义信息以扩充更多应用场景,比如消息的时间戳、设备位置或其他应用相关的数据,从而增加了 MQTT 消息传输的灵活性和控制力。
订阅选项: 细粒度的订阅控制
在 MQTT 5.0 中,提供了 4 个订阅选项,分别是 QoS、No Local、Retain As Published、Retain Handling,用来指定如何接收每个订阅主题的消息。比如,客户端可以指定他们是否接收某个订阅的保留消息,或者是否接收和订阅具有相同 QoS 级别的消息。
指定请求/响应: 允许客户端回复指定主题
在 MQTT 5.0 中,引入了响应主题 (Response Topic)、关联数据 (Correlation Data) 和响应信息 (Response Information) ,请求方可以在请求消息中指定自己期望的响应属性,从而使客户端和服务器之间的通信变得更高效和简洁。
共享订阅: 订阅者负载均衡功能
在 MQTT 5.0 中共享订阅特性使得多个客户端可以共享一个订阅,在使用共享订阅的客户端之间均衡地分配消息负载。也就是,当一条消息发布到一个共享主题时,服务器会把消息分发给共享订阅中的某个客户端,从而实现消息的负载均衡。