我使用Managed Wifi API库,可以连接" HasProfile" wifi AP是这样的:
WlanClient client = new WlanClient();
foreach (var item in client.Interfaces)
{
ViewModel.CurrentWlan = item;
Wlan.WlanAvailableNetwork[] networks = item.GetAvailableNetworkList(0);
foreach (Wlan.WlanAvailableNetwork network in networks)
{
var name = Helpers.GetStringForSSID(network.dot11Ssid);
ConnectionModel model = new ConnectionModel
{
DisplayName = string.Format("{0} (signal {1})", name, network.wlanSignalQuality),
IsConnected = network.flags.HasFlag(Wlan.WlanAvailableNetworkFlags.Connected),
SSID = network.dot11Ssid.SSID,
SsidString = Convert.ToBase64String(network.dot11Ssid.SSID),
ProfileName = network.profileName,
Name = name
};
if (network.flags.HasFlag(Wlan.WlanAvailableNetworkFlags.HasProfile))
{
model.XmlProfile = item.GetProfileXml(model.ProfileName);
}
if (network.flags == Wlan.WlanAvailableNetworkFlags.HasProfile)
{
model.IsRemembered = true;
}
ViewModel.Connections.Add(model);
}
}
现在好了,所有可用的AP都在ViewModel.Connections中。 然后我可以连接其中一个具有配置文件:
的AP private void OnConnect_Handler(object sender, RoutedEventArgs e)
{
Button button = sender as Button;
ConnectionModel model = button.DataContext as ConnectionModel;
ViewModel.CurrentWlan.SetProfile(Wlan.WlanProfileFlags.AllUser, model.XmlProfile, true);
ViewModel.CurrentWlan.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, model.ProfileName);
}
它已经奏效了! 然后我发现了一个问题,就是这样的代码只能连接那些具有配置文件的AP,如果我想连接到没有配置文件的AP(我认为这意味着' AP从未连接过' ),我应该使用以下代码:
string profileName = model.ProfileName;
string mac = "1008B1CD976F";
string key = "IsThisPasswordField?";
string profile = 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>",
profileName, mac, key);
ViewModel.CurrentWlan.SetProfile(Wlan.WlanProfileFlags.AllUser, profile, true);
ViewModel.CurrentWlan.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName);
但是我几次尝试总是失败,因为:
(1)我不知道XML内容是什么,为什么不能输入密码然后连接(ssid,密码)?是因为WIFI编程不是这样的吗? (2)如果必须设置一个配置文件,如何输入正确的内容,如:
string mac = "1008B1CD976F";
string key = "IsThisPasswordField?";
如何知道这个&#39;以及如何加密此密钥(如果它是AP的密码)?
编辑:这是Managed Wifi API 网站。但是没有文件。
答案 0 :(得分:2)
首先:要插入到配置文件中的十六进制字符串不是访问点的mac,而是ssid的十六进制字符串。 配置文件xml在这里是误导性的。我遇到了同样的问题,直到我将六角形字符串转换回已知的配置文件。这是ssid; - )
您可以通过以下方式将ssid转换为它的十六进制表示:
string ssid = "YourSSID";
byte[] ssidBytes = Text.Encoding.Default.GetBytes(ssid);
string ssidHex = BitConverter.ToString(ssidBytes);
ssidHex = ssidHex.Replace("-", "");
第二:由于ssid的十六进制字符串错误,因此使用明文密码的连接方法也不起作用。 所以只需使用ssid的十六进制表示,就可以像以前一样用明文连接密码。