Поиск сетей и подключение к Wi-Fi на C#

в 8:10, , рубрики: .net, wi-fi, Песочница, метки: , ,

Однажды искал возможность подключиться из своей программы к WI-Fi сети, для кого-то может это и не проблема, а для меня это оказалось большим камнем на дороге. Решение я нашел, надеюсь и ещё кому-либо пригодится. Ранее данную статью публиковал на сайте www.outme.ru вот ссылка http://www.outme.ru/poisk-setej-i-podklyuchenie-k-wi-fi-na-c.html

Разделим наш проект на две части, условно, просто для того что бы лучше разобраться.
Для начала создадим проект в Visual Studio на языке C# — WindowsFormsApplication и назовём его так как нам больше всего нравится, я назвал «Wifi».

Часть первая: Поиск доступных сетей

Итак, закидываем на форму два котрола:

  • ListView — назовём listNet, и добавим в него 4 колонки, просто для наглядности.
  • Button — назовём btnRefresh

Это всё что нам понадобиться, у меня окно выглядит так:
image
После чего добавим в проект два новых файла, это библиотека «Native Wifi», — где то в интернете нашел.
Исходники можно взять здесь

Объявим необходимые нам namespace'ы

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using NativeWifi;

Теперь создаём процедуру обработки клика нашей кнопки и добавляем туда данный код:

WlanClient client = new WlanClient();
 
	foreach (WlanClient.WlanInterface wlanIface in client.Interfaces)
	{
 
		Wlan.WlanAvailableNetwork[] wlanBssEntries = wlanIface.GetAvailableNetworkList( 0 );
 
		//очищаем листвью, что бы не дублировать найденные сети при повторном нажатии
 
		istNet.Items.Clear();
		foreach (Wlan.WlanAvailableNetwork network in wlanBssEntries)
		{
			// создаём экземпляр элемента листвью
			ListViewItem listItemWiFi = new ListViewItem(); 
 
			// назначаем ему имя нашей первой найденной сети, в конце убираем нулевые символы - Trim((char)0)
			listItemWiFi.Text = System.Text.ASCIIEncoding.ASCII.GetString(network.dot11Ssid.SSID).Trim((char)0);
 
			// узнаём дополнительную информацию о сети и так же добавляем её в листвью, но уже в наш только что созданный итэм.
			listItemWiFi.SubItems.Add(network.wlanSignalQuality.ToString() + "%"); // качество связи в процентах
			listItemWiFi.SubItems.Add(network.dot11DefaultAuthAlgorithm.ToString().Trim((char)0)); // тип безопасности
			listItemWiFi.SubItems.Add(network.dot11DefaultCipherAlgorithm.ToString().Trim((char)0)); // тип шифрования
 
			//ну и добавляем элемент непосредственно в листвью
			listNet.Items.Add(listItemWiFi);
 
		}
	}

Теперь можно попробовать запустить приложение и посмотреть что найдены все нужные сети, должно получится что то вроде этого, так оно выглядит у меня, тёмная полоса справа — это поле для подключения к сети в Windows 8:
image

Часть вторая: Подключение

И так, с самым простым мы закончили. Теперь необходимо подключится к необходимой сети, я рассмотрю пример подключения к моей сети, она первая в списке в программе.
Создадим ещё одну кнопку и добавим туда вот этот код:

try
{
	WlanClient client = new WlanClient();
 
	foreach (WlanClient.WlanInterface wlanIface in client.Interfaces)
	{
		Wlan.WlanAvailableNetwork[] wlanBssEntries = wlanIface.GetAvailableNetworkList(0);
		foreach (Wlan.WlanAvailableNetwork network in wlanBssEntries)
		{
			String profileName = System.Text.ASCIIEncoding.ASCII.GetString(network.dot11Ssid.SSID).Trim((char)0);
 
			// подключаемся именно к выбранной сети
			if (listNet.SelectedItems[0].Text.Equals(profileName))
			{
				String strTemplate="";
				String authentication="";
 
				switch ((int)network.dot11DefaultAuthAlgorithm)
				{
					case 1: // Open
 
						break;
					case 3: // WEP
 
						break;
					case 4: // WPA_PSK
 
						strTemplate = Properties.Resources.WPAPSK;
 
						authentication = "WPAPSK";
 
						String encryption = network.dot11DefaultCipherAlgorithm.ToString().Trim((char)0);
 
						// пароль к сети
						String key = "0000000000"; 
 
						String profileXml = String.Format(strTemplate, profileName, authentication, encryption, key);
 
						wlanIface.SetProfile(Wlan.WlanProfileFlags.AllUser, profileXml, true);
						wlanIface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName);
 
						break;
 
					default:
						break;
				}
			}
		}
	}
}
catch (Exception ex)
{
	MessageBox.Show(ex.Message);
}

Поясню лишь самое главное, вот эту строчку:

String profileXml = String.Format(strTemplate, profileName, authentication, encryption, key);

Здесь формируем профиль для нашего подключения, шаблон (strTemplate) выглядит вот таким образом:

<?xml version="1.0"?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
	<name>{0}</name>
	<SSIDConfig>
		<SSID>
			<name>{0}</name>
		</SSID>
	</SSIDConfig>
	<connectionType>ESS</connectionType>
	<connectionMode>manual</connectionMode>
	<MSM>
		<security>
			<authEncryption>
				<authentication>{1}</authentication>
				<encryption>{2}</encryption>
				<useOneX>false</useOneX>
			</authEncryption>
			<sharedKey>
				<keyType>passPhrase</keyType>
				<protected>false</protected>
				<keyMaterial>{3}</keyMaterial>
			</sharedKey>
		</security>
	</MSM>
</WLANProfile>

Я выбрал именно его, потому что заранее знаю какая у меня сеть. Подробнее с различными вариантами можно ознакомиться здесь:
http://msdn.microsoft.com/ru-RU/library/windows/desktop/aa369853(v=vs.85).aspx.

Проще говоря мы заполняем наш XML документ заранее известными данными, которые мы уже знаем(ключ сети) и найденными ранее(название, безопасность, шифрование), добавляем профиль и подключаемся.
Запускаем проект, обновляем список сетей выбираем нашу и подключаемся.

Пример конечно не универсальный, но что вам мешает проверить какое именно шифрование использует сеть и выбрать необходимый шаблон для профиля.
Проект в Visual Studio 2012 вы можете скачать по этой ссылке.
Спасибо за внимание.

Автор: devprodest

Источник

Поделиться

* - обязательные к заполнению поля