bat批处理开发-wifi联网系列(4):连接wifi,获取本机ip、网关及dns,并通过ping对wifi网络的连通性可用性进行检测
??? 公司wifi很不穩(wěn)定,編寫了個(gè)wifi斷網(wǎng)后自動(dòng)重連的批處理,主要包括:可用wifi查詢、聯(lián)網(wǎng)、wifi切換感知、自動(dòng)檢測及掉線重連,網(wǎng)絡(luò)狀態(tài)分析等功能。
??? 本次分享第四部分:連接wifi,并對wifi網(wǎng)絡(luò)的可用性進(jìn)行檢測
上篇bat批處理開發(fā)-wifi聯(lián)網(wǎng)系列(3):查詢當(dāng)前連接的wifi SSID和密碼,封裝為bat函數(shù)(如何傳遞入?yún)⒑头祷爻鰠?#xff09;講到如何查詢當(dāng)前連接的wifi及其密碼,并介紹了如何將查詢功能封裝為函數(shù),入?yún)⒑统鰠⑷绾蝹鬟f等知識。
? 本篇主要講解根據(jù)ssid連接wifi,連接后,檢測wifi的可用性,涉及的知識點(diǎn)包括:
- ? 斷開一個(gè)wifi連接
- ? 根據(jù)ssid連接wifi
- ? 獲取本機(jī)的ip,網(wǎng)關(guān)及dns
- ? 通過ping檢測wifi網(wǎng)絡(luò)的連通性
下面一一介紹。
1. 斷開一個(gè)wifi連接
當(dāng)前連接的wifi不是你想連接的wifi時(shí),需要先斷開wifi連接。命令如下:
netsh wlan disconnect
bat代碼為:
@netsh wlan disconnect>nul? 其中:
? @符號:表示屏蔽本行命令語句的回顯。即netsh wlan disconnect命令不是顯示在屏幕上
?? >符號:表示重定向,即命令語句執(zhí)行結(jié)果的輸出到哪里,由>指定,默認(rèn)為屏幕。如果是文件名,則表示輸出到文件。
??? nul符號:表示空指向,也即屏蔽輸出。
???? >nul:等于1>nul,是簡寫。表示屏蔽命令執(zhí)行的成功結(jié)果。如果要屏蔽失敗結(jié)果則寫成:2>nul。如果成功結(jié)果和失敗結(jié)果都不想輸出,那么則用 1>nul 2>nul 即可。
2.根據(jù)ssid連接wifi
要重新連接wifi,用到的命令為:netsh wlan connect ssid=ssidName name=ssidName
bat代碼為:
@netsh wlan connect ssid=%ssidName% name=%ssidName%>nul以上兩個(gè)命令即可封裝為 wifi連接的代碼,bat代碼如下:
rem 重連WIFI :reConnectWifi set ssidName=%1set ssidKey=%2@netsh wlan disconnect>nul@netsh wlan connect ssid=%ssidName% name=%ssidName%>nul call:echoConnectInfo "[連接] wifi已重新連接 %ssidName%" goto:eof3. 獲取本機(jī)的ip,網(wǎng)關(guān)及dns
獲取本機(jī)ip,網(wǎng)關(guān)和dns需要用到ipconfig/all命令+find命令組合,過濾出來想要的結(jié)果。廢話不多說,為了方便調(diào)用,獲取本機(jī)ip網(wǎng)關(guān)及dns的功能直接封裝成函數(shù),bat代碼如下:
:getDeviceInforem 獲取電腦本機(jī)IP,網(wǎng)關(guān),dnsfor /f "tokens=16" %%i in ('ipconfig /all ^| find /i "主機(jī)名"') do set hostName=%%i for /f "tokens=16" %%i in ('ipconfig ^|find /i "ipv4"') do set ip=%%ifor /f "tokens=15" %%i in ('ipconfig /all ^| find /i "默認(rèn)網(wǎng)關(guān)" ^| find /i "192"') do set gateway=%%irem for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^|findstr /i "DNS"') do set dns=%%ifor /f "tokens=16" %%i in ('ipconfig /all ^| find /i "DNS"') do set dns=%%i for /F "tokens=1,2* delims=:. " %%a in ('ipconfig/all') do (if defined s set s=%%a.%%b.%%c &goto:hanye)&if /i "%%a%%b"=="DNSServers" set dns2=noif "%hostName%"=="" (set hostName=空) else (call:trim %hostName% hostName)if "%ip%"=="" (set ip=空) else (call:trim %ip% ip)if "%gateway%"=="" (set gateway=空) else (call:trim %gateway% gateway)if "%dns%"=="" (set dns=無) else (call:trim %dns% dns)if "%dns2%"=="" (set dns2=無) else (call:trim %dns2% dns2)echo [信息] 機(jī)器名=%hostName%, 本機(jī)ip=%ip%, 網(wǎng)關(guān)=%gateway%, dns1=%dns%, dns2=%dns2% goto:eof? 很多機(jī)器的dns是自動(dòng)獲取的,因此dns1和dns2將是空值。
? 通過調(diào)用本程序的trim函數(shù),將字符串左右兩邊的空格全部刪掉,這樣獲取的值可以本其它函數(shù)調(diào)用直接使用。
??? 一般在連接wifi后獲取本機(jī)ip網(wǎng)關(guān)及dns。
? 4.通過ping檢測wifi網(wǎng)絡(luò)的連通性
? wifi已經(jīng)連接,本地ip、網(wǎng)關(guān)和dns(如果有的話)也有獲取,那么連接的wifi使用可用呢?
?? wifi可用性的檢測主要通過ping分別檢測 本機(jī)、網(wǎng)關(guān)、外網(wǎng)IP和外網(wǎng)域名分別進(jìn)行測試,如果都通過說明wifi可用。
??? 本文對ping進(jìn)行封裝,4個(gè)入?yún)?#xff0c;格式如下:
??? :ping [ 請求次數(shù)]? [ip|url] ? [檢測項(xiàng)名稱]? [檢測項(xiàng)代碼]?
??? wifi的可用性,主要通過檢測tcp/ip協(xié)議,網(wǎng)關(guān)、外網(wǎng)ip和外網(wǎng)域名的聯(lián)通性進(jìn)行判斷。如有其中一項(xiàng)不同,則認(rèn)為wifi不可用。
調(diào)用代碼如下:
?rem TCP/IP協(xié)議檢測
call:ping 2 %IP_127% TCPIP協(xié)議 1
?
rem 網(wǎng)關(guān)檢測
call:ping 2 %gateway% 網(wǎng)關(guān) 2
rem 互聯(lián)網(wǎng)IP檢測
call:ping 2 %IP_INTERNET% 外網(wǎng) 3
rem 互聯(lián)網(wǎng)域名檢測
call:ping 2 %IP_URL% DNS 4???
ping函數(shù)代碼如下: ??
:pingif "%2"=="" (goto detectWifiFailure)ping -n %1 %2 | find "TTL=" >nul if %errorlevel%==0 (goto detectWifiSuccess) else (goto detectWifiFailure):detectWifiSuccesscall:echoDetectInfo "[檢測] √ (%4)%3正常 %2"set netAvailable=%4 goto endPing:detectWifiFailurecall:echoError "[檢測] × (%4)%3不通 %2"rem echo [檢測] × ^(%4^)%3不通 %2set /a netAvailable=-%4goto netError:endPing goto:eof以上為關(guān)鍵知識點(diǎn),現(xiàn)將連接wifi、獲取本機(jī)信息和wifi檢測的完整代碼呈現(xiàn)如下:
call:getDeviceInfoecho [信息] 當(dāng)前wifi=%ssid% echo=rem TCP/IP協(xié)議檢測 call:ping 2 %IP_127% TCPIP協(xié)議 1rem 網(wǎng)關(guān)檢測 call:ping 2 %gateway% 網(wǎng)關(guān) 2rem 互聯(lián)網(wǎng)IP檢測 call:ping 2 %IP_INTERNET% 外網(wǎng) 3rem 互聯(lián)網(wǎng)域名檢測 call:ping 2 %IP_URL% DNS 4:netErrorrem 刪除緩存文件 ping 沒有產(chǎn)生臨時(shí)文件 rem if exist %temp%\*.ping del %temp%\*.pingset /a detectTotalCount+=1if %netAvailable% leq 0 (rem color %errorColor%set lastWifiReconnectDate=%date:~0,10%set lastWifiReconnectTime=%time% set /a detectErrorCount+=1echo=call:echoError "[結(jié)果] × 網(wǎng)絡(luò)狀態(tài) %netAvailable%"call:echoConnectInfo "[連接] wifi重連中…"call:reConnectWifi %ssid% %wifiKey% set waittime=%ERROR_WAITTIME% ) else (rem color %normalColor%echo=echo [結(jié)果] √ 網(wǎng)絡(luò)狀態(tài) %netAvailable%set waittime=%NORMAL_WAITTIME% )call:analyseWifi set lastDetectDate=%date:~0,10% set lastDetectTime=%time% echo= echo [提示] ※ 若要重新選擇wifi檢測,請按下Ctrl + C鍵,選擇N,然后選擇Y即可 echo= call:echoStartEndInfo 結(jié)束 echo= rem 函數(shù)定義 rem ping :pingif "%2"=="" (goto detectWifiFailure)ping -n %1 %2 | find "TTL=" >nul if %errorlevel%==0 (goto detectWifiSuccess) else (goto detectWifiFailure):detectWifiSuccesscall:echoDetectInfo "[檢測] √ (%4)%3正常 %2"set netAvailable=%4 goto endPing:detectWifiFailurecall:echoError "[檢測] × (%4)%3不通 %2"rem echo [檢測] × ^(%4^)%3不通 %2set /a netAvailable=-%4goto netError:endPing goto:eofrem 重連WIFI :reConnectWifi set ssidName=%1set ssidKey=%2@netsh wlan disconnect>nul@netsh wlan connect ssid=%ssidName% name=%ssidName%>nul call:echoConnectInfo "[連接] wifi已重新連接 %ssidName%" goto:eof:getDeviceInforem 獲取電腦本機(jī)IP,網(wǎng)關(guān),dnsfor /f "tokens=16" %%i in ('ipconfig /all ^| find /i "主機(jī)名"') do set hostName=%%i for /f "tokens=16" %%i in ('ipconfig ^|find /i "ipv4"') do set ip=%%ifor /f "tokens=15" %%i in ('ipconfig /all ^| find /i "默認(rèn)網(wǎng)關(guān)" ^| find /i "192"') do set gateway=%%irem for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^|findstr /i "DNS"') do set dns=%%ifor /f "tokens=16" %%i in ('ipconfig /all ^| find /i "DNS"') do set dns=%%i for /F "tokens=1,2* delims=:. " %%a in ('ipconfig/all') do (if defined s set s=%%a.%%b.%%c &goto:hanye)&if /i "%%a%%b"=="DNSServers" set dns2=noif "%hostName%"=="" (set hostName=空) else (call:trim %hostName% hostName)if "%ip%"=="" (set ip=空) else (call:trim %ip% ip)if "%gateway%"=="" (set gateway=空) else (call:trim %gateway% gateway)if "%dns%"=="" (set dns=無) else (call:trim %dns% dns)if "%dns2%"=="" (set dns2=無) else (call:trim %dns2% dns2)echo [信息] 機(jī)器名=%hostName%, 本機(jī)ip=%ip%, 網(wǎng)關(guān)=%gateway%, dns1=%dns%, dns2=%dns2% goto:eof運(yùn)行截圖如下:
?系列文章:
?bat批處理開發(fā)系列(1):獲取已連的wifi及其密碼
bat批處理開發(fā)-wifi聯(lián)網(wǎng)系列(2):從wifi列表選擇一個(gè)wifi
bat批處理開發(fā)-wifi聯(lián)網(wǎng)系列(3):查詢當(dāng)前連接的wifi SSID和密碼,封裝為bat函數(shù)(如何傳遞入?yún)⒑头祷爻鰠?#xff09;
總結(jié)
以上是生活随笔為你收集整理的bat批处理开发-wifi联网系列(4):连接wifi,获取本机ip、网关及dns,并通过ping对wifi网络的连通性可用性进行检测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5之DeviceOrientat
- 下一篇: 【FreeSwitch开发实践】外呼网关