AWS IoT 影子文件所需字段和报告字段之间的区别

Difference between AWS IoT shadow file desired and reported fields

我正在查看 AWS IoT documentation for shadow states 并试图更好地理解影子文件中 desiredreported 的用法。

文档指出:

When the shadow's state changes, AWS IoT sends /delta messages to all MQTT subscribers with the difference between the desired and the reported states.

看完文档的其余部分后,我觉得我对 desiredreported 的用例没有清晰的把握。有人可以解释用例吗?我们什么时候使用一个与另一个?

让我们从头开始,设备影子是 AWS IoT Registry 中定义的事物的持久虚拟 影子。基本上,它是一个 JSON 状态文档,用于存储和检索事物的当前状态信息。您可以使用 MQTT 主题或 REST API 调用与 Device Shadow 进行交互。 Shadows 的主要优点是您可以与其进行交互,无论它是否连接到 Internet。

影子的文档包含描述设备状态的各个方面的状态属性:

{
  "state": {
    "desired": {
      "color": "RED"
    },
    "reported": {
      "color": "GREEN"
    },
    "delta": {
      "color": "RED"
    }
  }
}

这是对每个状态的描述:

  • 应用程序通过更新 desired 对象来指定设备属性的所需状态。
  • 设备在 reported 对象中报告它们的当前状态。
  • AWS IoT 报告 delta 对象中所需状态与报告状态之间的差异。

每个影子都有一个保留的 MQTT 主题和 HTTP URL,支持影子上的 getupdatedelete 操作。一起来看看:

  • $aws/things/THING_NAME/shadow/update:将此主题发布到 update/create Thing Shadow;
  • $aws/things/THING_NAME/shadow/update/accepted:AWS IoT 在接受更新请求时发布关于此主题的状态文档的 reporteddesired 部分;
  • $aws/things/THING_NAME/shadow/update/rejected:AWS IoT 在拒绝更新请求时向该主题发布错误消息;
  • $aws/things/THING_NAME/shadow/update/documents:每当更新到此主题时,AWS IoT 都会发布一个包含 PreviousCurrent 状态信息的状态文档阴影执行成功;
  • $aws/things/THING_NAME/shadow/update/delta:当 AWS IoT 接受事物影子的更改并且请求状态文档包含所需状态和报告状态的不同值时,AWS IoT 会发布对此主题的响应增量状态文档。

举个例子。假设我们有一台空气净化器,我们想改变风扇速度。流程如下:

  1. 用户通过空气净化器移动应用程序更改风扇速度
  2. 移动应用程序向此 MQTT 主题发布以下 JSON 消息:$aws/things/THING_NAME/shadow/update 以使用新的所需状态更新设备影子:"fanSpeed": 50。它看起来像这样:
{
  "state": {
    "desired": {
      "fanSpeed": 50
    }
  }
}
  1. 影子更新成功后,如果先前的 reported 状态不同于 "fanSpeed": 50,AWS IoT 将发布 desired 状态到增量主题 $aws/things/THING_NAME/shadow/update/delta.
  2. 影子状态文档可能如下所示:
{
  "state": {
    "desired": {
      "fanSpeed": 50
    },
    "reported": {
      "fanSpeed": 100
    },
    "delta": {
      "fanSpeed": 50
    }
  }
}
  1. 订阅 delta 主题的设备(我们的空气净化器)将执行请求的操作(在本例中将风扇速度设置为 50),并使用更新主题 $aws/things/THING_NAME/shadow/update 以及以下 JSON 消息:
{
  "state": {
    "reported": {
      "fanSpeed": 50
    }
  }
}

现在我们的空气净化器的风扇速度为 50... 这就是它的工作原理 ;)