目前太多机器(我指的是笔记本)选择将无线网卡焊接在主板上了,而且,网卡的芯片基本上是Intel。这其实对大部分人来说并没什么影响,但是对于像我这种喜欢使用黑苹果的人来说,影响就有些大了,至少在去年以前:这个卡在黑苹果里是没法使用的,要想使用无线,要么是搞一块外接的USB无线网卡,要么是牺牲一块NVME插槽(如果你的机器凑巧支持双NVME的话)来做转接。但是,好的一点是去年一个国内大佬做出了Intel网卡、蓝牙的黑苹果驱动,地址:
OpenIntelWireless
目前,该驱动的稳定版为1.3.0,测试版为2.0.0,经过测试已经可以驱动市面上常见的Intel无线网卡。
但是,在我个人的日常使用中,时常会出现掉线,经过与原作者Z大沟通以及抓包测试,目前给的结论是:密钥过期了。暂时不清楚是什么原因造成的。
实际使用过程中,如果发生掉线通常重连一下网络就可以恢复正常,所以就萌发了个念头:让机器自己随时监测是不是与路由器断开,是的话就自己直接重连,不让人工参与?有了这个想法,就弄了下面这个shell脚本来实现:
## 路由器名称
routername="OpenWrt"
## 路由器密码
password="12345678"
## 路由器IP
routerip="192.168.1.1"
## 网卡名称
netcardname="en1"
play() {
hour=$(date "+%H")
if [[ $hour -gt 21 ]] ; then
echo $1
elif [[ $hour -lt 8 ]] ; then
echo $1
else
say $1 -r 250
fi
}
connectAirport() {
networksetup -setairportpower $4 off
sleep 2
play "开始尝试第一次连接无线网络,请等待"
echo "关闭 Airport"
networksetup -setairportpower $4 on
echo "等待2秒后尝试连接 $1"
sleep 2
echo "尝试连接 $1"
networksetup -setairportnetwork $4 $1 $2
echo "等待 5 秒后检测连接状态"
sleep 5
if [[ $(ping -i1 -c1 -t1 $3|grep "100.0% packet loss") == "" ]] ; then
return
else
play "第一次修复失败,继续尝试修复"
echo "尝试连接到 $1"
networksetup -setairportnetwork $4 $1 $2
echo "等待10秒后检测连接状态"
sleep 10
if [[ $(ping -i1 -c1 -t1 $3|grep "100.0% packet loss") == "" ]] ; then
return
else
play "无法修复,请手动处理"
echo "Can't find $1, Break"
exit
fi
fi
}
echo "开始监控网卡状态并尝试修复"
times=0
while [ 1 ]
do
if [[ $(ping -i1 -c2 -t2 $routerip|grep " 0 packets received") == "" ]] ; then
continue ###网络工作正常
else
((times=times+1))
time=$(date "+%Y-%m-%d %H:%M:%S")
echo "$time 网络第 $times 次断开"
play "网络已经断开,开始修复"
echo $(ping -i1 -c2 -t2 $routerip)
connectAirport $routername $password $routerip $netcardname;
play "修复成功,继续监控"
fi
done
将上述代码保存一下比如~/checkAirport.command,然后在终端执行
chmod +x ~/checkAirport.command
~/checkAirport.command
第一条给这个文件赋上可执行权限,第二条就执行它,扔那测试吧。上述代码的原理其实就是不停的发送ping命令来检测是否与指定的路由断开(间隔1s)如果断开就尝试关闭无线然后重新开启并尝试连接指定的路由器。
再说明一下:上述脚本针对的是AirportItlwm.kext,使用Z大的另一个驱动itlwm.kext是不存在掉线的问题的,只是不支持接力。