使用 AWS IoT Device Shadow 服务和 AWS IoT Greengrass 管理 IoT 设备状态
关键要点
在这篇文章中,我们将学习如何使用 AWS IoT Device Shadow 服务和 AWS IoT Greengrass 来本地或远程管理 IoT 设备的状态。带您逐步完成创建和测试智能家居电暖器的过程,您将能够通过 Raspberry Pi 和 Sense HAT 硬件来实现这项功能。
引言
物联网 (IoT) 开发者经常需要实现一种强大的机制,以便本地或远程管理 IoT 设备状态。典型的例子是智能家居电暖器,用户可以使用内置控制面板调整温度设备状态,或通过在云中运行的软件应用程序触发温度调整消息。
您可以通过使用 AWS IoT Device Shadow 服务 快速构建这种机制。AWS IoT Device Shadow 服务可以让设备的状态对于您的业务逻辑可用,即使在网络连接不稳定的情况下。
此外,为了有效管理设备的软件生命周期并加快开发速度,您可以使用AWS IoT Greengrass及其预构建的组件。AWS IoT Greengrass 是一个开源边缘运行时和云服务,用于构建、部署和管理设备软件。AWS IoT Greengrass 的一个组件是 shadow manager,它在您的核心设备上启用本地影子服务。本地影子服务允许组件使用进程间通信 (IPC) 与 本地影子进行交互。影子管理组件管理本地影子文档的存储,并处理本地影子状态与 AWS IoT Device Shadow 服务的同步。
在本博客中,我将使用 AWS IoT Device Shadow 服务和 AWS IoT Greengrass,以及 Raspberry Pi 和 Sense HAT 硬件来模拟智能家居电暖器。本示例使用单一数字09来模拟输出功率,这个数字是我们希望从任何地方本地和远程管理的设备状态。用户可以通过本地硬件开关Sense HAT 上的内置摇杆或通过基于云的应用程序远程更改此数字。
Raspberry Pi 将在 Sense HAT LED 显示屏上显示数字,指示电暖器的输出功率。用户可以通过在 Sense HAT 上推动摇杆来增加数字或向下推以减少。
图 1 Raspberry Pi 模拟家庭电暖器
图 2 架构概述
通过遵循这篇博客,您可以快速启动并测试您的 IoT 解决方案,以管理设备的状态。
前置条件
为了遵循本文,您需要:
硬件:
一台 Raspberry Pi本演示使用 Raspberry Pi 3B一块 Raspberry Pi Sense HAT软件:
安装在 Raspberry Pi 上的 Raspberry Pi OS (64 位)请参阅 此链接 获取安装说明安装在 Raspberry Pi 上的 Sense HAT SDK一个 AWS 账户 以及访问 AWS IoT Core 和 AWS IoT Greengrass 的权限操作步骤
第一步:在 Raspberry Pi 上安装和配置 AWS IoT Greengrass 核心软件
为了将您的 Raspberry Pi 设置为 AWS IoT Greengrass 核心设备,请遵循 AWS IoT Greengrass 开始使用文档中的步骤 1 到步骤 3。我使用以下配置创建设备:
核心设备名称:PiWithSenseHat设备组:RaspberryPiGroup现在您应该能够在 AWS 控制台中看到此设备。
图 3 AWS IoT Greengrass 核心设备在控制台中的显示
第二步:将预构建的 AWS IoT Greengrass 组件部署到设备
下一步是将 预构建的 AWS IoT Greengrass 组件 部署到设备。AWS IoT Greengrass 提供并维护一组预构建组件,可以加速我们的开发。在这个演示中,我将部署以下组件:
加速器ios免费greengrassCli:提供本地命令行界面,您可以在核心设备上使用它来本地开发和调试组件
greengrassShadowManager:在您的核心设备上启用本地影子服务,并处理本地影子状态与 AWS IoT Device Shadow 服务的同步
greengrassLocalDebugConsole可选:提供本地仪表板,显示有关您的 AWS IoT Greengrass 核心设备及其组件的信息
步骤:访问 AWS IoT Greengrass 控制台在 Greengrass 设备 中导航到 部署,创建新部署部署目标 可以是 设备组 RaspberryPiGroup,或 核心设备从 公共组件 中选择这三个组件图 4 选择预构建组件
配置 awsgreengrassShadowManager 组件在 配置组件 步骤中,选择 awsgreengrassShadowManager,然后点击 配置组件。
图 5 配置 awsgreengrassShadowManager
设置 awsgreengrassShadowManager 的组件版本和配置 json图 6 配置 awsgreengrassShadowManager 详细信息
版本:231配置合并:json{ synchronize { coreThing { classic true namedShadows [ NumberLEDNamedShadow ] } shadowDocuments [] direction betweenDeviceAndCloud } rateLimits { maxOutboundSyncUpdatesPerSecond 100 maxTotalLocalRequestsRate 200 maxLocalRequestsPerSecondPerThing 20 } shadowDocumentSizeLimitBytes 8192}
该 json 配置在两个方向上同步名为 NumberLEDNamedShadow 的 命名影子,选项为 betweenDeviceAndCloud。在您的实际应用中,您可以使用多个命名影子,并选择单向或双向同步。有关 awsgreengrassShadowManager 的详细信息,请查看 其文档。
完成 创建部署 向导以完成部署。完成步骤 2 后,Raspberry Pi 准备好通过使用 AWS IoT Greengrass 核心软件和预构建组件在设备和云之间同步命名影子 NumberLEDNamedShadow。
第三步:创建 AWS IoT Greengrass 组件以模拟智能家居电暖器并支持本地控制
现在创建两个 AWS IoT Greengrass 组件,以模拟具有本地控制的智能家居电暖器。我们可以利用 进程间通信 (IPC) 在组件之间进行内部通信。如果您不熟悉如何构建自定义 AWS IoT Greengrass 组件,请遵循 开始使用文档 中的步骤 4。本博客中,我们将其本地创建和测试。
组件 examplesensehatjoystick:捕获摇杆的事件并将事件发布到 IPC 主题 “ipc/joystick”在食谱中定义为变量。组件 examplesensehatled:订阅 IPC 主题 “ipc/joystick”,更新本地影子和 Sense HAT LED 显示屏。31 创建组件 comexamplesensehatjoystick此组件将内置摇杆的事件发布到 AWS IoT Greengrass 核心 IPC。事件格式如下:
json{ timemillis1669202845134 directiondown actionreleased}
您可以在 组件食谱 和 工件 中找到该组件的信息,并可以在 博客源代码仓库 中获得。为了避免将 IPC 主题硬编码在源代码中,已在 食谱中定义 其为变量。
32 创建组件 comexamplesensehatled
现在创建第二个名为 comexamplesensehatled 的组件。您可以在 组件食谱 和 工件 中找到该组件的信息。在食谱中,它 定义 了对 IPC 和影子文档的访问权限。
该组件: 维护一个数字作为设备状态,并在 LED 上显示 通过 IPC 订阅摇杆事件主题 基于接收到的摇杆事件,增加/减少数字 定期检查影子。如果影子文档中有新数字,则用该数字更新设备。
图 7 comexamplesensehatled 组件工作流
演示:设备状态实时管理
现在 Raspberry Pi 作为模拟器已准备就绪。
它响应两种类型的事件: 新的摇杆事件:本地控制设备 新的云影子文档:远程控制设备
图 8:本地或远程控制设备的逻辑
要查看设备影子的实时效果:1 访问 AWS IoT Greengrass 控制台2 导航到 Things,选择 PiWithSenseHat3 在 Device Shadows 中,您可以找到 NumberLEDNamedShadow。请注意,如果设备首次反馈影子时此影子不存在,它将自动为您创建。
图 9 在 AWS 控制台中查找设备影子
演示 1:使用摇杆本地更新设备
使用摇杆本地增加/减少数字最初数字为 6。我首先将其减少到 0,然后增加到 2。观察设备影子文档实时更新在 AWS 控制台中的变化。更改实时同步到云影子。
状态更改为“由本地设备更新”
数字更改为本地的新值图 10 使用摇杆更新数字,并实时上报新值到云
演示 2:通过更新云中的设备影子文档远程更新设备
在此演示开始时,设备 LED 显示 0,设备影子文档如下:json{ state { desired { number 0 } reported { status device is updated by local number 0 } }}
在 AWS IoT Core 控制台中,编辑影子文档,使用以下 Json可以跳过“报告”部分,然后点击 更新:json{ state { desired { number 9 } }}
观察 Raspberry Pi LED 更新数字。从云到本地设备的变化被推送。现在设备显示数字 9:
状态更改为“由影子更新的设备”数字从 0 更改为 9。图 11 通过更新云中的设备影子文档远程更新设备
由于显示数字可以通过本地摇杆或 AWS 控制台远程更新,因此最新的更新会优先处理。因此,当本地更新完成时,必须 将“期望”值 设置回云中的远程影子,以便远程影子知道新的“期望”值,并且不会在下次影子同步周期中更新它。有关详细信息,请参阅文档 [deviceshadowemptyfields