每隔一段时间,我的路由器就会出现故障(有时是由于固件更新),在此期间,有时我的 Raspberry Pi 也会重新启动,我会在日志中看到如下内容:
Jul 25 10:00:49 raspberrypi wpa_supplicant[536]: wlan0: Trying to associate with 80:3f:5d:99:b7:63 (SSID='X' freq=2462 MHz)
Jul 25 10:00:49 raspberrypi wpa_supplicant[536]: wlan0: CTRL-EVENT-ASSOC-REJECT status_code=16
Jul 25 10:00:49 raspberrypi wpa_supplicant[536]: wlan0: CTRL-EVENT-SSID-TEMP-DISABLED id=0 ssid="X" auth_failures=1 duration=10 reason=CONN_FAILED
这没问题,因为当时 WiFi 不可用,但 WiFi 几分钟后就会恢复。目前,我能找到的唯一“修复”方法是重新启动 Pi。
但是,如果我不在家,我希望它能再试一次。我把它放了 3 个小时,它从来没有重新尝试过,所以我想知道它还会再试一次吗?有什么办法可以让它处理这种情况吗?
答案1
在 RaspberryPi 上自动重新连接 WiFi
在这篇文章中,我将介绍如何编写一个简短的脚本,该脚本会自动将 RaspberryPi 重新连接到 WiFi 网络。该脚本将检查 Pi 是否具有网络连接,如果处于离线状态,则将重新启动无线接口以使其重新上线。我们将使用它
cron
来定期安排此脚本的执行。有几种方法可以确定 RaspberryPi 是否具有网络连接。对于此脚本,我们将使用
ping
。编写脚本
首先,我们需要确定 RaspberryPi 是否已连接到网络。为此,我们将尝试 ping 服务器并查看是否收到响应。如果命令成功(RaspberryPi 收到来自服务器的响应),则表示网络连接正常。如果命令失败,我们将关闭
wlan0
并重新打开。#!/bin/bash # The IP for the server you wish to ping (8.8.8.8 is a public Google DNS server) SERVER=8.8.8.8 # Only send two pings, sending output to /dev/null ping -c2 ${SERVER} > /dev/null # If the return code from ping ($?) is not 0 (meaning there was an error) if [ $? != 0 ] then # Restart the wireless interface ifdown --force wlan0 ifup wlan0 fi
将脚本命名为容易记住的名称 (
wifi_rebooter.sh
),并将此脚本放在 中/usr/local/bin
。通过运行以下命令确保其可执行:chmod +x /usr/local/bin/wifi_rebooter.sh
安排定期执行
为了确保脚本自动运行,我们将使用
cron
。运行此脚本的频率取决于个人喜好 - 我选择每五分钟运行一次脚本。要安排脚本,请打开
/etc/crontab
进行编辑并将此行添加到底部:*/5 * * * * root /usr/local/bin/wifi_rebooter.sh
这将确保脚本以 root 身份每 5 分钟运行一次。如果您不熟悉 cron 语法,请查看cron 格式。
测试
为了测试脚本是否按预期工作,我们将关闭界面
wlan0
并等待脚本将其恢复。在关闭之前wlan0
,您可能需要将间隔调整/etc/crontab
为1
分钟。另外,请注意,这将立即断开您与 shell 会话的连接。为了
wlan0
确认脚本有效,请运行:ifdown --force wlan0
耐心等待约 1 分钟后,尝试通过 SSH 重新连接到 RaspberryPi。假设一切正常,RaspberryPi 应该会自动重新连接到 WiFi。
etc/crontab
如果您将间隔设置为 1 分钟进行测试,请不要忘记将间隔调整回更合适的值。