Azure Iot Hub SDK для C: какой клиентский модуль использовать? - PullRequest
0 голосов
/ 21 декабря 2018

мы создаем IoT-продукт с Azure IoT Hub в качестве внутреннего решения.Основное приложение написано на C, и мы собираемся использовать Azure SDK для C. Мы изучили SDK и решили, что будем использовать низкоуровневый клиент.Но вот в чем дело - в Azure SDK есть несколько модулей, которые кажутся независимыми - iothub_client_ll.h, iothub_device_client_ll.h и iothub_client_core_ll.h.Какой использовать?

Также мы отметили, что iothub_device_client_ll.h не имеет возможности обрабатывать метод устройства асинхронно, и нам это действительно нужно.Но модуль device_client кажется самым последним - может быть, ребята из Microsoft планируют вообще удалить iothub_client_ll модули из SDK?

Мы не смогли найти ответы на эти вопросы на веб-сайте Azure или в документах репозитория github и в обсуждениях.Кто-нибудь может помочь нам понять это?

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Мы получили этот вопрос с поля и ответили по электронной почте.В целях документации я также опубликую ответ здесь.

Это действительно хорошие вопросы.

iothub_client_ll, iothub_device_client_ll и iothub_client_core_ll

Заказчик должен использовать API-интерфейс iothub_device_client_ll *,Это действительно новый способ, которым мы хотим, чтобы люди использовали движение вперед.Iothub_client_core_ll является только внутренним (он поддерживает device_client / legacy client / module_client).Iothub_client_ll - это то, что мы имели ранее, как правильно догадался Sub Zero.

API, который, кажется, выполняет асинхронные методы, не является тем, что мы взяли в iothub_device_client_ll.С точки зрения сервисной стороны методы являются синхронными (в частности, см. https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-direct-methods, и параграф, начинающийся с «Прямые методы являются синхронными и либо успешно выполняются, либо заканчиваются ошибкой по истечении времени ожидания (по умолчанию: 30 секунд, устанавливается до 3600 секунд»).

Мы понимаем, что существуют сценарии - например, обновление прошивки - когда метод может запустить долгосрочное задание. У нас есть пример этого здесь, в частности, они должны изучить функцию device_method_callback, котораяобрабатывает обратный вызов и затем вращает поток, когда method_name == ”FirmwareUpdate” и быстро возвращает. Поток do_firmware_update (), когда завершится, обновит свой статус для сервера, вызвав sendChillerReportedProperties (), который в основном обновляет сообщенные значения для объекта-близнеца.

Асинхронный метод в устаревшем iothub_client_ll не интегрируется в двойника и имеет ограниченное значение, поэтому мы не хотим использовать его в iothub_device_client_ll.

0 голосов
/ 22 декабря 2018

Если вы просмотрите исходные файлы, то увидите, что все они обращаются к iothub_client_core_ll, поэтому практически не имеет значения, какой из них вы используете.Эти разные версии существуют только для обратной совместимости.

Я не понимаю, что вы имеете в виду под асинхронной обработкой.Ll в этих файлах обозначает низкий уровень, что означает, что они имеют меньше зависимостей, чем те версии, где нет ll.Одним из них является то, что он не использует внутреннюю многопоточность, поэтому код можно запускать на процессорах, которые не поддерживают многопоточность, поэтому все будет выполняться в одном потоке, и вам потребуется регулярно вызывать IoTHubClient_LL_DoWork (подумайте100 раз в секунду) для подключения к концентратору и отправки и получения сообщений.Если вам нужно обработать метод устройства во втором потоке, вы должны использовать версию без все обозначения.

...