Проблемы с использованием управляемого Wi-Fi (API NativeWiFi)
Я пытаюсь создать профиль WLAN и подключиться к нему с помощью Native WiFi ( https://managedwifi.codeplex.com/). Я могу просмотреть весь список BSS сети и их параметры. Однако, когда я пытаюсь создать / перезаписать профиль WLAN, я получаю следующее сообщение об ошибке (Ошибка № 1):
Произошло необработанное исключение типа "System.ComponentModel.Win32Exception" в ManagedWifi.dll.
Дополнительная информация: Профиль сетевого подключения поврежден
Однако, когда я обычно создал профиль из "Центра управления сетями и общим доступом" панели управления Windows 7, а затем попытался подключиться с помощью ManagedWiFi, я получил другое сообщение об ошибке (Ошибка № 2):
Необработанное исключение типа "System.ArgumentException" произошло в mscorlib.dll
Дополнительная информация: Тип 'NativeWifi.Wlan+WlanReasonCode' нельзя маршалировать как неуправляемую структуру; никакой значимый размер или смещение не могут быть вычислены.
Я заметил, что эта ошибка возникает, даже если я пытаюсь подключиться / отключиться от профиля WLAN из "Центра управления сетями и общим доступом" с приложением Windows, работающим в фоновом режиме.
Вот пример кода, который я использую:
Dim profileName As String = GlobalVariables.ssidname ' Provides the selected SSID name from the Network BSS List
Dim hexval As String = StringToHex(GlobalVariables.ssidname) ' Function to get the hexadecimal value for a provided string
Dim key As String = TextBox1.Text ' Security key from the textbook provided
Dim profileXml As String = String.Format("<?xml version=""1.0""?><WLANProfile xmlns=""http://www.microsoft.com/networking/WLAN/profile/v1""><name>{0}</name><SSIDConfig><SSID><hex>{1}</hex><name>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><MSM><security><authEncryption><authentication>open</authentication><encryption>WEP</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>networkKey</keyType><protected>false</protected><keyMaterial>{2}</keyMaterial></sharedKey><keyIndex>0</keyIndex></security></MSM></WLANProfile>", 'GlobalVariables.ssidname, hexval, TextBox1.Text)
wlanIface.SetProfile(Wlan.WlanProfileFlags.AllUser, profileXml, True) 'Error#1 occurs here
wlanIface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName) 'Error#2 occurs here
Из форума " Тип Native Wifi.Wlan + WlanReasonCode не может быть маршализованной ошибкой", проблема (Ошибка № 2), кажется, находится в WlanAPI.cs, где есть строка кода, которая проверяет размер кода возврата. Это строка:
int expectedSize = Marshal.SizeOf(typeof(Wlan.WlanReasonCode));
if (notifyData.dataSize >= expectedSize)
{
Wlan.WlanReasonCode reasonCode = (Wlan.WlanReasonCode)Marshal.ReadInt32(notifyData.dataPtr);
if (wlanIface != null)
wlanIface.OnWlanReason(notifyData, reasonCode);
}
Изменение вышеуказанного кода на приведенное ниже, похоже, решает проблему.
//int expectedSize = Marshal.SizeOf(typeof(Wlan.WlanReasonCode));
if (notifyData.dataSize >= 0)
{
Wlan.WlanReasonCode reasonCode = (Wlan.WlanReasonCode)Marshal.ReadInt32(notifyData.dataPtr);
if (wlanIface != null)
wlanIface.OnWlanReason(notifyData, reasonCode);
}
Однако я не уверен, как добавить это исправление в свое решение. Я установил ManagedWiFi из диспетчера пакетов NuGet. Следовательно, не уверен, как изменить файл WlanApi.cs. Любая помощь в отношении вышеупомянутых двух вопросов очень ценится.
1 ответ
Проблема (ошибка № 1) теперь решена. Формат файла profilexml был другим для меня. Вот profilexml после того, как я изменил его.
Dim profileXml As String = String.Format("<?xml version=""1.0""?><WLANProfile xmlns=""http://www.microsoft.com/networking/WLAN/profile/v1""><name>{0}</name><SSIDConfig><SSID><hex>{1}</hex><name>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><connectionMode>auto</connectionMode><MSM><security><authEncryption><authentication>WPA2PSK</authentication><encryption>AES</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>passPhrase</keyType><protected>false</protected><keyMaterial>{2}</keyMaterial></sharedKey></security></MSM></WLANProfile>", GlobalVariables.ssidname, hexval, TextBox1.Text)
Также вторая проблема (Ошибка № 2) была решена, когда я удалил пакет ManagedWiFi из своего решения и добавил весь проект ManagedWiFi в решение. Затем я внес изменения в WlanApi.cs, как указано в SimpleWiFi или введите Native Wifi.Wlan + WlanReasonCode не может быть ошибкой маршалинга.
У меня была более простая задача (прочитать SSID подключенной сети), которая выдавала ту же ошибку.
Я решил это, полностью переключившись на использование SimpleWiFi и проигнорировав пакет ManagedWifi.
Глядя на исходный код, похоже, что SW - это фиксированная повторная реализация некоторых функций в MW.