【疑难杂症爆破委员会】
树莓派(Linux各种发行版通用)WiFi断线自动重连
状况说明
我的树莓派需要每天联网工作,可是每天早晨我都发现它连不上网,在路由器的管理界面也找不到它。后来我突然明白:我们宿舍晚上定时断电,早上定时通电。所以,树莓派和路由器是同时启动的。树莓派启动立即联网,可是这个时候路由器还并没有连上网。所以我需要让树莓派在没有网的情况下自动重新连接。
百度了半天没有找到解决方案,最终果不其然,在Stack Exchange上找到了一个脚本
https://raspberrypi.stackexchange.com/questions/4120/how-to-automatically-reconnect-wifi How to automatically reconnect WiFi? 回复者:goldilocks
可是事情并没有那么简单,用了他的脚本,在第二天早上我的树莓派还是没连上。
原Shell脚本(我并没有运行成功,请看“操作步骤”中的修改版!!):
#!/bin/bash
# make sure we aren't running already
# 确保本脚本没有重复运行
what=`basename $0`
for p in `ps h -o pid -C $what`; do
if [ $p != $$ ]; then
exit 0
fi
done
# source configuration
# 本来他是通过一个配置文件导入信息的,我直接把信息写在这了
#. /etc/wifi.conf
check_interval=间隔秒数
wlan=你wlan的名字
essid=你wifi的ssid
router_ip=你路由器的网关
exec 1> /dev/null
exec 2>> $log
echo $(date) > $log
# without check_interval set, we risk a 0 sleep = busy loop
# 这里在检测间隔时间有没有设置,如果没有设置就直接停止脚本
if [ ! "$check_interval" ]; then
echo "No check interval set!" >> $log
exit 1
fi
startWifi () {
dhclient -v -r
# make really sure
killall dhclient
iwconfig $wlan essid $essid
dhclient -v $wlan
}
ifconfig $eth down
ifconfig $wlan up
startWifi
while [ 1 ]; do
ping -c 1 $router_ip & wait $!
if [ $? != 0 ]; then
echo $(date)" attempting restart..." >> $log
startWifi
sleep 1
else sleep $check_interval
fi
done
所需条件
dhcpcd
或dhclient
: 用来自动获取ip地址。据说dclient更好用,我用的前者,如果不行就换成后者ifconfig
: 用来启动wifi连接wpa_supplicant
: 用来连接wifisystemd
: 用以开机启动脚本nice
: 用于间隔一定时间重复执行脚本
以上这些包,请确保已经装上了
操作步骤
- 编写一个wpa_supplicant的配置文件
我的放在了 /etc/wpa_supplicant/wpa_supplicant.conf
,内容如下:
country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=root
update_config=1
network={
ssid="改成你的wifi名" # wifi的名字
psk="改成你的wifi密码" # wifi密码
key_mgmt=WPA-PSK # 加密方式
priority=1 # 优先级
}
- 编写重连脚本
我的叫 reconnect.sh
放在了用户目录下
#!/bin/bash
# make sure we aren't running already
# 确保本脚本没有重复运行
what=`basename $0`
for p in `ps h -o pid -C $what`; do
if [ $p != $$ ]; then
exit 0
fi
done
# source configuration
# 本来他是通过一个配置文件导入信息的,我直接把信息写在这了
#. /etc/wifi.conf
check_interval=间隔秒数
wlan=你wlan的名字
essid=你wifi的ssid
router_ip=你路由器的网关
# 从这往上没变化
exec 1> /dev/null
# without check_interval set, we risk a 0 sleep = busy loop
if [ ! "$check_interval" ]; then
echo "No check interval set!" >> $log
exit 1
fi
startWifi () {
if ! ifconfig | grep $wlan;then
ifconfig $wlan up
fi
# 确保wlan连接启动了
if ps -ef | grep wpa_supplicant | grep -v grep;then
kill -9 `pidof wpa_supplicant`
fi
wpa_supplicant -i $wlan -c /etc/wpa_supplicant/wpa_supplicant.conf &
# 连接wifi 注意上边配置文件的路径
if ifconfig | grep $wlan | grep -v grep;then
if ps -ef | grep dhcpcd | grep -v grep;then
kill -9 `pidof dhcpcd`
fi
echo "dhcpcd"
dhcpcd
fi
# 获取ip地址
}
startWifi
while [ 1 ]; do
ping -c 1 $router_ip & wait $!
if [ $? != 0 ]; then
echo $(date)" attempting restart..."
startWifi
sleep 10
# 更改间隔时间,因为有些服务启动较慢,试验后,改的间隔长一点有用
else sleep $check_interval
fi
done
- 脚本写完之后,下一步就是让它能开机启动了
以下步骤需要ROOT权限
这里我们用到了 systemd
,在 /etc/systemd/system
目录下建立一个文件,我的叫 reconnect.service
编辑它:
[Unit]
Description=Script to reconnect wifi while getting disconnected
[Service]
ExecStart=nice -n -10 /home/alarm/reconnect.sh &
[Install]
WantedBy=multi-user.target
然后通过 sudo systemctl enable reconnect.service
来设置开机自动运行
这样就可以实现wifi掉线自动重连了