C#WPF如何使用密码

时间:2015-07-07 08:25:49

标签: c# wifi

我使用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 网站。但是没有文件。

1 个答案:

答案 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的十六进制表示,就可以像以前一样用明文连接密码。