让我们从头开始,设备影子是 AWS IoT Registry 中定义的事物的持久虚拟影子。基本上,它是一个 JSON 状态文档,用于存储和检索事物的当前状态信息。您可以使用 MQTT 主题或 REST API 调用与设备影子进行交互。 Shadows 的主要优点是您可以与它进行交互,无论该事物是否连接到 Internet。
影子的文档包含描述设备状态各个方面的状态属性:
{
"state": {
"desired": {
"color": "RED"
},
"reported": {
"color": "GREEN"
},
"delta": {
"color": "RED"
}
}
}
下面是每个状态的描述:
- 应用通过更新
desired 对象来指定所需的设备属性状态。
- 设备在
reported 对象中报告其当前状态。
- AWS IoT 在
delta 对象中报告所需状态和报告状态之间的差异。
每个影子都有一个保留的 MQTT 主题和 HTTP URL,支持对影子的 get、update 和 delete 操作。一起来看看吧:
-
$aws/things/THING_NAME/shadow/update:发布到这个主题以更新/创建影子;
-
$aws/things/THING_NAME/shadow/update/accepted:AWS IoT 在接受更新请求时将状态文档的 reported 或 desired 部分发布到此主题;
-
$aws/things/THING_NAME/shadow/update/rejected:AWS IoT 在拒绝更新请求时向该主题发布错误消息;
-
$aws/things/THING_NAME/shadow/update/documents:只要成功执行影子更新,AWS IoT 就会向该主题发布一个状态文档,其中包含 Previous 和 Current 状态信息;
-
$aws/things/THING_NAME/shadow/update/delta:当 AWS IoT 接受事物影子的更改并且请求状态文档包含所需状态和报告状态的不同值时,它会向该主题发布响应 Delta State Document。
这是一个例子。假设我们有一个空气净化器,我们想改变风扇速度。流程如下:
- 用户通过空气净化器移动应用更改风扇速度
- 移动应用程序将以下 JSON 消息发布到此 MQTT 主题:
$aws/things/THING_NAME/shadow/update 以使用新的所需状态更新设备影子:"fanSpeed": 50。它看起来像这样:
{
"state": {
"desired": {
"fanSpeed": 50
}
}
}
- 影子更新成功后,如果之前的
reported 状态与"fanSpeed": 50 不同,AWS IoT 会将desired 状态发布到增量主题$aws/things/THING_NAME/shadow/update/delta。
- 影子状态文档可能如下所示:
{
"state": {
"desired": {
"fanSpeed": 50
},
"reported": {
"fanSpeed": 100
},
"delta": {
"fanSpeed": 50
}
}
}
- 订阅了 delta 主题的设备(我们的空气净化器)将执行请求的操作(在这种情况下将风扇速度设置为 50),并使用更新主题
$aws/things/THING_NAME/shadow/update 将新状态报告回 AWS IoT Device Shadow带有以下 JSON 消息:
{
"state": {
"reported": {
"fanSpeed": 50
}
}
}
现在我们的空气净化器的风扇转速为 50...这就是它的工作原理;)