...

четверг, 15 сентября 2016 г.

Работаем с 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…». Может быть, дело в том, что используется кодировка 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:

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

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)

    Let's block ads! (Why?)

    Комментариев нет:

    Отправить комментарий