MQTT协议简史
所属分类 IOT
浏览量 86
MQTT是基于TCP/IP协议栈构建的异步通信消息协议,是一种轻量级的发布、订阅信息传输协议。
MQTT已逐渐成为IoT领域最热门的协议,也是国内外各大物联网平台最主流的传输协议
MQTT是当前最主流、增长最迅速的IoT应用层传输协议
MQTT最初由IBM于20世纪90年代发明,最初是用于石油管道的传感器与卫星之间数据传输。
MQTT v3.1.1于2014.10月正式发布,与此同时v3.1.1已成为OASIS协议标准(3.1.1已升级为国际物联网标准)
MQTT v5.0 于2018.5月正式发布
2019年3月,v5.0 成为了新的 OASIS 标准
1999 年,IBM 和合作伙伴共同发明了 MQTT 协议。
2004 年, MQTT.org 开放了论坛,供大家广泛参与。
2011 年,IBM 建立了 Eclipse 开源项目 Paho ,并贡献了代码。Eclipse Paho 是 MQTT 的 Java 实现版本。
2013 年, OASIS MQTT 技术规范委员会成立。
2014 年,MQTT 正式成为推荐的物联网传输协议标准。
MQTT v3
MQTT v3协议是为在低带宽、不可靠的网络上工作的传感器而设计的基于TCP的应用层协议,适用于IoT场景。
它具有以下几项重要特性:使用发布/订阅消息模式,支持一对多的消息分发,解除设备和业务之间的耦合;
报文格式设计精简, 适用于小规模数据传输以及资源受限的IoT设备。
固定头部是2字节,开销很小,支持QoS0、QoS1、QoS2 三种消息QoS。
MQTT3.1.1在MQTTv3基础上引入了一些新特性, 主要包括:
clientId优化,支持broker给设备指定clientId,增大了clientId最大长度。
ack响应优化,connect ack中引入session Present标识等。
MQTTv3/v3.1.1 在实际应用中存在以下不足:
1)错误码设计的不够完整,设备难以完整感知到broker的处理异常;
2)不支持设备跟broker之间的能力发现/协商,broker不能提供可选能力等。
3)协议设计的过于精简,没有预留扩展空间,无法直接在协议层做扩展,协议能力相对简陋。
4)对于一些高阶能力支持不够,例如协议层缺乏流控、优先级、报头压缩等功能。
5)MQTT3是基于TCP的应用层协议,TCP固有的一些缺点也被MQTT继承了。
MQTT-SN
MQTT-SN(Sensor Networks) 是MQTT协议的传感器网络版本,
最早用在zigBee无线网络中,主要面对电池供电,有限的处理器能力和存储能力的设备。
只有很小的内存和CPU,TCP 对于这些设备来说非常奢侈,甚至无法允许TCP协议栈。
还有一些网络,比如 zigBee,报文的长度在几百字节以下,无法承载太大的数据包。
MQTT-SN有主要特点:
1) MQTT-SN支持运行在链路层、IP、UDP之上。
2) QOS增加了-1级别,只用于传输,尽力而为,无保证。
3) 更丰富且开销更低的Topic类型。
4) 网络架构增加了SN网关。
MQTT v5
MQTT 5.0在协议层提供了更大的自定义扩展空间,平台基于扩展点可支持更丰富的协议能力。
v3.1版本中,只能通过overlay方式,在业务层提供扩展能力。
MQTT5.0 主要设计目标是提高错误反馈能力、增加可扩展能力、提高系统的伸缩性、优化资源受限和小客户端接入、常见范式下沉至协议层等。
MQTT应用架构
主要分为6大模块:
基础接入模块:包括多版本协议编解码、多协议端口复用、会话管理、心跳检测、连接管理等。
协议扩展模块:包括基于自定义协议扩展,实现的一系列扩展功能,包括通道解压缩、低功耗免ping等。
增值消息服务:包括Rrpc、广播、时钟同步、脚本前置解析等。
业务埋点模块:设备行为统计、在线时长聚合、网络延时诊断等。
安全防御模块:包括黑名单机制、入口流控等。
高可用模块:包括流量分组调度、容灾降级等。
运维管控模块:主要包括流量分组调度、限流管理、连接诊断
协议层设计挑战
设备状态一致性策略设计,包括session管理机制、心跳检测机制、异地登陆问题、状态最终一致性策略。
在MQTT发布/订阅异步分发模型上,如何满足多样的业务场景。例如同步调用、广播等。
如何同时满足不同场景下设备对MQTT接入需求,单应用上如何同时支持两个版本MQTT协议
MQTTv3协议过于精简,业务从MQTT3切换到v5的过渡时间,如何扩展协议层能力,提高客户接入体验。
MQTT关键策略设计
1. 设备在线状态
协议层本地有session管理器来对本地会话进行管理,通过心跳检测、会话自检来保证跟设备之间的连接状态一致性,
当前平台单设备不支持同时同设备多端登陆,基于分布式会话,协议层通过分布式会话识别异地登陆,将异常连接踢下线。
设备状态一致性策略:
设备到MQTT协议接入层之间是tcp长连接,通过心跳机制保证心跳周期内设备状态的最终一致性。
同时通过分布式会话版本号,保证分布式会话并发更新安全,通过上行消息/心跳定时触发会话自检机制,解决异常情况下本地/分布式会话状态不一致的问题。
2. 消息推送模式
MQTT协议是基于PUB/SUB的异步通信模式,针对单设备纬度实现基础的发布/订阅推送外,还支持了复杂的消息推送方式:RRpc和在线广播。
在传统的基于PUB/SUB通信模式的中间件中, 消息的Producer/Consumer只负责生产和消费,彼此之间不会直接通讯。
而在某些业务场景不仅仅是将消息投递至订阅方,订阅方收到消息后可能还会执行一些操作并返回结果,
PUB/SUB模式下实现这种请求/响应模式会非常繁琐,在MQTT中通信双方需要事先协商请求和响应topic
针对这一痛点,协议层在发布订阅模式之上构建了一套Rpc通讯模式,解决开发者痛点。
Rrpc模式允许Producer发出消息后,以同步形式等待Consumer消费这条消息并返回响应,达到类似Rpc的调用效果。
Rrpc模式使得MQTT应用具备了同步调用的能力,扩展了使用场景,使其具备更多的可能性
通过topic中包含的messageId匹配请求与响应,对业务数据零侵入
messageId的生成与匹配、超时控制等逻辑,调用方无感知
简化了业务方调用逻辑,扩展了MQTT使用场景。
3. 多种类接入方式
MQTT协议层针对不同场景支持多种MQTT接入方式,同时支持tcp直连、tls、ws、wss等方式接入,用于满足不同场景接入需求。
为了实现更好的网络穿透性,协议层实现了多协议端口复用,也就是一个端口同时支持多种协议。
边解析边判断,处理效率高;
节约常用端口,实现更好的网络穿透性
内部能力扩展对设备侧无感知
针对MQTT协议5和3,通过协议解析也实现了同时兼容。
上一篇
下一篇
smartsocket 整数读写实例
MQTT 特性简介
20240930 A股刷新多项历史记录
序列化协议及选型
MQTT 入门介绍
MQTT 主题