在应用程序和服务中使用影子 - AWS IoT
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

在应用程序和服务中使用影子

本节介绍了应用程序或服务如何与 AWS IoT Device Shadow 服务进行交互。该示例假定应用程序或服务仅与影子进行交互,并通过影子与设备进行交互。该示例不包括任何管理操作,例如创建或删除影子。

该示例使用 AWS IoT Device Shadow 服务的 REST API 与影子进行交互。与在设备中使用影子中使用的示例(它使用发布/订阅通信模型)不同,该示例使用 REST API 的请求/响应通信模型。这意味着,应用程序或服务必须先发出请求,然后才能从 AWS IoT 收到响应。但该模型的一个缺点是,它不支持通知。如果应用程序或服务需要及时通知设备状态变化,请考虑使用 MQTT 或基于 WSS 的 MQTT 协议,这些协议支持发布/订阅通信模型,如在设备中使用影子中所述。

重要

确保应用程序或服务使用的影子与设备中的相应实施保持一致,并且该实施支持使用这些影子。例如,考虑如何创建、更新和删除影子,以及如何在设备以及访问影子的应用程序或服务中处理更新。您的设计应明确指定如何更新和报告设备的状态,以及应用程序和服务如何与设备及其影子进行交互。

命名的影子的 REST API URL 为:

https://endpoint/things/thingName/shadow?name=shadowName

未命名的影子的 REST API URL 为:

https://endpoint/things/thingName/shadow

其中:

endpoint

CLI 命令返回的终端节点:

aws iot describe-endpoint --endpoint-type IOT:Data-ATS
thingName

影子所属的事物对象的名称

shadowName

命名的影子的名称。该参数不用于未命名的影子。

在连接到 AWS IoT 时初始化应用程序或服务

在应用程序首次连接到 AWS IoT 时,它应将 HTTP GET 请求发送到它使用的影子的 URL,以获取它使用的影子的当前状态。这样,它就可以将应用程序或服务同步到影子。

在应用程序或服务连接到 AWS IoT 后处理状态更改

在应用程序或服务连接到 AWS IoT 后,它可以在使用的影子的 URL 上发送 HTTP GET 请求以定期查询当前状态。

在最终用户与应用程序或服务交互以更改设备状态时,应用程序或服务可以向它使用的影子的 URL 发送 HTTP POST 请求以更新影子的 desired 状态。该请求返回已接受的更改,但您可能需要发出 HTTP GET 请求以轮询影子,直到设备使用新状态更新了影子为止。

检测是否连接了设备

要确定当前是否连接了设备,请在影子文档中包含一个 connected 属性;如果设备由于错误而断开连接,则使用 MQTT Last Will and Testament (LWT) 消息将 connected 属性设置为 false

注意

AWS IoT Device Shadow 服务忽略发送到 AWS IoT 保留主题(以 $ 开头的主题)的 MQTT LWT 消息。不过,它们由订阅的客户端和 AWS IoT 规则引擎处理,因此,您需要创建发送到非保留主题的 LWT 消息,并创建一个规则以将 MQTT LWT 消息作为影子更新消息重新发布到影子的保留更新主题 ShadowTopicPrefix/update

向 Device Shadow 服务发送 LWT 消息

  1. 创建一个规则以在保留的主题上重新发布 MQTT 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" } }] } }
  2. 在设备连接到 AWS IoT 时,它在非保留主题中注册 LWT 消息,以使重新发布规则能够识别该消息。在此示例中,该主题为 my/things/myLightBulb/update,它将 connected 属性设置为 false

    { "state": { "reported": { "connected":"false" } } }
  3. 在连接后,设备在其影子更新主题 $aws/things/myLightBulb/shadow/update 上发布消息以报告其当前状态,这包括将其 connected 属性设置为 true

    { "state": { "reported": { "connected":"true" } } }
  4. 在设备正常断开连接之前,它在其影子更新主题 $aws/things/myLightBulb/shadow/update 上发布消息以报告其最新状态,这包括将其 connected 属性设置为 false

    { "state": { "reported": { "connected":"false" } } }
  5. 如果设备由于错误而断开连接,AWS IoT 消息代理将代表设备发布设备的 LWT 消息。重新发布规则检测该消息,并发布影子更新消息以更新设备影子的 connected 属性。