【疑难杂症爆破委员会】树莓派(Linux各种发行版通用)WiFi断线自动重连

【疑难杂症爆破委员会】

树莓派(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

所需条件

  1. dhcpcddhclient : 用来自动获取ip地址。据说dclient更好用,我用的前者,如果不行就换成后者
  2. ifconfig : 用来启动wifi连接
  3. wpa_supplicant : 用来连接wifi
  4. systemd : 用以开机启动脚本
  5. nice : 用于间隔一定时间重复执行脚本

以上这些包,请确保已经装上了

操作步骤

  1. 编写一个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 # 优先级
}
  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
  1. 脚本写完之后,下一步就是让它能开机启动了

以下步骤需要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掉线自动重连了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值