如何自动重新连接WiFi?


74

我正在使用pi监视功率计。使用Edimax EW-7811UN USB适配器通过WiFi连接将数据传输到PC。当Wifi连接断开(通宵关闭或不稳定的连接)时,USB适配器将保持禁用状态。

有没有一种方法可以自动重新启动WiFi连接,而无需重新插入WiFi适配器?

Answers:


31

我更喜欢禁用大多数网络自动配置和连接管理守护程序,然后自己处理。这是一个(bash)脚本,只要网络存在,您就不会断开连接,只要您没有故障的wifi驱动程序或电源问题,就可以保持连接状态。这个想法是每N秒对路由器执行一次ping操作,如果失败,则重新连接:

#!/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

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

因此,/etc/wifi.conf在这种情况下可能包含:

router_ip=192.168.0.1
log=/var/log/wifi.log
wlan=wlan0
eth=eth0
essid=someNetwork
check_interval=5

所有这些都假定为一个开放的未加密网络(否则,您将必须添加适当的命令)。我已经在包括pi在内的各种linux机器上使用了这种方法,并且可以完美地工作。即使它定期进入睡眠状态(pi仍然无法通过它),它也将使系统无限期保持在线状态。

适当的检查间隔是3-5秒;此活动完全不会对系统资源产生任何重大影响。

您绝对需要先禁用网络自动配置,。包括ifplugd和其他网络守护进程,或者这将与你的努力的干扰:

如何在Raspbian上禁用自动配置的网络?

我其实用过apt-get remove ifplugd

要在启动时开始网络连接(因为我使用的是无头pi),我将其设置为可从/etc/rc.local以下位置在raspbian上运行:

wifi_mod=`lsmod | grep 8192cu`
if [ "$wifi_mod" ]; then
        echo "Starting wifi..."
        /usr/bin/nice -n -10 /usr/local/bin/wifi &
else
        echo "Starting ethernet..."
        /sbin/ifconfig eth0 up
        /sbin/dhclient eth0
fi

/usr/local/bin/wifi是脚本。如果您不知道该用什么nice,请阅读man nice

的要点if是,如果将我的wifi加密狗插入pi,此时内核将加载8192cu模块-因此wifi应该启动。如果不是,则假定已插入以太网并且应该使用该以太网(如果不是,则dhclient只会掉线并且没有网络访问权限)。

为此,您可能必须

因此,这会在启动时将无头的pi接入网络并保持在那里。如果您想在不登录的情况下在运行时切换到eth的方法,则可以使用udev规则执行一些操作,以拔出wifi加密狗。


听起来值得测试。不是Linux专业人士-如何将脚本设置为在启动时运行-放入cron?是否可能/也需要添加日志轮换?
andig 2013年

1
@andig:我添加了一些有关通过进行启动的段落rc.local。WRT日志轮换,这是一个与日志文件通常相关的独立问题(请参阅参考资料man logrotate)。现在,如果该脚本具有相同的路径而不是追加,则该脚本将破坏(覆盖)以前的任何日志。为了进行调试,有时会wifi.$$.log在wifi.conf文件中使用它,以便最后日志(不太可能)被破坏,并且在调整某些内容后可以将一个会话与另一个会话进行比较。$$是“ wifi”过程的pid。
goldilocks

我担心有时外壳脚本可能会很脆弱,并且在进行更新或安装了其他网络软件时很难破解。请注意此方法。
2013年

3
@耶利米:这是一个很好的恐惧。我编写了该脚本,并对其进行了多年的调整,并觉得我对它在其中运行的一般背景有所了解,因此我需要注意什么。但是,传递理解可能比代码片段更难。对我来说,这只是尝试将NetworkManager减少到一些非常基本的元素上的一种替代方法。在简单的独立系统的情况下,这可以为人们提供与Linux发行版中的“这对我有用”类似的观点。
goldilocks

所以:我知道这篇文章,如果主要发行版之一(debia,fedora和派生的)引入了一些与之混淆的内容,并打算对其进行更新。我还将重点说明需要禁用哪些内容以及如何禁用它们。
goldilocks

68

好吧,有一个非常简单的解决方案:

  1. 转到/etc/ifplugd/action.d/并将ifupdown文件重命名为ifupdown.original
  2. 然后做: cp /etc/wpa_supplicant/ifupdown.sh ./ifupdown
  3. 最后: sudo reboot

就这样。通过关闭/打开AP进行测试;您应该看到Raspberry Pi正确重新连接。


2
这是最简单,最有效的答案。经过2 Rpi测试,可以正常工作。发现此链接:raspberrypi.org/phpBB3/...
Mauvis莱德福德

12
很抱歉提出一个简单的问题-为什么这样做有效?
Jeff Meatball Yang 2014年

@JeffMeatballYang,为您的问题启动新线程。
AndaluZ 2014年

6
对我来说,那里没有ifupdown文件,只有一个链接action_wpa -> ../../wpa_supplicant/action_wpa.sh,所以也许这是默认设置了吗?
Zitrax

2
是的,就像其他人说的那样:这在dhcpcd基于发行版的版本上不起作用,要使其在RPI3上运行,您需要apt-get install rcconf切换dhcpcdnetworking
test30

21

最近,我偶然发现了一个控制台应用程序,该控制台应用程序对所有无线配置进行了分类。您也可以使用此工具来配置LAN接口。

sudo apt-get install wicd-curses

它将安装许多其他软件包并在后台运行其自己的守护程序,但它确实使配置所有内容变得更加容易。运行它

sudo wicd-curses

在此处输入图片说明

如果收到未检测到网络的消息,请按P(必须为大写字母,因此请使用[SHIFT] p),然后在无线接口字段中键入wlan0,然后按F10保存。

  1. R 刷新列表。
  2. 使用键盘上的光标在列表中向上和向下导航
  3. 按右键配置无线连接
  4. 按下几次,然后选中“自动连接到该网络”
  5. 再次按下几次,然后在关键字段中输入密码
  6. 按F10保存

在此处输入图片说明

您可能需要按C才能连接到接入点。如果进行有线连接,很可能会杀死LAN接口并启用无线功能。

它还管理连接,因此如果由于某种原因掉线,它将重新连接到任何已配置的无线访问点。

我测试了拔出WiFi适配器并将其重新插入的过程。这大约需要60到90秒钟,但它将重新连接到WiFi(不过我认为必须拔掉LAN)

希望能帮助到你!


1
不确定如何处理重新连接-初始连接不是这里的问题!
andig 2013年

我更新了答案,因为有一个步骤必须检查自动连接。同样,在首选项中,您应该一直向下滚动。最后一个选项不在屏幕上。它还说自动尝试连接到Wifi网络(默认情况下为ON)。我什至可以将WiFi适配器插回去,它会在2分钟内重新连接。您还会获得GUI版本,即wicd
Piotr Kula 2013年

命令“ sudo wicd-cruses”中的错字“ u”和“ r”被交换了
Gawcio 2014年

安装后wicd-curses,我的RPi 3开始随机冻结。以前从未冻结过,一旦卸载,冻结立即消失了。谨防!
akhmed

1
安装wicd-curses后,运行Jessie Lite的RPi 3s尚未冻结,并保持连接状态。但是今天我尝试通过以太网端口连接到一个,发现启动后几秒钟该接口将丢失。在配置wicd-curses连接到wifi之前,我能够正常连接。
克里斯·詹克斯

14

无需额外的脚本即可解决。

在/ etc / network / interfaces中放置:

allow-hotplug wlan0 iface wlan0 inet manual wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf iface default inet dhcp

漫游使接口可以自我修复。


最后一行似乎为wlan0接口添加了第二个IP地址。那是故意的吗?
2016年

我最后只有一个DHCP分配的地址。如果启动脚本更改了行为,这也不会完全使我感到惊讶-此配置文件不必要地是不可思议的……
David Sainty

2
在我的raspbian pi2机器上,如果wlan下降的时间足够长,以至于三个身份验证尝试失败,即使使用“ wpa-roam”,它也不会再次尝试。
2013年

这是在RPi 3上对我有用的唯一答案。谢谢!
akhmed

1

netcfg

尝试netcfg。没有关于您正在使用的发行版的更多详细信息,我无法提供更多详细信息,但是它可以满足您的要求。


4
我正在使用当前的raspbian发行版:pi @ raspberrypi〜$ man netcfg没有手动输入netcfg pi @ raspberrypi〜$ netcfg -bash:netcfg:找不到命令pi @ raspberrypi〜$ apt-cache搜索netcfg pi @ raspberrypi〜$
andig

0

另一种解决方案,摘自解决方案。
首先配置您的wifi设置: sudo vi /etc/wpa_supplicant/wpa_supplicant.conf添加如下部分:

network={
   ssid="MyNetworkName"
   psk="MyPaz0rdz"
   key_mgmt=WPA-PSK
}

然后,您的网络设置sudo vi /etc/dhcpcd.conf如下:

interface wlan0
inform 192.168.1.200 # the static ip for the wifi card
static routers=192.168.1.254 # your router's ip
static domain_name_servers=192.168.1.254 # your dns, usually=your router

然后在某个位置(例如在)中创建该脚本文件,/home/pi/reconnect.sh并授予其+x可执行文件的权限。

#!/bin/bash
router=`ip route | awk '/default/ {print $3}'`
/bin/ping -q -c1 $router > /dev/null

if [ $? -eq  0 ]
then
  true
  # echo "Network OK"
else
  echo "Network down, fixing..."
  # ifdown --force wlan0
  # sleep 5
  /bin/kill -9 `pidof wpa_supplicant`
  /sbin/ifup --force wlan0
  /sbin/ip route add default via $router dev wlan0
  /bin/mount -a
  echo "wlan0 reconnected at `date`"
fi

然后以root身份登录,sudo su并使用来编辑root的crontab crontab -e
在此文件的末尾添加以下行:

10 * * * * /home/pi/reconnect.sh

这意味着:“每10分钟执行一次该脚本(以root用户身份执行”)

现在,如果您已建立连接,则脚本将退出并且什么也不会发生。如果您无法ping通路由器,则脚本将尝试使用wpa_supplicant重新连接至该路由器。

请注意,从cron脚本(在这种情况下,只有在断开连接时)回显的所有内容都将通过电子邮件发送到root。因此,如果您已经配置了邮件别名和后记,那么当pi的wifi连接断开时,您将收到一封电子邮件,然后由于该脚本而再次成功返回。


0

这对我有用,于2017年3月30日使用Raspian Jessie:

http://alexba.in/blog/2015/01/14/automatically-reconnecting-wifi-on-a-raspberrypi/


1
如果链接失效,请总结您帖子中的解决方案。
tlhIngan

CMB,欢迎来到StackExchange的RPi风格角落。网站政策不鼓励链接答案,因为它们会受到链接腐烂的影响。您不需要重复链接的内容,但是一个好的答案至少应该在链接中包含的亮点上展开。
Jacobm001

除了上述Jacobm001的评论之外,根据我们关于无信息仅链接答案的政策,如果本帖子未经过编辑以包含可以作为答案的信息,但是最少可以在48小时内将其转换为Community Wiki,以简化具有它被社区纠正。
goobering '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.