Разработка электронных устройств

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

Прототипы и серийное производство

Разработка и изготовление корпусов и передних панелей. Разработка и изготовление печатных платы любой сложности. Монтаж печатных плат.

Написание программного обеспечения

Весь путь от создания, поддержания и качества программного обеспечения под любую операционную систему. Основные направления сетевое и системное программирование, взаимодействие клинт - серверных систем.

Разработка механизмов различной степени сложности

Проектирование и прототипирование подвижных и неподвижных механизмов и узлов устройств и агрегатов. Полное сопровождение проекта и написание технической литературы

Создание, продвижение и обслуживание сайтов

Написание php/perl/c кода или использование cms. Собственный сервер для размещения Ваших проектов под любые нагрузки. Поддержание сайта в актуальности и продвижение в поисковых системах.

 
 

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

Автор: от 19 Январь 2013 года, просмотров 11859

Google

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

 

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

 

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

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

Это всё что нам понадлобиться, у меня окно выглядит так:

Внешний вид формы приложения

После чего добавим в проект два новых файла, их можно взять здесь - это библиотека "Native Wifi", - где то в интернете раскапал.

 [ Файл: NativeWifi.zip ]

 

Всё, теперь необходимо объявить наш новый manespace

1
2
3
4
5
6
7
8
9
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;

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
	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:

Запущеное приложение

 

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

 

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

Создадим ещё одну кнопку и добавим туда вот этот код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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);
}

 

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

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

 

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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 вы можете скачать по этой ссылке.

 [ Файл: Wifi.zip ]

Спасибо за внимание.

Категория: