Wie verbinde ich mich automatisch wieder mit WiFi?

74

Ich verwende mein Pi, um meine Leistungsmesser zu überwachen. Die Datenübertragung zum PC erfolgt über eine WiFi-Verbindung mit dem USB-Adapter Edimax EW-7811UN. Wenn die WLAN-Verbindung unterbrochen wird (über Nacht ausgeschaltet oder die Verbindung wackelt), bleibt der USB-Adapter deaktiviert.

Gibt es eine Möglichkeit, die WLAN-Verbindung automatisch neu zu starten, ohne den WLAN-Adapter erneut anzuschließen?

andig
quelle

Antworten:

31

Ich bevorzuge es, die meisten Funktionen des Netzwerk-Autokonfigurations- und Verbindungsmanagement-Daemons zu deaktivieren und mich selbst darum zu kümmern. Hier ist ein (Bash-) Skript, das die Verbindung aufrecht erhält, solange das Netzwerk verfügbar ist und Sie keine Probleme mit dem WLAN-Treiber oder der Stromversorgung haben. Die Idee ist, alle N Sekunden einen Ping-Befehl an den Router zu senden. Wenn dies fehlschlägt, stellen Sie die Verbindung erneut her:

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

So /etc/wifi.confkönnte in diesem Fall enthalten:

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

Dies alles setzt ein offenes unverschlüsseltes Netzwerk voraus (andernfalls müssen Sie die entsprechenden Befehle hinzufügen). Ich habe diesen Ansatz auf verschiedenen Linux-Rechnern verwendet, einschließlich dem pi, und er funktioniert einwandfrei. es wird ein System auf unbestimmte Zeit online halten, auch wenn es regelmäßig in den Ruhezustand geht (was der Pi sowieso nicht kann).

Ein angemessenes Überprüfungsintervall beträgt 3-5 Sekunden. Diese Aktivität hat keine wesentlichen Auswirkungen auf die Systemressourcen.

Sie müssen unbedingt zuerst die automatische Netzwerkkonfiguration deaktivieren . einschließlich ifplugdund anderer Netzwerk-Daemons, oder dies wird Ihre Bemühungen stören:

Wie kann ich das automatisch konfigurierte Netzwerk unter Raspbian deaktivieren?

Ich habe in der Tat verwendet apt-get remove ifplugd.

Um beim Booten mit dem Networking zu beginnen (da ich den pi headless verwende), muss dieser Satz auf Raspbian ausgeführt werden von /etc/rc.local:

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/wifiist das Drehbuch. Wenn Sie nicht wissen, wofür es niceist, lesen Sie man nice.

Der Punkt von ifist, dass, wenn mein Wifi-Dongle in den Pi eingesteckt ist, das 8192cu-Modul an diesem Punkt vom Kernel geladen wird - also sollte Wifi starten. Wenn nicht, wird davon ausgegangen, dass das Ethernet angeschlossen ist und verwendet werden sollte (wenn dies nicht der Fall ist, scheißt dhclient einfach aus und es gibt keinen Netzwerkzugriff).

Damit dies funktioniert, müssen Sie wahrscheinlich

Dadurch wird beim Booten ein headless pi auf das Netzwerk übertragen und dort belassen. Wenn Sie möchten, dass Sie beim Laufen zu eth wechseln, ohne sich anzumelden, können Sie mit den udev-Regeln etwas unternehmen, um den WLAN-Dongle herauszuziehen.

Goldlöckchen
quelle
Hört sich prüfenswert an. Da ich kein Linux-Profi bin, wie würde ich das Skript so einstellen, dass es beim Start ausgeführt wird? Wäre es möglich / erforderlich, auch eine Protokollrotation hinzuzufügen?
Andig
1
@andig: Ich habe ein paar Absätze über das Starten über hinzugefügt rc.local. WRT-Protokollrotation, das ist eine separate Frage, die sich auf Protokolldateien im Allgemeinen bezieht (siehe aber man logrotate). Im Moment wird dieses Skript alle vorherigen Protokolle blockieren (überschreiben), wenn sie mit demselben Pfad existieren, und nicht anhängen. Zum Debuggen habe ich manchmal wifi.$$.login der wifi.conf-Datei verwendet, so dass das letzte Protokoll (unwahrscheinlich) blockiert wird und ich eine Sitzung mit einer anderen vergleichen kann, nachdem ich etwas optimiert habe. $$ist die PID des "Wifi" -Prozesses.
Goldlöckchen
Ich mache mir Sorgen, dass Shell-Skripte manchmal zerbrechlich sein können und schwer zu erkennen sind, wenn Updates vorliegen oder andere Netzwerksoftware installiert ist. Nur ein Hinweis zur Vorsicht bei diesem Ansatz.
Jeremiah
3
@ Jeremy: Das ist eine gute Angst. Ich habe das Drehbuch geschrieben, es über Jahre hinweg optimiert und das Gefühl, dass ich ein gewisses Verständnis für den allgemeinen Kontext habe, in dem es funktioniert, und daher, worauf ich achten muss. Es ist jedoch wahrscheinlich schwieriger, das Verständnis weiterzugeben als Codeausschnitte. Für mich ist es nur eine Alternative zum Arbeiten mit NetworkManager, indem die Situation auf einige sehr grundlegende Elemente reduziert wird. Dies ist etwas, das Menschen mit einer ähnlichen Perspektive wie "das ist, was für mich funktioniert" im gesamten Linux-Distributionsspektrum unter den Umständen eines einfachen eigenständigen Systems zu bieten hat.
Goldlöckchen
Also: Ich bin mir dieses Beitrags bewusst und beabsichtige, ihn auf dem neuesten Stand zu halten, wenn einer der wichtigsten Distributionsströme (Debia, Fedora und Derivated) etwas einführt, das damit zu tun hat. Ich werde auch die Punkte betonen, was und wie deaktiviert werden muss.
Goldlöckchen
68

Nun, es gibt eine sehr einfache Lösung:

  1. Gehen Sie zu /etc/ifplugd/action.d/und benennen Sie die ifupdownDatei in umifupdown.original
  2. Dann mach: cp /etc/wpa_supplicant/ifupdown.sh ./ifupdown
  3. Endlich: sudo reboot

Das ist alles. Testen Sie dies, indem Sie Ihren AP aus- / einschalten. Sie sollten sehen, dass Ihr Himbeer-Pi richtig wieder verbindet.

AndaluZ
quelle
2
Dies ist die einfachste und effektivste Antwort. Getestet auf 2 Rpi und es funktioniert. Diesen Link gefunden von: raspberrypi.org/phpBB3/…
Mauvis Ledford
12
Entschuldigen Sie eine vereinfachende Frage - warum funktioniert das?
Jeff Meatball Yang
@JeffMeatballYang, starte einen neuen Thread für deine Frage.
AndaluZ
6
Für mich gab es dort keine ifupdown-Datei, nur einen Link action_wpa -> ../../wpa_supplicant/action_wpa.sh, also ist das jetzt vielleicht der Standard?
Zitrax
2
Yep, wie andere sagen: Das ist nicht funktioniert dhcpcdbasierten Distributionen, um diese auf RPI3 Sie müssen zum Laufen zu bringen apt-get install rcconfund wechseln Sie von dhcpcdzunetworking
test30
21

Vor kurzem bin ich auf eine Konsolenanwendung gestoßen, die die gesamte drahtlose Konfiguration außer Kontrolle bringt. Mit diesem Tool können Sie auch die LAN-Schnittstelle konfigurieren.

sudo apt-get install wicd-curses

Es wird einige andere Pakete installieren und einen eigenen Daemon im Hintergrund laufen lassen, aber es macht sicher die Konfiguration viel einfacher. Führen Sie es mit

sudo wicd-curses

Bildbeschreibung hier eingeben

Wenn Sie die Meldung erhalten, dass keine Netzwerke erkannt wurden, drücken Sie P(muss ein Großbuchstabe sein, verwenden Sie die [UMSCHALTTASTE] p), geben Sie wlan0 in das Feld für die drahtlose Schnittstelle ein und drücken Sie zum Speichern die Taste F10.

  1. R um die Liste zu aktualisieren.
  2. Verwenden Sie die Cursor auf der Tastatur, um in der Liste nach oben und unten zu navigieren
  3. Drücken Sie rechts, um die drahtlose Verbindung zu konfigurieren
  4. Drücken Sie einige Male und aktivieren Sie "Automatisch mit diesem Netzwerk verbinden"
  5. Drücken Sie erneut einige Male und geben Sie Ihr Passwort in das Schlüsselfeld ein
  6. Drücken Sie zum Speichern F10

Bildbeschreibung hier eingeben

Möglicherweise müssen Sie drücken C, um eine Verbindung zum Zugangspunkt herzustellen. Wenn Sie verkabelt sind, wird dies höchstwahrscheinlich die LAN-Schnittstelle zerstören und die drahtlose Verbindung herstellen.

Es verwaltet auch die Verbindung, sodass die Verbindung zu konfigurierten drahtlosen Zugriffspunkten wiederhergestellt wird, wenn sie aus irgendeinem Grund unterbrochen wird.

Ich habe getestet, ob ich den WLAN-Adapter herausgezogen und wieder eingesteckt habe. Es dauert ungefähr 60 bis 90 Sekunden, aber es wird wieder eine Verbindung zum WLAN hergestellt (ich denke, das LAN muss jedoch ausgesteckt sein).

Ich hoffe es hilft!

Piotr Kula
quelle
1
Nicht sicher, wie sich das um die Wiederverbindung kümmert - anfängliche Verbindung war hier nicht die Frage!
Andig
Ich habe die Antwort aktualisiert, da es einen Schritt gibt, bei dem Sie die automatische Verbindung überprüfen müssen. Auch in den Einstellungen sollten Sie ganz nach unten scrollen. Die letzte Option ist außerhalb des Bildschirms. Es heißt auch Automatisch versuchen, eine Verbindung zu Netzwerken für Wifi herzustellen (standardmäßig aktiviert). Ich kann sogar den WLAN-Adapter wieder herausziehen und die Verbindung wird innerhalb von 2 Minuten wiederhergestellt. (Ich habe dies ohne angeschlossenes LAN getan.) Dies ist wirklich der beste Weg, den ich gefunden habe, um WLAN zu konfigurieren und zu verwalten. Sie erhalten auch die gerade genannte GUI-Versionwicd
Piotr Kula
Es gibt einen Tippfehler im Befehl "sudo wicd-cruses" "u" und "r" werden ausgetauscht
Gawcio
Nach der Installation wicd-cursesfrierte mein RPi 3 zufällig ein. War noch nie gefroren und das Gefrieren verschwand sofort, nachdem ich es deinstalliert hatte. In acht nehmen!
Akhmed
1
Nach der Installation von wicd-curses sind meine RPi 3s mit Jessie Lite nicht eingefroren und bleiben in Verbindung. Aber heute habe ich versucht, eine Verbindung über den Ethernet-Port herzustellen, und festgestellt, dass die Schnittstelle einige Sekunden nach dem Start verloren gehen würde. Ich konnte eine Verbindung herstellen, bevor ich wicd-curses konfigurierte, um eine Verbindung zu wifi herzustellen.
Chris Jenks
14

Dies kann ohne zusätzliche Skripte gelöst werden.

In / etc / network / interfaces setzen:

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

Das Roaming ermöglicht es der Schnittstelle, sich selbst zu heilen.

David Sainty
quelle
Die letzte Zeile scheint der wlan0-Schnittstelle eine zweite IP-Adresse hinzuzufügen. ist das beabsichtigt?
Fche
Ich habe nur eine DHCP-zugewiesene Adresse. Es würde mich nicht ganz überraschen, wenn sich das Verhalten der Boot-Skripte geändert hätte - diese Konfigurationsdatei ist unnötig geheimnisvoll ...
David Sainty
2
Wenn auf meiner Raspbian Pi2-Box das WLAN lange genug ausfällt, damit drei Authentifizierungszyklen fehlschlagen, wird es auch mit "wpa-roam" nicht erneut versucht.
Fche
Dies ist die einzige Antwort, die bei RPi 3 funktioniert hat. Danke!
Akhmed
1

netcfg

Versuchen Sie es netcfg. Ohne weitere Angaben zu der von Ihnen verwendeten Distribution kann ich nicht viele weitere Angaben machen, aber es sollte tun, was Sie wollen.

Alex Chamberlain
quelle
4
Ich verwende die aktuelle Raspbian-Distribution: pi @ raspberrypi ~ $ man netcfg Kein manueller Eintrag für netcfg. Pi @ raspberrypi ~ $ netcfg -bash: netcfg: Befehl nicht gefunden
Andig
0

Eine andere Lösung, wie aus dieser extrahiert .
Konfigurieren Sie zuerst Ihre WLAN-Einstellungen: sudo vi /etc/wpa_supplicant/wpa_supplicant.confFügen Sie einen Abschnitt wie diesen hinzu:

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

Dann deine Netzwerkeinstellungen mit 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

Erstellen Sie dann diese Skriptdatei irgendwo in /home/pi/reconnect.shund geben Sie ihr die +xBerechtigung, ausführbar zu sein.

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

Dann melde dich als root an sudo suund bearbeite die crontab mit root crontab -e.
Am Ende dieser Datei fügen Sie diese Zeile hinzu:

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

Das bedeutet: "Führe das Skript alle 10 Minuten aus (als root)"

Wenn Sie nun eine Verbindung haben, wird das Skript beendet und es passiert nichts. Wenn Sie Ihren Router nicht anpingen können, versucht das Skript, die Verbindung mit wpa_supplicant wiederherzustellen.

Beachten Sie, dass alles, was von einem Cron-Skript wiedergegeben wird (in diesem Fall nur, wenn die Verbindung getrennt wurde), per E-Mail an root gesendet wird. Wenn Sie also Ihre Mail-Aliase und Ihr Postscript konfiguriert haben, erhalten Sie eine E-Mail, sobald die WLAN-Verbindung Ihres PIS unterbrochen wurde und dank des Skripts wieder erfolgreich hergestellt wurde.

Leonardo
quelle
0

Dies funktionierte für mich mit Raspian Jessie am 30.März.2017:

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

Colorado MountainBoy
quelle
1
Bitte fasse die Lösung in deinem Beitrag zusammen, falls der Link nicht mehr funktioniert.
tlhIngan
CMB, willkommen in der RPi-Ecke von StackExchange. Die Site-Richtlinie rät von Link-Antworten ab, da sie dem Link-Rot unterliegen. Sie müssen den Inhalt des Links nicht duplizieren, aber eine gute Antwort sollte zumindest die in dem Link enthaltenen Hervorhebungen erweitern.
Jacobm001
Gemäß dem obigen Kommentar von Jacobm001 wird dieser Beitrag zur Vereinfachung in das Community-Wiki konvertiert, wenn er nicht so bearbeitet wird, dass er Informationen enthält, die als Antwort gelten können, auch wenn sie innerhalb von 48 Stunden minimal sind es wurde von der Community korrigiert.
Goobering