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

1dceebe3b4c84e9eabc6e0c5377acab6.png

В продолжение статьи Отправляем данные с 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). Устанавливаем. Создаем проект универсального приложения. Добавляем ссылку на подключенную службу

ab1a4bf068e041df887221f88b809273.PNG

1ef59ecd05dc42f7bc3709e3c1b748b4.PNG

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

4d34675d7d4e4e68b06cfebbe0eb50f0.PNG

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

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

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

7c98692681094e379807489c80f6f5c0.PNG

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

a40d836941244221ad49c284da9709de.PNG

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

74ba119630d64a558046bd14aa32dba3.PNG

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

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…». Может быть, дело в том, что используется кодировка ASCII (хотя консольное приложение, работая с Azure IoT, использует кодировку UTF8). Перестраховка? Скорее всего, это просто шаблон, код которого несложно подправить:

    public static async Task SendDeviceToCloudMessageAsync(string texttosend)
    {
        var deviceClient = DeviceClient.CreateFromConnectionString(deviceConnectionString, TransportType.Amqp);
        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:

1675d8e5829f4138bd0ce8d2e47f06f5.PNG

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

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)

© Habrahabr.ru