Primero debemos cambiar completamente a systemd
(que podría ser el futuro de todos modos), como Ingo ha explicado aquí:
# desinstalar la red clásica sudo -Es # si aún no lo ha hecho apt --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-resuelto y 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 habilitar systemd-networkd.service systemd-resident.service
1. Configure wpa_supplicant
×
Su wpa_supplicant-wlan0.conf
debería verse así:
country = FRctrl_interface = DIR = / var / run / wpa_supplicant GROUP = netdevupdate_config = 1ap_scan = 1 ### tu punto de acceso / hotspot ### network = {ssid =" RaspberrypiAP "# tu hotspot name mode = 2 key_mgmt = WPA-PSK psk = "passphrase" # frecuencia de la contraseña de tu hotspot = 2462} ### tu (s) red (s) ### red = {prioridad = 10 # agrega una prioridad superior a 0 a cualquier ssid de red = "yourWifi" # ¡excepto el del punto de acceso! psk = "passphrase"}
Tenemos que agregar un priority =
mayor que 0 a cualquier sección de la red excepto la del hotspot, entonces wpa_supplicant
los preferirá. Solo si no se encuentra ninguna de estas redes, wpa_supplicant
creará un punto de acceso / hotspot. Si wpa_supplicant
ha creado un hotspot, la interfaz debe tener una dirección estática y necesitamos un servidor DHCP, para que podamos conectar nuestros dispositivos a él. Esto lo hará systemd-networkd
.
2. Configure la interfaz inalámbrica con systemd-networkd
0000-
Necesitamos crear los siguientes archivos. El primero configurará su dispositivo como cliente, el segundo como punto de acceso. El primero es el predeterminado debido al número más pequeño.
sudoedit /etc/systemd/network/08-CLI.network
[Match] Name = wlan0 [Red] 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 un systemd.service
para configurar automáticamente la interfaz basada en wpa_supplicant
eventos
Este servicio ejecutará wpa_cli
, que ejecuta el siguiente script en ciertos eventos.
Ejecute sudo systemctl edit --full --force wpa_cli@wlan0.service
y pegue las siguientes líneas en él:
Description = Wpa_cli para crear automáticamente un punto de acceso si no hay una conexión de cliente disponible Después = wpa_supplicant @% i.serviceBindsTo = wpa_supplicant @% i.service [Servicio] ExecStart = / sbin / wpa_cli -i% I -a /usr/local/bin/autoAP.shRestart=on-failureRestartSec=1[Install]WantedBy=multi-user.target
4. El script necesario para el servicio
Este script debe guardarse en la ruta definida en la sección ExecStart =
. Configurará el dispositivo como cliente si está conectado a algún wifi, o como punto de acceso si wpa_supplicant
ha creado uno, lo que hará automáticamente si no se encuentra otra red.
Si nadie está conectado al punto de acceso durante un tiempo, se reiniciará wpa_supplicant
para que vuelva a buscar redes wifi.
sudoedit / usr / local / bin / autoAP. sh
#! / bin / bashdevice = wlan0configure_ap () {if [-e /etc/systemd/network/08-CLI.network]; luego 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 $ estado del dispositivo | grep -q "modo = estación"; luego 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 $ dispositivo all_sta) "=" "]; luego wpa_cli -i $ device reconfigure fi} case "$ 2" in # Configure access point si se crea uno AP-ENABLED) configure_ap reconfigure_wpa_supplicant 2m & ;; # Configurar como cliente, si está conectado a alguna red CONECTADO) configure_client ;; # Reconfigure wpa_supplicant para buscar su wifi nuevamente, # si nadie está conectado al ap AP-STA-DISCONNECTED) reconfigure_wpa_supplicant 20 & ;; esac
Haga que el script sea ejecutable chmod + x /path/to/script/autoAP.sh
.
Ahora tenemos que ejecutar sudo systemctl enable --now wpa_cli@wlan0.service
, reiniciar el Pi y todo debería funcionar.
También creé un repositorio github para esto, desde donde podrías instalarlo muy fácilmente.
Estaré encantado de cualquier sugerencia sobre cómo mejorar esta configuración.