Отправка сообщений из облака на устройство с помощью Центра Интернета вещей (.NET)

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

Примечание

Функции, описанные в этой статье, доступны только на стандартном уровне Центра Интернета вещей. Дополнительные сведения о базовом, стандартном и бесплатном уровнях см. в статье Выбор правильного уровня Центра Интернета вещей для решения.

Этот учебник является логическим продолжением статьи по отправке данных телеметрии с устройства в центр Интернета вещей. В нем описывается, как выполнять следующие задачи:

  • Отправка сообщений, передаваемых из облака на устройство, из серверной части решения на одно устройство через Центр Интернета вещей.

  • Получение на устройстве сообщений, передаваемых из облака на устройство.

  • Запрос из серверной части решения подтверждения доставки (отзыва) для сообщений, отправленных на устройство из Центра Интернета вещей.

Дополнительные сведения о сообщениях, отправляемых из облака на устройство, см. в статье Обмен сообщениями между устройством и облаком с помощью Центра Интернета вещей.

В конце этого руководства запускаются два консольных приложения для .NET.

  • SimulatedDevice. Это приложение подключается к центру Интернета вещей и получает сообщения, отправляемые из облака на устройство. Это приложение является измененной версией приложения, созданного в руководстве Отправка данных телеметрии с устройства в центр Интернета вещей.

  • SendCloudToDevice. Это приложение отправляет сообщение из облака в приложение устройства через Центр Интернета вещей и затем получает подтверждение доставки сообщения.

Примечание

В Центре Интернета вещей реализована поддержка для пакетов SDK для многих платформ устройств и языков (включая C, Java, Python и Javascript). Эти пакеты работают на основе пакетов SDK для устройств Azure IoT. Пошаговые инструкции по связыванию устройства с кодом из этого руководства, а также по подключению к Центру Интернета вещей Azure см. в руководстве разработчика для Центра Интернета вещей.

Предварительные требования

  • Visual Studio

  • Активная учетная запись Azure. Если ее нет, можно создать бесплатную учетную запись всего за несколько минут.

  • Убедитесь, что в брандмауэре открыт порт 8883. Пример устройства в этой статье использует протокол MQTT, который передает данные через порт 8883. В некоторых корпоративных и академических сетях этот порт может быть заблокирован. Дополнительные сведения и способы устранения этой проблемы см. в разделе о подключении к Центру Интернета вещей по протоколу MQTT.

Получение сообщений в приложении для устройства

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

  1. В 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);
         }
     }
    
  2. Добавьте в метод 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. По умолчанию каждый Центр Интернета вещей создается с помощью политики общего доступа, называемой службой, которая предоставляет это разрешение.

Чтобы получить строку подключения Центра Интернета вещей для политики службы, выполните следующие действия:

  1. На портале Azure выберите Группы ресурсов. Выберите группу ресурсов, в которой находится центр, а затем выберите центр из списка ресурсов.

  2. В левой части центра Интернета вещей выберите Политики общего доступа.

  3. В списке политик выберите политику службы.

  4. В разделе Общие ключи доступа выберите значок копирования рядом с пунктом Первичная строка подключения и сохраните значение.

Screenshot that shows how to retrieve the connection string

Дополнительные сведения о политиках и разрешениях общего доступа Центра Интернета вещей см. в разделе Управления доступом и разрешения.

Отправка сообщения из облака на устройство

При работе с этим разделом вы создадите консольное приложение .NET, которое отправляет сообщения, передаваемые из облака на устройство, в приложение имитированного устройства.

  1. В текущем решении Visual Studio выберите Файл>Создать>Проект. В окне Создание проекта выберите Консольное приложение (.NET Framework) и нажмите кнопку Далее.

  2. Присвойте проекту имя SendCloudToDevice. В разделе Решение выберите Добавить в решение и примите последнюю версию .NET Framework. Выберите Создать, чтобы создать проект.

    Configure a new project in Visual Studio

  3. В Обозревателе решений щелкните новый проект правой кнопкой мыши и выберите пункт Управление пакетами NuGet.

  4. В окне Управление пакетами NuGet нажмите Обзор, найдите и выберите Microsoft.Azure.Devices. Выберите пункт Установить.

    После этого будут выполнены скачивание, установка и добавление ссылки на пакет SDK NuGet для служб Azure IoT.

  5. Добавьте следующий оператор using в начало файла Program.cs.

    using Microsoft.Azure.Devices;
    
  6. Добавьте следующие поля в класс Program . Замените заполнитель {iot hub connection string} строкой подключения центра Интернета вещей, скопированной в разделе Получение строки подключения центра Интернета вещей. Замените заполнитель {device id} идентификатором устройства, добавленным в рамках краткого руководства Отправка данных телеметрии с устройства в центр Интернета вещей.

    static ServiceClient serviceClient;
    static string connectionString = "{iot hub connection string}";
    static string targetDevice = "{device id}";
    
  7. Добавьте указанные ниже метод в класс Program, чтобы отправить сообщение на устройство.

    private async static Task SendCloudToDeviceMessageAsync()
    {
         var commandMessage = new
          Message(Encoding.ASCII.GetBytes("Cloud to device message."));
         await serviceClient.SendAsync(targetDevice, commandMessage);
    }
    
  8. Наконец, добавьте следующие строки в метод 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();
    
  9. В обозревателе решений щелкните решение правой кнопкой мыши и выберите Назначить запускаемые проекты.

  10. В разделе Общие свойства>Запускаемый проект выберите элемент Несколько запускаемых проектов, а затем выберите действие Запуск для SimulatedDevice и SendCloudToDevice. Нажмите кнопку ОК , чтобы сохранить изменения.

  11. Нажмите клавишу F5. Должны запуститься оба приложения. Выберите окно SendCloudToDevice и нажмите клавишу ВВОД. Приложение для устройства должно получить сообщение.

    Device app receiving message

Получение подтверждений доставки

Для каждого сообщения, передаваемого из облака на устройство, в Центре Интернета вещей можно запросить подтверждения доставки (или истечения срока действия). Этот параметр позволяет серверной части решения легко передавать данные в логику повторных попыток или компенсаций. Дополнительные сведения об отзывах сообщений, передаваемых из облака на устройство, см. в статье Обмен сообщениями между устройством и облаком с помощью Центра Интернета вещей.

В этом разделе вы измените приложение SendCloudToDevice, чтобы оно запрашивало подтверждение и получало его из Центра Интернета вещей.

  1. В 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);
         }
     }
    

    Обратите внимание, что шаблон получения здесь аналогичен шаблону, использовавшемуся для получения сообщений из облака на устройство из приложения устройства.

  2. Добавьте в метод Main сразу после строки serviceClient = ServiceClient.CreateFromConnectionString(connectionString) следующую строку.

    ReceiveFeedbackAsync();
    
  3. Чтобы запросить подтверждение доставки сообщения из облака на устройство, необходимо указать свойство в методе SendCloudToDeviceMessageAsync . Добавьте следующую строку сразу после строки var commandMessage = new Message(...);.

    commandMessage.Ack = DeliveryAcknowledgement.Full;
    
  4. Запустите приложения, нажав клавишу F5. Должны запуститься оба приложения. Выберите окно SendCloudToDevice и нажмите клавишу ВВОД. Приложение для устройства должно получить сообщение, а через несколько секунд ваше приложение SendCloudToDevice должно получить сообщение о подтверждении.

    Device app receiving message and service app receiving feedback

Примечание

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

Дальнейшие действия

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

Дополнительные сведения о разработке решений с помощью Центра Интернета вещей см. в руководстве разработчика для Центра Интернета вещей.