C# WPF如何使用密码连接wifi
C# WPF how to connect a wifi with password
我使用 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);
}
成功了!
然后我发现一个问题就是这样的代码只能连接那些APHas Profile,如果我想连接到没有配置文件的AP(我认为那意味着'AP never connected'),我应该使用以下代码:
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) 如果一定要设置profile,如何输入正确的东西如:
string mac = "1008B1CD976F";
string key = "IsThisPasswordField?";
如何知道这个 'mac',以及如何加密这个密钥(如果它是 AP 的密码)?
编辑:这是 Managed Wifi API 网站。但是没有文档。
首先:要插入配置文件的十六进制字符串不是接入点的 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 的十六进制表示,您就可以像之前尝试的那样以明文形式连接密码。
我使用 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);
}
成功了! 然后我发现一个问题就是这样的代码只能连接那些APHas Profile,如果我想连接到没有配置文件的AP(我认为那意味着'AP never connected'),我应该使用以下代码:
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) 如果一定要设置profile,如何输入正确的东西如:
string mac = "1008B1CD976F";
string key = "IsThisPasswordField?";
如何知道这个 'mac',以及如何加密这个密钥(如果它是 AP 的密码)?
编辑:这是 Managed Wifi API 网站。但是没有文档。
首先:要插入配置文件的十六进制字符串不是接入点的 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 的十六进制表示,您就可以像之前尝试的那样以明文形式连接密码。