Primeiro, precisamos mudar completamente para systemd
(que pode ser o futuro de qualquer maneira), como Ingo explicou aqui:
# desinstala o clássico networkingsudo -Es # se ainda não foi feito --autoremove purge ifupdown dhcpcd5 isc-dhcp-client isc-dhcp-common rsyslogapt-mark hold ifupdown dhcpcd5 isc-dhcp-client isc-dhcp-common rsyslog raspberrypi-net-mods openresolvrm -r / etc / network / etc / dhcp # setup / enable systemd-resolution and systemd-networkdapt --autoremove purge avahi-daemonapt-mark hold avahi -daemon libnss-mdnsapt install libnss-resolveln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.confsystemctl enable systemd-networkd.service systemd-resolvido.service
1. Configure wpa_supplicant
✓
Seu wpa_supplicant-wlan0.conf
deve ser semelhante a:
country = FRctrl_interface = DIR = / var / run / wpa_supplicant GROUP = netdevupdate_config = 1ap_scan = 1 ### seu ponto de acesso / ponto de acesso ### rede = {ssid =" RaspberrypiAP "# seu ponto de acesso name mode = 2 key_mgmt = WPA-PSK psk = "passphrase" # frequência da senha do seu hotspot = 2462} ### sua (s) rede (s) ### network = {priority = 10 # adicionar uma prioridade maior que 0 a qualquer rede ssid = "seuWifi" # exceto o do ponto de acesso! psk = "passphrase"}
Temos que adicionar uma priority =
maior que 0 para qualquer seção de rede exceto a do ponto de acesso, então wpa_supplicant código> vai preferir eles. Somente se nenhuma dessas redes for encontrada, wpa_supplicant
criará um ponto de acesso / ponto de acesso. Se wpa_supplicant
criou um hotspot, a interface deve receber um endereço estático e precisamos de um servidor DHCP, para que possamos conectar nossos dispositivos a ele. Isso será feito por systemd-networkd
.
2. Configure a interface wireless com systemd-networkd
Budap
Precisamos criar os seguintes arquivos. O primeiro irá configurar seu dispositivo como cliente, o segundo como ponto de acesso. O primeiro é o padrão devido ao número menor.
sudoedit /etc/systemd/network/08-CLI.network
[Match] Name = wlan0 [Network] DHCP = yesLinkLocalAddressing = yesMulticastDNS = yes
sudoedit / etc / systemd / network / 12-AP .network
[Match] Name = wlan0 [Network] Address = 192.168.4.1 / 24DHCPServer = yesLinkLocalAddressing = yesMulticastDNS = yes código>
3. Configure um systemd.service
para configurar automaticamente a interface com base em eventos wpa_supplicant
Este serviço executará wpa_cli
, que executa o script abaixo em determinados eventos.
Execute sudo systemctl edit --full --force wpa_cli@wlan0.service
e cole as seguintes linhas nele:
Description = Wpa_cli para criar automaticamente um ponto de acesso se nenhuma conexão de cliente estiver disponívelAfter = wpa_supplicant @% i.serviceBindsTo = wpa_supplicant @% i.service [Serviço] ExecStart = / sbin / wpa_cli -i% I -a /usr/local/bin/autoAP.shRestart=on-failureRestartSec=1[Install]WantedBy=multi-user.target
4. O script necessário para o serviço
Este script deve ser salvo no caminho definido na seção ExecStart =
. Ele configurará o dispositivo como cliente se estiver conectado a algum wi-fi, ou como ponto de acesso se wpa_supplicant
tiver criado um, o que fará automaticamente se nenhuma outra rede for encontrada.
Se ninguém está conectado ao ponto de acesso por um tempo ele irá reiniciar o wpa_supplicant
para fazê-lo procurar redes wi-fi novamente.
sudoedit / usr / local / bin / autoAP. sh
#! / bin / bashdevice = wlan0configure_ap () {if [-e /etc/systemd/network/08-CLI.network]; então mv /etc/systemd/network/08-CLI.network /etc/systemd/network/08-CLI.network~ systemctl restart systemd-networkd fi} configure_client () {if [-e / etc / systemd / network / 08 -CLI.network ~] && wpa_cli -i $ status do dispositivo | grep -q "modo = estação"; então mv /etc/systemd/network/08-CLI.network~ /etc/systemd/network/08-CLI.network systemctl restart systemd-networkd fi} reconfigure_wpa_supplicant () {sleep "$ 1" if ["$ (wpa_cli -i $ device all_sta) "=" "]; então wpa_cli -i $ device reconfigure fi} case "$ 2" em # Configure access point se for criado AP-ENABLED) configure_ap reconfigure_wpa_supplicant 2m & ;; # Configurar como cliente, se conectado a alguma rede CONECTADO) configure_client ;; # Reconfigure wpa_supplicant para pesquisar seu wi-fi novamente, # se ninguém estiver conectado ao ap AP-STA-DISCONNECTED) reconfigure_wpa_supplicant 20 & ;; esac
Torne o script executável chmod + x /path/to/script/autoAP.sh
.
Agora, temos que executar sudo systemctl enable --now wpa_cli@wlan0.service
, reinicie o Pi e tudo deve funcionar.
Eu também criei um repositório github para isso, de onde você pode instalá-lo facilmente.
Ficarei feliz por alguma sugestão sobre como melhorar esta configuração.