Отправка сообщений из облака на устройство с помощью Центра Интернета вещей (.NET)
Центр Интернета вещей Azure — это полностью управляемая служба, которая обеспечивает надежный и защищенный двунаправленный обмен данными между миллионами устройств и серверной частью решения. В кратком руководстве по отправке данных телеметрии с устройства в центр Интернета вещей показано, как создать центр Интернета вещей, подготовить в нем удостоверение устройства и написать код приложения для устройства, которое отправляет сообщения из устройства в облако.
Примечание
Функции, описанные в этой статье, доступны только на стандартном уровне Центра Интернета вещей. Дополнительные сведения о базовом, стандартном и бесплатном уровнях см. в статье Выбор правильного уровня Центра Интернета вещей для решения.
Этот учебник является логическим продолжением статьи по отправке данных телеметрии с устройства в центр Интернета вещей. В нем описывается, как выполнять следующие задачи:
Отправка сообщений, передаваемых из облака на устройство, из серверной части решения на одно устройство через Центр Интернета вещей.
Получение на устройстве сообщений, передаваемых из облака на устройство.
Запрос из серверной части решения подтверждения доставки (отзыва) для сообщений, отправленных на устройство из Центра Интернета вещей.
Дополнительные сведения о сообщениях, отправляемых из облака на устройство, см. в статье Обмен сообщениями между устройством и облаком с помощью Центра Интернета вещей.
В конце этого руководства запускаются два консольных приложения для .NET.
SimulatedDevice. Это приложение подключается к центру Интернета вещей и получает сообщения, отправляемые из облака на устройство. Это приложение является измененной версией приложения, созданного в руководстве Отправка данных телеметрии с устройства в центр Интернета вещей.
SendCloudToDevice. Это приложение отправляет сообщение из облака в приложение устройства через Центр Интернета вещей и затем получает подтверждение доставки сообщения.
Примечание
В Центре Интернета вещей реализована поддержка для пакетов SDK для многих платформ устройств и языков (включая C, Java, Python и Javascript). Эти пакеты работают на основе пакетов SDK для устройств Azure IoT. Пошаговые инструкции по связыванию устройства с кодом из этого руководства, а также по подключению к Центру Интернета вещей Azure см. в руководстве разработчика для Центра Интернета вещей.
Предварительные требования
Visual Studio
Активная учетная запись Azure. Если ее нет, можно создать бесплатную учетную запись всего за несколько минут.
Убедитесь, что в брандмауэре открыт порт 8883. Пример устройства в этой статье использует протокол MQTT, который передает данные через порт 8883. В некоторых корпоративных и академических сетях этот порт может быть заблокирован. Дополнительные сведения и способы устранения этой проблемы см. в разделе о подключении к Центру Интернета вещей по протоколу MQTT.
Получение сообщений в приложении для устройства
В этом разделе вы измените приложение устройства, созданное в руководстве Отправка данных телеметрии с устройства в Центр Интернета вещей, чтобы с помощью Центра Интернета вещей получать сообщения из облака на устройство.
В Visual Studio в проекте SimulatedDevice добавьте в класс SimulatedDevice следующий метод:
private static async void ReceiveC2dAsync() { Console.WriteLine("\nReceiving cloud to device messages from service"); while (true) { Message receivedMessage = await s_deviceClient.ReceiveAsync(); if (receivedMessage == null) continue; Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("Received message: {0}", Encoding.ASCII.GetString(receivedMessage.GetBytes())); Console.ResetColor(); await s_deviceClient.CompleteAsync(receivedMessage); } }
Добавьте в метод Main непосредственно перед строкой
Console.ReadLine()
следующий метод:ReceiveC2dAsync();
Метод ReceiveAsync
асинхронно возвращает полученное сообщение, когда устройство его получило. Он возвращает NULL после указанного периода ожидания. В этом примере установлен период по умолчанию — одна минута. Когда приложение получит значение NULL, оно продолжит ожидание новых сообщений. Из-за этого требования присутствует строка if (receivedMessage == null) continue
.
Вызов CompleteAsync()
уведомляет Центр Интернета вещей о том, что сообщение успешно обработано и его можно безопасно удалить из очереди устройства. Устройство должно вызывать этот метод при успешном завершении обработки, независимо от используемого протокола.
Если используется AMQP и HTTPS, но не MQTT, устройство также может:
- отказаться от сообщения, и тогда Центр Интернета вещей будет хранить сообщение в очереди для последующей обработки.
- отклонить сообщение, чтобы оно было окончательно удалено из очереди.
Если по какой-либо причине устройство не сможет завершить обработку сообщения, отказаться от него или отклонить его, Центр Интернета вещей после фиксированного периода ожидания снова поместит сообщение в очередь для доставки. Поэтому логика обработки сообщений в приложении устройства должна быть идемпотентной. Это обеспечит одинаковый результат при многократном получении одного и того же сообщения.
Дополнительные сведения о том, как Центр Интернета вещей обрабатывает отправляемые из облака на устройство сообщения, включая сведения об их жизненном цикле, см. в статье Отправка сообщений из облака на устройство Центром Интернета вещей.
Примечание
При использовании HTTPS вместо MQTT или AMQP в качестве транспорта немедленно возвращается метод ReceiveAsync
. Схема сообщений, передаваемых из облака на устройство с помощью HTTPS, может использоваться на периодически подключаемых устройствах, которые редко проверяют наличие новых сообщений (по крайней мере раз в 25 минут). Если HTTPS получает много результатов, регулируются запросы в Центре Интернета вещей. Дополнительные сведения о различиях между MQTT, AMQP и HTTPS см. в статьях Руководство по обмену данными между облаком и устройством и Выбор протокола связи.
Получение строки подключения центра Интернета вещей
В этой статье вы создадите серверную службу для отправки сообщений из облака на устройство через центр Интернета вещей, созданный в кратком руководстве Отправка данных телеметрии с устройства в центр Интернета вещей. Для отправки сообщений из облака на устройство службе требуется разрешение service connect. По умолчанию каждый Центр Интернета вещей создается с помощью политики общего доступа, называемой службой, которая предоставляет это разрешение.
Чтобы получить строку подключения Центра Интернета вещей для политики службы, выполните следующие действия:
На портале Azure выберите Группы ресурсов. Выберите группу ресурсов, в которой находится центр, а затем выберите центр из списка ресурсов.
В левой части центра Интернета вещей выберите Политики общего доступа.
В списке политик выберите политику службы.
В разделе Общие ключи доступа выберите значок копирования рядом с пунктом Первичная строка подключения и сохраните значение.
Дополнительные сведения о политиках и разрешениях общего доступа Центра Интернета вещей см. в разделе Управления доступом и разрешения.
Отправка сообщения из облака на устройство
При работе с этим разделом вы создадите консольное приложение .NET, которое отправляет сообщения, передаваемые из облака на устройство, в приложение имитированного устройства.
В текущем решении Visual Studio выберите Файл>Создать>Проект. В окне Создание проекта выберите Консольное приложение (.NET Framework) и нажмите кнопку Далее.
Присвойте проекту имя SendCloudToDevice. В разделе Решение выберите Добавить в решение и примите последнюю версию .NET Framework. Выберите Создать, чтобы создать проект.
В Обозревателе решений щелкните новый проект правой кнопкой мыши и выберите пункт Управление пакетами NuGet.
В окне Управление пакетами NuGet нажмите Обзор, найдите и выберите Microsoft.Azure.Devices. Выберите пункт Установить.
После этого будут выполнены скачивание, установка и добавление ссылки на пакет SDK NuGet для служб Azure IoT.
Добавьте следующий оператор
using
в начало файла Program.cs.using Microsoft.Azure.Devices;
Добавьте следующие поля в класс Program . Замените заполнитель
{iot hub connection string}
строкой подключения центра Интернета вещей, скопированной в разделе Получение строки подключения центра Интернета вещей. Замените заполнитель{device id}
идентификатором устройства, добавленным в рамках краткого руководства Отправка данных телеметрии с устройства в центр Интернета вещей.static ServiceClient serviceClient; static string connectionString = "{iot hub connection string}"; static string targetDevice = "{device id}";
Добавьте указанные ниже метод в класс Program, чтобы отправить сообщение на устройство.
private async static Task SendCloudToDeviceMessageAsync() { var commandMessage = new Message(Encoding.ASCII.GetBytes("Cloud to device message.")); await serviceClient.SendAsync(targetDevice, commandMessage); }
Наконец, добавьте следующие строки в метод Main .
Console.WriteLine("Send Cloud-to-Device message\n"); serviceClient = ServiceClient.CreateFromConnectionString(connectionString); Console.WriteLine("Press any key to send a C2D message."); Console.ReadLine(); SendCloudToDeviceMessageAsync().Wait(); Console.ReadLine();
В обозревателе решений щелкните решение правой кнопкой мыши и выберите Назначить запускаемые проекты.
В разделе Общие свойства>Запускаемый проект выберите элемент Несколько запускаемых проектов, а затем выберите действие Запуск для SimulatedDevice и SendCloudToDevice. Нажмите кнопку ОК , чтобы сохранить изменения.
Нажмите клавишу F5. Должны запуститься оба приложения. Выберите окно SendCloudToDevice и нажмите клавишу ВВОД. Приложение для устройства должно получить сообщение.
Получение подтверждений доставки
Для каждого сообщения, передаваемого из облака на устройство, в Центре Интернета вещей можно запросить подтверждения доставки (или истечения срока действия). Этот параметр позволяет серверной части решения легко передавать данные в логику повторных попыток или компенсаций. Дополнительные сведения об отзывах сообщений, передаваемых из облака на устройство, см. в статье Обмен сообщениями между устройством и облаком с помощью Центра Интернета вещей.
В этом разделе вы измените приложение SendCloudToDevice, чтобы оно запрашивало подтверждение и получало его из Центра Интернета вещей.
В Visual Studio в проекте SendCloudToDevice добавьте в класс Program следующий метод:
private async static void ReceiveFeedbackAsync() { var feedbackReceiver = serviceClient.GetFeedbackReceiver(); Console.WriteLine("\nReceiving c2d feedback from service"); while (true) { var feedbackBatch = await feedbackReceiver.ReceiveAsync(); if (feedbackBatch == null) continue; Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("Received feedback: {0}", string.Join(", ", feedbackBatch.Records.Select(f => f.StatusCode))); Console.ResetColor(); await feedbackReceiver.CompleteAsync(feedbackBatch); } }
Обратите внимание, что шаблон получения здесь аналогичен шаблону, использовавшемуся для получения сообщений из облака на устройство из приложения устройства.
Добавьте в метод Main сразу после строки
serviceClient = ServiceClient.CreateFromConnectionString(connectionString)
следующую строку.ReceiveFeedbackAsync();
Чтобы запросить подтверждение доставки сообщения из облака на устройство, необходимо указать свойство в методе SendCloudToDeviceMessageAsync . Добавьте следующую строку сразу после строки
var commandMessage = new Message(...);
.commandMessage.Ack = DeliveryAcknowledgement.Full;
Запустите приложения, нажав клавишу F5. Должны запуститься оба приложения. Выберите окно SendCloudToDevice и нажмите клавишу ВВОД. Приложение для устройства должно получить сообщение, а через несколько секунд ваше приложение SendCloudToDevice должно получить сообщение о подтверждении.
Примечание
Для упрощения в этом руководстве не реализуются политики повтора. В рабочем коде следует реализовать политики повторных попыток (например, с экспоненциальной задержкой), как указано в статье Обработка временных сбоев.
Дальнейшие действия
В этом руководстве вы научились отправлять и получать сообщения из облака на устройство.
Дополнительные сведения о разработке решений с помощью Центра Интернета вещей см. в руководстве разработчика для Центра Интернета вещей.