Comment reconnecter automatiquement le WiFi?

74

J'utilise mon pi pour surveiller mes compteurs d'énergie. Les données sont transférées vers le PC via une connexion WiFi à l'aide de l'adaptateur USB Edimax EW-7811UN. Lorsque la connexion Wifi est interrompue (désactivée la nuit ou si la connexion est instable), l'adaptateur USB reste désactivé.

Est-il possible de redémarrer automatiquement la connexion WiFi sans rebrancher l'adaptateur WiFi?

andig
la source

Réponses:

31

Je préfère désactiver la plupart des tâches du démon de configuration automatique du réseau et de gestion des connexions et les gérer moi-même. Voici un script (bash) qui maintiendra la connexion en place tant que le réseau est en place et que vous n’avez pas de pilote wifi défectueux ni de problème d’alimentation; L'idée est d'envoyer une requête ping au routeur toutes les N secondes et, en cas d'échec, de vous reconnecter:

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

Donc, /etc/wifi.confdans ce cas pourrait contenir:

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

Tout cela suppose un réseau non crypté ouvert (sinon, vous devrez ajouter les commandes appropriées). J'ai utilisé cette approche sur diverses machines Linux, y compris la pi, et cela fonctionne parfaitement; il gardera un système en ligne indéfiniment, même s'il se met périodiquement en veille (ce que le pi ne peut pas de toute façon).

Un intervalle de vérification décent est 3-5 secondes; cette activité n'aura aucun impact significatif sur les ressources système.

Vous ne devez absolument désactiver la configuration automatique premier réseau ,. y compris ifplugdet d’autres démons de réseautage, sinon cela entravera vos efforts:

Comment puis-je désactiver la mise en réseau autoconfigurée sur Raspbian?

J'ai en fait utilisé apt-get remove ifplugd.

Pour démarrer la mise en réseau au démarrage (puisque j'utilise le pi headless), j'ai ce jeu pour fonctionner sur raspbian à partir de /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/wifiest le script. Si vous ne savez pas à quoi ça nicesert, lisez man nice.

Le fait ifest que si mon dongle wifi est branché sur le pi, le module 8192cu sera chargé par le noyau à ce stade - le wifi devrait donc commencer. Si ce n'est pas le cas, alors on suppose que l'Ethernet est branché et qu'il devrait être utilisé (sinon, dhclient ne fera que déborder et il n'y aura pas d'accès au réseau).

Pour que cela fonctionne, vous devrez probablement

Donc, cela obtient un pi sans tête sur le réseau au démarrage et le maintient là. Si vous vouliez un moyen de passer à eth en cours d'exécution sans vous connecter, vous pouvez utiliser les règles udev pour retirer le dongle wifi.

Boucles d'or
la source
Cela vaut la peine d'être testé. N'étant pas un pro- linux, comment pourrais-je configurer le script pour qu'il s'exécute au démarrage, puis dans cron? Serait-il possible / nécessaire d’ajouter une rotation de journal?
Andig
1
@andig: J'ai ajouté quelques paragraphes sur le démarrage via rc.local. Rotation des journaux WRT, question distincte relative aux fichiers journaux en général (mais voir man logrotate). À l'heure actuelle, ce script éponge (écrase) tout journal précédent s'il existe avec le même chemin, sans ajout. Pour le débogage, j'ai parfois utilisé wifi.$$.logle fichier wifi.conf, de sorte que le dernier journal soit (peu probable) obstrué et que je puisse comparer une session à une autre après avoir modifié quelque chose. $$est le pid du processus "wifi".
goldilocks
Je crains que, parfois, les scripts de shell ne soient fragiles et ne permettent pas de voir comment il existe des mises à jour ou si un autre logiciel de réseau est installé. Juste une note de prudence sur cette approche.
Jérémie
3
@jeremiah: C'est une bonne peur. J'ai écrit le script, je l'ai peaufiné au fil des ans et j'ai le sentiment de bien comprendre le contexte général dans lequel il évolue et, par conséquent, ce que je dois surveiller. Cependant, il est probablement plus difficile de transmettre la compréhension que les extraits de code. Pour moi, il ne s'agit que d'une approche alternative pour essayer de travailler avec NetworkManager, en réduisant la situation à des éléments très fondamentaux. C’est quelque chose à offrir aux personnes partageant le même point de vue que "c’est ce qui a fonctionné pour moi" dans l’ensemble du spectre de la distribution Linux dans le cas d’un système autonome simple.
goldilocks
Donc: je suis au courant de ce post et j’ai l’intention de le tenir à jour si l’un des principaux flux de distribution (debia et fedora et dérivés) introduit quelque chose qui le dérange. J'ajouterai également quelques points aux points sur ce qui doit être désactivé et comment.
goldilocks
68

Eh bien, il existe une solution très simple:

  1. Allez à /etc/ifplugd/action.d/et renommez le ifupdownfichier enifupdown.original
  2. Alors fais: cp /etc/wpa_supplicant/ifupdown.sh ./ifupdown
  3. Finalement: sudo reboot

C'est tout. Testez ceci en allumant / éteignant votre AP; vous devriez voir que votre Raspberry Pi se reconnecte correctement.

AndaluZ
la source
2
C'est la réponse la plus simple et la plus efficace. Testé sur 2 Rpi et ça marche. Trouvé ce lien sur: raspberrypi.org/phpBB3/…
Mauvis Ledford le
12
Désolé pour une question simpliste - pourquoi ça marche?
Jeff Meatball Yang
@JeffMeatballYang, commencez un nouveau sujet pour votre question.
AndaluZ
6
Pour moi, il n'y avait pas de fichier ifupdown là-bas, juste un lien action_wpa -> ../../wpa_supplicant/action_wpa.sh, alors c'est peut-être le fichier par défaut maintenant?
Zitrax
2
Oui, comme d'autres le disent: cela ne fonctionne pas sur les dhcpcddistributions basées sur , pour pouvoir utiliser cette fonction sur RPI3, vous devez apt-get install rcconfpasser dhcpcdànetworking
test30
22

Je suis récemment tombé sur une application console qui trie toute la configuration sans fil. Vous pouvez également utiliser cet outil pour configurer l'interface LAN.

sudo apt-get install wicd-curses

Il installera de nombreux autres packages et exécutera son propre démon en arrière-plan, mais il facilite certainement la configuration de tout. Le courir avec

sudo wicd-curses

entrez la description de l'image ici

Si vous recevez un message indiquant qu'aucun réseau n'a été détecté, appuyez sur P(il doit être majuscule, utilisez [SHIFT] p) et tapez wlan0 dans le champ d'interface sans fil, puis appuyez sur F10 pour enregistrer.

  1. R pour rafraîchir la liste.
  2. Utilisez les curseurs du clavier pour parcourir la liste.
  3. Appuyez à droite pour configurer la connexion sans fil
  4. Appuyez plusieurs fois et cochez la case "Se connecter automatiquement à ce réseau"
  5. Appuyez à nouveau plusieurs fois et tapez votre mot de passe dans le champ de clé
  6. Appuyez sur F10 pour enregistrer

entrez la description de l'image ici

Vous devrez peut-être appuyer sur Cpour vous connecter au point d'accès. Si vous étiez câblé, cela risquerait de tuer l'interface de réseau local et d'activer le sans fil.

Il gère également la connexion afin de se reconnecter à n’importe quel point d’accès sans fil configuré si celui-ci se déconnecte pour une raison quelconque.

J'ai essayé de débrancher l'adaptateur WiFi, puis de le rebrancher. Cela prend environ 60 ~ 90 secondes, mais la connexion au WiFi est rétablie (je pense que le réseau local doit être débranché).

J'espère que ça aide!

Piotr Kula
la source
1
Je ne sais pas comment cela s’occupe de la reconnexion. La connexion initiale n’était pas la question ici!
Andig
J'ai mis à jour la réponse parce qu'il y a une étape où vous devez vérifier la connexion automatiquement. Dans les préférences, vous devez également faire défiler l'écran jusqu'en bas. La dernière option est hors écran. Il dit également Essayez automatiquement de vous connecter aux réseaux pour le Wifi (il est activé par défaut). Je peux même retirer la connexion de l'adaptateur WiFi et la connexion sera rétablie dans les 2 minutes. Vous obtenez également la version de l'interface graphique qui vient d'être appeléewicd
Piotr Kula
il y a une faute de frappe dans la commande "sudo wicd-cruses": "u" et "r" sont échangés
Gawcio
Après l’installation wicd-curses, mon RPi 3 a commencé à geler de manière aléatoire. Ne gelait jamais avant et le gel a disparu immédiatement une fois que je l'ai désinstallé. Il faut se méfier!
Akhmed
1
Après avoir installé wicd-curses, mes RPi 3 exécutant Jessie Lite ne se sont pas figés et restent connectés. Mais aujourd’hui, j’ai essayé de me connecter à un port Ethernet, et j’ai découvert que l’interface serait perdue quelques secondes après le démarrage. Je pouvais me connecter correctement avant de configurer wicd-curses pour me connecter au wifi.
Chris Jenks
14

Cela peut être résolu sans scripts supplémentaires.

Dans / etc / network / interfaces, mettez:

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

L'itinérance permet à l'interface de s'auto-soigner.

David Sainty
la source
La dernière ligne semble ajouter une deuxième adresse IP à l'interface wlan0; est-ce intentionnel?
Fche
Je ne me retrouve qu'avec une adresse attribuée par DHCP. Cela ne me surprendrait pas totalement si les scripts de démarrage ont changé de comportement - ce fichier de configuration est inutilement mystérieux ...
David Sainty
2
Sur ma boîte pi2 raspbian, si le wlan tombe en panne suffisamment longtemps pour que trois cycles d’authentification échouent, même avec "wpa-roam", il n’essaie pas de nouveau.
fche
Ceci est la seule réponse qui a fonctionné pour moi sur RPi 3. Merci!
akhmed
1

netcfg

Essayez netcfg. Sans plus de détails sur la distribution que vous utilisez, je ne peux pas en dire beaucoup plus, mais elle devrait faire ce que vous voulez.

Alex Chamberlain
la source
4
J'utilise la distro actuelle raspbian: pi @ raspberrypi ~ $ man netcfg Aucune entrée manuelle pour netcfg pi @ raspberrypi ~ $ netcfg -bash: netcfg: commande introuvable pi @ raspberrypi ~ $ apt-cache search netcfg pi @ raspberrypi ~ $
andig
0

Une autre solution, extraite de celle-ci .
Commencez par configurer vos paramètres wifi: sudo vi /etc/wpa_supplicant/wpa_supplicant.confajoutez une section comme celle-ci:

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

Ensuite, vos paramètres réseau avec 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

Créez ensuite ce fichier de script quelque part, par exemple dans, /home/pi/reconnect.shet donnez-lui l' +xautorisation d'exécuter.

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

Puis connectez-vous en tant que root avec sudo suet éditez la crontab de root avec crontab -e.
A la fin de ce fichier, ajoutez cette ligne:

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

Cela signifie: "exécuter ce script toutes les 10 minutes (en tant que root)"

Maintenant, si vous avez une connexion, le script se ferme et rien ne se passe. Si vous ne pouvez pas envoyer de ping à votre routeur, le script essaiera de se reconnecter via wpa_supplicant.

Notez que tout ce qui est répercuté dans un script cron (dans ce cas, uniquement lorsqu'il est déconnecté) sera envoyé à la racine par courrier électronique. Donc, si vous avez configuré vos alias de courrier et votre postscript, vous recevrez un email chaque fois que la connexion wifi de votre pi sera interrompue, puis de nouveau avec succès grâce au script.

Leonardo
la source
0

Cela a fonctionné pour moi, en utilisant Raspian Jessie sur 30.March.2017:

http://alexba.in/blog/2015/01/14/automatiquement-reconnecter-wifi-on-a-raspberrypi/

Colorado MountainBoy
la source
1
Veuillez résumer la solution dans votre message, au cas où le lien disparaîtrait.
tlhIngan
CMB, bienvenue dans le coin de StackExchange au RPi. La politique du site déconseille uniquement les réponses par lien car elles sont soumises à la pourriture du lien. Vous n'avez pas besoin de dupliquer le contenu du lien, mais une bonne réponse devrait au moins développer les points saillants du lien.
Jacobm001
Comme suite au commentaire de Jacobm001 ci-dessus, conformément à notre politique en matière de réponses de lien sans information, si ce message n'est pas modifié pour contenir des informations qui peuvent constituer une réponse, même minime, elle sera convertie au format Wiki de communauté dans les 48 heures à venir. il a corrigé par la communauté.
Goobering