Raspberry Pi – Crear AP en caso de no tener conexión

En esta ocasión vamos a montar un punto de acceso en caso de que no se tenga conexión y poder configurar una red wifi , esto va muy bien cuando movemos la placa de ubicación y no tenemos configurada la nueva red , de la forma habitual necesitaríamos un teclado y un monitor para cambiar el fichero /etc/wpa_supplicant/wpa_supplicant.conf , de esta forma si al arrancar no se puede conectar creara un punto de acceso al que nos podemos conectar y poner las credenciales de la nueva red.

Instalaremos balena-os/wifi-connect .

bash <(curl -L https://github.com/balena-io/wifi-connect/raw/master/scripts/raspbian-install.sh)

Este es el proceso de funcionamiento de wifi-connect

How it works

Tuve que añadir un par de pausas y forzar un escaneo ya que si no me aparecían en blanco la lista de redes

sleep 15

iwlist scan

sleep 15

Crearemos el script sudo nano /home/antonio/scripts/wifiactiva.sh

#!/usr/bin/env bash

export DBUS_SYSTEM_BUS_ADDRESS=unix:path=/host/run/dbus/system_bus_socket

# Optional step - it takes couple of seconds (or longer) to establish a WiFi connection
# sometimes. In this case, following checks will fail and wifi-connect
# will be launched even if the device will be able to connect to a WiFi network.
# If this is your case, you can wait for a while and then check for the connection.
sleep 15

iwlist scan

sleep 15

# Choose a condition for running WiFi Connect according to your use case:

# 1. Is there a default gateway?
# ip route | grep default

# 2. Is there Internet connectivity?
#nmcli -t g | grep full

# 3. Is there Internet connectivity via a google ping?
#wget --spider http://google.com 2>&1

# 4. Is there an active WiFi connection?
iwgetid -r

if [ $? -eq 0 ]; then
    printf 'Skipping WiFi Connect\n'
else
    printf 'Starting WiFi Connect\n'
#    sudo nmcli connection delete id `hostname`_wifi
#    sleep 5
    sudo  /usr/local/sbin/wifi-connect  -s `hostname`_wifi -i wlan0 -p 123454321
fi

# Start your application here.
sleep infinity

Y lo añadiremos en crontab

#Modo AP si no hay conexion
@reboot /bin/sh  /home/antonio/scripts/wifiactiva.sh

Una vez arrancada si no detecta conexión llamara a wifi-connect , creara el AP y ya nos aparecerá en el móvil

En la pantalla de inicio o si no en la url http://192.168.42.1/ podremos elegir la red y la contraseña

Si todo es correcto ya nos deberá aparecer dentro de nuestra red

Y podremos conectarnos al dispositivo

Después de varias pruebas con el script que recomiendan en github me fallaba bastante por lo que decidí adaptar un script que utilizaba para otros tema y funciona correctamente.

Este seria el script definitivo , donde ponemos el nombre de la wifi en función del hostname y le ponemos una contraseña por defecto

#!/usr/bin/env bash

export DBUS_SYSTEM_BUS_ADDRESS=unix:path=/host/run/dbus/system_bus_socket

# Un log, porque la vida sin logs no es nada
RUTA_LOG="/home/antonio/scripts/log_conexion.txt"

echo "#################################################################" >> $RUTA_LOG
echo "INICIO DEL SCRIPT CONTROL CONEXION" >> $RUTA_LOG
echo "#################################################################" >> $RUTA_LOG
echo `date`  >> $RUTA_LOG
echo `uptime` | sed -e 's/^[ \t]*//'  >> $RUTA_LOG
echo "#################################################################" >> $RUTA_LOG


####################
# Configurations
####################

# The interval [sec] to check the pingable destination for connectivity.
check_interval=150

# The public or local resource to ping.
ping_destination="www.google.com"

# The number of ping packets to send.
ping_count=5

# The consecutive max ping failure count. When reached a reboot is invoked.
max_ping_failures=1

####################
# Main
####################

sleep 15

iwlist scan

sleep 15

failure_count=0

while true
do


    # test the pingable resource
    wget -q --tries=10 --timeout=20 --spider http://google.com

    # check exit status of ping command
    if [[ $? -eq 0 ]]; then
        failure_count=0
    else
        failure_count=$((failure_count+1))
        echo `date +"%T"` "fallo de conexión ..." >> $RUTA_LOG
        if ((failure_count >= max_ping_failures)); then
            echo "#################################################################" >> $RUTA_LOG
            echo `date +"%T"` "llamada a wifi-connect" >> $RUTA_LOG
            echo "#################################################################" >> $RUTA_LOG
            sudo  /usr/local/sbin/wifi-connect  -s `hostname`_wifi -i wlan0 -p 123454321
            failure_count=0
            check_interval=300
            #sudo /sbin/shutdown -r +1
            break
        fi
    fi

    sleep $check_interval

done

Lo añadimos a nuestro querido cron

#Modo AP si no hay conexion
@reboot /bin/bash  /home/antonio/scripts/wifiactiva.sh

los ficheros de conexión que se van creando se guardan en /etc/NetworkManager/system-connections/

Y con esto y un bizcocho ………..