• Главная
  • Карта сайта
Не найдено

Сучасні програми - Створюємо сканер Wi-Fi на платформі UWP

  1. Простір імен Windows.Devices.WiFi
  2. Додавання апаратної можливості Wi-Fi
  3. Дослідження бездротових мереж
  4. створення UI
  5. Захоплення даних про місцезнаходження
  6. періодичне сканування
  7. Звіт про результати сканування
  8. візуалізація даних
  9. Області застосування на практиці
  10. висновок

За останнє десятиліття або близько того 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-пристроєм, який виконує цю програму?
Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью