热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解密阿里云IoT物联网平台MQTTAccessServer核心架构

MQTT是基于TCPIP协议栈构建的异步通信消息协议,是一种轻量级的发布、订阅信息传输协议。MQTT已逐渐成为IoT领域最热门的协议,也是国内外各大物联

MQTT是基于TCP/IP协议栈构建的异步通信消息协议,是一种轻量级的发布、订阅信息传输协议。MQTT已逐渐成为IoT领域最热门的协议,也是国内外各大物联网平台最主流的传输协议,阿里云IoT物联网平台很多设备都是通过MQTT接入。本文将详细介绍MQTT协议的历史演进,以及阿里云IoT物联网平台在MQTT协议层实践中的一些关键设计及思考。

本文主要包含了以下内容:

  • MQTT协议演进历史及协议特点,总结和分析MQTT协议族的优缺点,分析和总结了为什么相比于其他协议,MQTT适合IoT等。

  • 阿里云IoT MQTT3和5协议在实践中的一些关键设计及思考。包括连接复用、状态一致性、扩展增值能力设计等。

一、MQTT协议

1.1 MQTT协议演进

MQTT最初由IBM于20世纪90年代发明,最初是用于石油管道的传感器与卫星之间数据传输。MQTT v3.1.1于2014.10月正式发布,与此同时v3.1.1已成为OASIS协议标准(就是3.1.1已升级为国际物联网标准)。正如HTTP为人们通过web分享信息铺平了道路一样,MQTT标准化能将几十亿低成本、IoT设备连接到网络。毫无疑问,MQTT是当前最主流、增长最迅速的IoT应用层传输协议,目前,阿里云IoT平台许多在线设备都是通过MQTT接入的。

MQTT v5.0 于2018.5月正式发布,2019年3月,v5.0 成为了新的 OASIS 标准。v5.0在 v3.1.1的基础上做了较大的改变且不做向下兼容,显然是有太多的新东西要被引入,所有现有的实现要重新实现。此次通过的v5.0是自2014年的v3.1.1以来最重要的协议升级,新协议能适应近年来行业发展的新需求,同时也为未来物联网行业发展的做了协议上的准备。阿里云IoT平台从2020.12月开始支持 MQTT5.0。

1.2 MQTT协议族

每一种协议都是在特定上下文、约束下得出的折中设计,从来都没有完美的协议。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 Broker开源社区基本已经支持v5.0,并且开源SDK也已经初步支持v5.0,与此同时,国内IoT云厂商还没有支持v5.0,但未来已来。

二、MQTT协议层实践

2.1 MQTT应用架构

主要分为6大模块:

  • 基础接入模块:包括多版本协议编解码、多协议端口复用、会话管理、心跳检测、连接管理等。

  • 协议扩展模块:包括基于自定义协议扩展,实现的一系列扩展功能,包括通道解压缩、低功耗免ping等。

  • 增值消息服务:包括Rrpc、广播、时钟同步、脚本前置解析等。

  • 业务埋点模块:设备行为统计、在线时长聚合、网络延时诊断等。

  • 安全防御模块:包括黑名单机制、入口流控等。

  • 高可用模块:包括流量分组调度、容灾降级等。

  • 运维管控模块:主要包括流量分组调度、限流管理、连接诊断

2.2 协议层设计挑战

  • 设备状态一致性策略设计,包括session管理机制、心跳检测机制、异地登陆问题、状态最终一致性策略。

  • 在MQTT发布/订阅异步分发模型上,如何满足多样的业务场景。例如同步调用、广播等。

  • 如何同时满足不同场景下设备对MQTT接入需求,单应用上如何同时支持两个版本MQTT协议

  • MQTTv3协议过于精简,业务从MQTT3切换到v5的过渡时间,如何扩展协议层能力,提高客户接入体验。

2.3 MQTT关键策略设计

设备在线状态

协议层本地有session管理器来对本地会话进行管理,通过心跳检测、会话自检来保证跟设备之间的连接状态一致性,当前平台单设备不支持同时同设备多端登陆,基于分布式会话,协议层通过分布式会话识别异地登陆,将异常连接踢下线。

设备状态一致性策略:设备到MQTT协议接入层之间是tcp长连接,通过心跳机制保证心跳周期内设备状态的最终一致性。同时通过分布式会话版本号,保证分布式会话并发更新安全,通过上行消息/心跳定时触发会话自检机制,解决异常情况下本地/分布式会话状态不一致的问题。

消息推送模式

MQTT协议是基于PUB/SUB的异步通信模式,针对单设备纬度实现基础的发布/订阅推送外,还支持了复杂的消息推送方式:RRpc和在线广播。

在传统的基于PUB/SUB通信模式的中间件中, 消息的Producer/Consumer只负责生产和消费,彼此之间不会直接通讯。而在某些业务场景不仅仅是将消息投递至订阅方,订阅方收到消息后可能还会执行一些操作并返回结果,PUB/SUB模式下实现这种请求/响应模式会非常繁琐,在MQTT中通信双方需要事先协商请求和响应topic。

针对这一痛点,协议层在发布订阅模式之上构建了一套Rpc通讯模式,解决开发者痛点。Rrpc模式允许Producer发出消息后,以同步形式等待Consumer消费这条消息并返回响应,达到类似Rpc的调用效果。Rrpc模式使得MQTT应用具备了同步调用的能力,扩展了使用场景,使其具备更多的可能性

  • 通过topic中包含的messageId匹配请求与响应,对业务数据零侵入

  • messageId的生成与匹配、超时控制等逻辑,调用方无感知

  • 简化了业务方调用逻辑,扩展了MQTT使用场景。

多种类接入方式

MQTT协议层针对不同场景支持多种MQTT接入方式,同时支持tcp直连、tls、ws、wss等方式接入,用于满足不同场景接入需求。为了实现更好的网络穿透性,协议层实现了多协议端口复用,也就是一个端口同时支持多种协议。

  • 边解析边判断,处理效率高;

  • 节约常用端口,实现更好的网络穿透性

  • 内部能力扩展对设备侧无感知

  • 针对MQTT协议5和3,通过协议解析也实现了同时兼容。

自定义协议扩展

MQTTv3在实际应用中存在一些缺点,而MQTTv5生态的繁荣推广还需要很长时间的推进, 在MQTT3到5的过渡时间,我们在v3.1.1基础上通过overlay的方式,提供了扩展套件来解决客户痛点,丰富接入增值能力,提高接入体验。思路:没有什么问题不是封一层解决不了的,如果有那就再封一层

  • 通过在建连clientId中扩展ext参数,实现端云之间能力协商

  • 通过扩展消息topic格式,实现支持自定义属性

  • 定义一套ext异常推送topic规范

三、展望未来

当前阿里云IoT平台协议层已支持了MQTT主流协议,并支持了多种协议接入方式,但还存在一些会进一步优化的地方:1)更丰富的消息质量模型,例如支持QoS2,支持消息优先级等;2)完善低功耗领域的网关侧支持,可以跟SDK/边缘网关合作,支持MQTT-SN协议等

扫码免费参加AIoT训练营

往期推荐

1、HarmonyOS 到底是不是Android套壳?

2、5G将是一个彻底失败的通信技术吗?

3、AWS IoT 物联网平台 MQTT 通讯模式

4、IoT平台如何实现 100万/秒消息广播?

5、无GPS模块,IoT设备如何定位?

6、 IoT物联网 4 本好书推荐



推荐阅读
  • Harmony 与 Game Space 达成合作,在 Shard1 上扩展 Web3 游戏
    旧金山20 ... [详细]
  • SOA架构理解理解SOA架构,了解ESB概念,明白SOA与微服务的区别和联系,了解SOA与热门技术的结合与应用。1、面向服务的架构SOASOA(ServiceOrien ... [详细]
  • 一、概述OpenWRT是一个高度模块化、自动化的嵌入式Linux系统,拥有强大的网络组建和扩展性,常常被用于工控设备、电话、小型机器人、智能家居、路由 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 本文介绍了如何在Azure应用服务实例上获取.NetCore 3.0+的支持。作者分享了自己在将代码升级为使用.NET Core 3.0时遇到的问题,并提供了解决方法。文章还介绍了在部署过程中使用Kudu构建的方法,并指出了可能出现的错误。此外,还介绍了开发者应用服务计划和免费产品应用服务计划在不同地区的运行情况。最后,文章指出了当前的.NET SDK不支持目标为.NET Core 3.0的问题,并提供了解决方案。 ... [详细]
  • PL2303HXD电路图(USB转UART)介绍及应用
    本文介绍了PL2303HXD电路图(USB转UART)的特性和应用,该电路图可以实现RS232和USB信号的转换,方便嵌入到手持设备中。PL2303HXD作为USB/RS232双向转换器,可以将USB数据转换为RS232信息流格式发送给外设,并将RS232外设的数据转换为USB数据格式传送回主机。通过利用USB块传输模式和自动流量控制,PL2303HXD能够实现更高的数据传输吞吐量比传统的UART端口。 ... [详细]
  • 本文介绍了一个Magento模块,其主要功能是实现前台用户利用表单给管理员发送邮件。通过阅读该模块的代码,可以了解到一些有关Magento的细节,例如如何获取系统标签id、如何使用Magento默认的提示信息以及如何使用smtp服务等。文章还提到了安装SMTP Pro插件的方法,并给出了前台页面的代码示例。 ... [详细]
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
  • C#设计模式之八装饰模式(Decorator Pattern)【结构型】
    一、引言今天我们要讲【结构型】设计模式的第三个模式,该模式是【装饰模式】,英文名称:DecoratorPattern。我第一次看到这个名称想到的是另外一个词语“装修”,我就说说我对“装修”的理 ... [详细]
  • 用ESP32与Python实现物联网(IoT)火焰检测报警系统
    下图是本案例除硬件连线外的3步导学开发过程,每个步骤中实现的功能请参考图中的说明。在硬件连线完成之后我们建议您先使用“一分钟上云体验”功能预先体验本案例的实际运行效果 ... [详细]
  • 列举几个Java程序员通用的、必须掌握的框架
    Java程序员历来就被认为是好职业,但并不是所有的Java程序员都能如愿获得好的回报,任何一个行业,都有低端饱和、高端紧缺的现象ÿ ... [详细]
  • ActiveMQ是java开发的消息中间件服务。可以支持多种协议(AMQP,MQTT,OpenWire,Stomp),默认的是OpenWire。而python与Act ... [详细]
author-avatar
肥羊羊和懒羊羊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有