Как отправить явный ответ с полезной нагрузкой для сообщения C2D (Cloud to Device) Azure IoT Hub обратно инициатору?

#azure #azure-iot-hub

#azure #azure-iot-hub

Вопрос:

В настоящее время я пытаюсь реализовать некоторую обработку сообщений C2D. До сих пор отправка сообщения C2D из функции IoT Hub работает как шарм, и я получаю и обрабатываю полезную нагрузку без каких-либо проблем.

Однако моя проблема заключается в том, что на стороне инициатора я всегда получаю положительное подтверждение, даже если я отключаю устройство IoT во время обработки команды. Кажется, что вся документация начинает становиться немного расплывчатой, как только дело доходит до ответов на сообщения C2D. И я несколько раз прочитал соответствующие документы о функциональности IoT Hub… Надеюсь, я не пропустил важную часть, но я сомневаюсь в этом.

Итак, как я могу явно отправить ответ инициатору, который также содержит полезную нагрузку?

В настоящее время я использую бесплатную демо-подписку, поскольку делаю свои первые шаги с IoT Hub.

Помощь с благодарностью.

Комментарии:

1. Какой протокол устройства используется для подключения к IoT Hub? Обратите внимание, что устройство, подключенное с использованием протокола MQTT , автоматически сгенерирует подтверждение, когда устройство подключено (и подписано). Другими словами, подключенное устройство MQTT не может обработать отклонение или отказ от сообщений C2D. Я рекомендую использовать postman для имитации https-устройства для обмена сообщениями C2D, см. REST API docs.microsoft.com/en-us/rest/api/iothub/device

Ответ №1:

Хорошим началом для любого взаимодействия из облака с устройством является эта страница. Из того, что я могу сказать, в вашей ситуации вы, возможно, захотите использовать прямой метод, а не сообщение C2D. Сообщение C2D отлично подходит для уведомления устройства, но, как вы уже испытали, нет встроенных функций для ответа на сообщение.

Прямой метод позволяет отправить запрос на устройство, и чтобы это устройство ответило на него. Как для запроса, так и для ответа разрешена полезная нагрузка JSON размером 128 КБ, поэтому вы можете использовать ее на стороне устройства для отправки чего-либо обратно.

Обновление: Как упоминалось в комментариях, вы не оказываете большого влияния на то, как обрабатывать сообщения C2D с устройства, кроме как принимать / отклонять их. Вот как можно отклонить сообщение, используя C # Device SDK.

 private async Task RejectSample()
{
    var deviceClient = DeviceClient.CreateFromConnectionString("muchconnectionstring");
    var message = await deviceClient.ReceiveAsync();
    // await deviceClient.CompleteAsync(message);
    await deviceClient.RejectAsync(message);
}
 

Комментарии:

1. Но на этих страницах документации (особенно здесь: docs.microsoft.com/en-us/azure/iot-hub /… ) они говорят: «Когда вы отправляете сообщение из облака на устройство, служба может запросить доставку обратной связи для каждого сообщения о конечном состоянии этого сообщения. Для этого свойству приложения iothub-ack в отправляемом сообщении cloud-to-device присваивается одно из следующих четырех значений:» … и я установил его на «полный»… означает ли это, что я не могу контролировать ответ, и IoT Hub генерирует его, как только сообщение доставлено?

2. Когда вы установите iothub-ack для свойства full значение, вы получите сообщение обратной связи, как только ваше сообщение C2D будет «завершено» устройством. Он также выдаст вам сообщения обратной связи, если срок действия сообщения истек или было достигнуто максимальное количество доставок. Вы правы, говоря, что у вас нет никакого контроля над ответом, кроме отклонения сообщения со стороны устройства.

3. Есть ли какие-либо доступные примеры того, как устройство может фактически отклонить сообщение?

4. Теперь есть (см. Обновление). Большинство примеров сосредоточены на счастливом потоке. Но в C # SDK это так же просто, как заставить клиента отклонить сообщение.

5. Да… ну, вероятно, поскольку я использую версию SDK GO от github.com/amenzhinsky/iothub … вероятно, это просто не поддерживается.