AWS IoT
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

事物影子数据流

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

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

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

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

当事物影子更新成功时,Thing Shadows 服务将向该主题发送消息。

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

当事物影子更新被拒绝时,Thing Shadows 服务将向该主题发送消息。

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

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

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

当获取事物影子的请求获批时,Thing Shadows 服务将向该主题发送消息。

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

当获取事物影子的请求被拒绝时,Thing Shadows 服务将向该主题发送消息。

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

当事物影子被删除时,Thing Shadows 服务将向该主题发送消息。

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

当删除事物影子的请求被拒绝时,Thing Shadows 服务将向该主题发送消息。

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

每次事物影子更新成功执行时,Thing Shadows 服务都会向该主题发布状态文档。

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

注意

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

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

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

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

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

Thing Shadows 服务通过向 $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" }

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

此外,Thing Shadows 服务还向 $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 主题发布一条空消息 ("")。

Thing Shadows 服务通过向 $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 主题发布之前的消息。

Thing Shadows 服务通过向 $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" }

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

Thing 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} } }

Thing Shadows 服务通过向 $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 }

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

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

注意

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

Thing Shadows 服务将返回事物影子文档:

{ "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 影子服务将忽略发送至 AWS IoT 预留主题 (以 $ 开头的主题) 的 LWT 消息,但订阅的客户端和 AWS IoT 规则引擎仍会处理此类消息。如果您希望 AWS IoT Shadows 服务接收 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 消息将自动发布到更新主题。

本页内容: