Однажды искал возможность подключиться из своей программы к 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
Это всё что нам понадобиться, у меня окно выглядит так:
После чего добавим в проект два новых файла, это библиотека «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:
Часть вторая: Подключение
И так, с самым простым мы закончили. Теперь необходимо подключится к необходимой сети, я рассмотрю пример подключения к моей сети, она первая в списке в программе.
Создадим ещё одну кнопку и добавим туда вот этот код:
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
Попробовал ваш код, но у меня возникла проблема: NativeWiFi подчеркивается красным.
Я правильно понял что NativeWiFi нужно скачивать и добавлять в VS? Если да объясните как это сделать