c - 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>}
我应该在哪里包含对称密钥信息,它的格式是什么?
解决方案
经过反复试验,我们发现它比我们想象的要容易得多。如果您使用 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 支持分块编码。
推荐阅读
- django - ImportError:无法导入名称“force_unicode”导致另一个异常
- c# - WPF IsPressed 触发器在鼠标离开按钮时消失
- c# - VirtualFileDataObject 实现不适用于 Outlook 365
- c++ - 为什么我不能用 SFML C++ 创建字体变量?
- reactjs - 在 Ant 设计 (antd) 表组件中使用带有 React Hooks 的 ref 和自定义过滤器
- java - 使用 SimpleCommandLinePropertySource 提取属性在 Java 中不起作用
- reactjs - React Hooks:当只有 props.children 值发生变化时,如何防止重新渲染整个组件?
- javascript - 使用 pushState 将查询参数附加到 url 的末尾
- python - 如何在不使用 sorted 函数的情况下对字典进行排序?
- angular - 角度地理哈希意外令牌导出