AWS IoT
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

Device Shadow 服务数据流

Device Shadow 服务充当中介,支持设备和应用程序检索和更新设备的影子。

为了说明设备和应用程序如何与 Device Shadow 服务进行通信,本节将介绍如何使用 AWS IoT MQTT 客户端和 AWS CLI 模拟连接了 Internet 的灯泡、应用程序和 Device Shadow 服务之间的通信。

Device Shadow 服务使用 MQTT 主题来促进应用程序和设备之间的通信。要了解相应运作方式,请使用 AWS IoT MQTT 客户端订阅以下 QoS 1 级 MQTT 主题:

$aws/things/myLightBulb/shadow/update/accepted

当设备的影子更新成功时,Device Shadow 服务将向此主题发送消息。

$aws/things/myLightBulb/shadow/update/rejected

当设备的影子更新遭拒时,Device Shadow 服务将向此主题发送消息。

$aws/things/myLightBulb/shadow/update/delta

当检测到设备的影子的“reported”部分与“desired”部分之间存在差异时,Device Shadow 服务将向此主题发送消息。有关更多信息,请参阅 /update/delta

$aws/things/myLightBulb/shadow/get/accepted

当获取设备的影子的请求获批时,Device Shadow 服务将向此主题发送消息。

$aws/things/myLightBulb/shadow/get/rejected

当获取设备的影子的请求遭拒时,Device Shadow 服务将向此主题发送消息。

$aws/things/myLightBulb/shadow/delete/accepted

当设备的影子被删除时,Device Shadow 服务将向此主题发送消息。

$aws/things/myLightBulb/shadow/delete/rejected

当删除设备的影子的请求遭拒时,Device Shadow 服务将向此主题发送消息。

$aws/things/myLightBulb/shadow/update/documents

每次设备的影子更新成功执行时,Device Shadow 服务都会向此主题发布状态文档。

要了解有关 Device Shadow 服务使用的所有 MQTT 主题的更多信息,请参阅 影子 MQTT 主题

注意

建议您订阅 .../rejected 主题,以查看 Device Shadow 服务发送的任何错误。

当灯泡联机时,它将向 $aws/things/myLightBulb/shadow/update 主题发送 MQTT 消息,告知 Device Shadow 服务其当前状态。

要模拟这一过程,请使用 AWS IoT MQTT 客户端向 $aws/things/myLightbulb/shadow/update 主题发布以下消息:

{ "state": { "reported": { "color": "red" } } }

此消息将灯泡的颜色设为红色 (“red”)。

Device Shadow 服务通过向 $aws/things/myLightBulb/shadow/update/accepted 主题发送以下消息进行响应:

{ "messageNumber": 4, "payload": { "state": { "reported": { "color": "red" } }, "metadata": { "reported": { "color": { "timestamp": 1469564492 } } }, "version": 1, "timestamp": 1469564492 }, "qos": 0, "timestamp": 1469564492848, "topic": "$aws/things/myLightBulb/shadow/update/accepted" }

此消息表明 Device Shadow 服务已收到 UPDATE 请求并更新了设备的影子。如果事物影子不存在, Shadows 服务则将创建事物影子;如果存在,则将使用消息中的数据更新该影子。如果您发现没有任何消息发布至 $aws/things/myLightBulb/shadow/update/accepted,请查看 $aws/things/myLightBulb/shadow/update/rejected 订阅,了解该主题下是否有任何错误消息。

此外,Device Shadow 服务还会向 $aws/things/myLightBulb/shadow/update/documents 主题发布以下消息。

{ "previous":null, "current":{ "state":{ "reported":{ "color":"red" } }, "metadata":{ "reported":{ "color":{ "timestamp":1483467764 } } }, "version":1 }, "timestamp":1483467764 }

每次设备的影子更新成功执行时,都会向 /update/documents 主题发布消息。有关发布到此主题的消息内容的更多信息,请参阅影子 MQTT 主题

与电灯泡交互的应用程序联机并请求获取电灯泡的当前状态。该应用程序将向 $aws/things/myLightBulb/shadow/get 主题发送一条空消息。要模拟这一过程,请使用 AWS IoT MQTT 客户端向 $aws/things/myLightBulb/shadow/get 主题发布一条空消息 ("")。

Device Shadow 服务通过向 $aws/things/myLightBulb/shadow/get/accepted 主题发布请求获取的影子进行响应:

{ "messageNumber": 1, "payload": { "state": { "reported": { "color": "red" } }, "metadata": { "reported": { "color": { "timestamp": 1469564492 } } }, "version": 1, "timestamp": 1469564571 }, "qos": 0, "timestamp": 1469564571533, "topic": "$aws/things/myLightBulb/shadow/get/accepted" }

如果您在 $aws/things/myLightBulb/shadow/get/accepted 主题下没有看到任何消息,请查看 $aws/things/myLightBulb/shadow/get/rejected 主题,了解该主题下是否有任何错误消息。

应用程序向用户显示此信息,用户请求更改电灯泡的颜色(将红色更改为绿色)。为此,该应用程序将向 $aws/things/myLightBulb/shadow/update 主题发布消息:

{ "state": { "desired": { "color": "green" } } }

要模拟这一过程,请使用 AWS IoT MQTT 客户端向 $aws/things/myLightBulb/shadow/update 主题发布之前的消息。

Device Shadow 服务通过向 $aws/things/myLightBulb/shadow/update/accepted 主题发送以下消息进行响应:

{ "messageNumber": 5, "payload": { "state": { "desired": { "color": "green" } }, "metadata": { "desired": { "color": { "timestamp": 1469564658 } } }, "version": 2, "timestamp": 1469564658 }, "qos": 0, "timestamp": 1469564658286, "topic": "$aws/things/myLightBulb/shadow/update/accepted" }

并向 $aws/things/myLightBulb/shadow/update/delta 主题发送以下消息进行响应:

{ "messageNumber": 1, "payload": { "version": 2, "timestamp": 1469564658, "state": { "color": "green" }, "metadata": { "color": { "timestamp": 1469564658 } } }, "qos": 0, "timestamp": 1469564658309, "topic": "$aws/things/myLightBulb/shadow/update/delta" }

当此主题接受影子更新并且生成的影子包含不同的预期状态和报告状态值时,Device Shadow 服务将向此主题发布消息。

Device Shadow 服务还会向 $aws/things/myLightBulb/shadow/update/documents 主题发布消息:

{ "previous":{ "state":{ "reported":{ "color":"red" } }, "metadata":{ "reported":{ "color":{ "timestamp":1483467764 } } }, "version":1 }, "current":{ "state":{ "desired":{ "color":"green" }, "reported":{ "color":"red" } }, "metadata":{ "desired":{ "color":{ "timestamp":1483468612 } }, "reported":{ "color":{ "timestamp":1483467764 } } }, "version":2 }, "timestamp":1483468612 }

电灯泡已订阅 $aws/things/myLightBulb/shadow/update/delta 主题,因此可以接收到消息、更改其颜色并发布新状态。要模拟这一过程,请使用 AWS IoT MQTT 客户端向 $aws/things/myLightbulb/shadow/update 主题发布以下消息,以更新影子状态:

{ "state":{ "reported":{ "color":"green" }, "desired":null} } }

Device Shadow 服务通过向 $aws/things/myLightBulb/shadow/update/accepted 主题发送消息进行响应:

{ "messageNumber": 6, "payload": { "state": { "reported": { "color": "green" }, "desired": null }, "metadata": { "reported": { "color": { "timestamp": 1469564801 } }, "desired": { "timestamp": 1469564801 } }, "version": 3, "timestamp": 1469564801 }, "qos": 0, "timestamp": 1469564801673, "topic": "$aws/things/myLightBulb/shadow/update/accepted" }

并向 $aws/things/myLightBulb/shadow/update/documents 主题发送以下消息进行响应:

{ "previous":{ "state":{ "reported":{ "color":"red" } }, "metadata":{ "reported":{ "color":{ "timestamp":1483470355 } } }, "version":3 }, "current":{ "state":{ "reported":{ "color":"green" } }, "metadata":{ "reported":{ "color":{ "timestamp":1483470364 } } }, "version":4 }, "timestamp":1483470364 }

应用程序向 Device Shadow 服务请求获取当前状态并显示最新状态数据。要模拟这一过程,请运行以下命令:

aws iot-data get-thing-shadow --thing-name "myLightBulb" "output.txt" && cat "output.txt"

注意

在 Windows 上,请忽略 && cat "output.txt" 命令,该命令用于向控制台显示 output.txt 内容。您可以在记事本或任何文本编辑器中打开该文件,以查看影子的内容。

Device Shadow 服务将返回影子文档:

{ "state":{ "reported":{ "color":"green" } }, "metadata":{ "reported":{ "color":{ "timestamp":1469564801 } } }, "version":3, "timestamp":1469564864}

要删除设备的影子,请将一条空消息发布到 $aws/things/myLightBulb/shadow/delete 主题。AWS IoT 通过向 $aws/things/myLightBulb/shadow/delete/accepted 主题发布消息来做出响应:

{ "version" : 1, "timestamp" : 1488565234 }

检测事物是否已连接

要确定设备当前是否已连接,请在影子中包含一个已连接设置,然后使用 MQTT Last Will and Testament (LWT) 消息,该消息会在设备由于错误而断开连接时将已连接设置设为 false

注意

目前,AWS IoT Device Shadow 服务将忽略发送至 AWS IoT 预留主题(以 $ 开头的主题)的 LWT 消息,但订阅的客户端和 AWS IoT 规则引擎仍会处理此类消息。如果您希望 Device Shadow 服务接收 LWT 消息,请将一条 LWT 消息注册为非预留主题,然后创建一条在预留的主题中重新发布消息的规则。以下示例将展示如何创建重新发布规则,以侦听 my/things/myLightBulb/update 主题发布的消息并将其重新发布到 $aws/things/myLightBulb/shadow/update 主题。

{ "rule": { "ruleDisabled": false, "sql": "SELECT * FROM 'my/things/myLightBulb/update'", "description": "Turn my/things/ into $aws/things/", "actions": [{ "republish": { "topic": "$$aws/things/myLightBulb/shadow/update", "roleArn": "arn:aws:iam::123456789012:role/aws_iot_republish" } }] } }

当设备成功连接后,它将注册一条 LWT 消息并将已连接设置设为 false

{ "state": { "reported": { "connected":"false" } } }

它还会在其更新主题 ($aws/things/myLightBulb/shadow/update) 下发布一条消息,以将其连接状态设置为 true

{ "state": { "reported": { "connected":"true" } } }

当设备正常断开连接时,它将在其更新主题下发布消息并将其连接状态设置为 false

{ "state": { "reported":{ "connected":"false" } } }

如果设备由于错误而断开连接,其 LWT 消息将自动发布到更新主题。

本页内容: