C#编程使用Managed Wifi API连接wifi整理(一)

一、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 ssids = new List();  
    
        public MyWifi()  
        {  
            ssids.Clear();  
        }  
    
    
        static string GetStringForSSID(Wlan.Dot11Ssid ssid)  
        {  
            return Encoding.UTF8.GetString(ssid.SSID, 0, (int)ssid.SSIDLength);  
        }  
    
        ///   
        /// 枚举所有无线设备接收到的SSID  
        ///   
        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  
    
    
        ///   
        /// 连接到未加密的SSID  
        ///   
        ///   
        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("{0}{1}New{0}ESSopennonefalsenetworkKeyfalse{2}0", profileName, mac, key);  
            //string profileXml2 = "Hacker SSID54502D4C494E4B5F506F636B657441505F433844323632TP-LINK_PocketAP_C8D262                ESSmanual opennonefalse";  
            //wlanIface.SetProfile( Wlan.WlanProfileFlags.AllUser, profileXml2, true );  
            //wlanIface.Connect( Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName );  
            string myProfileXML = string.Format("{0}{1}{0}ESSmanualopennonefalse", profileName, mac);  
            ssid.wlanInterface.SetProfile(Wlan.WlanProfileFlags.AllUser, myProfileXML, true);  
            ssid.wlanInterface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName);  
            //Console.ReadKey();  
        }  
    
        ///   
        /// 字符串转Hex  
        ///   
        ///   
        ///   
        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文件



  nicaimimashisha
  
    
      6E696361696D696D61736869736861
      nicaimimashisha
    
  
  ESS
  auto
  
    
      
        WPA2PSK
        AES
        false
      
      
        passPhrase
        true
        01000000D08C9DDF0115D1118C7A00C04FC297EB010000004F479E51D4435D409C4B5FC05DF1BD2D000000000200000000001066000000010000200000005C53C70A83EBEA47512B9F87B34EC7C405E9B4ACDBFFFEBEA8B5DA6D6958E6A8000000000E8000000002000020000000F95172637168CC535A909A1CC8021C003077AD958B38C2C01F5B1CF6AB3F87B4100000005D3361250B2140E1B14D0F66D36F2CA640000000C49084078E63F00188D3CF0B80EE9127EEDFAEABAB01803D5E0480A89811E3B24FEF3EA45FF713BB9C244EABC1C2C119CAC4FE192ACF60C976027112262A4E3F
      
    
  
  
    false
  
特别说明: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);
}
C#编程使用Managed Wifi API连接wifi整理(一)_第1张图片

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


        123
        
                
                        313233
                        123
                
        
        ESS
        auto
        
                
                        
                                WPA2PSK
                                AES
                                false
                        
                        
                                passPhrase
                                true
                                01000000D08C9DDF0115D1118C7A00C04FC297EB010000004F479E51D4435D409C4B5FC05DF1BD2D00000000020000000000106600000001000020000000EF6E93D46740330472CADC868CA81CF587AFD3D6D8C3B734066CFC27A25025F7000000000E80000000020000200000002A290E5F01D301902EB7ECD21E37336CCB32825DFB2FC8A1A71D2F3B4E173AF81000000071CC3F3EBF21D55DF27136D77246EB9C400000008A8607C942F8DF619AE1FDD56E556DDC3D86F567FCF043EFD9D7CFD7263B31F4D27D6FECE6BC18843EE479430FE0563E19E08A6186D7B45DBB5FF034D70D43EC
                        
                
        
        
                false
        


******************************************************
ssid:nicaimimashisha


        nicaimimashisha
        
                
                        6E696361696D696D61736869736861
                        nicaimimashisha
                
        
        ESS
        auto
        
                
                        
                                WPA2PSK
                                AES
                                false
                        
                        
                                passPhrase
                                true
                                01000000D08C9DDF0115D1118C7A00C04FC297EB010000004F479E51D4435D409C4B5FC05DF1BD2D000000000200000000001066000000010000200000005C53C70A83EBEA47512B9F87B34EC7C405E9B4ACDBFFFEBEA8B5DA6D6958E6A8000000000E8000000002000020000000F95172637168CC535A909A1CC8021C003077AD958B38C2C01F5B1CF6AB3F87B4100000005D3361250B2140E1B14D0F66D36F2CA640000000C49084078E63F00188D3CF0B80EE9127EEDFAEABAB01803D5E0480A89811E3B24FEF3EA45FF713BB9C244EABC1C2C119CAC4FE192ACF60C976027112262A4E3F
                        
                
        
        
                false
        


******************************************************
更多参考:

C#进制转换操作(三)之16进制操作

wlanapi.dll简介使用CMD命令修改Windows本地账户密码

http://blog.csdn.net/m593192219/article/details/9363355

你可能感兴趣的:(C#网络编程)