Jak automatycznie ponownie połączyć WiFi?

74

Używam mojego pi do monitorowania moich mierników mocy. Dane są przesyłane do komputera przez połączenie WiFi za pomocą adaptera USB Edimax EW-7811UN. Gdy połączenie Wi-Fi zostanie zerwane (wyłączone na noc lub niepewne), adapter USB pozostaje wyłączony.

Czy istnieje sposób automatycznego ponownego uruchomienia połączenia WiFi bez ponownego podłączania karty WiFi?

andig
źródło

Odpowiedzi:

31

Wolę wyłączyć większość rzeczy związanych z automatyczną konfiguracją sieci i demonem zarządzania połączeniami i sam sobie z tym poradzić. Oto skrypt (bash), który będzie utrzymywał połączenie tak długo, jak sieć będzie w pobliżu i nie będziesz mieć problemów ze sterownikiem Wi-Fi lub problemami z zasilaniem; pomysł polega na pingowaniu routera co N sekund, a jeśli to się nie powiedzie, podłącz ponownie:

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

Tak więc, /etc/wifi.confw tym przypadku może zawierać:

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

Wszystko to zakłada otwartą, niezaszyfrowaną sieć (w przeciwnym razie konieczne będzie dodanie odpowiednich poleceń). Zastosowałem to podejście na różnych maszynach linuxowych, w tym pi, i działa ono bezbłędnie; utrzyma system w trybie online przez czas nieokreślony, nawet jeśli okresowo przejdzie w tryb uśpienia (czego pi nie może zresztą).

Przyzwoity okres sprawdzania wynosi 3-5 sekund; ta aktywność w ogóle nie wpłynie znacząco na zasoby systemowe.

Koniecznie trzeba wyłączyć automatycznej konfiguracji sieci pierwszy ,. w tym ifplugdi inne demony sieciowe, w przeciwnym razie będzie to zakłócać Twoje wysiłki:

Jak mogę wyłączyć automatycznie skonfigurowaną sieć w Raspbian?

Faktycznie użyłem apt-get remove ifplugd.

Aby rozpocząć pracę w sieci podczas rozruchu (ponieważ używam pi bez głowy), mam ten zestaw do uruchomienia na raspbian z /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/wifijest skrypt. Jeśli nie wiesz, po co nice, przeczytaj man nice.

Chodzi o ifto, że jeśli mój klucz Wi-Fi jest podłączony do pi, moduł 8192cu zostanie w tym momencie załadowany przez jądro - więc wifi powinno się uruchomić. Jeśli nie, to zakłada się, że sieć Ethernet jest podłączona i powinna być używana (jeśli tak nie jest, dhclient po prostu zawiedzie i nie będzie dostępu do sieci).

Aby to zadziałało, prawdopodobnie będziesz musiał

W ten sposób dostaje się bezgłowe pi do sieci podczas rozruchu i utrzymuje ją tam. Jeśli chcesz zmienić sposób na et podczas pracy bez logowania, możesz zrobić coś z regułami udev w celu wyciągnięcia klucza Wi-Fi.

Złotowłosa
źródło
Brzmi warte przetestowania. Nie będąc pro-linuksem, jak ustawić skrypt do uruchamiania przy starcie - umieścić w cronie? Czy byłoby również możliwe / wymagane dodanie rotacji logów?
andig
1
@ andig: Dodałem kilka akapitów na temat uruchamiania przez rc.local. Rotacja dziennika WRT, to osobne pytanie, które dotyczy plików dziennika w ogóle (ale patrz man logrotate). W tej chwili skrypt będzie kasował (nadpisywał) każdy poprzedni dziennik, jeśli istnieje z tą samą ścieżką, a nie dołącza. Do debugowania czasami wifi.$$.logużywałem pliku wifi.conf, więc ostatni dziennik jest (mało prawdopodobny), aby zostać zablokowanym i mogę porównać jedną sesję z drugą po poprawieniu czegoś. $$jest pid procesu „wifi”.
złotowłosa
Martwię się, że czasami skrypty powłoki mogą być delikatne i trudno się zorientować, kiedy są aktualizacje lub jeśli zainstalowane jest inne oprogramowanie sieciowe. Tylko uwaga na temat tego podejścia.
jeremiah
3
@jeremiah: To dobry strach. Napisałem scenariusz, poprawiałem go przez lata i czuję, że rozumiem ogólny kontekst, w którym działa, a zatem to, na co muszę uważać. Prawdopodobnie jednak trudniej jest przekazać zrozumienie niż fragmenty kodu. Dla mnie jest to tylko alternatywne podejście do próby pracy z NetworkManager, ograniczając sytuację do kilku bardzo podstawowych elementów. Jest to coś, co oferuje ludziom z podobną perspektywą, jak „to, co dla mnie zadziałało” w całym spektrum dystrybucji Linuksa w warunkach prostego systemu autonomicznego.
złotowłosa
Więc: Zdaję sobie sprawę z tego postu i zamierzam go aktualizować, jeśli jeden z głównych strumieni dystrybucji (debia i fedora i pochodne) wprowadzi coś, co mu nie przeszkadza. Zwrócę też trochę uwagi na to, co należy wyłączyć i jak.
złotowłosa
68

Cóż, istnieje bardzo proste rozwiązanie:

  1. Przejdź do /etc/ifplugd/action.d/i zmień nazwę ifupdownpliku naifupdown.original
  2. Następnie wykonaj: cp /etc/wpa_supplicant/ifupdown.sh ./ifupdown
  3. Wreszcie: sudo reboot

To wszystko. Sprawdź to, wyłączając / włączając swój AP; powinieneś zobaczyć, że Twoje Raspberry Pi prawidłowo się ponownie łączy.

AndaluZ
źródło
2
To najprostsza i najskuteczniejsza odpowiedź. Testowany na 2 Rpi i działa. Znaleziono ten link z: raspberrypi.org/phpBB3/…
Mauvis Ledford
12
Przepraszamy za uproszczone pytanie - dlaczego to działa?
Jeff Meatball Yang
@JeffMeatballYang, rozpocznij nowy wątek na swoje pytanie.
AndaluZ
6
Dla mnie nie było tam pliku ifupdown, tylko link action_wpa -> ../../wpa_supplicant/action_wpa.sh, więc może teraz jest to domyślny?
Zitrax
2
Tak, jak mówią inni: to nie dhcpcddziała na bazowych dystrybucjach, aby uruchomić to na RPI3, musisz apt-get install rcconfi przełączyć się z dhcpcdnanetworking
test30
21

Niedawno natknąłem się na aplikację konsolową, która rozwiązuje całą konfigurację bezprzewodową. Możesz także użyć tego narzędzia do skonfigurowania interfejsu LAN.

sudo apt-get install wicd-curses

Zainstaluje kilka innych pakietów i uruchomi własnego demona w tle, ale z pewnością ułatwia konfigurację wszystkiego. Uruchom to z

sudo wicd-curses

wprowadź opis zdjęcia tutaj

Jeśli pojawi się komunikat informujący, że nie wykryto sieci, naciśnij P(musi być duże, więc użyj [SHIFT] p) i wpisz wlan0 w polu interfejsu bezprzewodowego i naciśnij F10, aby zapisać.

  1. R aby odświeżyć listę.
  2. Użyj kursorów na klawiaturze, aby poruszać się w górę i w dół listy
  3. Naciśnij w prawo, aby skonfigurować połączenie bezprzewodowe
  4. Naciśnij kilka razy i zaznacz „Automatycznie połącz z tą siecią”
  5. Naciśnij jeszcze raz kilka razy i wpisz hasło w polu klucza
  6. Naciśnij klawisz F10, aby zapisać

wprowadź opis zdjęcia tutaj

Być może trzeba będzie nacisnąć, Caby połączyć się z punktem dostępu. Jeśli masz połączenie przewodowe, najprawdopodobniej zabije interfejs LAN i uruchomi sieć bezprzewodową.

Zarządza także połączeniem, więc połączy się z dowolnym skonfigurowanym bezprzewodowym punktem dostępowym, jeśli z jakiegokolwiek powodu przestanie działać.

Testowałem podłączanie adaptera Wi-Fi i podłączanie go z powrotem. Zajmuje to około 60 ~ 90 sekund, ale połączy się ponownie z Wi-Fi (myślę, że sieć LAN musi być odłączona)

Mam nadzieję, że to pomoże!

Piotr Kula
źródło
1
Nie jestem pewien, jak to zajmuje się ponownym połączeniem - pierwsze połączenie nie było tutaj pytaniem!
andig
Zaktualizowałem odpowiedź, ponieważ jest krok, w którym musisz sprawdzić połączenie automatycznie. Również w preferencjach należy przewinąć do końca. Ostatnia opcja jest poza ekranem. Mówi także: Automatycznie spróbuj połączyć się z siecią Wi-Fi (domyślnie jest WŁĄCZONA). Mogę nawet wyjąć wtyczkę adaptera Wi-Fi z powrotem, a ona połączy się ponownie w ciągu 2 minut. (Zrobiłem to bez podłączonej sieci LAN) To naprawdę najlepszy sposób na konfigurację i zarządzanie siecią bezprzewodową. Dostajesz również wersję GUI, która właśnie się nazywawicd
Piotr Kula,
w poleceniu „sudo wicd-cruses” literówka „u” i „r” wymieniono
literówkę
Po instalacji wicd-cursesmoje RPi 3 zaczęło się losowo zamrażać. Nigdy wcześniej nie zamrażał, a zamrażanie zniknęło natychmiast po jego odinstalowaniu. Strzec się!
akhmed
1
Po zainstalowaniu wicd-curses moje RPi 3s z Jessie Lite nie zawiesiły się i pozostają w kontakcie. Ale dzisiaj próbowałem połączyć się z jednym przez port Ethernet i okazało się, że interfejs zostanie utracony kilka sekund po uruchomieniu. Byłem w stanie połączyć się dobrze przed skonfigurowaniem wicd-curses do połączenia z Wi-Fi.
Chris Jenks,
14

Można to rozwiązać bez dodatkowych skryptów.

W pliku / etc / network / interfaces:

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

Roaming umożliwia samoleczenie się interfejsu.

David Sainty
źródło
Ostatni wiersz wydaje się dodawać drugi adres IP do interfejsu wlan0; czy to celowe?
fche
Mam tylko jeden adres przypisany do DHCP. Nie zaskoczyłoby mnie to całkowicie, gdyby skrypty rozruchowe zmieniły zachowanie - ten plik konfiguracyjny jest niepotrzebnie tajemny ...
David Sainty
2
Na moim urządzeniu Raspbian pi2, jeśli sieć Wlan działa wystarczająco długo, aby trzy próby uwierzytelnienia zakończyły się niepowodzeniem, nawet w przypadku „wpa-roam” nie próbuje ponownie.
fche
To jedyna odpowiedź, która zadziałała na mnie w RPi 3. Dzięki!
akhmed
1

netcfg

Spróbować netcfg. Bez dalszych szczegółów na temat używanej dystrybucji nie mogę podać wielu innych szczegółów, ale powinno zrobić to, co chcesz.

Alex Chamberlain
źródło
4
Używam bieżącej dystrybucji Raspbian: pi @ raspberrypi ~ $ man netcfg Brak ręcznego wpisu dla netcfg pi @ raspberrypi ~ $ netcfg -bash: netcfg: polecenie nie znaleziono pi @ raspberrypi ~ $ apt-cache szukaj netcfg pi @ raspberrypi ~ $
andig
0

Inne rozwiązanie, jak wyciągnięto z tego .
Najpierw skonfiguruj ustawienia Wi-Fi: sudo vi /etc/wpa_supplicant/wpa_supplicant.confdodając taką sekcję:

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

Następnie ustawienia sieciowe za pomocą 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

Następnie utwórz gdzieś ten plik skryptu, na przykład w, /home/pi/reconnect.shi zezwól mu +xna wykonywanie.

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

Następnie zaloguj się jako root za pomocą sudo sui edytuj crontab roota za pomocą crontab -e.
Na końcu tego pliku dodaj ten wiersz:

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

Oznacza to: „uruchamiaj ten skrypt co 10 minut (jako root)”

Teraz, jeśli masz połączenie, skrypt zakończy działanie i nic się nie stanie. Jeśli nie możesz pingować routera, skrypt spróbuje ponownie połączyć się z nim za pomocą wpa_supplicant.

Zauważ, że wszystko, co jest echem ze skryptu cron (w tym przypadku tylko gdy jest rozłączony), zostanie wysłane e-mailem do roota. Jeśli więc skonfigurowałeś aliasy poczty i PostScript, otrzymasz e-mail za każdym razem, gdy połączenie Wi-Fi przestanie działać, a następnie z powodzeniem ponownie dzięki skryptowi.

Leonardo
źródło
0

To zadziałało dla mnie, używając Raspian Jessie 30. marca.2017:

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

Colorado MountainBoy
źródło
1
Proszę streścić rozwiązanie w poście, na wypadek gdyby link przestał działać.
tlhIngan
CMB, witaj w narożniku o smaku RPi StackExchange. Polityka strony odradza linkowanie tylko odpowiedzi, ponieważ mogą one ulec zniszczeniu. Nie musisz powielać treści linku, ale dobra odpowiedź powinna przynajmniej rozwinąć najważniejsze informacje zawarte w linku.
Jacobm001
Zgodnie z powyższym komentarzem Jacobm001, zgodnie z naszą polityką dotyczącą pozbawionych informacji odpowiedzi tylko za pomocą linku, jeśli ten post nie będzie edytowany, aby zawierał informacje, które mogą stanowić odpowiedź, choć minimalną, w ciągu 48 godzin zostanie przekonwertowany na Community Wiki, aby uprościć posiadanie poprawione przez społeczność.
goobering