Azure IoT Hub: HTTP-сообщения устройства с облаком без SDK? - PullRequest
0 голосов
/ 07 мая 2019

Я использую 32-битный микроконтроллер (программный код, написанный на C) с очень ограниченным пространством флэш-памяти, которое обменивается данными с сотовым модулем. У меня настроена учетная запись Azure с концентратором IoT, и я хотел бы отправить некоторые сообщения с устройства в облако на мой концентратор IoT. Я проверил и подтвердил связь HTTP и HTTPS с другими серверами. Тем не менее, я не могу найти нигде, где указаны HTTP-заголовки, необходимые для отправки сообщения с устройства в облако. Может ли кто-нибудь предоставить описание необходимого формата сообщения HTTP (строка начала HTTP, требуемые заголовки HTTP и значения заголовка HTTP)?

Я нашел Azure SDK для C, но даже при всех включенных параметрах оптимизации он занимает слишком много места для моего микроконтроллера. Я попытался следовать коду в SDK, чтобы понять, как создается HTTP-сообщение, но мне кажется, что мне не хватает некоторых частей. У меня есть только два или три сообщения с устройства в облако, которые я отправляю, поэтому я предполагаю, что, если я знаю, что такое заголовки, для генерации сообщений с устройства в облако не потребуется много кода.

Модуль сотовой связи, который у меня есть, обрабатывает сертификаты X.509 для взаимной аутентификации TLS. Предположим, что работает. В связи с этим вопросом меня интересует только форматирование HTTP-сообщения, необходимого для сообщения устройства в облако IoT.

EDIT : После предложения из комментария меня в конечном итоге привели на эту страницу: 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>}

Где я должен включить информацию о симметричном ключе и в каком формате?

1 Ответ

0 голосов
/ 15 мая 2019

После некоторых проб и ошибок мы обнаружили, что это намного проще, чем мы думали.Если вы используете сертификаты X.509 для аутентификации клиента, вам не нужно ничего включать в содержимое HTTP-сообщения, чтобы указать свою аутентификацию.Минимальное значение, необходимое для сообщения Azure с устройства в облако, использующего сертификаты X.509 для проверки подлинности:

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> - это идентификатор устройства, указанный в концентраторе IoT Azure, а <fully-qualified-iothubname> - этоназвание IoT Hub.Я считаю, что Azure поддерживает чанкованное кодирование, если вы хотите сделать это вместо использования заголовка Content-Length.

...