Wifi断网自动重连
作者:faaronzheng 转载请注明出处!
最近宿舍wifi不知道为什么不稳定,经常电脑会断开连接,需要手动重连。而我又会整夜开着电脑下东西,十分蛋疼。所以我就小小的学以致用一下,写了一个简单地wifi断网自动重连工具,并且可以设置在断网超过一定时间后会自动关机。开发环境为win8+vs2012,亲测win8下可以连接路由器和connectify。连接时请注意正确选择认证方式和加密方式。但是即使配置正确也有一定可能因为路由器问题无法连接。
这个程序的实现其实很简单,下面是主要代码的实现。
主要用到了wininet.dll、managedwifi.dll、c#操作cmd、c#操作xml文件和多线程的知识。
wininet.dll主要是获得当前网络的连接状态。使用方法如下先导入wininet.dll
//检测网络状态
[DllImport("wininet.dll", EntryPoint = "InternetGetConnectedState")]
public extern static bool InternetGetConnectedState(out int conState, int reder); //使用时直接调用InternetGetConnectedState(out int conState, int reder)函数。
我的使用是先定义int Desc = 0;
然后判断 if (InternetGetConnectedState(out Desc, 0)) //如果有网络连接会返回true
managedwifi.dll主要是用来获取所有无线wifi和对特定wifi进行连接。
#region 枚举所有无线设备接收到的SSIDpublic List<WIFISSID> ScanSSID() //获取所有可用wifi{List<WIFISSID> wifiName = new List<WIFISSID>(); //用来保存wifi信息WlanClient client = new WlanClient();foreach (WlanClient.WlanInterface wlanIface in client.Interfaces){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.dot11DefaultAuthAlgorithm = network.dot11DefaultAuthAlgorithm.ToString();targetSSID.dot11DefaultCipherAlgorithm = network.dot11DefaultCipherAlgorithm.ToString();wifiName.Add(targetSSID);}}return wifiName;} #endregion
#region 连接到指定的SSIDpublic void ConnectToSSID(WIFISSID ssid,Boolean isSave) //连接指定wifi{ string profileXml = string.Format("<?xml version=\"1.0\" encoding=\"US-ASCII\"?> <WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><name>{0}</name></SSID></SSIDConfig> <connectionType>ESS</connectionType><connectionMode>auto</connectionMode><autoSwitch>false</autoSwitch><MSM><security><authEncryption><authentication>{1}</authentication><encryption>{2}</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>passPhrase</keyType><protected>false</protected><keyMaterial>{3}</keyMaterial></sharedKey></security></MSM></WLANProfile>",name,authen,encry, pswd);ssid.wlanInterface.SetProfile(Wlan.WlanProfileFlags.AllUser, profileXml, true);ssid.wlanInterface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any,name); if (isSave) //是否需要保存{//xml文件操作XmlDocument doc = new XmlDocument();doc.Load("setting.xml");XmlNodeList nodeList = doc.SelectSingleNode("setting").ChildNodes;foreach (XmlNode xn in nodeList){XmlElement xe = (XmlElement)xn;if (xe.GetAttribute("ssid").Equals(name)){isAdded = true;}}if (!isAdded) //是否已经存在 {XmlOP xml = new XmlOP();xml.addXml(name, pswd); //将wifi名和密码写入xml文件}} }#endregion
上面这段代码中最重要的是profileXml,不同的网络格式也会不尽相同,具体请参考
http://msdn.microsoft.com/en-us/library/windows/desktop/aa369853%28v=vs.85%29.aspx
c#操作cmd代码,这部分主要是实现关机和取消关机
#region 调用Cmd public void useCmd(string str){System.Diagnostics.Process process = new Process();//StartInfo获取或设置要传递给Process的Start方法的属性.为ProcessStartInfo类型process.StartInfo.FileName = "cmd.exe";//设置UseShellExecute以指定是否使用操作系统外壳程序启动进程process.StartInfo.UseShellExecute = false;//使进程从文件或其他设备获取输入process.StartInfo.RedirectStandardInput = true;//向文件或其他设备返回输出process.StartInfo.RedirectStandardOutput = true;process.StartInfo.CreateNoWindow = true;process.Start();//给命令行传入关机命令process.StandardInput.WriteLine(str);process.StandardInput.WriteLine("exit");process.Close();}#endregion
c#操作xml文件,xml文件主要是用来保存配置信息、wifi名和wifi密码。主要是因为我没用过xml所以就尝试一下。我觉得xml文件像一个树的结构。具体使用可以自行查找资料,还是十分简单的。
以下是我的实现代码.
#region 创建xml文件public void creXml() {XmlDocument doc = new XmlDocument();XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "gb2312", "yes");doc.AppendChild(dec);XmlElement elem1 = doc.CreateElement("", "setting", "");doc.AppendChild(elem1);XmlNode root = doc.SelectSingleNode("setting");XmlElement basic = doc.CreateElement("basic");basic.SetAttribute("timeout", "10");basic.SetAttribute("authen", "WPAPSK");basic.SetAttribute("encry", "AES");root.AppendChild(basic); doc.Save("setting.xml");}#endregion
#region 添加结点到xmlpublic void addXml(string SSID,string pswd) {XmlDocument doc = new XmlDocument();doc.Load("setting.xml");XmlNode root = doc.SelectSingleNode("setting");XmlElement elem = doc.CreateElement(SSID);elem.SetAttribute("ssid", SSID);elem.SetAttribute("pswd", pswd);root.AppendChild(elem);doc.Save("setting.xml");}#endregion
这个程序也用到了多线程知识。除了主线程外还有重连线程、断网关机线程。
具体实现代码如下
#region 重连线程public void AutoConThread(Boolean isSave){int Desc = 0;while (true){if (InternetGetConnectedState(out Desc, 0)) //有网络连接 {sw.Reset(); //重置时间continue;}else{AutoConFlag = true;sw.Start(); //开始计时Thread.Sleep(1000);}if (AutoConFlag){wifi.ConnectToSSID(targetSSID, isSave); //连接wifiAutoConFlag = false;Thread.Sleep(60000);}Thread.Sleep(10000);}}#endregion
#region 断网关机线程public void watchThread() {while (true){if (Convert.ToInt32(sw.ElapsedMilliseconds) > time){timeout = true;}if (timeout){useCmd("shutdown -s -t 600");timeout = false;}Thread.Sleep(10000);}}#endregion
这些线程都是死循环一直运行的,这样的话启动后即使你关掉程序,但是线程还在继续工作,进程里还能看到程序在跑。一个很好地解决办法就是把这些线程设置为后台线程,这样的话关闭应用程序后线程也会结束。
autoConnect = new Thread(()=>state.AutoConThread(isSave));autoConnect.IsBackground = true; //设置线程为后台进程//System.Environment.Exit(0); 也可以起到退出后程序完全关闭的效果autoConnect.Start();
源代码下载:
http://download.csdn.net/detail/faaronzheng/7250515
发现bug或有好的改进请告诉我,大家共同学习。
Wifi断网自动重连相关推荐
- 电脑开机自动登录,断网自动重连以及桌面联网小程序
对于需要拨号连接联网的公司企业和学校,每次开机都需要点一下弹出的连接对话框,才能让电脑联网,有没有什么方法无需用户进行任何操作就能自动联网呢?在远程办公时,办公室偶尔会出现断网的情况,远程软件也无法使 ...
- WIN10 电脑设置自动拨号联网任务,实现开机、断网自动重连
1.打开"计算机管理" 使用组合键 win + X 唤出系统菜单,点击 计算机管理 . 2.打开"任务计划程序" 3.创建自动联网任务 ① 点击 创建基本任务 ...
- windows 任务管理器实现拨号断网自动重连
windows 任务管理器实现拨号断网自动重连 打开任务管理器 测试任务执行情况 打开任务管理器 右键计算机->管理 任务计划程序->创建基本任务 名称和描述方便自己记忆即可 完成如图点击 ...
- 江西理工大学校园网开机自动连接,断网自动重连
一.打开网页,但是先不登录 二.F12打开开发者工具,点击网络,勾选保留日志(防止日志丢失) 三.登录账号,观察连接后日志的变化 根据user_account及password的值可知,这是我们登录的 ...
- win10宽带连接断网自动重连
文章目录 1. 断开网络连接,重命名网络连接 2. bat代码:检测到断线自动重连 3. 设置开机自动执行 3.1 方式一:任务计划程序 3.2 方式二:用vbs代码开机运行bat 1. 断开网络连接 ...
- windows 断网自动重拨
原理 大家都喜欢用 ping IP 来检测网络是否连通,断网检测也是基于这个原理,通过返回的内容来判断是否断网,然后启动拨号程序就可以了. 代码 @echo off :start ping -n 2 ...
- 【软路由】openwrt 断网自动重连拨号
实现原理 定时ping两个外网IP,如果连续N次都ping不通,则用 ifup wan 重启网卡重新拨号 文件及目录 ping检测脚本:/root/ping/ping.sh 守护脚本:/root/pi ...
- win11断网自动重启
前言 远程办公需要. 办公电脑没密码,开机后会自动联网,所以每次断网后联一下重启一下就好了 . 除了要求没密码外,还需要要求电脑的电源设置为从不睡眠: 一. 批处理脚本 功能:电脑一直不关机,6~7点 ...
- openwrt 断网 自动重启网络
路由器偶尔会自动断网,但是进去路由器发现网络正常,网上查找资料发现应该是运营商更新了,但是路由器没有更新,网上搜了个脚本能解决这个问题,做个备忘. #!/bin/sh tries=0 logger & ...
最新文章
- img 在video上面_HTML,img,video无法铺满屏幕解决方法,同视频做网页背景无法全屏的解决方法...
- Python【每日一问】36
- 乱乱乱!那些惨不忍睹的机房布线
- Linux学习之十二-Linux文件属性
- 微软HTTP API指南
- 如何给柱状图柱子添加阴影_【LeetCode日记】84. 柱状图中最大的矩形
- php调用接口搜索的网页源代码,PHP用户管理中常用接口调用实例及解析(含源码)...
- 【Python笔记】元组的用法
- java se下载完怎么启动_【Java SE】如何安装JDK以及配置Java运行环境
- 深入探索 Android 包体积优化(匠心制作)
- unity NOPI 创建word文档
- python自动化测试工程师面试题(转载师傅:上海悠悠)
- 进销存系统设计说明书
- 【Mongodb】常用的一些功能
- HBuilderX 打包问题
- Playfair Crack
- JINI学习笔记2-HelloWorld
- web前端框架——Vue的特性
- 商用密码产品及对应规范介绍
- SPARQL 使用教程
热门文章
- java异常和错误共有的超类为Throwable
- mysql安装时卡在starting server的解决方法
- 几种黑白相间的棋盘实现方法
- Windows驱动_WFP之三Callout驱动的操作
- DaoCloud道客:云原生多云应用利器-Karmada控制器
- 学校计算机的使用英语作文180字,我的梦想高中英语作文180字
- linux socket send函数和recv函数详解以及修改缓冲区大小
- Python--根据计算公式:BMI = 体重(kg) / 身高(m)^2判断身体状况
- 频繁项集挖掘算法在告警关联中的应用
- C++ 基础知识(二)变量 HINSTANCE、HWND、HDC