首页 > 解决方案 > Azure IoT Hub:没有 SDK 的 HTTP 设备到云消息?

问题描述

我正在使用一个 32 位微控制器(用 C 编写的程序代码),它的闪存空间非常有限,它与蜂窝模块通信。我有一个带有 IoT 中心的 Azure 帐户设置,我想将一些设备到云的消息发送到我的 IoT 中心。我已经测试并确认了与其他服务器的 HTTP 和 HTTPS 通信。但是,我找不到任何地方指定发送设备到云消息所需的 HTTP 标头是什么。谁能提供所需 HTTP 消息格式的描述(HTTP 起始行、所需的 HTTP 标头和 HTTP 标头值)?

我找到了 Azure SDK for C,但即使打开了所有优化选项,它也为我的微控制器占用了太多的代码空间。我已经尝试按照 SDK 中的代码来了解如何构建 HTTP 消息,但我似乎遗漏了一些内容。我只有两三个要发送的设备到云消息,所以我假设如果我知道标头是什么,生成设备到云消息不需要太多代码。

我拥有的蜂窝模块正在处理用于相互 TLS 身份验证的 X.509 证书。假设这是有效的。对于这个问题,我只关心为 Azure IoT 设备到云消息找到所需的 HTTP 消息格式。

编辑:根据评论的建议,我最终被带到了这个页面: https ://docs.microsoft.com/en-us/rest/api/iothub/device/senddeviceevent

使用建议的 HTTP POST(替换了我的设备细节),我现在收到 401 错误(IotHubUnauthorizedAccess)。我以为我了解身份验证应该如何工作,但我想我错了。

我的 IoT 设备有一个对称密钥。我以为我应该包含一个格式为:

Authorization:SharedAccessKey=<my_primary_key>

但这不起作用。我的 HTTP 正文很简单:

{"deviceID":<my_IoT_Device_ID>}

我应该在哪里包含对称密钥信息,它的格式是什么?

标签: cazurehttpazure-iot-hub

解决方案


经过反复试验,我们发现它比我们想象的要容易得多。如果您使用 X.509 证书进行客户端身份验证,则不需要在 HTTP 消息内容中包含任何内容来指定您的身份验证。使用 X.509 证书进行身份验证的 Azure 设备到云消息的最低要求是:

POST /devices/<id>/messages/events?api-version=2018-06-30 HTTP/1.1
Host:<fully-qualified-iothubname>.azure-devices.net
Content-Length:<number-of-bytes-in-the-JSON-body>

{"deviceID":"<id>",<your-JSON-formatted-custom-d2c-message-data>}

其中<id>是 Azure IoT 中心列出的设备 ID,<fully-qualified-iothubname>是 IoT 中心的名称。如果您想这样做而不是使用Content-Length标头,我相信 Azure 支持分块编码。


推荐阅读