一、Managed Wifi API简介
1.这是一个.Net类库允许控制无线网络适配器(802.11)安装在你的Windows机器编程。
2.这个类库使用本地WiFi的API,不支持旧版本的Windows。wlanapi.dll更多参考:https://my.oschina.net/tianma3798/blog/846727
3.CodeFlex源代码地址:http://managedwifi.codeplex.com/
4.这个类库的wlanapi不是特别全....
5.更多wifi相关参考Msdn:https://technet.microsoft.com/zh-cn/network/bb545365
6.Native Wifi API Sample (Windows),参考:https://msdn.microsoft.com/en-us/library/aa816369(v=vs.85).aspx
二、更多相关资料
1.C#与C++数据类型对应:http://www.cnblogs.com/zjoch/p/5999335.html
2.更多C# 的wlanapi接口对应:http://www.pinvoke.net/default.aspx/wlanapi.wlanconnect
3.Wireless Profile Samples:https://msdn.microsoft.com/en-us/library/aa369853(v=vs.85).aspx
4.WLAN_profile Schema Elements ,Xml文件介绍:https://msdn.microsoft.com/en-us/library/ms706965(v=vs.85).aspx
三、简单使用实例
1.引用 ManagedWifi.dll,using NativeWifi;
2.C#代码
class MyWifi
{
public List<WIFISSID> ssids = new List<WIFISSID>();
public MyWifi()
{
ssids.Clear();
}
static string GetStringForSSID(Wlan.Dot11Ssid ssid)
{
return Encoding.UTF8.GetString(ssid.SSID, 0, (int)ssid.SSIDLength);
}
/// <summary>
/// 枚举所有无线设备接收到的SSID
/// </summary>
public void ScanSSID()
{
WlanClient client = new WlanClient();
foreach (WlanClient.WlanInterface wlanIface in client.Interfaces)
{
// Lists all networks with WEP security
Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0);
foreach (Wlan.WlanAvailableNetwork network in networks)
{
WIFISSID targetSSID = new WIFISSID();
targetSSID.wlanInterface = wlanIface;
targetSSID.wlanSignalQuality = (int)network.wlanSignalQuality;
targetSSID.SSID = GetStringForSSID(network.dot11Ssid);
//targetSSID.SSID = Encoding.Default.GetString(network.dot11Ssid.SSID, 0, (int)network.dot11Ssid.SSIDLength);
targetSSID.dot11DefaultAuthAlgorithm = network.dot11DefaultAuthAlgorithm.ToString();
targetSSID.dot11DefaultCipherAlgorithm = network.dot11DefaultCipherAlgorithm.ToString();
ssids.Add(targetSSID);
//if ( network.dot11DefaultCipherAlgorithm == Wlan.Dot11CipherAlgorithm.WEP )
//{
// Console.WriteLine( "Found WEP network with SSID {0}.", GetStringForSSID(network.dot11Ssid));
//}
//Console.WriteLine("Found network with SSID {0}.", GetStringForSSID(network.dot11Ssid));
//Console.WriteLine("dot11BssType:{0}.", network.dot11BssType.ToString());
//Console.WriteLine("dot11DefaultAuthAlgorithm:{0}.", network.dot11DefaultAuthAlgorithm.ToString());
//Console.WriteLine("dot11DefaultCipherAlgorithm:{0}.", network.dot11DefaultCipherAlgorithm.ToString());
//Console.WriteLine("dot11Ssid:{0}.", network.dot11Ssid.ToString());
//Console.WriteLine("flags:{0}.", network.flags.ToString());
//Console.WriteLine("morePhyTypes:{0}.", network.morePhyTypes.ToString());
//Console.WriteLine("networkConnectable:{0}.", network.networkConnectable.ToString());
//Console.WriteLine("numberOfBssids:{0}.", network.numberOfBssids.ToString());
//Console.WriteLine("profileName:{0}.", network.profileName.ToString());
//Console.WriteLine("wlanNotConnectableReason:{0}.", network.wlanNotConnectableReason.ToString());
//Console.WriteLine("wlanSignalQuality:{0}.", network.wlanSignalQuality.ToString());
//Console.WriteLine("-----------------------------------");
// Console.WriteLine(network.ToString());
}
}
} // EnumSSID
/// <summary>
/// 连接到未加密的SSID
/// </summary>
/// <param name="ssid"></param>
public void ConnectToSSID(WIFISSID ssid)
{
// Connects to a known network with WEP security
string profileName = ssid.SSID; // this is also the SSID
string mac = StringToHex(profileName); //
//string key = "";
//string profileXml = 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>New{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><MSM><security><authEncryption><authentication>open</authentication><encryption>none</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);
//string profileXml2 = "<?xml version=\"1.0\"?><WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>Hacker SSID</name><SSIDConfig><SSID><hex>54502D4C494E4B5F506F636B657441505F433844323632</hex><name>TP-LINK_PocketAP_C8D262</name></SSID> </SSIDConfig> <connectionType>ESS</connectionType><connectionMode>manual</connectionMode><MSM> <security><authEncryption><authentication>open</authentication><encryption>none</encryption><useOneX>false</useOneX></authEncryption></security></MSM></WLANProfile>";
//wlanIface.SetProfile( Wlan.WlanProfileFlags.AllUser, profileXml2, true );
//wlanIface.Connect( Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName );
string myProfileXML = 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>manual</connectionMode><MSM><security><authEncryption><authentication>open</authentication><encryption>none</encryption><useOneX>false</useOneX></authEncryption></security></MSM></WLANProfile>", profileName, mac);
ssid.wlanInterface.SetProfile(Wlan.WlanProfileFlags.AllUser, myProfileXML, true);
ssid.wlanInterface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName);
//Console.ReadKey();
}
/// <summary>
/// 字符串转Hex
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string StringToHex(string str)
{
StringBuilder sb = new StringBuilder();
byte[] byStr = System.Text.Encoding.Default.GetBytes(str); //默认是System.Text.Encoding.Default.GetBytes(str)
for (int i = 0; i < byStr.Length; i++)
{
sb.Append(Convert.ToString(byStr[i], 16));
}
return (sb.ToString().ToUpper());
}
}
class WIFISSID
{
public string SSID = "NONE";
public string dot11DefaultAuthAlgorithm = "";
public string dot11DefaultCipherAlgorithm = "";
public bool networkConnectable = true;
public string wlanNotConnectableReason = "";
public int wlanSignalQuality = 0;
public WlanClient.WlanInterface wlanInterface = null;
}
}
3.带密码的Xml文件
<?xml version="1.0" encoding="utf-8" ?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
<name>nicaimimashisha</name>
<SSIDConfig>
<SSID>
<hex>6E696361696D696D61736869736861</hex>
<name>nicaimimashisha</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>true</protected>
<keyMaterial>01000000D08C9DDF0115D1118C7A00C04FC297EB010000004F479E51D4435D409C4B5FC05DF1BD2D000000000200000000001066000000010000200000005C53C70A83EBEA47512B9F87B34EC7C405E9B4ACDBFFFEBEA8B5DA6D6958E6A8000000000E8000000002000020000000F95172637168CC535A909A1CC8021C003077AD958B38C2C01F5B1CF6AB3F87B4100000005D3361250B2140E1B14D0F66D36F2CA640000000C49084078E63F00188D3CF0B80EE9127EEDFAEABAB01803D5E0480A89811E3B24FEF3EA45FF713BB9C244EABC1C2C119CAC4FE192ACF60C976027112262A4E3F</keyMaterial>
</sharedKey>
</security>
</MSM>
<MacRandomization xmlns="http://www.microsoft.com/networking/WLAN/profile/v3">
<enableRandomization>false</enableRandomization>
</MacRandomization>
</WLANProfile>
特别说明:keyMaterial必须是根据指定加密方法加密之后的数据
4.事件监听:
wlanIface.WlanConnectionNotification += WlanIface_WlanConnectionNotification;
private static void WlanIface_WlanConnectionNotification(Wlan.WlanNotificationData notifyData,
Wlan.WlanConnectionNotificationData connNotifyData)
{
Console.WriteLine(".....................");
Console.WriteLine(notifyData.NotificationCode);
Console.WriteLine(notifyData.notificationSource);
}
4.获取已经连接过的Xml配置文件
WlanClient client = new WlanClient();
foreach (WlanClient.WlanInterface wlanIface in client.Interfaces)
{
// Lists all networks with WEP security
Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0);
foreach (Wlan.WlanAvailableNetwork network in networks)
{
//Console.WriteLine(network.profileName);
//Console.WriteLine(GetStringForSSID(network.dot11Ssid));
//Console.WriteLine(network.dot11DefaultCipherAlgorithm);
//Console.WriteLine("*********************************");
//if (network.dot11DefaultCipherAlgorithm == Wlan.Dot11CipherAlgorithm.WEP)
//{
// Console.WriteLine("Found WEP network with SSID {0}.", GetStringForSSID(network.dot11Ssid));
//}
}
// Retrieves XML configurations of existing profiles.
// This can assist you in constructing your own XML configuration
// (that is, it will give you an example to follow).
foreach (Wlan.WlanProfileInfo profileInfo in wlanIface.GetProfiles())
{
string name = profileInfo.profileName; // this is typically the network's SSID
string xml = wlanIface.GetProfileXml(profileInfo.profileName);
Console.WriteLine("ssid:" + name);
Console.WriteLine(xml);
Console.WriteLine("******************************************************");
}
}
获取结果:
******************************************************
ssid:123
<?xml version="1.0"?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
<name>123</name>
<SSIDConfig>
<SSID>
<hex>313233</hex>
<name>123</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>true</protected>
<keyMaterial>01000000D08C9DDF0115D1118C7A00C04FC297EB010000004F479E51D4435D409C4B5FC05DF1BD2D00000000020000000000106600000001000020000000EF6E93D46740330472CADC868CA81CF587AFD3D6D8C3B734066CFC27A25025F7000000000E80000000020000200000002A290E5F01D301902EB7ECD21E37336CCB32825DFB2FC8A1A71D2F3B4E173AF81000000071CC3F3EBF21D55DF27136D77246EB9C400000008A8607C942F8DF619AE1FDD56E556DDC3D86F567FCF043EFD9D7CFD7263B31F4D27D6FECE6BC18843EE479430FE0563E19E08A6186D7B45DBB5FF034D70D43EC</keyMaterial>
</sharedKey>
</security>
</MSM>
<MacRandomization xmlns="http://www.microsoft.com/networking/WLAN/profile/v3">
<enableRandomization>false</enableRandomization>
</MacRandomization>
</WLANProfile>
******************************************************
ssid:nicaimimashisha
<?xml version="1.0"?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
<name>nicaimimashisha</name>
<SSIDConfig>
<SSID>
<hex>6E696361696D696D61736869736861</hex>
<name>nicaimimashisha</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>true</protected>
<keyMaterial>01000000D08C9DDF0115D1118C7A00C04FC297EB010000004F479E51D4435D409C4B5FC05DF1BD2D000000000200000000001066000000010000200000005C53C70A83EBEA47512B9F87B34EC7C405E9B4ACDBFFFEBEA8B5DA6D6958E6A8000000000E8000000002000020000000F95172637168CC535A909A1CC8021C003077AD958B38C2C01F5B1CF6AB3F87B4100000005D3361250B2140E1B14D0F66D36F2CA640000000C49084078E63F00188D3CF0B80EE9127EEDFAEABAB01803D5E0480A89811E3B24FEF3EA45FF713BB9C244EABC1C2C119CAC4FE192ACF60C976027112262A4E3F</keyMaterial>
</sharedKey>
</security>
</MSM>
<MacRandomization xmlns="http://www.microsoft.com/networking/WLAN/profile/v3">
<enableRandomization>false</enableRandomization>
</MacRandomization>
</WLANProfile>
******************************************************
更多参考:
wlanapi.dll简介使用CMD命令修改Windows本地账户密码
http://blog.youkuaiyun.com/m593192219/article/details/9363355