總體的概念是,使用 bash script,每隔一段時間測試網路狀況,如果有問題就重啟。
- 測試的方法是用 curl 向 google 與 yahoo 要網頁,有回應就算成功。
- 重啟的動作,ifup/ifdown,ifconfig wlan0 up/down 或是 dhcpcd restart 都無用。ifup/ifdown 在 raspbian 有問題,找不到 wlan0,而後兩個失敗的原因是 route default gateway 的設定會失蹤。解決方法直覺的是使用 `sudo route add default gw 192.168.1.1`,另一個則是在 dhcpcd restart 之前做 `sudo ip addr flush dev wlan0`,而我選擇後者。
- 每隔一段時間執行的動作是使用 cron,在 raspbian 這個版本用的是 anacron,直接在 /etc/crontab 加入設定即可。它自己就會檢查與執行,不用重啟 cron deamon。
完整 bash script 如下:
```
```#!/bin/bash urls=("http://www.google.com" "http://tw.yahoo.com") http_code_accept=("200" "301" "302" "404") count=${#urls[@]} connected=0 echo "now start to check net is on or not" echo "bash file in /home/pi/net_restart.sh" #check net is connected or not for ((i=0;i<$count;i++)) do url=${urls[$i]} result=$(curl -o /dev/null -s -m 10 -w "%{http_code}" "$url") for flag in ${http_code_accept[@]} do #echo $flag $result $url if [ $flag = $result ]; then connected=$(expr $connected + 1) echo "accept" $url $connected fi done done if [ $connected -eq 0 ]; then echo "network not good" echo "going to restart network" ip addr flush dev wlan0 systemctl restart dhcpcd fi