Сучасні програми - Створюємо сканер Wi-Fi на платформі UWP
- Простір імен Windows.Devices.WiFi
- Додавання апаратної можливості Wi-Fi
- Дослідження бездротових мереж
- створення UI
- Захоплення даних про місцезнаходження
- періодичне сканування
- Звіт про результати сканування
- візуалізація даних
- Області застосування на практиці
- висновок
За останнє десятиліття або близько того Wi-Fi поширився повсюдно. Багато магазинів і кафе пропонують клієнтам безкоштовний Wi-Fi для їх зручності. Практично всі готелі пропонують своїм гостям якийсь вид бездротового Інтернету. У більшості з нас вдома є бездротові мережі. Оскільки лише у деяких планшетів і мобільних пристроїв є роз'єми Ethernet, Wi-Fi став невід'ємною частиною нашого життя. Крім того, ми рідко замислюємося про нього.
Виникає безліч питань. Яка зона покриття Wi-Fi-мереж навколо нас? Скільки їх? Чи безпечні вони? На якому каналі вони працюють? Як вони звуться? Чи можна засікати їх і наносити на карту? Що можна дізнатися з метаданих Wi-Fi-мережі?
Нещодавно вигулюючи своїх собак, я випадково глянув на екран мережевих з'єднань Wi-Fi на своєму телефоні і помітив деякі вельми дотепні назви мереж. Мені стало цікаво, скільки ще людей вважало за краще комічні назви практичним. Потім у мене з'явилася ідея просканувати і нанести на карту бездротові мережі в моєму районі. Якби автоматизувати б цей процес, я міг би сканувати і наносити на карту бездротові мережі за час поїздки з передмістя в місто. В ідеалі, я міг би написати програму, виконувану на Raspberry Pi, яка періодично сканувала б бездротові мережі і записувала б ці дані в якийсь веб-сервіс. Це безумовно було б практичніше, ніж періодично витріщатися в свій телефон.
Виявляється, що Universal Windows Platform (UWP) забезпечує багаті можливості доступу до даних бездротових мереж через класи в просторі імен Windows.Devices.WiFi. Як ви знаєте, UWP-додаток може працювати не тільки на телефоні або ПК, а й на Raspberry Pi 2 під управлінням Windows 10 IoT Core. Тепер у мене було все, що потрібно для розробки мого проекту.
У цій статті я досліджую основи сканування Wi-Fi-мереж за допомогою API, вбудованих безпосередньо в UWP.
Простір імен Windows.Devices.WiFi
Класи в просторі імен Windows.Devices.WiFi містять все необхідне для сканування і дослідження бездротових мереж і їх адаптерів в межах досяжності (within range). Після створення нового UWP-проекту в Visual Studio додайте новий клас з ім'ям WifiScanner і включіть наступне властивість:
public WiFiAdapter WiFiAdapter {get; private set; }Оскільки в конкретній системі може бути кілька адаптерів Wi-Fi, ви повинні вибрати той адаптер, який хочете використовувати. Метод InitializeFirstAdapter отримує перший з них, перерахований в системі, як показано на рис. 1.
Мал. 1. Знаходження першого адаптера Wi-Fi, підключеного до системи, і його ініціалізація
private async Task InitializeFirstAdapter () {var access = await WiFiAdapter.RequestAccessAsync (); if (access! = WiFiAccessStatus.Allowed) {throw new Exception ( "WiFiAccessStatus not allowed"); } Else {var wifiAdapterResults = await DeviceInformation. FindAllAsync (WiFiAdapter.GetDeviceSelector ()); if (wifiAdapterResults.Count> = 1) {this .WiFiAdapter = await WiFiAdapter.FromIdAsync (wifiAdapterResults [0] .Id); } Else {throw new Exception ( "WiFi Adapter not found."); }}}Додавання апаратної можливості Wi-Fi
Ймовірно, ви помітили, що в прикладі є перевірка доступу до Wi-Fi і що цей код генерує виняток, якщо метод RequestAccessAsync повертає false. Справа в тому, що з додатком потрібна апаратна можливість (device capability), яка дозволить йому сканувати Wi-Fi-мережі і підключатися до них. Ця можливість не перераховується на вкладці Capabilities в редакторові властивостей маніфесту. Щоб додати цю можливість, клацніть правою кнопкою миші файл Package.appxmanager і виберіть View Code.
Ви побачите вихідний XML у файлі Package.appxmanager. У вузол Capabilities додайте наступний код:
<DeviceCapability Name = "wifiControl" />Збережіть файл. Тепер у вашої програми є дозвіл на доступ до Wi-Fi API.
Дослідження бездротових мереж
При наявності коду для ідентифікації адаптера Wi-Fi, з яким ви будете працювати, і дозволу на доступ до нього наступний крок - власне сканування мереж. На щастя, відповідний код вельми простий; це просто виклик методу ScanAsync об'єкта WiFiAdapter. Додайте наступний метод в клас WiFiScanner:
public async Task ScanForNetworks () {if (this .WiFiAdapter! = null) {await this .WiFiAdapter.ScanAsync (); }}Після запуску ScanAsync заповнюється властивість NetworkReport об'єкта WiFiAdapter. NetworkReport - це екземпляр WiFiNetworkReport, що містить AvailableNetworks - List <WiFiAvailableNetwork>. Об'єкт WiFiAvailableNework містить безліч даних про конкретну мережі. Крім інших даних, ви можете знайти Service Set Identifier (SSID), потужність сигналу (signal strength), метод шифрування і час безперебійної роботи точки доступу (access point uptime) - і все це без підключення до цієї мережі.
Перебір доступних мереж досить простий: ви створюєте POCO-об'єкт (Plain Old CLR Object), що містить деякі дані з об'єктів WiFiAvailableNetwork:
foreach (var availableNetwork in report.AvailableNetworks) {WiFiSignal wifiSignal = new WiFiSignal () {MacAddress = availableNetwork.Bssid, Ssid = availableNetwork.Ssid, SignalBars = availableNetwork.SignalBars, ChannelCenterFrequencyInKilohertz = availableNetwork.ChannelCenterFrequencyInKilohertz, NetworkKind = availableNetwork.NetworkKind.ToString ( ), PhysicalKind = availableNetwork.PhyKind.ToString ()}; }створення UI
Хоча в кінцевому проекті я маю намір зробити так, щоб додаток виконувалося без UI, він корисний при розробці та аналізі проблем, щоб бачити мережі в межах досяжності і метадані, пов'язані з ними. Він також корисний для розробників, які не мають в даний момент Raspberry Pi, але все одно охочих іти за мною. Як показано на рис. 2, XAML для проекту дуже проста, і для зберігання результатів сканування використовується багаторядковий TextBox.
Мал. 2. XAML для UI
<Grid Background = "{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Grid.RowDefinitions> <RowDefinition Height = "60" /> <RowDefinition Height = "60" /> <RowDefinition Height = "*" /> </ Grid.RowDefinitions> < TextBlock FontSize = "36" Grid.RowSpan = "2"> WiFi Scanner </ TextBlock> <StackPanel Name = "spButtons" Grid.Row = "1" Orientation = "Horizontal"> <Button Name = "btnScan" Click = " btnScan_Click "Grid.Row =" 1 "> Scan For Networks </ Button> </ StackPanel> <TextBox Name =" txbReport "TextWrapping =" Wrap "AcceptsReturn =" True "Grid.Row =" 2 "> </ TextBox> </ Grid> </ Page>Захоплення даних про місцезнаходження
Щоб програма була корисніше, в кожному скане бездротової мережі слід відзначати місце розташування ськана. Згодом це дозволить надати цікаву аналітичну картину і візуалізацію даних. На щастя, додати визначення місцеположення в UWP-додатки дуже просто. Однак вам потрібно включити в свій додаток можливість Location. Для цього двічі клацніть файл Package.appxmanifest в Solution Explorer, клацніть вкладку Capabilities і встановіть прапорець Location в списку Capabilities.
Наступний код буде отримувати розташування, використовуючи API, вбудовані в UWP:
Geolocator geolocator = new Geolocator (); Geoposition position = await geolocator.GetGeopositionAsync ();Тепер, коли у вас є дані про місцезнаходження, ви захочете зберегти їх. Наступний на черзі клас WiFiPointData, який зберігає дані про місцезнаходження, а також інформацію про мережі, знайдених в цьому розташування:
public class WiFiPointData {public DateTimeOffset TimeStamp {get; set; } Public double Latitude {get; set; } Public double Longitude {get; set; } Public double Accuracy {get; set; } Public List <WiFiSignal> WiFiSignals {get; set; } Public WiFiPointData () {this .WiFiSignals = new List <WiFiSignal> (); }}До цього моменту важливо розуміти, що, якщо ваш пристрій не містить GPS, з додатком буде потрібно Wi-Fi-з'єднання з Інтернетом, щоб визначити місце розташування. Без вбудованого GPS-пристрої вам знадобиться мобільний хот-спот (mobile hotspot) і підключення до нього вашого лептопа або Raspberry Pi 2. Це також означає, що повідомляється місце розташування буде менш точним. Детальніше про рекомендації по створенню UWP-додатки з підтримкою визначення місця розташування див. Статтю «Guidelines for Location-Aware Apps» на сайті Windows Dev Center за посиланням bit.ly/1P0St0C .
періодичне сканування
Для сценарію зі скануванням і визначенням місць розташування в процесі поїздки з додатком потрібно періодично сканувати Wi-Fi-мережі. Для цього слід використовувати DispatchTimer, щоб сканувати Wi-Fi-мережі через регулярні інтервали. Якщо ви не знайомі з тим, як працює DispatchTimer, див. У документації за посиланням bit.ly/1WPMFcp .
Зауважте, що сканування Wi-Fi може займати до декількох секунд в залежності від вашої системи. Наступний код встановлює DispatchTimer на генерацію події через кожні 10 секунд - це більш ніж достатньо навіть для самої повільної системи:
DispatcherTimer timer = new DispatcherTimer (); timer.Interval = new TimeSpan (0, 0, 10); timer.Tick + = Timer_Tick; timer.Start ();Через кожні 10 секунд таймер виконує код в методі Timer_Tick. Наступний код сканує Wi-Fi-мережі, а потім дописує результати в UI-елемент TextBox:
private async void Timer_Tick (object sender, object e) {StringBuilder networkInfo = await RunWifiScan (); this .txbReport.Text = this .txbReport.Text + networkInfo.ToString (); }Звіт про результати сканування
Як уже згадувалося, після виклику методу ScanAsync результати зберігаються в List <WiFiAvailableNetwork>. Щоб дістатися до цих результатів, досить пройти по списку. Код на рис. 3 робить саме це і поміщає результати в екземпляр класу WiFiPointData.
Мал. 3. Код для перебору всіх мереж, знайдених при скануванні
foreach (var availableNetwork in report.AvailableNetworks) {WiFiSignal wifiSignal = new WiFiSignal () {MacAddress = availableNetwork.Bssid, Ssid = availableNetwork.Ssid, SignalBars = availableNetwork.SignalBars, NetworkKind = availableNetwork.NetworkKind.ToString (), PhysicalKind = availableNetwork. PhyKind.ToString (), Encryption = availableNetwork.SecuritySettings. NetworkEncryptionType.ToString ()}; wifiPoint.WiFiSignals.Add (wifiSignal); }Щоб зробити UI простим і в той же час надати багаті засоби аналізу, ви можете перетворити WiFiPointData в формат Comma Separated Value (CSV) і задати текст TextBox в UI. CSV - порівняно простий формат, який можна імпортувати в Excel і Power BI для аналізу. Код для перетворення WiFiPointData представлений на рис. 4.
Мал. 4. Перетворення WiFiPointData
private StringBuilder CreateCsvReport (WiFiPointData wifiPoint) {StringBuilder networkInfo = new StringBuilder (); networkInfo.AppendLine ( "MAC, SSID, SignalBars, Type, Lat, Long, Accuracy, Encryption"); foreach (var wifiSignal in wifiPoint.WiFiSignals) {networkInfo.Append ($ "{wifiSignal.MacAddress},"); networkInfo.Append ($ "{wifiSignal.Ssid},"); networkInfo.Append ($ "{wifiSignal.SignalBars},"); networkInfo.Append ($ "{wifiSignal.NetworkKind},"); networkInfo.Append ($ "{wifiPoint.Latitude},"); networkInfo.Append ($ "{wifiPoint.Longitude},"); networkInfo.Append ($ "{wifiPoint.Accuracy},"); networkInfo.Append ($ "{wifiSignal.Encryption}"); networkInfo.AppendLine (); } Return networkInfo; }візуалізація даних
Природно, я з нетерпінням прагнув підготувати хмарний сервіс для відображення і візуалізації даних. Таким чином, я скопіював CSV-дані, згенеровані додатком, і вставив їх у текстовий файл. Потім зберіг цей файл з розширенням .CSV. Після цього я імпортував дані в Power BI Desktop. Power BI Desktop - це безкоштовно скачуваний пакет з powerbi.microsoft.com, спрощує візуалізацію і вивчення даних.
Щоб імпортувати дані з програми, клацніть Get Data на початковому екрані Power Bi Desktop.
На наступному екрані виберіть CSV, а потім натисніть Connect. У вікні вибору файлу виберіть CSV-файл зі скопійованими з програми даними.
Після його завантаження ви побачите список полів в правій частині екрана. Хоча повний опис Power BI Desktop виходить за рамки цієї статті, ця програма не вимагає особливих навичок для створення візуалізації, яка б показала місце розташування Wi-Fi-мереж, їх SSID-ідентифікатори і протоколи шифрування (рис. 5).
Мал. 5. Візуалізація в Power BI даних, зібраних додатком-сканером Wi-Fi
Як це не дивно, але приблизно в третині мереж шифрування використовуватись. І якщо деякі з них є гостьовими мережами, встановленими спеціально для загального доступу відвідувачів різних організацій, то інші до них не відносяться.
Області застосування на практиці
Спочатку я мав намір просто «заміряти рівень» здорового глузду і дотепності своїх сусідів, але потім проект вилився в щось більш практичне. Можливість легко і автоматично зіставляти потужність сигналу Wi-Fi з місцем розташування має цікаві застосування. Що міг би отримати місто, якби кожен міський автобус був обладнаний IoT-пристроєм, який виконує цю програму? У містах можна було б заміряти ступінь поширення Wi-Fi-мереж і співвіднести ці дані з рівнями доходів по районам. Представники законодавчих органів могли б потім приймати обґрунтовані рішення, відштовхуючись від цих даних. Якщо суспільство надає відкриту Wi-Fi-мережу в місті або в певних його місцях, можна було б в реальному часі заміряти потужність сигналу без додаткових витрат на відправку відповідних технічних фахівців. У містах також могли б визначати, де переважають незахищені мережі, і створювати цільові ознайомчі програми (targeted awareness programs) для підвищення кіберзахисту суспільства.
У малому масштабі можливість швидко просканувати метадані Wi-Fi-мереж знадобиться під час налаштування власної мережі. Багато маршрутизатори (routers) дозволяють користувачам змінювати широкомовний канал. Чудовий приклад цьому - додаток Wi-Fi Analyzer ( bit.ly/25ovZ0Q ), Яке, крім іншого, відображає потужність і частоту сусідніх бездротових мереж. Це зручно при створенні Wi-Fi-мережі в новому місці.
висновок
Копіювання текстових даних з UI і їх вставка в текстовий файл не особливо зручна і не забезпечує масштабування. Більш того, якщо ставиться мета виконувати додаток на IoT-пристрої без візуального виведення, тоді це додаток повинен посилати дані в хмару без жодного UI. У наступній статті ви дізнаєтеся, як підготувати хмарний сервіс для прийому всіх цих даних. Крім того, ви побачите, як розгорнути це рішення на Raspberry Pi 2 під управлінням Windows IoT Core.
Френк Ла-Віне (Frank La Vigne) - ідеолог технологій в групі Microsoft Technology and Civic Engagement, де він допомагає користувачам застосовувати технології і формувати відповідні спільноти. Регулярно веде блог на FranksWorld.com і має канал на YouTube під назвою «Frank's World TV» ( youtube.com/FranksWorldTV ).
Висловлюю подяку за рецензування статті експертам Речел Аппель (Rachel Appel), Роберту Бернштейна (Robert Bernstein) і Хосе Луїсу Маннерс (Jose Luis Manners).
Яка зона покриття Wi-Fi-мереж навколо нас?Скільки їх?
Чи безпечні вони?
На якому каналі вони працюють?
Як вони звуться?
Чи можна засікати їх і наносити на карту?
Що можна дізнатися з метаданих Wi-Fi-мережі?
Що міг би отримати місто, якби кожен міський автобус був обладнаний IoT-пристроєм, який виконує цю програму?