Compartilhar via

如何在设备和 DPS 之间传输有效负载

向 DPS 注册的设备在注册时需要提供注册 ID 和有效凭据(密钥或 X.509 证书)。 但是,可能有 IoT 解决方案或方案需要更多来自设备的数据。 例如,自定义分配策略 Webhook 可能会使用诸如设备型号之类的信息来选择要为设备进行预配的 IoT hub。 同样,设备可能需要注册响应中的更多数据来促进其客户端逻辑。 DPS 为设备提供了在注册时发送和接收可选有效负载的功能。

何时使用

发送可选有效负载的常见场景是:

  • 自定义分配策略可以使用设备有效负载来帮助为设备选择IoT hub或设置其初始数字孪生。 例如,你可能希望基于设备模型分配设备。 在这种情况下,可将设备配置为在注册时报告其型号信息。 DPS 将设备的有效负载传递到自定义分配 Webhook。 然后,Webhook 可以根据设备模型信息来决定将设备预配到哪些IoT hub。 如果需要,Webhook 还可以在 Webhook 响应中将数据以 JSON 对象的形式返回给设备。 有关详细信息,请参阅在自定义分配中使用设备有效负载

  • IoT Plug and Play(PnP)设备在向 DPS 注册时可能使用有效负载发送其模型 ID。 可以在 SDK 或示例存储库中的 PnP 示例中找到此用法的示例。 例如,C# PnP 恒温器Node.js PnP 温度控制器

  • 通过 DPS 进行连接的 IoT Central 设备应该遵循 IoT Plug and Play 约定,并在注册时发送其模型 ID。 IoT Central 使用型号 ID 将设备分配到正确的设备模板。

设备将数据负载发送到 DPS

当设备调用 注册设备 以向 DPS 注册时,它可以在 有效负载 属性中包含更多数据。 例如,以下 JSON 显示了使用 TPM 证明进行注册的请求的正文:

{ 
    "registrationId": "mydevice", 
    "tpm": { 
        "endorsementKey": "xxxx-device-endorsement-key-xxxx", 
        "storageRootKey": "xxx-device-storage-root-key-xxxx" 
    }, 
    "payload": { A JSON object that contains your additional data } 
} 

payload 属性必须是一个 JSON 对象,可以包含与 IoT 解决方案或场景相关的任何数据。

DPS 将数据返回给设备

DPS 可以在注册响应中将数据返回给设备。 目前,此功能只能在自定义分配场景中使用。 如果自定义分配策略 Webhook 需要将数据返回给设备,它可以在 Webhook 响应中以 JSON 对象的形式传回数据。 然后,DPS 将该数据传回到 Register Device 响应registrationState.payload 属性中。 例如,以下 JSON 显示了使用 TPM 证明成功注册的响应正文。

{
   "operationId":"5.316aac5bdc130deb.b1e02da8-xxxx-xxxx-xxxx-7ea7a6b7f550",
   "status":"assigned",
   "registrationState":{
      "registrationId":"my-tpm-device",
      "createdDateTimeUtc":"2022-08-31T22:02:50.5163352Z",
      "assignedHub":"sample-iot-hub-1.azure-devices.cn",
      "deviceId":"my-tpm-device",
      "status":"assigned",
      "substatus":"initialAssignment",
      "lastUpdatedDateTimeUtc":"2022-08-31T22:02:50.7370676Z",
      "etag":"xxxx-etag-value-xxxx",
      "tpm": {"authenticationKey": "xxxx-encrypted-authentication-key-xxxxx"},
      "payload": { A JSON object that contains the data returned by the webhook }
   }
}

payload 属性必须是一个 JSON 对象,可以包含与 IoT 解决方案或场景相关的任何数据。

SDK 支持

此功能在 C、C#、JAVA 和 Node.js 客户端 SDK 中可用。 若要详细了解可用于IoT Hub和IoT Hub设备预配服务的 Azure IoT SDK,请参阅 Azure IoT SDK

IoT Edge 支持

从版本 1.4 开始,IoT Edge支持发送 JSON 文件中包含的数据有效负载。 在设备进行(重新)注册时(通常发生在您首次运行 iotedge config apply 时),将读取有效负载文件并发送到 DPS。 也可以使用 CLI 的重新预配命令 iotedge system reprovision 强制其被重新读取和注册。

下面的示例是一个代码片段 /etc/aziot/config.toml,其中属性 payload 设置为本地 JSON 文件的路径。

   [provisioning]
   source = "dps"
   global_endpoint = "https://global.azure-devices-provisioning.net"
   id_scope = "0ab1234C5D6"

   # Uncomment to send a custom payload during DPS registration
   payload = { uri = "file:///home/aziot/payload.json" }

有效负载文件(在本例中为 /home/aziot/payload.json)可以包含任何有效的 JSON,例如:

{
    "modelId": "dtmi:com:example:edgedevice;1"
}

后续步骤