¿Cómo reconectar automáticamente WiFi?

74

Estoy usando mi pi para monitorear mis medidores de potencia. Los datos se transfieren a la PC mediante conexión WiFi utilizando el adaptador USB Edimax EW-7811UN. Cuando la conexión Wifi se cae (se apaga durante la noche o una conexión inestable), el adaptador USB permanece deshabilitado.

¿Hay alguna manera de reiniciar la conexión WiFi automáticamente sin volver a enchufar el adaptador WiFi?

andig
fuente

Respuestas:

31

Prefiero deshabilitar la mayor parte de la configuración automática de red y el daemon de administración de conexión y tratarlo yo mismo. Aquí hay un script (bash) que mantendrá la conexión activa mientras la red esté allí y no tenga un controlador wifi defectuoso o problemas de alimentación; la idea es hacer ping al enrutador cada N segundos, y si eso falla, vuelva a conectar:

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

Entonces, /etc/wifi.confen este caso podría contener:

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

Todo esto supone una red abierta no encriptada (de lo contrario, tendrá que agregar los comandos apropiados). He utilizado este enfoque en varias máquinas Linux, incluido el pi, y funciona a la perfección; mantendrá un sistema en línea indefinidamente, incluso si se va a dormir periódicamente (lo que el pi no puede de todos modos).

Un intervalo de verificación decente es de 3-5 segundos; Esta actividad no tendrá un impacto significativo en los recursos del sistema.

A pesar de todo hay que desactivar la configuración automática de la red primero ,. incluidos ifplugdy otros demonios de redes, o esto interferirá con sus esfuerzos:

¿Cómo puedo desactivar las redes autoconfiguradas en Raspbian?

De hecho lo usé apt-get remove ifplugd.

Para iniciar la red en el arranque (ya que uso el pi sin cabeza), tengo este conjunto para ejecutar en raspbian desde /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/wifiEs el guión. Si no sabes para qué nicesirve, lee man nice.

El punto ifes que si mi dongle wifi está enchufado en el pi, el núcleo cargará el módulo 8192cu en este punto, por lo que el wifi debería comenzar. Si no es así, se supone que el ethernet está enchufado y debe usarse (si no lo está, dhclient simplemente no funcionará y no habrá acceso a la red).

Para que esto funcione, probablemente tendrá que

Entonces, esto obtiene un pi sin cabeza en la red en el arranque y lo mantiene allí. Si desea una forma de cambiar a eth mientras se ejecuta sin iniciar sesión, puede hacer algo con las reglas de udev para extraer el dongle wifi.

Ricitos de oro
fuente
Suena digno de prueba. No siendo un programa de Linux, ¿cómo configuraría el script para que se ejecute en el inicio? ¿Sería posible / requerido agregar también rotación de registros?
andig
1
@andig: agregué algunos párrafos sobre el inicio a través de rc.local. Rotación de registro WRT, esa es una pregunta separada que se relaciona con los archivos de registro en general (pero ver man logrotate). En este momento, ese script bloqueará (sobrescribirá) cualquier registro anterior si existe con la misma ruta, no se agregará. Para la depuración, a veces lo he usado wifi.$$.logen el archivo wifi.conf, de modo que es poco probable que el último registro se bloquee y pueda comparar una sesión con otra después de haber modificado algo. $$es el pid del proceso "wifi".
Ricitos de oro
Me preocupa que, a veces, los scripts de shell pueden ser frágiles e interrumpir las formas difíciles de ver cuando hay actualizaciones o si hay otro software de red instalado. Solo una nota de precaución sobre este enfoque.
jeremiah
3
@ jeremiah: Ese es un buen miedo. Escribí el guión, lo modifiqué a lo largo de los años, y siento que tengo algo de comprensión del contexto general en el que opera y, por lo tanto, de lo que debo tener cuidado. Sin embargo, probablemente sea más difícil transmitir la comprensión que los fragmentos de código. Para mí, es solo un enfoque alternativo para tratar de trabajar con NetworkManager, reduciendo la situación a algunos elementos muy básicos. Esto es algo para ofrecer a las personas con una perspectiva similar a "esto es lo que funcionó para mí" en todo el espectro de distribución de Linux en el caso de un sistema simple e independiente.
Ricitos de oro
Entonces: estoy al tanto de esta publicación y tengo la intención de mantenerla actualizada si una de las principales secuencias de distribución (debia y fedora y derivadas) introduce algo que se mete con ella. También agregaré algo de énfasis a los puntos sobre lo que se debe deshabilitar y cómo.
Ricitos de oro
68

Bueno, hay una solución muy simple:

  1. Vaya /etc/ifplugd/action.d/y cambie el nombre del ifupdownarchivo aifupdown.original
  2. Entonces hazlo: cp /etc/wpa_supplicant/ifupdown.sh ./ifupdown
  3. Finalmente: sudo reboot

Eso es todo. Pruebe esto apagando / encendiendo su AP; debería ver que su Raspberry Pi se reconecta correctamente.

Andaluz
fuente
2
Esta es la respuesta más simple y efectiva. Probado en 2 Rpi y funciona. Encontré este enlace en: raspberrypi.org/phpBB3/…
Mauvis Ledford
12
Perdón por una pregunta simplista: ¿por qué funciona esto?
Jeff Meatball Yang
@JeffMeatballYang, comienza un nuevo hilo para tu pregunta.
Andaluz
66
Para mí no había ningún archivo ifupdown allí, solo un enlace action_wpa -> ../../wpa_supplicant/action_wpa.sh, ¿quizás este es el predeterminado ahora?
Zitrax
2
Sí, al igual que otros dicen: esto no funciona en dhcpcddistribuciones basadas, con el fin de conseguir este se ejecuta en RPI3 lo que necesita apt-get install rcconfy cambia de dhcpcdanetworking
test30
22

Recientemente me topé con una aplicación de consola que clasifica toda la configuración inalámbrica. También puede usar esta herramienta para configurar la interfaz LAN.

sudo apt-get install wicd-curses

Instalará muchos otros paquetes y ejecutará su propio demonio en segundo plano, pero seguro que hace que la configuración sea mucho más fácil. Ejecútalo con

sudo wicd-curses

ingrese la descripción de la imagen aquí

Si recibe un mensaje que dice que no se detectaron redes, presione P(debe ser mayúscula, use [SHIFT] p) y escriba wlan0 en el campo de la interfaz inalámbrica y presione F10 para guardar.

  1. R para actualizar la lista.
  2. Use los cursores en el teclado para navegar hacia arriba y hacia abajo en la lista
  3. Presione hacia la derecha para configurar la conexión inalámbrica
  4. Presione hacia abajo varias veces y marque "Conectarse automáticamente a esta red"
  5. Presione hacia abajo varias veces y escriba su contraseña en el campo clave
  6. Presione F10 para guardar

ingrese la descripción de la imagen aquí

Puede que tenga que presionar Cpara conectarse al punto de acceso. Si estaba conectado, lo más probable es que elimine la interfaz LAN y muestre la conexión inalámbrica.

También gestiona la conexión, por lo que se volverá a conectar a cualquier punto de acceso inalámbrico configurado si se desconecta por cualquier motivo.

Probé desconectar el adaptador WiFi y volver a enchufarlo. Tarda entre 60 y 90 segundos, pero se volverá a conectar a WiFi (aunque creo que la LAN debe estar desconectada)

¡Espero eso ayude!

Piotr Kula
fuente
1
No estoy seguro de cómo se encarga la reconexión: ¡la conexión inicial no era la pregunta aquí!
andig
Actualicé la respuesta porque hay un paso en el que debes verificar la conexión automáticamente. También en las preferencias debes desplazarte hacia abajo. La última opción está fuera de la pantalla. También dice que automáticamente intente conectarse a redes para Wifi (está activado de forma predeterminada). Incluso puedo volver a conectar el adaptador WiFi y se volverá a conectar en 2 minutos. (Lo hice sin LAN conectada) Esta es realmente la mejor manera que he encontrado para configurar y administrar la conexión inalámbrica. También puede obtener la versión de interfaz gráfica de usuario llamado simplementewicd
Piotr Kula
hay un error tipográfico en el comando "sudo wicd-cruses" 'u' y 'r' se intercambian
Gawcio
Después de la instalación wicd-curses, mi RPi 3 comenzó a congelarse al azar. Nunca antes se estaba congelando y la congelación desapareció inmediatamente una vez que lo desinstalé. ¡Tener cuidado!
akhmed
1
Después de instalar wicd-curses, mis RPi 3 que ejecutan Jessie Lite no se han congelado y permanecen conectados. Pero hoy intenté conectarme a uno por el puerto ethernet, y descubrí que la interfaz se perdería unos segundos después del arranque. Pude conectarme bien antes de configurar wicd-curses para conectarme a wifi.
Chris Jenks
14

Esto se puede resolver sin scripts adicionales.

En / etc / network / interfaces poner:

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

El roaming permite que la interfaz se auto-cure.

David Sainty
fuente
La última línea parece agregar una segunda dirección IP a la interfaz wlan0; es eso intencional?
fche
Solo termino con una dirección asignada por DHCP. No me sorprendería por completo si los guiones de arranque han cambiado el comportamiento aunque - este fichero de configuración es innecesariamente arcano ...
David Sainty
2
En mi caja de raspbian pi2, si el wlan deja de funcionar lo suficiente como para fallar durante tres ciclos de intentos de autenticación, incluso con "wpa-roam" no vuelve a intentarlo.
fche
Esta es la única respuesta que me funcionó en RPi 3. ¡Gracias!
akhmed
1

netcfg

Tratar netcfg. Sin más detalles sobre qué distribución está utilizando, no puedo proporcionar muchos más detalles, pero debería hacer lo que desee.

Alex Chamberlain
fuente
44
Estoy usando la distribución actual de raspbian: pi @ raspberrypi ~ $ man netcfg No hay entrada manual para netcfg pi @ raspberrypi ~ $ netcfg -bash: netcfg: comando no encontrado pi @ raspberrypi ~ $ apt-cache search netcfg pi @ raspberrypi ~ $
andig
0

Otra solución, como extraída de esta .
Primero configure su configuración wifi: sudo vi /etc/wpa_supplicant/wpa_supplicant.confagregue una sección como esta:

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

Luego, su configuración de red 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

Luego cree este archivo de secuencia de comandos en algún lugar, por ejemplo, /home/pi/reconnect.shy déle +xpermiso para ser ejecutable.

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

Luego inicie sesión como root con sudo suy edite el crontab de root con crontab -e.
Al final de este archivo agregue esta línea:

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

Eso significa: "ejecutar ese script cada 10 minutos (como root)"

Ahora, si tiene una conexión, el script se cerrará y no pasará nada. Si no puede hacer ping a su enrutador, el script intentará volver a conectarse a él usando wpa_supplicant.

Tenga en cuenta que todo lo que se repita desde un script cron (en este caso solo cuando está desconectado) se enviará por correo electrónico a la raíz. Entonces, si ha configurado sus alias de correo y postscript, recibirá un correo electrónico cada vez que se desconecte la conexión wifi de su pi y luego volverá con éxito nuevamente gracias al script.

Leonardo
fuente
0

Esto funcionó para mí, usando Raspian Jessie el 30 de marzo de 2017:

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

Colorado MountainBoy
fuente
1
Resuma la solución en su publicación, en caso de que el enlace se cierre.
tlhIngan
CMB, bienvenido a la esquina con sabor a RPi de StackExchange. La política del sitio desalienta las respuestas de solo enlaces, ya que están sujetas a la descomposición del enlace. No necesita duplicar el contenido del enlace, pero una buena respuesta al menos debería expandir los aspectos destacados que contiene el enlace.
Jacobm001
Además del comentario anterior de Jacobm001, de acuerdo con nuestra política con respecto a las respuestas sin información de solo enlace, si esta publicación no se edita para contener información que pueda ser una respuesta, aunque sea mínima, en 48 horas se convertirá a Wiki de la comunidad para simplificar corregido por la comunidad.
goobering