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

在设备中使用影子

本节介绍了设备使用 MQTT 消息与影子进行通信,这是设备与 AWS IoT Device Shadow 服务进行通信的首选方法。

影子通信使用 MQTT 的发布/订阅通信模型以模拟请求/响应模型。每个影子操作包含请求主题、成功的响应主题 (accepted) 和错误响应主题 (rejected)。

如果您希望应用程序和服务能够确定是否连接了设备,请参阅检测是否连接了设备

重要

由于 MQTT 使用发布/订阅通信模型,您必须先订阅响应主题,然后 再发布请求主题。否则,您不会收到您发布请求的响应。

本节中的示例使用主题的缩写形式,其中 ShadowTopicPrefix 可以表示命名或未命名的影子,如该表中所述。

影子可以是命名或未命名(经典)的。每个影子使用的主题仅在主题前缀上有所不同。下表显示每种影子类型使用的主题前缀。

ShadowTopicPrefix 影子类型
$aws/things/thingName/shadow 未命名的(经典)影子
$aws/things/thingName/shadow/name/shadowName 命名的影子

要创建完整的主题,请为要表示的影子类型选择 ShadowTopicPrefix,将 thingNameshadowName(如果适用)替换为相应的值,然后在其后面附加主题存根,如下表中所示。主题名称区分大小写。

有关影子的保留主题的更多信息,请参阅影子主题

重要

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

要创建完整的主题,请为要表示的影子类型选择 ShadowTopicPrefix,将 thingNameshadowName(如果适用)替换为相应的值,然后在其后面附加主题存根,如下表中所示。请记住,主题区分大小写。

有关影子的保留主题的更多信息,请参阅影子主题

重要

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

首次连接到 AWS IoT 时初始化设备

在 AWS IoT 中注册设备后,它应该为支持的影子订阅这些 MQTT 消息。

主题 含义 在收到该主题时设备应执行的操作

ShadowTopicPrefix/delete/accepted

已接受 delete 请求并且 AWS IoT 删除了影子。

为满足删除的影子要求而需要执行的操作,例如,停止发布更新。

ShadowTopicPrefix/delete/rejected

AWS IoT 已拒绝 delete 请求,并且未删除影子。消息正文包含错误信息。

响应消息正文中的错误消息。

ShadowTopicPrefix/get/accepted

AWS IoT 已接受 get 请求,并且消息正文包含当前影子文档。

处理消息正文中的状态文档所需的操作。

ShadowTopicPrefix/get/rejected

AWS IoT 已拒绝 get 请求,并且消息正文包含错误信息。

响应消息正文中的错误消息。

ShadowTopicPrefix/update/accepted

AWS IoT 已接受 update 请求,并且消息正文包含当前影子文档。

确认消息正文中的更新数据与设备状态匹配。

ShadowTopicPrefix/update/rejected

AWS IoT 已拒绝 update 请求,并且消息正文包含错误信息。

响应消息正文中的错误消息。

ShadowTopicPrefix/update/delta

发送到 AWS IoT 的请求更新了影子文档,并且消息正文包含请求的更改。

更新设备的状态以与消息正文中的所需状态匹配。

ShadowTopicPrefix/update/documents

最近完成了影子更新,并且消息正文包含当前影子文档。

确认消息正文中的更新状态与设备的状态匹配。

在为每个影子订阅上表中的消息后,设备应进行测试,以确定是否已将 /get 主题发布到它支持的每个影子以创建这些影子。如果收到 /get/accepted 消息,则消息正文包含影子文档,设备可以使用该文档初始化其状态。如果收到 /get/rejected 消息,应发布具有当前设备状态的 /update 消息以创建影子。

在设备连接到 AWS IoT 后处理消息

在设备连接到 AWS IoT 后,它可以接收 /update/delta 消息,并且应按以下方式将设备状态与其影子更改保持匹配:

  1. 读取所有收到的 /update/delta 消息并同步设备状态以保持匹配。

  2. 每次设备的状态发生变化时,都会使用具有设备的当前状态的 reported 消息正文发布 /update 消息。

在连接设备后,它应在出现指示时发布这些消息。

指示 主题 负载

设备的状态已发生变化。

ShadowTopicPrefix/update

具有 reported 属性的影子文档。

设备可能与影子不同步。

ShadowTopicPrefix/get

(空)

对设备执行的操作指示设备不再支持影子,例如在卸下或更换设备时。

ShadowTopicPrefix/delete

在设备的状态发生变化时

设备可能与影子不同步

ShadowTopicPrefix/get

(空)

对设备执行的操作指示设备不再支持影子,例如在卸下或更换设备时

ShadowTopicPrefix/delete

(空)

在设备重新连接到 AWS IoT 时处理消息

在具有一个或多个影子的设备连接到 AWS IoT 时,它应按以下方式将其状态与它支持的所有影子的状态进行同步:

  1. 读取所有收到的 /update/delta 消息并同步设备状态以保持匹配。

  2. 使用具有设备的当前状态的 reported 消息正文发布 /update 消息。