如何在 Azure IoT 中配置设备时发送自定义负载?

How to send custom payload while provisioning device in Azure IoT?

我正在尝试使用 Azure IoT 设备预配服务将我的设备预配到 Azure IoT,我在其中使用自定义分配策略,在管理注册组下。

当设备注册到 DPS(设备配置服务)时,它会触发一个 Azure 函数,我将在其中决定将设备分配到哪个 IoT 中心。

在我的函数中,我必须根据我需要在将自身注册到 DPS 时从设备发送的一些自定义负载来做出此决定。

如何在注册时将自定义负载从设备发送到 DPS,以便我可以在我的 Azure 函数中获取该负载并做出决定?

我正在使用 Java 作为相同的编程语言。

如果您使用的是基于 X.509 的身份验证,您的 Azure 函数将获取实际证书作为请求的一部分(在 clientCertificate 字段中)。

因此,您可能希望在您的证书中使用您可以在您的函数中读取的自定义字段,然后根据它们的内容分配您选择的 IoT 中心。

另一个选项可能更优雅,因为在您的证书中包含自定义字段可能会暴露最好​​保持私有的信息,即在单独的存储中维护 registrationId、customerId、customerId 等之间的映射,您可以在 Azure 函数中查询。

我在 Node.js 中通过单独发送自定义负载而不是在证书的自定义字段中实现了上述功能。 is the link to handle the custom payload in Azure function in node.js. This feature is available in C, C#, JAVA and Node.js client SDKs as per the Azure doc here.

关于在设备注册期间发送负载 here 是您应该在 Java 中使用的方法。

使用上述方法可以避免在证书的自定义字段中公开数据。

实际上,Azure SDK 支持在通过设备预配客户端注册设备时发送自定义负载。请参阅 .NET SDK https://docs.microsoft.com/es-es/dotnet/api/microsoft.azure.devices.provisioning.client.provisioningregistrationadditionaldata?view=azure-dotnet

中的 ProvisioningRegistrationAdditionalData Class

我认为 Java SKD 中的等效数据是 AdditionalData Class https://docs.microsoft.com/es-es/java/api/com.microsoft.azure.sdk.iot.provisioning.device.additionaldata?view=azure-java-stable

此外,您还可以使用 DPS REST API 在注册设备时提供自定义负载。在这个 post (Register Device using rest API of Azure device provisioning service?) 的答案中,您可以找到一个带有 curl 的请求示例,用于为设备配置自定义负载。

curl -L -i -X PUT --cert ./chain.pem --key ./iot-device-1.key.pem -H 'Content-Type: application/json' -H 'Content-Encoding:  utf-8' -d '{"registrationId": "iot-device-1", "payload": {"CustomProperty": "CustomValue"}}' https://global.azure-devices-provisioning.net/XXXXXXXXXXX/registrations/iot-device-1/register?api-version=2019-03-31

还要检查这个 post (http://busbyland.com/azure-iot-device-provisioning-service-via-rest-part-1/) on which that answer is based and the REST API documentation (https://docs.microsoft.com/es-es/rest/api/iot-dps/runtimeregistration/registerdevice)。