AWS IoT Greengrass 入门-模块5:与设备影子交互
本高级模块演示 AWS IoT Greengrass 设备如何与 AWS IoT Greengrass 组 中的 AWS IoT 设备影子交互。影子 是用于存储事物的当前或所需状态信息的 JSON 文档。在本模块中,您将探索一个 AWS IoT Greengrass 设备 (GG_Switch
) 如何修改另一个 AWS IoT Greengrass 设备 (GG_TrafficLight
) 的状态,以及这些状态如何同步到 AWS IoT Greengrass 云。
配置设备和订阅
当 AWS IoT Greengrass Core 连接到 Internet 时,影子可以同步到 AWS IoT。在此模块中,您首先使用本地影子而不同步到云。然后,您启用云同步。每个设备都有自己的影子。
从 (设备) 页面上,在 AWS IoT Greengrass 组 中添加两个新设备。
- 将设备命名为
GG_Switch
和GG_TrafficLight
。 - 生成并下载两个设备的一键式默认安全资源。
- 记下设备的安全资源的文件名中的哈希组分。稍后会用到这些值。
- 将设备命名为
将为两个设备下载的证书和密钥解压缩到计算机上的单个文件夹中。 将在上一模块中下载的
root-ca-cert.pem
文件复制到此文件夹中。确保将设备设置为使用本地影子。否则,请选择省略号 (…),然后选择 (仅限本地)。
此模块中使用的函数代码要求您手动配置核心的终端节点。
在组配置页面上,选择 (设置)。
对于 (本地连接检测),选择 (手动管理连接信息),然后选择 (查看核心的特定终端节点信息)。
选择您的核心,然后选择**(连接)**。
选择编辑,确保只有一个终端节点值。该值必须是 AWS IoT Greengrass Core 设备的端口 8883 的 IP 地址终端节点(例如,
192.168.1.4
)。选择 (更新)。
将下表中的订阅添加到您的组中。例如,要创建第一个订阅,请执行以下操作:
- 在组配置页面中,选择 (订阅),然后选择 (添加订阅)。
- 在 (选择源) 下面,选择 (设备),然后选择 GG_Switch。
- 在 (选择目标) 下面,选择 (服务),然后选择 (本地影子服务)。
- 选择 (下一步)。
- 对于 (主题筛选条件),输入
$aws/things/GG_TrafficLight/shadow/update
。 - 选择**(下一步),然后选择(完成)**。
主题的输入方式必须与表中所示完全相同。尽管可以使用通配符来整合一些订阅,但我们不建议这种做法。
源 目标 主题 备注 GG_Switch 本地影子服务 $aws/things/GG_TrafficLight/shadow/update GG_Switch 发送更新请求来更新主题。 本地影子服务 GG_Switch $aws/things/GG_TrafficLight/shadow/update/accepted GG_Switch 需要知道更新请求是否被接受。 本地影子服务 GG_Switch $aws/things/GG_TrafficLight/shadow/update/rejected GG_Switch 需要知道更新请求是否被拒绝。 GG_TrafficLight 本地影子服务 $aws/things/GG_TrafficLight/shadow/update GG_TrafficLight 将其状态的更新发送到更新主题。 本地影子服务 GG_TrafficLight $aws/things/GG_TrafficLight/shadow/update/delta 本地影子服务通过增量主题将收到的更新发送到 GG_TrafficLight。 本地影子服务 GG_TrafficLight $aws/things/GG_TrafficLight/shadow/update/accepted GG_TrafficLight 需要知道其状态更新是否被接受。 本地影子服务 GG_TrafficLight $aws/things/GG_TrafficLight/shadow/update/rejected GG_TrafficLight 需要知道其状态更新是否被拒绝。 注意
有关
$
符号的信息,请参阅保留主题。确保 AWS IoT Greengrass 守护程序正在您的核心设备上运行。在核心设备终端中运行以下命令。
要检查守护程序是否正在运行,请执行以下操作:
ps aux | grep -E 'greengrass.*daemon'
如果输出包含
/greengrass/ggc/packages/1.9.4/bin/daemon
的root
条目,则表示守护程序正在运行。要启动守护程序,请执行以下操作:
cd /greengrass/ggc/core/ sudo ./greengrassd start
现在已准备好将 Lambda 函数和订阅配置部署到您的 AWS IoT Greengrass Core 设备。
在组配置页面上,从 (操作) 中选择 (部署)。
下载必需的文件
安装 适用于 Python 的 AWS IoT 设备开发工具包。有关说明,请参阅安装 适用于 Python 的 AWS IoT 设备开发工具包中的步骤 1。
该开发工具包供 AWS IoT 设备用于与 AWS IoT 以及与 AWS IoT Greengrass 核心设备通信。
从 GitHub 上的 AWS IoT Greengrass 样本存储库中,将
lightController.py
和trafficLight.py
文件下载到您的计算机上。将它们保存在包含 GG_Switch 和 GG_TrafficLight 设备证书和密钥的文件夹中。lightController.py
脚本对应于 GG_Switch 设备,而trafficLight.py
脚本对应于 GG_TrafficLight 设备。
测试通信 (已禁用设备同步)
确保您的计算机和 AWS IoT Greengrass Core 设备已使用同一个网络连接到 Internet。
在 AWS IoT Greengrass Core 设备上,运行以下命令以查找其 IP 地址。
hostname -I
在计算机上,使用核心的 IP 地址运行以下命令。可以使用 Ctrl + C 停止 ping 命令。
ping IP-address
获取您的 AWS IoT 终端节点。
在AWS IoT 控制台的导航窗格中,选择 (设置)。
在**(设置)** 下方,记录**(终端节点)**的值。您可以使用此值在以下步骤中替换命令中的
AWS_IOT_ENDPOINT
占位符。
在您的计算机(不是 AWS IoT Greengrass Core 设备)上,打开两个命令提示符窗口。一个窗口代表 GG_Switch 设备,另一个窗口代表 GG_TrafficLight 设备。
从 GG_Switch 设备窗口中,运行以下命令。
- 将
path-to-certs-folder
替换为包含证书、密钥和 Python 文件的文件夹的路径。 - 将
AWS_IOT_ENDPOINT
替换为您的终端节点。 - 将两个
switch
实例替换为 GG_Switch 设备的文件名中的哈希值。
cd 'path-to-certs-folder' python lightController.py --endpoint 'AWS_IOT_ENDPOINT' --rootCA root-ca-cert.pem --cert 'switch'.cert.pem --key 'switch'.private.key --thingName GG_TrafficLight --clientId GG_Switch
- 将
从 GG_TrafficLight 设备窗口中,运行以下命令。
- 将
path-to-certs-folder
替换为包含证书、密钥和 Python 文件的文件夹的路径。 - 将
AWS_IOT_ENDPOINT
替换为您的终端节点。 - 将两个
light
实例替换为 GG_TrafficLight 设备的文件名中的哈希值。
cd 'path-to-certs-folder' python trafficLight.py --endpoint 'AWS_IOT_ENDPOINT' --rootCA root-ca-cert.pem --cert 'light'.cert.pem --key 'light'.private.key --thingName GG_TrafficLight --clientId GG_TrafficLight
在首次执行时,每个设备脚本都将运行 AWS IoT Greengrass 发现服务来连接到 AWS IoT Greengrass Core(通过 Internet)。在设备发现了 AWS IoT Greengrass Core 并成功连接到它后,未来的操作可以在本地执行。
- 将
在 AWS IoT 控制台中,选择您的 AWS IoT Greengrass 组,选择 (设备),然后选择 GG_TrafficLight。
选择**(影子)。在 GG_Switch 更改状态后,影子状态中的该影子主题不应有任何更新。这是因为 GG_TrafficLight 设置为仅限本地影子而不是影子同步到云**。
测试通信 (已启用设备同步)
对于此测试,您将 GG_TrafficLight 设备影子配置为与 AWS IoT 同步。您运行与上一个测试中相同的命令,但这次当 GG_Switch 发送更新请求时,云中的影子状态会更新。
在 AWS IoT 控制台中,选择 AWS IoT Greengrass 组,然后选择**(设备)**。
对于 GG_TrafficLight 设备,选择省略号 (…),然后选择 (同步到云)。
在组配置页面上,从 (操作) 中选择 (部署)。
再次在两个终端命令行窗口运行交互命令。
现在,请检查 AWS IoT 控制台中的影子状态。选择您的 AWS IoT Greengrass 组,选择 (设备),选择 GG_TrafficLight,然后选择 (影子)。
因为已启用 GG_TrafficLight 影子到 AWS IoT 的同步,所以每当 GG_Switch 发送更新时,云中的影子状态应该会更新。此功能可用于将 Greengrass 设备的状态公开给 AWS IoT。
注意
如果需要,您可以通过查看 AWS IoT Greengrass Core日志(尤其是
runtime.log
)来排除问题:cd /greengrass/ggc/var/log sudo cat system/runtime.log | more
也可以查看
GGShadowSyncManager.log
和GGShadowService.log
。 有关更多信息,请参阅AWS IoT Greengrass 问题排查。