介绍新功能:AWS IoT Core 中的 MQTTv5 特性,帮助构建灵活的架构模式 官方博客
新增 AWS IoT Core 的 MQTTv5 特性以协助构建灵活的架构模式
文章重点
在此篇文章中,我们介绍 AWS IoT Core 支持的新 MQTTv5 特性,包括更灵活的设备消息传递、请求/回应模式、用户属性功能等,这些功能将显著提升大规模设备部署的通信效率和架构灵活性。
引言
我们欣然宣布 AWS IoT Core 现在支持 MQTTv5 的新特性,以增强大规模设备部署的通信并创新设备消息传递模式。已经拥有 MQTTv311 部署的客户,现在也可以利用 MQTTv5 的新特性,因为 AWS IoT Core 在两个版本间提供了无缝集成并支持在迁移过程中的异构部署。在这篇文章中,我们将总结几个 MQTTv5 特性,并提供实际 IoT 情境中的示例,展示如何设计更加灵活和高效的 IoT 架构模式。我们还会展示 MQTTv5 如何为运行在 AWS IoT Core 的现有设备群体带来新可能性。
在成功应用 MQTTv311 后,OASIS结构化信息标准促进组织对标准进行了改进,以增强可扩展性和大规模系统的支持。这些增强导致 MQTT 版本 5MQTTv5在 2019 年 3 月发布,成为新的标准。详情请参见 MQTT 5 支持的特性 文档页面。
前提条件
AWS 帐户开发环境,或者安装了 AWS CLI 和 Python 3 的电脑。开始使用
访问示例脚本:这篇博客中提供的示例脚本文件存储在 awssamples/awsiotmqttv5examples Git 仓库中。请进入 Git 仓库链接并下载到您的开发环境中。下载 MQTT 客户端库:在这篇文章中,我们使用开源的 Eclipse Paho MQTT Python 客户端库。若未安装,运行以下命令安装 pip: bash python m ensurepip upgrade
运行以下命令安装 pahomqtt 库: bash pip install pahomqtt 您也可以检查 pahomqtt 源码仓库 和其他客户端的安装选项。
获取 AWS IoT Core 设备数据端点:AWS IoT Core 设备数据端点是您 AWS 帐户特定区域的 AWS IoT Core 端点,您的设备将连接到此端点。
进入 AWS IoT Core 控制台。在左侧导航菜单中,选择 Settings。在 Device data endpoint 下,复制 Endpoint。在本博客的后面部分,您将被要求将此端点作为示例脚本的参数提供。
创建 AWS IoT 事物,获取并放置证书:
安易加速器ios创建 AWS IoT 事物并下载设备证书。请遵循 创建 AWS IoT 资源页面 中的说明,使用 Amazon 根证书授权CA签名的客户端证书。如果您使用 AWS IoT Core 并选择自己的根证书或中介证书机构CA,请参考 创建自己的客户端证书 页面的指导。本博客中的示例脚本预期将证书放置在“certificates”文件夹中,但您也可以使用 certificatespath 参数覆盖此设置。将证书文件重命名为以下名称:将证书文件重命名为 “clientcertpem”将下载的根证书文件重命名为 “AmazonRootCA1pem”将下载的私钥重命名为 “privatekeypem”现在,您已经准备好开始实验 AWS IoT Core 现在支持的 MQTTv5 新特性。
1 使用请求/回应模式实现更透明的消息传递
请求/回应消息传递模式是一种以非同步方式跟踪客户端请求回应的方法。这是在 MQTTv5 中实现的一种机制,允许发布者为特定消息指定回应的主题。因此,当订阅者接收到请求时,还会接收到要发送回应的主题。它还支持关联数据字段,用于跟踪数据包,例如请求或设备识别参数。
例如,一个连接的门锁的智能家居应用程序可以受益于请求/回应模式。假设用户通过一个移动应用程序与门锁互动,并发送 MQTT 消息来开关锁定。应用程序和门锁之间交换的任何消息都必须被确认并能够追踪数据包是否已经成功传递。另外,门锁命令需要包含上下文,例如请求者的用户身份。
要实验这项功能,请查阅您在 开始使用 步骤中下载的 Git 仓库中的 /awsiotmqttv5examples/01requestresponseexamplepy 脚本文件。执行以下命令并指定您在 开始使用 步骤中获取的设备数据端点,使用 endpoint 参数,将 ltAWSIoTDeviceDataEndpointgt 替换为,例如:abcd123456zatsiotregionamazonawscom
bash python3 01requestresponseexamplepy endpoint ltAWSIoTDeviceDataEndpointgt
plaintextDEBUGmainSending CONNECT (u0 p0 wr0 wq0 wf0 c1 k60) clientid=bTestThing01 properties=NoneDEBUGmainReceived SUBACK 4 requestid eb1bd30ac7e642a49e00d5baee89f65c}] (4 bytes)DEBUGrootReceived a message on topic home07/maindoor/lock payload LOCKDEBUGrootMain door LOCK request with parameters b{userprofileid 4 requestid eb1bd30ac7e642a49e00d5baee89f65c}DEBUGmainSending PUBLISH (d0 q0 r0 m3) bhome07/maindoor/status properties=[CorrelationData b{userprofileid 4 requestid eb1bd30ac7e642a49e00d5baee89f65c}] (25 bytes)DEBUGmainReceived PUBLISH (d0 q0 r0 m0) home07/maindoor/status properties=[CorrelationData b{userprofileid 4 requestid eb1bd30ac7e642a49e00d5baee89f65c}] (25 bytes)DEBUGrootReceived a message on topic home07/maindoor/status payload USERISNOTAUTHENTICATEDDEBUGrootMain door status USERISNOTAUTHENTICATED with parameters b{userprofileid 4 requestid eb1bd30ac7e642a49e00d5baee89f65c}

图: 移动应用中的门锁请求/回应消息传递模式
移动应用的 MQTT 客户端订阅回应主题。然后,一个锁定请求包将发布到 home07/maindoor/lock 主题上,并以 home07/maindoor/status 作为预期的回应主题,并且关联数据对象包含请求者的 userprofileid 和 requestid。当门锁在 home07/maindoor/lock 接收到锁定请求时,它处理 MQTT 数据包,包括回应主题和关联数据。门锁做出决定并通过发布到主题来响应,并传递关联数据。订阅者函数在 home07/maindoor/status 上接收到响应,并记录该决定及其关联数据。请求者可以使用 userprofileid 和 requestid 进行进一步行动。2 使用用户属性功能实现更灵活的设备消息传递
用户属性功能允许连接的设备或订阅应用添加自定义信息,通过将自定义键值对附加到 MQTT 数据包中,包括发布和连接。该功能提供了类似于 HTTP 标头的功能,只要总大小不超过 8KB。
例如,您可以在多供应商传感器部署的用例中使用用户属性功能。假设在一个产业或智能家居应用中有多个来自不同供应商的传感器。在这些情况下,各个传感器可以使用不同的编码发送它们的数据,这些编码在用户属性中进行指定。根据用户属性值,消息的订阅者可以采取特定动作来处理它们。
要实验这一功能,请查阅您在 开始使用 步骤中下载的 Git 仓库中的 /awsiotmqttv5examples/02userpropertiesexamplepy 脚本文件。执行以下命令并指定您在 开始使用 步骤中获取的设备数据端点,使用 endpoint 参数,将 ltAWSIoTDeviceDataEndpointgt 替换为,例如:abcd123456zatsiotregionamazonawscom
bash python3 02userpropertiesexamplepy endpoint ltAWSIoTDeviceDataEndpointgt
plaintextDEBUGmainSending CONNECT (u0 p0 wr0 wq0 wf0 c1 k60) clientid=bTestThing02 properties=NoneDEBUGmainSending PUBLISH (d0 q0 r0 m4) bsensors/gateway01/sensor03 properties=None (4 bytes)DEBUGmainReceived PUBLISH (d0 q0 r0 m0) sensors/gateway01/sensor01 properties=[UserProperty [(ContentType text/plain) (HardwareRevision brandXrev117c)]] (4 bytes)DEBUGrootReceived a message on topic sensors/gateway01/sensor01DEBUGrootMessage has user properties [(ContentType text/plain) (HardwareRevision brandXrev117c)]DEBUGrootReceived message with ContentType text/plainDEBUGrootPlain text payload 234DEBUGmainReceived PUBLISH (d0 q0 r0 m0) sensors/gateway01/sensor02 properties=[UserProperty [(ContentType base64) (HardwareManufacturer brandXrev82)]] (8 bytes)DEBUGrootReceived a message on topic sensors/gateway01/sensor02DEBUGrootMessage has user properties [(ContentType base64) (HardwareManufacturer brandXrev82)]DEBUGrootReceived message with ContentType base64DEBUGrootRaw payload MjMuNw== Decoded base64 payload 237DEBUGmainReceived PUBLISH (d0 q0 r0 m0) sensors/gateway01/sensor03 properties=[] (4 bytes)DEBUGrootReceived a message on topic sensors/gateway01/sensor03DEBUGrootNo User Property specified raw payload 244
该示例脚本展示了三个不同品牌的传感器,使用不同数据编码发布到它们的主题上。订阅者通过评估其 ContentType 用户属性值来处理原始传感器值和 base64 编码的传感器值。
在 AWS IoT Core 主题规则中处理带有用户属性的 MQTT 数据包
AWS IoT Core 的主题规则功能允许配置规则来转发和摄取来自 AWS IoT Core 的 MQTT 消息到各种 AWS 服务。您可以使用 AWS IoT 规则 SQL 语句定义处理逻辑。这使数据在各供应商之间转换为标准化和与供应商无关的形式,并在 AWS IoT 主题规则上实施相应的处理,将其转发到任何 AWS 服务。
sqlSELECT CASE getuserproperty(ContentType) WHEN base64 THEN decode(decode(encode( base64) base64) base64)ELSE decode(encode( base64) base64) END as sensorvalue FROM sensors/#
AWS IoT Core 主题规则功能提供的 getuserproperty() 函数允许在规则定义中访问 MQTT 数据包的用户属性值。上面的规则 SQL 在数据为 base64 编码时实施 base64 解码操作。要创建主题规则,请查看 创建 AWS IoT 规则 文档页面。同时查看 AWS IoT SQL 参考 和 处理二进制负载 文档页面。
3 更高效地使用设备带宽,使用主题别名功能
蜂窝 IoT 设备和传感器使用行动网路与其后端服务进行通信。这些设备通常设计为在最低带宽下运行,因为它们的数据服务是计量的。假设连接的传感器设备在农田上运行,它们应该能够在低数据通信和长电池寿命的情况下工作。此外,较大的数据包通常会导致更多的电力消耗。考虑到这些传感器仅发布几字节的传感器值,过长的 MQTT 主题将成为设备消息传递的负担。
主题别名功能允许 MQTT 客户端为主题分配数字别名,然后在发布进一步消息时引用该别名。这使得传输的 MQTT 数据包大小通过引用一个数字而不是主题本身来减小。
例如传感器值:232
示例 MQTT 主题 (83 字节):sensors/field/field001/equipments/a804e598ee904f899cde458f8fe9b980/temperature
要实验这一功能,请查阅您在 开始使用 步骤中下载的 Git 仓库中的 /awsiotmqttv5examples/03topicaliasexamplepy 脚本文件。执行以下命令并指定您在 开始使用 步骤中获取的设备数据端点,使用 endpoint 参