Работаем с Azure IoT устройствами из приложений UWP



    В продолжение статьи Отправляем данные с Arduino в Azure IoT Hub я сейчас расскажу о том, как можно считывать и отправлять данные в IoT Hub облака Azure из UWP приложения. Делается это с использованием клиентской библиотеки Microsoft.Azure.Devices.Client. Для мониторинга этих, отправленных в облако сообщений, можно использовать Device Explorer или iothub-explorer.

    Кроме того, расскажу о том, как создать простое приложение UWP, отправляющее данные из облака на устройство. Напоследок, приведу пример того, как можно получить сообщение из Azure IoT hub на Arduino MKR1000.

    Имитируем Azure IoT устройство с помощью UWP приложения


    Скачиваем Connected Service for Azure IoT Hub (текущая версия 1.5). Устанавливаем. Создаем проект универсального приложения. Добавляем ссылку на подключенную службу





    Нажимаем «Настроить». На выбор нам будет предложено 2 варианта.



    Первый вариант классический. В случае если у нас обычный проект без особых требований к безопасности. Строка подключения к IoT хабу будет хранится в коде.

    Второй вариант экспериментальный. Устройство регистрируется на Windows Device Portal. Затем после выбора в меню пункта «TPM configuration» необходимо установить TPM (Trusted Platform Module) на устройство и ввести данные ключа из Azure хаба. В результате устройство не будет хранить первичный ключ доступа к Azure. Вместо этого TPM устройства будет генерировать SAS токены с коротким сроком жизни.

    Выбрав первый вариант и введя идентификационные данные пользователя Azure, получим окно выбора хаба:



    В моем случае выбирать особо не приходится, так как я создал только один хаб. Его и добавляю.
    Получаю приглашение выбрать устройство. Опять же, в моем случае, только одно устройство зарегистрировано (пользуюсь бесплатными возможностями Azure)



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



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

    SendDeviceToCloudMessageAsync()

    для отправки сообщений. И для получения сообщений:

    ReceiveCloudToDeviceMessageAsync()

    Добавим кнопочку и проверим, получим ли мы сообщение, отправленное с помощью DeviceExplorer-а:

    private async void btnCheck_Click(object sender, RoutedEventArgs e)
         {
             string message = await AzureIoTHub.ReceiveCloudToDeviceMessageAsync();
         }

    Если с получением все должно быть понятно, то при отправке сообщений с помощью SendDeviceToCloudMessageAsync отправляется всегда одна и та же строка текста. Рассмотрим код, который находится в файле AzureIoTHub.cs:

    public static async Task SendDeviceToCloudMessageAsync()
        {
            var deviceClient = DeviceClient.CreateFromConnectionString(deviceConnectionString, TransportType.Amqp);
    
    #if WINDOWS_UWP
            var str = "Hello, Cloud from a UWP C# app!";
    #else
            var str = "Hello, Cloud from a C# app!";
    #endif
            var message = new Message(Encoding.ASCII.GetBytes(str));
    
            await deviceClient.SendEventAsync(message);
        }

    Изначально я не совсем понял, почему Task не принимает строку текста в качестве параметра, чтобы отправить именно ее, а отправляет hard-coded значение «Hello…». Оказалось, что это сделано специально для того, чтобы разработчики не копировали код, а изменяли его. Так что можем вынести создание объекта deviceClient куда-нибудь в отдельный метод и вызывать ее в нужном нам месте (при загрузке страницы, например). Ну а таск, выполняющий отправку сообщения, мы уже можем сделать принимающим параметр. У меня, кстати, получилось отправить сообщение и в кодировке UTF8:

    
        public static async Task SendDeviceToCloudMessageAsync(string texttosend)
        {
            var message = new Message(Encoding.UTF8.GetBytes(texttosend));
            await deviceClient.SendEventAsync(message);
        }

    Теперь вы можете с помощью Device Explorer получить сообщение или отправить его в UWP приложение.

    » Ссылка на англоязычную статью: Connect your Windows app to Azure IoT Hub with Visual Studio
    » Ссылка на GitHub страницу проекта Connected Service for Azure IoT Hub (если что-то вдруг не так, есть куда сабмиттить баг)

    Еще раз уточню, что может возникнуть путаница. Отправлять сообщение можно как с устройства в облако, так и с облака на устройство. Приведу пример приложения UWP, которое на этот раз отправляет сообщение с облака на устройство.

    Отправляем сообщение из облака на устройство с помощью приложения UWP


    В менеджере пакетов NuGet необходимо найти по фразе Microsoft.Azure.Devices пакет и установить его. На всякий случай прямая ссылка: Microsoft Azure IoT Service SDK

    Добавить пространства имен:

    using Microsoft.Azure.Devices;
    using System.Threading.Tasks;
    using System.Text;

    И следующие переменные:

    static ServiceClient serviceClient;
    static string connectionString = "{строка подключения iot hub}";

    Где строка подключения берется с портала Azure:



    Нам понадобится метод, отправляющий текст на устройство

    private async static Task SendCloudToDeviceMessageAsync()
        {
            var commandMessage = new Message(Encoding.UTF8.GetBytes("light on")); 
            // даем команду включить светодиод
            await serviceClient.SendAsync("pseudoDevice", commandMessage);
        }

    Здесь pseudoDevice это id устройства на которое будет отправлено сообщение.

    Остается в MainPage добавить после this.InitializeComponent():

    serviceClient = ServiceClient.CreateFromConnectionString(connectionString);

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

    private async void Button_Click(object sender, RoutedEventArgs e)
        {
            await SendCloudToDeviceMessageAsync();
        }

    Наше UWP приложение готово. Теперь можно отправлять команду «light on» нашему устройству.

    Получение сообщения с Azure IoT хаба платой Arduino MKR1000


    С помощью следующего скетча можно получить сообщение из хаба. В случае, если получено сообщение с текстом «light on», Arduino MKR1000 включит светодиод.
    Скетч необходимо немного сконфигурировать. Ввести данные вашей Wi-Fi сети:

    char ssid[] = "xxx"; //  SSID имя вашей Wi-Fi точки доступа
    char pass[] = "xxxxxxxx";    // пароль вашей сети

    И данные вашего Azure IoT хаба:

    char hostname[] = "xxxxxx.azure-devices.net";    // host name address for your Azure IoT Hub
    char feeduri[] = "/devices/xxxxxxx/messages/devicebound?api-version=2016-02-03"; // здесь нужно вместо xxxxxxx ввести id устройства 
    char authSAS[] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

    Как получить строку authSAS (SAS Token) с помощью Device Explorer я описовал в прошлой статье. Это строка, которая начинается с «SharedAccessSignature sr=».
    Поделиться публикацией
    Комментарии 0

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое