目前太多機(jī)器(我指的是筆記本)選擇將無線網(wǎng)卡焊接在主板上了,而且,網(wǎng)卡的芯片基本上是Intel。這其實(shí)對(duì)大部分人來說并沒什么影響,但是對(duì)于像我這種喜歡使用黑蘋果的人來說,影響就有些大了,至少在去年以前:這個(gè)卡在黑蘋果里是沒法使用的,要想使用無線,要么是搞一塊外接的USB無線網(wǎng)卡,要么是犧牲一塊NVME插槽(如果你的機(jī)器湊巧支持雙NVME的話)來做轉(zhuǎn)接。但是,好的一點(diǎn)是去年一個(gè)國內(nèi)大佬做出了Intel網(wǎng)卡、藍(lán)牙的黑蘋果驅(qū)動(dòng),地址:
OpenIntelWireless
目前,該驅(qū)動(dòng)的穩(wěn)定版為1.3.0,測(cè)試版為2.0.0,經(jīng)過測(cè)試已經(jīng)可以驅(qū)動(dòng)市面上常見的Intel無線網(wǎng)卡。
但是,在我個(gè)人的日常使用中,時(shí)常會(huì)出現(xiàn)掉線,經(jīng)過與原作者Z大溝通以及抓包測(cè)試,目前給的結(jié)論是:密鑰過期了。暫時(shí)不清楚是什么原因造成的。
實(shí)際使用過程中,如果發(fā)生掉線通常重連一下網(wǎng)絡(luò)就可以恢復(fù)正常,所以就萌發(fā)了個(gè)念頭:讓機(jī)器自己隨時(shí)監(jiān)測(cè)是不是與路由器斷開,是的話就自己直接重連,不讓人工參與?有了這個(gè)想法,就弄了下面這個(gè)shell腳本來實(shí)現(xiàn):
## 路由器名稱
routername="OpenWrt"
## 路由器密碼
password="12345678"
## 路由器IP
routerip="192.168.1.1"
## 網(wǎng)卡名稱
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 "開始嘗試第一次連接無線網(wǎng)絡(luò),請(qǐng)等待"
echo "關(guān)閉 Airport"
networksetup -setairportpower $4 on
echo "等待2秒后嘗試連接 $1"
sleep 2
echo "嘗試連接 $1"
networksetup -setairportnetwork $4 $1 $2
echo "等待 5 秒后檢測(cè)連接狀態(tài)"
sleep 5
if [[ $(ping -i1 -c1 -t1 $3|grep "100.0% packet loss") == "" ]] ; then
return
else
play "第一次修復(fù)失敗,繼續(xù)嘗試修復(fù)"
echo "嘗試連接到 $1"
networksetup -setairportnetwork $4 $1 $2
echo "等待10秒后檢測(cè)連接狀態(tài)"
sleep 10
if [[ $(ping -i1 -c1 -t1 $3|grep "100.0% packet loss") == "" ]] ; then
return
else
play "無法修復(fù),請(qǐng)手動(dòng)處理"
echo "Can't find $1, Break"
exit
fi
fi
}
echo "開始監(jiān)控網(wǎng)卡狀態(tài)并嘗試修復(fù)"
times=0
while [ 1 ]
do
if [[ $(ping -i1 -c2 -t2 $routerip|grep " 0 packets received") == "" ]] ; then
continue ###網(wǎng)絡(luò)工作正常
else
((times=times+1))
time=$(date "+%Y-%m-%d %H:%M:%S")
echo "$time 網(wǎng)絡(luò)第 $times 次斷開"
play "網(wǎng)絡(luò)已經(jīng)斷開,開始修復(fù)"
echo $(ping -i1 -c2 -t2 $routerip)
connectAirport $routername $password $routerip $netcardname;
play "修復(fù)成功,繼續(xù)監(jiān)控"
fi
done
將上述代碼保存一下比如~/checkAirport.command,然后在終端執(zhí)行
chmod +x ~/checkAirport.command
~/checkAirport.command
第一條給這個(gè)文件賦上可執(zhí)行權(quán)限,第二條就執(zhí)行它,扔那測(cè)試吧。上述代碼的原理其實(shí)就是不停的發(fā)送ping命令來檢測(cè)是否與指定的路由斷開(間隔1s)如果斷開就嘗試關(guān)閉無線然后重新開啟并嘗試連接指定的路由器。
再說明一下:上述腳本針對(duì)的是AirportItlwm.kext,使用Z大的另一個(gè)驅(qū)動(dòng)itlwm.kext是不存在掉線的問題的,只是不支持接力。