Пакет SDK для Azure Iot Hub для C: какой клиентский модуль использовать?

мы создаем продукт IoT с центром Интернета вещей Azure в качестве внутреннего решения. Основное приложение написано на 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. Кто-нибудь может помочь нам разобраться в этом?


person bring_dat    schedule 21.12.2018    source источник


Ответы (2)


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

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

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 (), который в основном обновляет сообщаемые значения на двойнике.

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

person Yi Zhong - MSFT    schedule 04.01.2019

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

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

person Mark Radbourne    schedule 21.12.2018
comment
Да, я видел реализацию, и я видел, что все они указывают на один и тот же модуль. Вопрос в том, безопасно ли использовать iothub_explorer_ll или его собираются удалить? О методах асинхронного устройства - я имел в виду IoTHubClient_LL_SetDeviceMethodCallback_Ex, который позволяет позже отправить ответ прямому методу. И да, я знаю о DoWork функции, поэтому мы выбрали низкоуровневые библиотеки. - person bring_dat; 25.12.2018
comment
Любые обновления SDK не будут включать критических изменений обратной совместимости, за исключением случая обновления основного номера версии. Строго говоря, методы обратного вызова, такие как упомянутый вами, не являются асинхронными. Когда вызывается dowork, он будет читать любые данные из сокета. Если это данные, требующие обратного вызова, например прямой вызов метода, они будут вызваны в этот момент. Это будет выполняться в потоке, в котором была вызвана функция dowork. - person Mark Radbourne; 27.12.2018