bat批处理开发-wifi联网系列(4):连接wifi,获取本机ip、网关及dns,并通过ping对wifi网络的连通性可用性进行检测

    公司wifi很不稳定,编写了个wifi断网后自动重连的批处理,主要包括:可用wifi查询、联网、wifi切换感知、自动检测及掉线重连,网络状态分析等功能。

    本次分享第四部分:连接wifi,并对wifi网络的可用性进行检测

上篇bat批处理开发-wifi联网系列(3):查询当前连接的wifi SSID和密码,封装为bat函数(如何传递入参和返回出参)讲到如何查询当前连接的wifi及其密码,并介绍了如何将查询功能封装为函数,入参和出参如何传递等知识。

  本篇主要讲解根据ssid连接wifi,连接后,检测wifi的可用性,涉及的知识点包括:

  •   断开一个wifi连接
  •   根据ssid连接wifi
  •   获取本机的ip,网关及dns
  •   通过ping检测wifi网络的连通性

下面一一介绍。

1. 断开一个wifi连接

当前连接的wifi不是你想连接的wifi时,需要先断开wifi连接。命令如下:

netsh wlan disconnect

bat代码为:

@netsh wlan disconnect>nul

  其中:

  @符号:表示屏蔽本行命令语句的回显。即netsh wlan disconnect命令不是显示在屏幕上

   >符号:表示重定向,即命令语句执行结果的输出到哪里,由>指定,默认为屏幕。如果是文件名,则表示输出到文件。

    nul符号:表示空指向,也即屏蔽输出。

     >nul:等于1>nul,是简写。表示屏蔽命令执行的成功结果。如果要屏蔽失败结果则写成:2>nul。如果成功结果和失败结果都不想输出,那么则用 1>nul 2>nul 即可。

2.根据ssid连接wifi

要重新连接wifi,用到的命令为:netsh wlan connect ssid=ssidName name=ssidName

bat代码为:

@netsh wlan connect ssid=%ssidName% name=%ssidName%>nul 

以上两个命令即可封装为 wifi连接的代码,bat代码如下:

rem 重连WIFI
:reConnectWifi 
  set ssidName=%1
  set ssidKey=%2
  @netsh wlan disconnect>nul
  @netsh wlan connect ssid=%ssidName% name=%ssidName%>nul 
  call:echoConnectInfo "[连接]    wifi已重新连接 %ssidName%"
goto:eof

3. 获取本机的ip,网关及dns

获取本机ip,网关和dns需要用到ipconfig/all命令+find命令组合,过滤出来想要的结果。废话不多说,为了方便调用,获取本机ip网关及dns的功能直接封装成函数,bat代码如下:

:getDeviceInfo
  rem 获取电脑本机IP,网关,dns
  for /f "tokens=16" %%i in ('ipconfig /all ^| find /i "主机名"') do set hostName=%%i 
  for /f "tokens=16" %%i in ('ipconfig ^|find /i "ipv4"') do set ip=%%i
  for /f "tokens=15" %%i in ('ipconfig /all ^| find /i "默认网关" ^| find /i "192"') do set gateway=%%i
  rem for /f "tokens=2 delims=:"  %%i in ('ipconfig /all ^|findstr /i "DNS"') do set dns=%%i
  for /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=no
  if "%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 [信息] 机器名=%hostName%, 本机ip=%ip%, 网关=%gateway%, dns1=%dns%, dns2=%dns2%
goto:eof

  很多机器的dns是自动获取的,因此dns1和dns2将是空值。

  通过调用本程序的trim函数,将字符串左右两边的空格全部删掉,这样获取的值可以本其它函数调用直接使用。

    一般在连接wifi后获取本机ip网关及dns。

  4.通过ping检测wifi网络的连通性

  wifi已经连接,本地ip、网关和dns(如果有的话)也有获取,那么连接的wifi使用可用呢?

   wifi可用性的检测主要通过ping分别检测 本机、网关、外网IP和外网域名分别进行测试,如果都通过说明wifi可用。

    本文对ping进行封装,4个入参,格式如下:

    :ping [ 请求次数]  [ip|url]   [检测项名称]  [检测项代码] 

    wifi的可用性,主要通过检测tcp/ip协议,网关、外网ip和外网域名的联通性进行判断。如有其中一项不同,则认为wifi不可用。

调用代码如下:

 rem TCP/IP协议检测
call:ping 2 %IP_127% TCPIP协议 1
 
rem 网关检测
call:ping 2 %gateway% 网关 2

rem 互联网IP检测
call:ping 2 %IP_INTERNET% 外网 3

rem 互联网域名检测
call:ping 2 %IP_URL% DNS 4   

ping函数代码如下:   

:ping
  if "%2"=="" (goto detectWifiFailure)
  ping -n %1 %2  | find "TTL=" >nul 
  if %errorlevel%==0 (goto detectWifiSuccess) else (goto detectWifiFailure)
  
  :detectWifiSuccess
  call:echoDetectInfo "[检测] √ (%4)%3正常 %2"
  set netAvailable=%4 
  goto endPing
  
  :detectWifiFailure
  call:echoError  "[检测] × (%4)%3不通 %2"
  rem echo [检测] × ^(%4^)%3不通 %2
  set /a netAvailable=-%4
  goto netError
  
  :endPing
goto:eof

以上为关键知识点,现将连接wifi、获取本机信息和wifi检测的完整代码呈现如下:

call:getDeviceInfo

echo [信息] 当前wifi=%ssid%
echo=

rem TCP/IP协议检测 
call:ping 2 %IP_127% TCPIP协议 1
 
rem 网关检测
call:ping 2 %gateway% 网关 2

rem 互联网IP检测
call:ping 2 %IP_INTERNET% 外网 3

rem 互联网域名检测
call:ping 2 %IP_URL% DNS 4

:netError

rem 删除缓存文件 ping 没有产生临时文件
rem if exist %temp%\*.ping del %temp%\*.ping

set /a detectTotalCount+=1

if %netAvailable% leq 0 (
  rem color %errorColor%
  set lastWifiReconnectDate=%date:~0,10%
  set lastWifiReconnectTime=%time% 
  set /a detectErrorCount+=1
  echo=
  call:echoError  "[结果] × 网络状态 %netAvailable%"
  call:echoConnectInfo  "[连接]    wifi重连中…"
  
  call:reConnectWifi %ssid% %wifiKey% 
    
  set waittime=%ERROR_WAITTIME%
) else (
  rem color %normalColor%
  
  echo=
  echo [结果] √ 网络状态 %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 结束
echo=   

rem 函数定义
rem ping
:ping
  if "%2"=="" (goto detectWifiFailure)
  ping -n %1 %2  | find "TTL=" >nul 
  if %errorlevel%==0 (goto detectWifiSuccess) else (goto detectWifiFailure)
  
  :detectWifiSuccess
  call:echoDetectInfo "[检测] √ (%4)%3正常 %2"
  set netAvailable=%4 
  goto endPing
  
  :detectWifiFailure
  call:echoError  "[检测] × (%4)%3不通 %2"
  rem echo [检测] × ^(%4^)%3不通 %2
  set /a netAvailable=-%4
  goto netError
  
  :endPing
goto:eof

rem 重连WIFI
:reConnectWifi 
  set ssidName=%1
  set ssidKey=%2
  @netsh wlan disconnect>nul
  @netsh wlan connect ssid=%ssidName% name=%ssidName%>nul 
  call:echoConnectInfo "[连接]    wifi已重新连接 %ssidName%"
goto:eof

:getDeviceInfo
  rem 获取电脑本机IP,网关,dns
  for /f "tokens=16" %%i in ('ipconfig /all ^| find /i "主机名"') do set hostName=%%i 
  for /f "tokens=16" %%i in ('ipconfig ^|find /i "ipv4"') do set ip=%%i
  for /f "tokens=15" %%i in ('ipconfig /all ^| find /i "默认网关" ^| find /i "192"') do set gateway=%%i
  rem for /f "tokens=2 delims=:"  %%i in ('ipconfig /all ^|findstr /i "DNS"') do set dns=%%i
  for /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=no
  if "%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 [信息] 机器名=%hostName%, 本机ip=%ip%, 网关=%gateway%, dns1=%dns%, dns2=%dns2%
goto:eof

运行截图如下:

bat批处理开发-wifi联网系列(4):连接wifi,获取本机ip、网关及dns,并通过ping对wifi网络的连通性可用性进行检测_第1张图片

 系列文章:

 bat批处理开发系列(1):获取已连的wifi及其密码

bat批处理开发-wifi联网系列(2):从wifi列表选择一个wifi

bat批处理开发-wifi联网系列(3):查询当前连接的wifi SSID和密码,封装为bat函数(如何传递入参和返回出参)

你可能感兴趣的:(bat,batch,wifi)