C#WIFI搜索与连接

来源:互联网 发布:淘宝收藏的宝贝失效了 编辑:程序博客网 时间:2024/05/21 17:16

1、功能搜索WIFI并连接

2、所用工具及资源:VS2012 Managed Wifi API(即:引用ManagedWifi.dll文件地址:http://files.cnblogs.com/files/ywf520/ManagedWifi.zip)

3、运行截图及工程截图:

 

工程目录 结构

4、具体代码实现

wifiSo.cs

复制代码
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using NativeWifi; namespace WifiConnect{    class wifiSo    {        private WIFISSID ssid;               //wifi ssid        private string key;                 //wifi密码        public List<WIFISSID> ssids = new List<WIFISSID>();        public wifiSo()        {            ssids.Clear();        }        public wifiSo(WIFISSID ssid, string key)          {            ssids.Clear();            this.ssid = ssid;            this.key = key;        }        //寻找当前连接的网络:        public static string GetCurrentConnection()        {            WlanClient client = new WlanClient();            foreach (WlanClient.WlanInterface wlanIface in client.Interfaces)            {                Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0);                foreach (Wlan.WlanAvailableNetwork network in networks)                {                    if (wlanIface.InterfaceState == Wlan.WlanInterfaceState.Connected && wlanIface.CurrentConnection.isState == Wlan.WlanInterfaceState.Connected)                    {                        return wlanIface.CurrentConnection.profileName;                    }                }            }            return string.Empty;        }        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);                }            }        }         // 字符串转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());        }        // 连接到无线网络        public void ConnectToSSID()        {            try            {                String auth = string.Empty;                String cipher = string.Empty;                bool isNoKey = false;                String keytype = string.Empty;                //Console.WriteLine("》》》《《" + ssid.dot11DefaultAuthAlgorithm + "》》对比《《" + "Wlan.Dot11AuthAlgorithm.RSNA_PSK》》");                switch (ssid.dot11DefaultAuthAlgorithm)                {                    case "IEEE80211_Open":                        auth = "open"; break;                    case "RSNA":                        auth = "WPA2PSK"; break;                    case "RSNA_PSK":                        //Console.WriteLine("电子设计wifi:》》》");                        auth = "WPA2PSK"; break;                    case "WPA":                        auth = "WPAPSK"; break;                    case "WPA_None":                        auth = "WPAPSK"; break;                    case "WPA_PSK":                        auth = "WPAPSK"; break;                }                switch (ssid.dot11DefaultCipherAlgorithm)                {                    case "CCMP":                        cipher = "AES";                        keytype = "passPhrase";                        break;                    case "TKIP":                        cipher = "TKIP";                        keytype = "passPhrase";                        break;                    case "None":                        cipher = "none"; keytype = "";                        isNoKey = true;                        break;                    case "WWEP":                        cipher = "WEP";                        keytype = "networkKey";                        break;                    case "WEP40":                        cipher = "WEP";                        keytype = "networkKey";                        break;                    case "WEP104":                        cipher = "WEP";                        keytype = "networkKey";                        break;                }                if (isNoKey && !string.IsNullOrEmpty(key))                {                                 Console.WriteLine(">>>>>>>>>>>>>>>>>无法连接网络!");                    return;                }                else if (!isNoKey && string.IsNullOrEmpty(key))                {                    Console.WriteLine("无法连接网络!");                    return;                }                else                {                    //string profileName = ssid.profileNames; // this is also the SSID                     string profileName = ssid.SSID;                    string mac = StringToHex(profileName);                    string profileXml = string.Empty;                    if (!string.IsNullOrEmpty(key))                    {                        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>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><connectionMode>auto</connectionMode><autoSwitch>false</autoSwitch><MSM><security><authEncryption><authentication>{2}</authentication><encryption>{3}</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>{4}</keyType><protected>false</protected><keyMaterial>{5}</keyMaterial></sharedKey><keyIndex>0</keyIndex></security></MSM></WLANProfile>",                            profileName, mac, auth, cipher, keytype, key);                    }                    else                    {                        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>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><connectionMode>auto</connectionMode><autoSwitch>false</autoSwitch><MSM><security><authEncryption><authentication>{2}</authentication><encryption>{3}</encryption><useOneX>false</useOneX></authEncryption></security></MSM></WLANProfile>",                            profileName, mac, auth, cipher, keytype);                    }                    ssid.wlanInterface.SetProfile(Wlan.WlanProfileFlags.AllUser, profileXml, true);                                        bool success = ssid.wlanInterface.ConnectSynchronously(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName, 15000);                    if (!success)                    {                        Console.WriteLine("连接网络失败!");                        return;                    }                }            }            catch (Exception e)            {                Console.WriteLine("连接网络失败!");                return;            }        }        //当连接的连接状态进行通知 面是简单的通知事件的实现,根据通知的内容在界面上显示提示信息:        private void WlanInterface_WlanConnectionNotification(Wlan.WlanNotificationData notifyData, Wlan.WlanConnectionNotificationData connNotifyData)        {            try            {                    if (notifyData.notificationSource == Wlan.WlanNotificationSource.ACM)                    {                        int notificationCode = (int)notifyData.NotificationCode;                        switch (notificationCode)                        {                            case (int)Wlan.WlanNotificationCodeAcm.ConnectionStart:                                Console.WriteLine("开始连接无线网络.......");                                break;                            case (int)Wlan.WlanNotificationCodeAcm.ConnectionComplete:                                break;                            case (int)Wlan.WlanNotificationCodeAcm.Disconnecting:                                    Console.WriteLine("正在断开无线网络连接.......");                                break;                            case (int)Wlan.WlanNotificationCodeAcm.Disconnected:                                Console.WriteLine("已经断开无线网络连接.......");                                break;                        }                    }                //}));            }            catch (Exception e)            {                //Loger.WriteLog(e.Message);            }        }    }    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;    }}
复制代码


Form1.cs

复制代码
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using NativeWifi;using System.Threading;namespace WifiConnect{    public partial class wifi : Form    {        private List<WIFISSID> ssids;        private wifiSo wifiso;        public wifi()        {            InitializeComponent();        }        private void wifi_Load(object sender, EventArgs e)        {                        wifiso = new wifiSo();  //加载wifi            ssids = wifiso.ssids;            wifiso.ScanSSID();      //显示所有wifi                    }        private void connectWIFI()        {        }        private void button1_Click(object sender, EventArgs e)        {            this.wifiListOK.Items.Clear();  //只移除所有的项。            //wifiListOK.Clear();//清除listview中的数据            SetwifiList();            ScanSSID();        }        //设置listviewok        private void SetwifiList()        {            this.wifiListOK.Columns.Add("wifi名称", 160, HorizontalAlignment.Left); //一步添加             this.wifiListOK.Columns.Add("wifiSSID", 120, HorizontalAlignment.Left); //一步添加             this.wifiListOK.Columns.Add("加密方式", 100, HorizontalAlignment.Left); //一步添加            this.wifiListOK.Columns.Add("信号强度", 88, HorizontalAlignment.Left); //一步添加             //ColumnHeader ch = new ColumnHeader();  //先创建列表头            wifiListOK.GridLines = true;//显示网格            wifiListOK.Scrollable = true;//显示所有项时是否显示滚动条            wifiListOK.AllowColumnReorder = true;            wifiListOK.FullRowSelect = true;            wifiListOK.CheckBoxes = true;        }        //添加数据        private void wifiListOKADDitem(String wifiname, String pass,String dot11DefaultAuthAlgorithm,int i)        {            this.wifiListOK.BeginUpdate();   //数据更新,UI暂时挂起,直到EndUpdate绘制控件,可以有效避免闪烁并大大提高加载速度              //this.wifiListOK.Items.Add(wifiname,0);            ListViewItem wifiitem = wifiListOK.Items.Add(wifiname);            wifiitem.SubItems.Add(pass);            wifiitem.SubItems.Add(dot11DefaultAuthAlgorithm);            wifiitem.SubItems.Add(i+"");            this.wifiListOK.EndUpdate();  //结束数据处理,UI界面一次性绘制。            this.wifiListOK.View = System.Windows.Forms.View.Details;        }        //单击事件        private void wifiListOK_SelectedIndexChanged(object sender, EventArgs e)        {            if (wifiListOK.SelectedIndices != null && wifiListOK.SelectedItems.Count > 0)            {                ListView.SelectedIndexCollection c = wifiListOK.SelectedIndices;                MessageBoxButtons messButton = MessageBoxButtons.OKCancel;                DialogResult dr = MessageBox.Show("确定要连接" + wifiListOK.Items[c[0]].Text + "吗?", "wifi连接", messButton);                 if (dr == DialogResult.OK)//如果点击“确定”按钮                 {                    // Console.WriteLine("<<<<<<<<<<<<<<<<flags:{0}.>>>>>>>>>>>>>>>>>>>>>>>", ssid);                     //wifiso.ConnectToSSID(targetSSID, "ZMZGZS520");//连接wifi                 }            }        }        static string GetStringForSSID(Wlan.Dot11Ssid ssid)        {            return Encoding.UTF8.GetString(ssid.SSID, 0, (int)ssid.SSIDLength);        }        //显示所有wifi        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);                    wifiListOKADDitem(GetStringForSSID(network.dot11Ssid), network.dot11DefaultCipherAlgorithm.ToString(),                        network.dot11DefaultAuthAlgorithm.ToString(),(int)network.wlanSignalQuality);                    if (GetStringForSSID(network.dot11Ssid).Equals("DZSJ1"))                    {                        var obj = new wifiSo(targetSSID, "ZMZGZS520");                        Thread wificonnect = new Thread(obj.ConnectToSSID);                        wificonnect.Start();                        //wifiso.ConnectToSSID(targetSSID, "ZMZGZS520");//连接wifi                        connectWifiOK.Text = GetStringForSSID(network.dot11Ssid);                        Image img = new Bitmap(Environment.CurrentDirectory+"/image/wifi.png");//这里是你要替换的图片。当然你必须事先初始化出来图                        pictureBoxW.BackgroundImage = img;                        //Console.WriteLine(">>>>>>>>>>>>>>>>>开始连接网络!" + targetSSID.SSID + GetStringForSSID(network.dot11Ssid) + GetStringForSSID(network.dot11Ssid).Equals("DZSJ1"));                    }                }            }        }        /// <summary>        /// 关闭wifi        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void closeWIFI_Click(object sender, EventArgs e)        {            if (connectWifiOK.Text.Equals("") || connectWifiOK.Text.Equals(null))            {                MessageBox.Show("当前无连接wifi");            }            else            {                            }        }        //更新数据        private void getwifidatabtn_Click(object sender, EventArgs e)        {            WifiSocket wifiscoket = new WifiSocket();            wifiscoket.fuwu();            wifiscoket.kehuduan();        }    }}
复制代码

5、到此就结束了,写的不对的地方希望大家多多指教,更多功能还希望小伙伴们继续研究。

6、鸣谢:感谢各位广大博友无私的分享精神!

7、参考:http://blog.csdn.net/m593192219/article/details/9363355

原创粉丝点击