Clase Conexion: una clase para conectar y administrar la red wifi en la placa Esp32




Presentación


La clase Conexion es una herramienta integral diseñada para gestionar la conectividad WiFi en dispositivos embebidos que ejecutan MicroPython, como el ESP32 o ESP8266 (con limitaciones). Su objetivo principal es simplificar tareas comunes de red: conexión a una red conocida, escaneo de redes disponibles, verificación de acceso a Internet, y, lo más destacado, permitir la configuración remota mediante una interfaz web accesible desde cualquier navegador.

La clase opera en dos modos: modo estación (STA), para conectarse a una red WiFi existente, y modo Access Point (AP), para crear una red temporal que permita a un usuario configurar credenciales sin necesidad de cableado ni programación adicional. Además, incluye funciones de diagnóstico, persistencia de credenciales y reconexión automática, lo que la hace ideal para aplicaciones IoT autónomas.

Todos los métodos están pensados para ser robustos, con manejo de errores, tiempos de espera controlados y retroalimentación clara al usuario mediante mensajes en consola. La clase también incluye una función auxiliar para decodificar URLs, necesaria para procesar correctamente los datos enviados desde formularios web.

A continuación se detallan sus métodos organizados por funcionalidad, siguiendo una estructura lógica que va desde la inicialización básica hasta funciones avanzadas de configuración remota.

Métodos de conexión y gestión básica


__init__(self, red=None, clave=None): Inicializa la interfaz WiFi en modo estación, desactiva el modo AP por defecto y almacena credenciales opcionales para futuras conexiones.

conectar(self, red=None, clave=None): Inicia el proceso de conexión a una red WiFi usando las credenciales proporcionadas o las guardadas internamente. No espera a que la conexión se complete; solo la solicita.

esperar(self, tiempo_final=30): Espera activamente hasta que el dispositivo se conecte a la red o se agote el tiempo límite. Devuelve True si la conexión es exitosa, False en caso contrario.

desconectar(self): Desconecta del WiFi actual y restablece el estado interno de conexión.

reconectar(self, max_intentos=3, espera=5): Intenta reconectar a la red guardada tras una desconexión inesperada, útil para mantener la conectividad en entornos inestables.

Métodos de información y diagnóstico


estado(self): Devuelve una cadena de texto con el estado actual de la conexión, incluyendo IP, máscara de red, gateway y DNS si está conectado.

info_red(self): Obtiene información detallada de la red a la que está conectado, como SSID, dirección MAC, potencia de señal (RSSI) y canal, siempre que el firmware lo permita.

internet_activa(self, host="8.8.8.8", puerto=53, tiempo_final=3): Verifica si hay acceso real a Internet mediante una conexión TCP a un servidor DNS confiable, evitando falsos positivos de conexión local.

tiempo_conexion(self): Calcula y devuelve el tiempo transcurrido (en segundos) desde que se estableció la conexión WiFi actual.

diagnostico(self): Imprime un informe completo del estado de red, combinando todos los métodos anteriores en un formato legible para depuración o monitoreo.

Métodos de persistencia y configuración remota


guardar_credenciales(self, archivo="wifi.json"): Almacena las credenciales actuales (SSID y contraseña) en un archivo JSON en el sistema de archivos del dispositivo.

cargar_credenciales(cls, archivo="wifi.json"): Método de clase que crea una nueva instancia de Conexion cargando credenciales desde un archivo JSON, ideal para arranques automáticos.

escanear(self, intentos=3, espera=0.5): Escanea redes WiFi disponibles, elimina duplicados y devuelve una lista ordenada por potencia de señal en formato de tabla legible.

activar_ap(self, nombre_red="Esp32_WiFi", clave="12345678"): Activa el modo Access Point con un SSID y contraseña personalizables, creando una red temporal para configuración.

navegador(self, red_ap="ConfigurarWiFi", clave_ap="12345678", puerto=80): Inicia un servidor web en modo AP que sirve una página HTML interactiva. El usuario puede seleccionar una red de una lista escaneada o escribirla manualmente, ingresar la contraseña y enviarla. La ESP32 recibe las credenciales, las guarda, se conecta a la red objetivo y apaga el AP una vez que el cliente se desconecta.

decodifica_URL(s) (función auxiliar): Decodifica cadenas codificadas en formato URL (reemplazando + por espacios y convirtiendo secuencias %XX a caracteres), necesaria para procesar correctamente los datos de formularios HTML enviados por POST.


Código


El código de la clase esta en el archivo conexion.py.



Descarga de la libreria


Descargar Libreria



A continuación, coloco a modo de ejemplo un pequeño código para para probar el funcionamiento de esta clase.



    
# Demostración de la clase Conexion

from conexion import Conexion
from time import sleep

def main():
    print("🚀 Iniciando demostración de la clase Conexion...\n")

    # === 1. Crear instancia con credenciales ===
    red = "Marcar2"          # ← Cambia por tu red wifi
    clave = "chacho2020"     # ← Cambia por tu clave de red

    wifi = Conexion(red=red, clave=clave)

    # === 2. Guardar credenciales (opcional, solo para demo) ===
    print("💾 Guardando credenciales en 'wifi.json'...")
    wifi.guardar_credenciales("wifi.json")

    # === 3. Intentar conectar ===
    print("\n🔌 Intentando conectar a la red WiFi...")
    wifi.conectar()
    conectado = wifi.esperar(tiempo_final=15)  # Espera máximo 15 segundos

    if conectado:
        print("\n✅ Conexión exitosa. Mostrando estado...")
        print(wifi.estado())

        # === 4. Diagnóstico completo ===
        wifi.diagnostico()

        # === 5. Verificar acceso a Internet ===
        print("🌐 Verificando acceso a Internet...")
        if wifi.internet_activa():
            print("✅ Internet disponible.")
        else:
            print("❌ Sin acceso a Internet (aunque estás conectado a la red local).")

        # === 6. Reconexión de prueba (simulando caída) ===
        print("\n🔄 Simulando pérdida de conexión y reconectando...")
        wifi.desconectar()
        sleep(2)
        if wifi.reconectar(max_intentos=2, espera=3):
            print("✅ Reconexión exitosa.")
        else:
            print("❌ Falló la reconexión.")

        # === 7. Desconectar antes de crear AP ===
        print("\n🛑 Desconectando de la red WiFi...")
        print(wifi.desconectar())
    else:
        print("\n❌ No se pudo conectar a la red WiFi.")

    # === 8. Activar modo Access Point (AP) ===
    print("\n📶 Activando modo Access Point (AP) de respaldo...")
    ap = wifi.activar_ap(nombre_red="MiEsp32_AP", clave="12345678")

    # Mostrar info del AP
    ip_ap = ap.ifconfig()[0]
    print(f"✅ AP activo. Conéctate a 'MiEsp32_AP' (IP: {ip_ap})")

    # === 9. Mostrar redes cercanas (escaneo) ===
    print("\n📡 Escaneando redes WiFi cercanas (desde modo STA, aún activo)...")
    print(wifi.escanear(intentos=2))

    print("\n🏁 Demostración finalizada. El dispositivo está en modo AP. Red 'MiEsp32_AP'")
    

# Ejecutar solo si se llama directamente
if __name__ == "__main__":
    main()

    

Otro codigo de ejemplo para probar el servidor incluido en esta clase.



    
from conexion import Conexion  # o como se llame tu archivo

# Intentar cargar credenciales
conexion = Conexion.cargar_credenciales()

print("\n🛑 Desconectando de la red WiFi...")
print(conexion.desconectar())

if not conexion.wlan.isconnected():
    print("No hay conexión. Iniciando configuración vía navegador...")
    conexion.navegador()  # Esto bloqueará hasta que se configure o se cancele
else:
    print("Ya conectado:", conexion.estado())
    

Este segundo codigo una vez ejecutado en la Esp32 creara una red AP llamada ConfigurarWiFi a la que debera conectarse y luego abrir en el navegador la pagina http://192.168.4.1:80.

En esa pagina encontrar los campos para configurar la placa Esp32 para que se conecte a la red WiFi que ud. desee, y luego se deberá desconectar la red AP ConfigurarWiFi para volver a conectarse a la red donde ya esta conectada la placa

Tenga presente que solo podrá acceder a la placa si ud le ha programado el servidor


Quedo disposición de quien quiera hacerme consultas o sugerencias mi correo electronico es carlosvaccaro1960@gmail.com