如何获取子属性/TwinCollection 的元数据/版本?

How to get Metadata / versions for sub-properties / TwinCollection?

我正在使用 Azure IoT SDK 实现 Java DeviceTwin 功能。在调用 startDeviceTwin() 时,我在 TwinPropertyCallBack.

中收到一次报告的和所需的属性

但是,在发送的Property里面,我只能得到'root node'的version,对于子属性或者TwinCollections(他们都是null)。在 Azure Portal 上,我可以清楚地看到它们在 JSON 的元数据部分都有自己的版本。示例:

...
  "properties": {
    "desired": {
      "Broadcast": {
        "0": {
          "Scene": 2,
          "Brightness": 13
        }
      },
      "$metadata": {
        "$lastUpdated": "2020-12-01T07:53:53.0372127Z",
        "$lastUpdatedVersion": 17,
        "Broadcast": {
          "0": {
            "$lastUpdated": "2020-12-01T07:53:53.0372127Z",
            "$lastUpdatedVersion": 17,
            "Scene": {
              "$lastUpdated": "2020-12-01T07:53:53.0372127Z",
              "$lastUpdatedVersion": 17
            },
            "Brightness": {
              "$lastUpdated": "2020-12-01T07:28:08.5730028Z",
              "$lastUpdatedVersion": 15
            }
          },
          "$lastUpdated": "2020-12-01T07:53:53.0372127Z",
          "$lastUpdatedVersion": 17
        }
      },
      "$version": 17
    },
...

如何接收嵌套 TwinCollection 的这些版本?是某种配置还是目前不支持?

在上面的例子中,我想防止重新处理亮度值,因为我的本地状态已经是 'Version 15'。

根据 Azure documentation,您应该获得每个 属性 的 lastUpdatedVersion。我能够在 NodeJS 中获取包括 lastUpdatedVersion 在内的整个元数据对象,因此类似的功能也应该在 Java 中工作。

相关 Github 问题发布于:Azure/azure-iot-sdk-java/issue

以下是 MicrosoftTeam 的回复。

The service does not send that metadata to devices by design. It is only available to service clients who request for a device's twin. In general, you will need to rely on the overall version of the document for concurrency protection.

如果您在这件事上需要进一步的帮助,请在下面发表评论。