Como reconectar automaticamente o WiFi?

74

Estou usando meu pi para monitorar meus medidores de energia. Os dados são transferidos para o PC por conexão WiFi usando o adaptador USB Edimax EW-7811UN. Quando a conexão Wifi cai (desligada durante a noite ou conexão instável), o adaptador USB permanece desativado.

Existe uma maneira de reiniciar a conexão Wi-Fi automaticamente sem reconectar o adaptador WiFi?

andig
fonte

Respostas:

31

Prefiro desativar a maioria das coisas de daemon de gerenciamento automático de configuração e rede e lidar com isso sozinho. Aqui está um script (bash) que manterá a conexão ativa enquanto a rede estiver lá e você não tiver um driver wifi com falha ou problemas de energia; a idéia é executar ping no roteador a cada N segundos e, se isso falhar, reconecte-se:

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

Portanto, /etc/wifi.confnesse caso, pode conter:

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

Tudo isso pressupõe uma rede aberta não criptografada (caso contrário, você precisará adicionar os comandos apropriados). Eu usei essa abordagem em várias máquinas Linux, incluindo o pi, e funciona perfeitamente; manterá um sistema on-line indefinidamente, mesmo que periodicamente entre em suspensão (o que o pi não pode, de qualquer maneira).

Um intervalo de verificação decente é de 3-5 segundos; essa atividade não afetará significativamente os recursos do sistema.

Você absolutamente precisa desativar a configuração automática de rede primeiro . incluindo ifplugde outros daemons de rede, ou isso interferirá em seus esforços:

Como posso desativar a rede configurada automaticamente no Raspbian?

Eu de fato usei apt-get remove ifplugd.

Para iniciar a rede na inicialização (desde que eu uso o pi sem cabeça), eu tenho esse conjunto para rodar no raspbian 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/wifié o script. Se você não sabe para que niceserve, leia man nice.

O ponto principal ifé que, se meu dongle wifi estiver conectado ao pi, o módulo 8192cu será carregado pelo kernel neste momento - portanto, o wifi deve iniciar. Caso contrário, presume-se que a ethernet esteja conectada e deva ser usada (se não estiver, o dhclient irá apenas cagar e não haverá acesso à rede).

Para que isso funcione, você provavelmente terá que

Portanto, isso coloca um pi decapitado na rede na inicialização e o mantém lá. Se você quiser uma maneira de mudar para eth durante a execução sem fazer login, poderá fazer algo com as regras do udev para retirar o dongle do wifi.

Cachinhos Dourados
fonte
Parece vale a pena testar. Não sendo um pro linux, como eu configuraria o script para ser executado na inicialização - colocado no cron? Seria possível / necessário adicionar também a rotação de logs?
26513 andig
1
@andig: adicionei alguns parágrafos sobre a inicialização via rc.local. Rotação de log do WRT, que é uma pergunta separada relacionada aos arquivos de log em geral (mas consulte man logrotate). No momento, esse script ignora (sobrescreve) qualquer log anterior, se existir com o mesmo caminho, não anexar. Para depuração, eu às vezes usei wifi.$$.logno arquivo wifi.conf, para que o último log (improvável) seja derrotado e eu possa comparar uma sessão com outra depois de ajustar algo. $$é o pid do processo "wifi".
goldilocks
Eu me preocupo que, às vezes, os scripts de shell possam ser frágeis e dificultar a visualização de maneiras quando houver atualizações ou se outro software de rede estiver instalado. Apenas uma nota de cautela sobre essa abordagem.
Jeremiah
3
@jeremiah: Esse é um bom medo. Escrevi o roteiro, aprimorei-o ao longo dos anos e sinto que tenho alguma compreensão do contexto geral em que ele opera e, portanto, o que preciso observar. No entanto, é provavelmente mais difícil transmitir a compreensão do que trechos de código. Para mim, é apenas uma abordagem alternativa para tentar trabalhar com o NetworkManager, reduzindo a situação a alguns elementos muito básicos. Isso é algo a oferecer às pessoas com uma perspectiva semelhante, como "isto é o que funcionou para mim" em todo o espectro da distribuição Linux, na circunstância de um sistema autônomo simples.
goldilocks
Então: eu estou ciente deste post e pretendo mantê-lo atualizado se um dos principais fluxos de distribuição (debia e fedora e derivados) apresentar algo que mexa com ele. Também acrescentarei alguma ênfase aos pontos sobre o que precisa ser desativado e como.
goldilocks
68

Bem, há uma solução muito simples:

  1. Vá para /etc/ifplugd/action.d/e renomeie o ifupdownarquivo paraifupdown.original
  2. Então faça: cp /etc/wpa_supplicant/ifupdown.sh ./ifupdown
  3. Finalmente: sudo reboot

Isso é tudo. Teste isso desligando / no seu AP; você deve ver que o seu Raspberry Pi se reconecta corretamente.

AndaluZ
fonte
2
Esta é a resposta mais simples e mais eficaz. Testado em 2 Rpi e funciona. Encontre este link em: raspberrypi.org/phpBB3/…
Mauvis Ledford
12
Desculpe por uma pergunta simplista - por que isso funciona?
Jeff Meatball Yang
@JeffMeatballYang, inicie um novo tópico para sua pergunta.
AndaluZ
6
Para mim, não havia arquivo ifupdown lá, apenas um link action_wpa -> ../../wpa_supplicant/action_wpa.sh, então talvez esse seja o padrão agora?
Zitrax 27/03
2
Sim, como outros dizem: isso não funciona em dhcpcddistros baseadas, a fim de obter essa execução no RPI3 você precisa apt-get install rcconfe alternar entre dhcpcdanetworking
test30
22

Recentemente, deparei com um aplicativo de console que classifica toda a configuração sem fio. Você também pode usar esta ferramenta para configurar a interface da LAN.

sudo apt-get install wicd-curses

Ele instalará muitos outros pacotes e executará seu próprio daemon em segundo plano, mas com certeza facilita a configuração de tudo. Execute-o com

sudo wicd-curses

insira a descrição da imagem aqui

Se você receber uma mensagem dizendo que nenhuma rede foi detectada, pressione P(deve ser maiúsculo), digite [SHIFT] p), digite wlan0 no campo da interface sem fio e pressione F10 para salvar.

  1. R para atualizar a lista.
  2. Use os cursores do teclado para navegar para cima e para baixo na lista
  3. Pressione para a direita para configurar a conexão sem fio
  4. Pressione algumas vezes e marque "Conectar-se automaticamente a esta rede"
  5. Pressione algumas vezes novamente e digite sua senha no campo chave
  6. Pressione F10 para salvar

insira a descrição da imagem aqui

Pode ser necessário pressionar Cpara conectar-se ao ponto de acesso. Se você fosse conectado, provavelmente matará a interface da LAN e ativará a conexão sem fio.

Ele também gerencia a conexão para se reconectar a qualquer ponto de acesso sem fio configurado, se cair por qualquer motivo.

Eu testei conectando o adaptador WiFi e conectando-o novamente. Demora cerca de 60 a 90 segundos, mas ele será conectado novamente ao WiFi (acho que a LAN deve estar desconectada)

Espero que ajude!

Piotr Kula
fonte
1
Não sei como isso cuida da reconexão - a conexão inicial não era a questão aqui!
andig
Atualizei a resposta porque há uma etapa em que você precisa verificar a conexão automaticamente. Também nas preferências, você deve rolar todo o caminho para baixo. A última opção está fora da tela. Também diz que tenta conectar-se automaticamente às redes por Wifi (está ativado por padrão). Posso até retirar o plug-in do adaptador WiFi e ele será reconectado em 2 minutos. (Fiz isso sem a LAN conectada) Essa é realmente a melhor maneira que encontrei para configurar e gerenciar a conexão sem fio. Você também terá a versão GUI chamado apenaswicd
Piotr Kula
há um erro de digitação no comando "sudo wicd-cruses" 'u' e 'r' são trocados
Gawcio
Após a instalação wicd-curses, meu RPi 3 começou a congelar aleatoriamente. Nunca estava congelando antes e o congelamento desapareceu imediatamente depois que eu o desinstalei. Cuidado!
Akhmed
1
Depois de instalar o wicd-maldições, meu RPi 3s executando Jessie Lite não congelou e permanece conectado. Mas hoje eu tentei conectar a um pela porta Ethernet e descobri que a interface seria perdida alguns segundos após a inicialização. Eu era capaz de me conectar bem antes de configurar o wicd-maldições para conectar ao wifi.
Chris Jenks
14

Isso pode ser resolvido sem scripts extras.

Em / etc / network / interfaces, coloque:

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

O roaming permite que a interface se recupere automaticamente.

David Sainty
fonte
A última linha parece adicionar um segundo endereço IP à interface wlan0; isso é intencional?
fche 18/05
Acabo com apenas um endereço atribuído por DHCP. Não me surpreenderia comportamento por completo, se os scripts de inicialização mudaram embora - este arquivo de configuração é desnecessariamente arcano ...
David Sainty
2
Na minha caixa pi2 raspbian, se a wlan cair o tempo suficiente para que três ciclos de autenticação falhem, mesmo com o "wpa-roam", ele não tenta novamente.
fche 23/05
Esta é a única resposta que funcionou para mim no RPi 3. Obrigado!
Akhmed
1

netcfg

Tente netcfg. Sem mais detalhes sobre qual distribuição você está usando, não posso fornecer muitos mais detalhes, mas ele deve fazer o que você deseja.

Alex Chamberlain
fonte
4
Estou usando a distribuição raspbian atual: pi @ raspberrypi ~ $ man netcfg Nenhuma entrada manual para netcfg pi @ raspberrypi ~ $ netcfg -bash: netcfg: comando não encontrado pi @ raspberrypi ~ $ apt-cache search netcfg pi @ raspberrypi ~ $
andig
0

Outra solução, extraída desta .
Primeiro, defina suas configurações de wifi: sudo vi /etc/wpa_supplicant/wpa_supplicant.confadicionando uma seção como esta:

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

Em seguida, suas configurações de rede com 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

Em seguida, crie esse arquivo de script em algum lugar, por exemplo, /home/pi/reconnect.she +xpermita que ele seja executável.

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

Então faça o login como root sudo sue edite o crontab do root com crontab -e.
No final deste arquivo, adicione esta linha:

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

Isso significa: "execute esse script a cada 10 minutos (como root)"

Agora, se você tiver uma conexão, o script será encerrado e nada acontecerá. Se você não conseguir executar ping no seu roteador, o script tentará se reconectar usando o wpa_supplicant.

Observe que tudo o que é ecoado em um script cron (nesse caso, somente quando desconectado) será enviado por email para o root. Portanto, se você configurou seus aliases de e-mail e postscript, receberá um e-mail sempre que a conexão wifi do seu pi for desativada e depois voltará com êxito graças ao script.

Leonardo
fonte
0

Isso funcionou para mim, usando Raspian Jessie em 30 de março de 2017:

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

Colorado MountainBoy
fonte
1
Resuma a solução em sua postagem, caso o link fique inoperante.
tlhIngan
CMB, bem-vindo ao canto com sabor RPi do StackExchange. A política do site desencoraja as respostas apenas ao link , pois estão sujeitas à podridão do link. Você não precisa duplicar o conteúdo do link, mas uma boa resposta deve pelo menos expandir os destaques contidos no link.
Jacobm001
Além do comentário de Jacobm001 acima, de acordo com nossa política sobre respostas somente para links sem informação, se este post não for editado para conter informações que possam servir como resposta, por mínima que seja, em 48 horas, ele será convertido em Community Wiki para simplificar corrigido pela comunidade.
goobering