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 的十六进制表示,您就可以像之前尝试的那样以明文形式连接密码。