Come riconnettere automaticamente il WiFi?


74

Sto usando il mio pi per monitorare i miei misuratori di potenza. I dati vengono trasferiti al PC tramite connessione WiFi tramite l'adattatore USB Edimax EW-7811UN. Quando la connessione Wifi si interrompe (disattivata durante la notte o connessione instabile), l'adattatore USB rimane disabilitato.

C'è un modo per riavviare automaticamente la connessione WiFi senza ricollegare l'adattatore WiFi?

Risposte:


31

Preferisco disabilitare la maggior parte delle cose del daemon di configurazione automatica della rete e di gestione delle connessioni e gestirle da solo. Ecco uno script (bash) che manterrà la connessione attiva finché la rete è lì e non hai un driver wifi glitch o problemi di alimentazione; l'idea è di eseguire il ping del router ogni N secondi e, in caso contrario, riconnettere:

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

Quindi, /etc/wifi.confin questo caso potrebbe contenere:

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

Tutto ciò presuppone una rete aperta non crittografata (se altrimenti, dovrai aggiungere i comandi appropriati). Ho usato questo approccio su varie macchine linux, incluso il pi, e funziona perfettamente; manterrà un sistema online a tempo indeterminato, anche se periodicamente va a dormire (cosa che il pi non può comunque).

Un intervallo di controllo decente è di 3-5 secondi; questa attività non avrà alcun impatto significativo sulle risorse di sistema.

È assolutamente necessario disabilitare l'auto-configurazione di rete prima ,. compresi ifplugde altri daemon di rete, altrimenti ciò interferirà con i tuoi sforzi:

Come posso disabilitare la rete configurata automaticamente su Raspbian?

In effetti l'ho usato apt-get remove ifplugd.

Per avviare la rete all'avvio (poiché utilizzo il pi headless), ho questo set per l'esecuzione su raspbian da /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/wifiè la sceneggiatura. Se non sai a cosa niceserve, leggi man nice.

Il punto ifè che se il mio dongle wifi è collegato al pi, il modulo 8192cu verrà caricato dal kernel a questo punto - quindi il wifi dovrebbe iniziare. In caso contrario, si presume che l'ethernet sia collegato e debba essere utilizzato (in caso contrario, dhclient verrà semplicemente eliminato e non vi sarà alcun accesso alla rete).

Perché questo funzioni probabilmente dovrai farlo

Quindi, questo ottiene un pi senza testa sulla rete all'avvio e lo mantiene lì. Se desideri un modo per passare a eth mentre corri senza effettuare l'accesso, potresti fare qualcosa con le regole udev per estrarre il dongle wifi.


Vale la pena testarlo. Non essendo un programma linux come avrei impostato lo script per l'esecuzione all'avvio, messo in cron? Sarebbe possibile / richiesto aggiungere anche la rotazione del registro?
Andig,

1
@andig: ho aggiunto alcuni paragrafi sull'avvio tramite rc.local. Rotazione del registro WRT, questa è una domanda separata relativa ai file di registro in generale (ma vedi man logrotate). Proprio ora che lo script sarà clobber (sovrascrive) qualsiasi registro precedente se esiste con lo stesso percorso, non aggiunge. Per il debug ho usato qualche volta wifi.$$.lognel file wifi.conf, in modo che l'ultimo registro sia (improbabile) per essere bloccato e posso confrontare una sessione con un'altra dopo aver modificato qualcosa. $$è il pid del processo "wifi".
Riccioli d'oro

Temo che a volte gli script di shell possano essere fragili e rompersi in modi difficili da vedere quando ci sono aggiornamenti o se è installato un altro software di rete. Solo una nota di cautela su questo approccio.
Geremia,

3
@jeremiah: Questa è una buona paura. Ho scritto la sceneggiatura, l'ho modificata nel corso degli anni e sento di avere una certa comprensione del contesto generale in cui opera e quindi di ciò a cui devo fare attenzione. Tuttavia, è probabilmente più difficile trasmettere la comprensione degli snippet di codice. Per me è solo un approccio alternativo al tentativo di lavorare con NetworkManager, riducendo la situazione ad alcuni elementi molto basilari. Questo è qualcosa da offrire alle persone con una prospettiva simile a "questo è ciò che ha funzionato per me" attraverso lo spettro di distribuzione Linux nella circostanza di un semplice sistema autonomo.
Riccioli d'oro

Quindi: sono a conoscenza di questo post e intendo mantenerlo aggiornato se uno dei principali flussi di distribuzione (Debia, Fedora e derivati) introduce qualcosa che non funziona. Aggiungerò anche un po 'di enfasi ai punti su ciò che deve essere disabilitato e su come.
Riccioli d'oro

68

Bene, c'è una soluzione molto semplice:

  1. Vai a /etc/ifplugd/action.d/e rinomina il ifupdownfile inifupdown.original
  2. Quindi fa: cp /etc/wpa_supplicant/ifupdown.sh ./ifupdown
  3. Finalmente: sudo reboot

È tutto. Prova questo spegnendo / accendendo il tuo AP; dovresti vedere che Raspberry Pi si riconnette correttamente.


2
Questa è la risposta più semplice ed efficace. Testato su 2 Rpi e funziona. Trovato questo link da: raspberrypi.org/phpBB3/…
Mauvis Ledford

12
Ci scusiamo per una domanda semplicistica: perché funziona?
Jeff Meatball Yang,

@JeffMeatballYang, inizia una nuova discussione per la tua domanda.
AndaluZ,

6
Per me non c'erano file ifupdown lì, solo un link action_wpa -> ../../wpa_supplicant/action_wpa.sh, quindi forse questo è il default ora?
Zitrax,

2
Sì, come dicono gli altri: questo non funziona su dhcpcddistribuzioni basate su, al fine di ottenere questo in esecuzione su RPI3 è necessario apt-get install rcconfe passare da dhcpcdalnetworking
test30

22

Di recente mi sono imbattuto in un'applicazione console che ordina tutta la configurazione wireless. È inoltre possibile utilizzare questo strumento per configurare l'interfaccia LAN.

sudo apt-get install wicd-curses

Installerà molti altri pacchetti ed eseguirà il proprio demone in background, ma rende sicuramente la configurazione di tutto molto più semplice. Eseguilo con

sudo wicd-curses

inserisci qui la descrizione dell'immagine

Se ricevi un messaggio che dice che non è stata rilevata alcuna rete, premi P(deve essere maiuscola, quindi usa [SHIFT] p) e digita wlan0 nel campo dell'interfaccia wireless e premi F10 per salvare.

  1. R per aggiornare l'elenco.
  2. Utilizzare i cursori sulla tastiera per spostarsi in alto e in basso nell'elenco
  3. Premi il pulsante destro per configurare la connessione wireless
  4. Premi alcune volte verso il basso e seleziona "Connetti automaticamente a questa rete"
  5. Premere di nuovo alcune volte verso il basso e digitare la password nel campo chiave
  6. Premere F10 per salvare

inserisci qui la descrizione dell'immagine

Potrebbe essere necessario premere Cper connettersi al punto di accesso. Se sei stato cablato, molto probabilmente ucciderai l'interfaccia LAN e visualizzerai il wireless.

Gestisce anche la connessione, quindi si riconnetterà a tutti i punti di accesso wireless configurati se si interrompe per qualsiasi motivo.

Ho provato a scollegare l'adattatore WiFi e ricollegarlo. Ci vogliono circa 60 ~ 90 secondi ma si ricollegherà al WiFi (penso che la LAN debba essere scollegata però)

Spero che sia d'aiuto!


1
Non sono sicuro di come si occupi della riconnessione: la connessione iniziale non era la domanda qui!
Andig

Ho aggiornato la risposta perché c'è un passaggio in cui è necessario verificare connettersi automaticamente. Anche nelle preferenze dovresti scorrere fino in fondo. L'ultima opzione è fuori schermo. Dice anche Prova automaticamente a connettersi alle reti per Wifi (è ON per impostazione predefinita). Posso anche rimuovere nuovamente la spina dell'adattatore WiFi e si riconnetterà entro 2 minuti. (L'ho fatto senza LAN collegata) Questo è davvero il modo migliore che ho trovato per configurare e gestire il wireless. Ottieni anche la versione della GUI appena chiamatawicd
Piotr Kula,

c'è un refuso nel comando "sudo wicd-cruses" si scambiano "u" e "r"
Gawcio

Dopo l'installazione wicd-curses, il mio RPi 3 ha iniziato a bloccarsi in modo casuale. Non ho mai congelato prima e il congelamento è scomparso immediatamente dopo averlo disinstallato. Attenzione!
akhmed,

1
Dopo aver installato wicd-curses, il mio RPi 3 con Jessie Lite non si è bloccato e rimane connesso. Ma oggi ho provato a collegarmi a uno tramite la porta Ethernet e ho scoperto che l'interfaccia si sarebbe persa pochi secondi dopo l'avvio. Sono stato in grado di connettermi bene prima di configurare wicd-maledizioni per connettersi al wifi.
Chris Jenks,

14

Questo può essere risolto senza ulteriori script.

In / etc / network / interfaces inserisci:

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

Il roaming consente all'interfaccia di autoguarigione.


L'ultima riga sembra aggiungere un secondo indirizzo IP all'interfaccia wlan0; è intenzionale?
fche

Ho solo un indirizzo assegnato da DHCP. Non mi sorprenderebbe del tutto se gli script di avvio avessero cambiato comportamento - questo file di configurazione è inutilmente arcano ...
David Sainty,

2
Sulla mia raspbian pi2 box, se il wlan si abbassa abbastanza a lungo per tre cicli di tentativi di autenticazione, anche con "wpa-roam" non ci riprova.
fche

Questa è l'unica risposta che ha funzionato per me su RPi 3. Grazie!
akhmed,

1

netcfg

Prova netcfg. Senza ulteriori dettagli su quale distribuzione stai usando, non posso fornire molti più dettagli, ma dovrebbe fare quello che vuoi.


4
Sto usando l'attuale distro raspbian: pi @ raspberrypi ~ $ man netcfg Nessuna voce manuale per netcfg pi @ raspberrypi ~ $ netcfg -bash: netcfg: comando non trovato pi @ raspberrypi ~ $ apt-cache cerca netcfg pi @ raspberrypi ~ $
andig

0

Un'altra soluzione, come estratta da questa .
Per prima cosa configura le tue impostazioni wifi: sudo vi /etc/wpa_supplicant/wpa_supplicant.confaggiungi una sezione come questa:

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

Quindi le impostazioni di rete con 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

Quindi crea questo file di script da qualche parte, ad esempio in /home/pi/reconnect.she concedi il +xpermesso di essere eseguibile.

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

Quindi accedi come root con sudo sue modifica il crontab di root con crontab -e.
Alla fine di questo file aggiungi questa riga:

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

Ciò significa: "esegui quello script ogni 10 minuti (come root)"

Ora, se hai una connessione, lo script verrà chiuso e non accadrà nulla. Se non riesci a eseguire il ping del router, lo script proverà a riconnetterlo utilizzando wpa_supplicant.

Si noti che tutto ciò che viene ripetuto da uno script cron (in questo caso solo quando disconnesso) verrà inviato via e-mail a root. Quindi, se hai configurato i tuoi alias di posta e postscript, riceverai un'e-mail ogni volta che la connessione wifi del tuo pi si interrompe e poi di nuovo con successo grazie allo script.


0

Questo ha funzionato per me, usando Raspian Jessie il 30 marzo 2017:

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


1
Riassumi la soluzione nel tuo post, nel caso in cui il link si interrompa.
martedì

CMB, benvenuto nell'angolo RPi di StackExchange. La politica del sito scoraggia solo le risposte dei link in quanto sono soggette alla marcescenza dei link. Non è necessario duplicare i contenuti del collegamento, ma una buona risposta dovrebbe almeno espandersi sui punti salienti contenuti nel collegamento.
Jacobm001

A seguito del commento di Jacobm001 sopra, in linea con la nostra politica relativa alle risposte senza link senza informazioni, se questo post non viene modificato per contenere informazioni che possono rappresentare una risposta, per quanto minima, in 48 ore verrà convertito in Wiki della community per semplificare è stato corretto dalla comunità.
goobering
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.