Поделиться через



сентября 2016

Том 31 Номер 9

Современные приложения - Создаем общегородской сканер Wi-Fi на платформах UWP и Azure

Фрэнк Ла-Вине | сентября 2016 | Исходный код можно скачать по ссылке

В прошлом номере я рассказал, как написать UWP-приложение (Universal Windows Platform) для сканирования Wi-Fi-сетей. В конце той статьи я представил решение для создания текстовой строки CSV. Затем я вкратце обрисовал, что можно было бы сделать с помощью Power BI в плане визуализации данных. Однако копирование и вставка текстовых данных из UI вручную препятствует масштабированию этого решения — с ним может работать только один пользователь. Более того, цель заключалась в выполнении приложения на IoT-устройстве безо всякого дисплея. Это означает, что UWP-приложение должно отправлять данные в облако без UI. Такое решение относится к «безголовым» (т. е. без дисплея). План заключался в установке многочисленных устройств по всему городу для сканирования Wi-Fi-сетей.

Во-первых, для приема всех этих данных нужно подготовить облачный сервис. Во-вторых, вы должны модифицировать существующий код UWP-приложения для передачи данных этому облачному сервису. Наконец, необходимо визуализировать эти данные в Power BI.

Облако и Интернет вещей

Облако — замечательная инновация. Оно предлагает практически безграничные хранилище и вычислительные ресурсы даже для самых маломощных устройств. Нужно лишь подключение к Интернету. Зачастую в обсуждении Интернета вещей (Internet of Things, IoT) доминируют облачные сервисы, а не сами устройства. Почему так? Что ж, если в двух словах, многим из устройств, подключенных к Интернету, требуется централизованное место, в которое они передают данные и получают уведомления. Многие достижения, меняющие мир и парадигмы, являются результатом обработки и анализа данных в облаке. Кроме того, перекладывание бремени вычислений и хранения на облако означает, что сами устройства могут быть менее мощными. А меньшая мощность означает удешевление устройств и делает их менее энергоемкими.

Как и подразумевает этот термин, IoT относится к Интернету и вещам, подключенным к Интернету. А значит, код выполняется как на устройстве, так и в облачных сервисах. Задача этого проекта заключается в том, чтобы множество устройств с адаптерами Wi-Fi непрерывно сканировало беспроводные сети. Эти устройства будут сообщать о своих находках в реальном времени. Для целей этой статьи мы будет предполагать, что ваше устройство имеет доступ в Интернет.

Решение основано на использовании Microsoft Azure IoT Hub и Azure Stream Analytics. Azure IoT Hub — это сервис с высокой масштабируемостью, способный обрабатывать миллионы событий в секунду. IoT Hub аналогичен Azure Event Hub с тем исключением, что у него есть дополнительная функциональность для управления устройствами. Устройства нужно регистрировать, чтобы их можно было подключить к IoT Hub. После регистрации устройство передает сообщение в IoT Hub, который затем собирает данные от этого устройства в реальном времени. Эти данные могут отправляться в Azure Stream Analytics.

Azure Stream Analytics — это полностью управляемый сервис с низкими задержками, высокой доступностью и масштабируемостью, который обеспечивает комплексную обработку событий в потоковых данных от разных источников. Stream Analytics будет собирать потоковые данные от каждого устройства, где выполняется UWP-приложение Wi-Fi Scanner.

Если кратко, то Azure IoT Hub собирает данные от зарегистрированных устройств, а Azure Stream Analytics позволяет легко запрашивать эти данные. Для этого вам понадобится подготовить соответствующие сервисы в Azure и внести изменения в UWP-приложение.

Подготовка облачных сервисов

Задача номер один — создание Azure IoT Hub. Для этого перейдите на Azure Portal, щелкните New, а затем щелкните Internet of Things, чтобы раскрыть варианты в этой категории (рис. 1). Щелкните IoT Hub, чтобы увидеть диалог, показанный на рис. 2.

Создание IoT Hub на Azure Portal
Рис. 1. Создание IoT Hub на Azure Portal

Диалог создания IoT Hub
Рис. 2. Диалог создания IoT Hub

В этой форме вы вводите уникальное имя для своего IoT Hub. Я назвал его CityWifiScannerHub. На данный момент я выбираю бесплатный уровень сервиса, поскольку для разработки этого достаточно. Я также создаю новую группу ресурсов и присваиваю ей имя CityWifiScannerRG. Лучше всего выбрать какое-то соглашение по именованию и придерживаться его. Что касается параметра Region, то на самом деле не важно, какой регион вы выберете. Просто выбирайте один и тот же регион для всех своих сервисов, чтобы сэкономить затраты на выходных данных (data egress charges). Для моих целей отлично подходит East US. Установить флажок Pin to dashboard для упрощения доступа к этому сервису. Теперь щелкните Create, и через несколько секунд сервис будет подготовлен и начнет работать.

Пока вы ожидаете начала работы сервиса, самое время скачать Device Explorer по ссылке bit.ly/25lXGY9.

Device Explorer

Device Explorer — это утилита, которая помогает создавать решения с IoT Hub, позволяя регистрировать и удалять устройства в IoT Hub, а также отслеживать данные, передаваемые между устройством и хабом. Чтобы использовать эту утилиту с хабом, понадобится строка подключения от IoT Hub. На Azure Portal перейдите в IoT Hub и щелкните значок ключа. Поскольку вам нужны привилегии управления для добавления и удаления устройств, выберите политику iothubowner. В следующем диалоге щелкните значок копирования рядом с Connection string — основной ключ (рис. 3). Это приведет к копированию строки подключения в буфер обмена.

Получение строки подключения для Device Explorer
Рис. 3. Получение строки подключения для Device Explorer

Поместив строку подключения в буфер обмена, перейдите в Device Explorer и вставьте ее в текстовое поле IoT Hub Connection String. Щелкните Update и вы увидите сообщение «Settings updated successfully» (настройки успешно обновлены). Щелкните OK, чтобы закрыть окно с сообщением.

Теперь щелкните вкладку Management. Чтобы зарегистрировать устройство в этом IoT Hub, нужно щелкнуть Create. В следующем диалоговом окне введите Device ID, как на рис. 4. Щелкните кнопку Create, чтобы зарегистрировать устройство в этом сервисе. Появится окно с сообщением, подтверждающее успешность этой операции. Щелкните Close, чтобы закрыть окно.

Регистрация устройства в Device Explorer
Рис. 4. Регистрация устройства в Device Explorer

Вы заметите, что в списке Devices появился новый элемент. Щелкните правой кнопкой мыши элемент WiFiScanner1. В появившемся контекстном меню выберите Copy connection string for selected device, как показано на рис. 5. Вы будете использовать эту строку подключения в UWP-приложении для его соединения с IoT Hub.

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

Модификация кода UWP-приложения

Рубрика по UWP-разработке не была бы таковой без некоторого UWP-кода. Сейчас самое время модифицировать приложение, созданное в прошлый раз, чтобы подключить его к IoT Event Hub. К счастью, Microsoft создала библиотеку, которая упрощает эту задачу, и опубликовала ее в NuGet. Загрузите приложение из прошлой статьи в Visual Studio. Щелкните правой кнопкой мыши References, затем укажите Manage NuGet Packages. В поле поиска введите Microsoft.Azure.Devices.Client и выберите первый вариант. Установите этот пакет, как и любой другой NuGet-пакет.

После установки пакета добавьте в файл MainPage.xaml.cs следующее выражение using:

using Microsoft.Azure.Devices.Client;

Затем добавьте член в класс, заменив «[Connection String]» строкой подключения, созданной в предыдущем разделе:

private DeviceClient deviceClient =
  DeviceClient.CreateFromConnectionString(
  [Connection String]);

Код, необходимый для отправки данных в Azure IoT Hub, тривиален благодаря коду внутри пространства имен Microsoft.Azure.Devices.Client. Все делает следующий метод:

private async void SendScanData(string message)
{
  var content = new Message(
    Encoding.UTF8.GetBytes(message));
  await deviceClient.SendEventAsync(content);
}

Поместив этот код в класс MainPage, теперь можно добавить ближе к концу метода RunWifiScan файла MainPage.xaml.cs строки, показанные ниже. Первая строка преобразует объект WiFiPointData в JSON-строку для транспорта, а вторая — вызывает метод, передающий данные в Event Hub:

string NetworkInfoJson = CreateJson(wifiPoint);
SendScanData(NetworkInfoJson);

Теперь запустите приложение и отправьте данные в IoT Hub. Но сначала перейдите в Device Explorer, откройте вкладку Data и щелкните кнопку Monitor. Это позволит вам наблюдать за данными, отправляемыми в Iot Hub.

Работа со Stream Analytics

Теперь у вас есть IoT Hub в облаке и UWP-приложение, которое посылает ему данные. Что дальше? Следующий шаг — сделать что-то полезное с этими данными. С этой целью вы будете использовать Stream Analytics. На Azure Portal щелкните New и найдите Stream Analytics. Щелкните Create, и появится диалог New Stream Analytics Job. Назовите задание (job), как хотите, — я назвал его CityWifiScannerJob. Я также выбрал использование созданной ранее группы ресурсов. И вновь я выбираю East US, чтобы все мои сервисы находились в одном информационном центре. Вы должны увидеть нечто вроде того, что показано на рис. 6. Щелкните Create, чтобы создать задание.

Конфигурирование нового задания Stream Analytics
Рис. 6. Конфигурирование нового задания Stream Analytics

Задания Stream Analytics принимают данные от источника ввода, обрабатывают их через запрос, а затем посылают в вывод. Создав новое задание, вы располагаете нулевым количеством потоков ввода и вывода, а также запросом по умолчанию.

Создание ввода

Сначала добавьте ввод, щелкнув плитку Inputs, а затем кнопку Add. В диалоге New input присвойте вводу какое-нибудь имя, как показано на рис. 7 (я выбрал CitiWifiScannerInput). Смените Source на IoT Hub. Затем выберите CityWifiScannerHub из раскрывающегося списка. Поскольку UWP-приложение посылает данные в формате JSON с кодировкой UTF-8, вам нет нужды модифицировать параметры по умолчанию. Щелкните Create, чтобы создать ввод.

Создание ввода
Рис. 7. Создание ввода

Теперь, когда ввод создан, следует создать вывод. На момент публикации этой статьи новый Azure Portal не поддерживал создание вывода Power BI. По этой причине вы должны загрузить прежний портал по ссылке bit.ly/1V3IFPU. Там перейдите в раздел Stream Analytics, выберите CityWifiScannerJob и щелкните Output. В списке вариантов выберите Power BI. Псевдониму вывода (output alias) присвойте имя CitiWifiPowerBI, Dataset Name — имя CityWifiScans и Tablet Name — имя CityWifiTable. Щелкните стрелку «далее». На следующем экране вас попросят авторизовать доступ к Power BI. Вам понадобится войти в организационную учетную запись (organizational account). Если у вас нет такой учетной записи, следуйте руководству в публикации блога по ссылке bit.ly/29m89ZV, чтобы создать пробную учетную запись Office 365.

Теперь, когда у вас есть ввод и вывод, следует отредактировать запрос. Описание полных возможностей запросов в Stream Analytics выходят за рамки этой статьи. Поэтому я создам очень простой запрос, который будет посылать все данные из ввода в вывод безо всяких преобразований или другой обработки:

SELECT
INTO
  CityWifiPowerBI
FROM
  CitiWifiScannerInput

Этот синтаксис должен быть знаком любому, кто имел дело с T-SQL. Заметьте, что в запросе используются ранее указанные имена ввода и вывода, чтобы сообщить заданию, где получать данные и куда их отправлять. Теперь сохраните запрос и запустите задание. Щелкните кнопку Start внизу страницы, чтобы запустить задание. Его запуск может занять несколько секунд. После того как оно будут запущено, откройте Power BI в своем браузере. Теперь вы должны видеть CitiWifiScans как набор данных в своей рабочей области.

Откройте этот набор данных, щелкнув его. Перетащите поле Lat из списка Fields на пустое место. Появится элемент управления «карта». Далее перетащите поле Long на этот элемент. Вы должны увидеть карту с точками ваших данных, расположенных по их широте и долготе. В случае моего примера набора данных я получаю то, что показано на рис. 8.

Создание карты в Power BI с данными от UWP-приложения
Рис. 8. Создание карты в Power BI с данными от UWP-приложения

Заключение

Настоящая мощь и революционный потенциал IoT заключены в облаке. Облако предоставляет почти неограниченные хранилище и вычислительные ресурсы. Эта мощь может использоваться недорогими, экономичными устройствами благодаря Интернету. В облаке данные могут ставиться в очередь, обрабатываться и даже визуализироваться с помощью таких инструментов, как Power BI. Возможность легко модифицировать UWP-приложение для отправки данных в Azure IoT Hub и поддержка его развертывания на IoT-устройствах создает непревзойденную комбинацию, которая преобразит наш мир.


Фрэнк Ла-Вине (Frank La Vigne) — идеолог технологий в группе Microsoft Technology and Civic Engagement, где он помогает пользователям применять технологии и формировать соответствующие сообщества. Регулярно ведет блог на FranksWorld.com и имеет канал на YouTube под названием «Frank’s World TV» (youtube.com/FranksWorldTV).

Выражаю благодарность за рецензирование статьи экспертам Оливьи Блош (Olivier Bloch) и Робу Тиффани (Rob Tiffany).