В продолжение статьи Отправляем данные с 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=».