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

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

В этой статье показано, как выполнить следующие действия:

  • Отправка сообщений из облака на устройство (C2D) из серверной части решения на одно устройство через Центр Интернета вещей

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

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

Примечание

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

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

  • MessageReceiveSample— пример приложения устройства, входящего в состав пакета SDK Для Интернета вещей Microsoft Azure для .NET, который подключается к Центру Интернета вещей и получает сообщения из облака на устройство.

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

Примечание

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

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

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

  • Подписка Azure. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу.

  • Центр Интернета вещей в подписке Azure. Если у вас еще нет центра, выполните действия, описанные в разделе Создание центра Интернета вещей.

  • Устройство, зарегистрированное в центре Интернета вещей. Если вы еще не зарегистрировали устройство, зарегистрируйте его в портал Azure.

  • В этой статье используется пример кода из пакета SDK Для Интернета вещей Azure для C#.

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

  • приведенному.

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

В этой статье вы запустите пример приложения, имитирующий устройство, которое получает сообщения из облака на устройство, отправляемые через Центр Интернета вещей. Пример приложения MessageReceiveSample , входящий в состав пакета SDK Для Интернета вещей Microsoft Azure для .NET , подключается к Центру Интернета вещей и выступает в качестве имитированного устройства. В примере используется основная строка подключения зарегистрированного устройства в Центре Интернета вещей.

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

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

  2. В левой области Центра Интернета вещей в разделе Управление устройствами выберите Устройства.

  3. В списке устройств выберите соответствующее устройство.

  4. Скопируйте основную строку подключения и сохраните значение.

    Снимок экрана: получение основной строки подключения для устройства, зарегистрированного в Центре Интернета вещей в портал Azure.

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

В этом разделе запустите пример приложения для устройства MessageReceiveSample для получения сообщений C2D, отправляемых через Центр Интернета вещей. Откройте новую командную строку и перейдите в папку azure-iot-sdk-csharp\iothub\device\samples\getting started\MessageReceiveSample в папке, в которой вы развернете пакет SDK для C# для Интернета вещей Azure. Выполните следующие команды, заменив {Your device connection string} значение заполнителя строкой подключения устройства, скопированной с зарегистрированного устройства в Центре Интернета вещей.

dotnet restore
dotnet run --c "{Your device connection string}"

Ниже приведены выходные данные из примера приложения для устройства после успешного запуска и подключения к Центру Интернета вещей:

5/22/2023 11:13:18 AM> Press Control+C at any time to quit the sample.
     
5/22/2023 11:13:18 AM> Device waiting for C2D messages from the hub...
5/22/2023 11:13:18 AM> Use the Azure Portal IoT hub blade or Azure IoT Explorer to send a message to this device.
5/22/2023 11:13:18 AM> Trying to receive C2D messages by polling using the ReceiveAsync() method. Press 'n' to move to the next phase.

Пример приложения устройства опрашивает сообщения с помощью методов ReceiveAsync и CompleteAsync . Метод ReceiveC2dMessagesPollingAndCompleteAsync использует ReceiveAsync метод , который асинхронно возвращает полученное сообщение во время получения сообщения устройством. ReceiveAsync возвращает значение NULL после определенного периода времени ожидания. В этом примере установлен период по умолчанию — одна минута. Когда устройство получает значение NULL, оно должно продолжать ждать новых сообщений. Это требование является причиной, по которой пример приложения включает в ReceiveC2dMessagesPollingAndCompleteAsync метод следующий блок кода:

   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. Скопируйте основную строку подключения и сохраните значение.

Снимок экрана: извлечение строки подключения из Центра Интернета вещей на портале Azure.

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

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

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

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

  2. Присвойте проекту имя SendCloudToDevice, а затем выберите Далее.

    Снимок экрана: всплывающее окно

  3. Примите самую последнюю версию платформы .NET Framework. Выберите Создать, чтобы создать проект.

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

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

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

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

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

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

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

    5/22/2023 11:13:18 AM> Press Control+C at any time to quit the sample.
    
    5/22/2023 11:13:18 AM> Device waiting for C2D messages from the hub...
    5/22/2023 11:13:18 AM> Use the Azure Portal IoT hub blade or Azure IoT Explorer to send a message to this device.
    5/22/2023 11:13:18 AM> Trying to receive C2D messages by polling using the ReceiveAsync() method. Press 'n' to move to the next phase.
    5/22/2023 11:15:18 AM> Polling using ReceiveAsync() - received message with Id=
    5/22/2023 11:15:18 AM> Received message: [Cloud to device message.]
            Content type:
    
    5/22/2023 11:15:18 AM> Completed C2D message with Id=.
    

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

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

В этом разделе вы измените пример приложения-службы 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 . В следующих выходных данных показано сообщение обратной связи, полученное примером приложения-службы:

    Send Cloud-to-Device message
    
    
    Receiving c2d feedback from service
    Press any key to send a C2D message.
    
    Received feedback: Success
    

Примечание

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

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

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