Conexión de Esp8266 y Esp32 a WiFi con MicroPython




Presentación


En el presente proyecto se busco desarrollar usando micropython una libreria de conexion a la red wifi de las placas Esp32 y Esp8266 que permitiera modificar las credenciales de la red sin necesidad de reprogramar la placa sino accediendo a traves de un navegador.

El programa propuesto guarda los datos en un archivo config.dat el cual puede ser escrito manualmente y colocado en la placa o de no hacerlo el programa lo crea para guardar las credenciales.

En el caso de no estar el archivo config.dat, de estar vacio o de no lograr conectarse a la red con los datos cargados se crea una red AP con el nombre Configuracion y la clave 12345678.

Ahora debemos conectarnos con cualquier equipo que tenga wifi y un navegador a esa red y dirigirnos a la IP 192.168.4.1 donde se abrira la siguiente pagina

En la misma ingresamos las credenciales de la red a la que deseamos que se conecte nuestra placa y haciendo clic en el boton "Grabar datos" se abrira la siguiente pagina:

Ahora solo resta reiniciar la placa y esta se podra conectar a la red wifi elegida.


Código


El código se ha escrito en un unico archivo conectar.py.



#Esta libreria esta diseñada para conectar la placa Esp32 una la red wifi ingresando el nombre de la red y su clave
#La primera vez que se inicie o en el caso que no se pueda ingresar a la red wifi por no encontrase la misma o por
#haberse cambiado la clave se creara una red wifi llamada Esp32 con clave 12345678. Conectandose a esa red e ingresando
#con un navegador a la ip 192.168.4.1 se podran grabar el nombre de la red wifi a la que se desea conectar y su clave
#luego, reiniciando la placa se conectara a la red cuyas credenciales se grabaron
      
#Librerias
from machine import reset
import network
import socket
import time
import uos
      
      
      
#Paginas web
def pagina_web(pag):
    if (pag == 1): 
        html = """
        <!DOCTYPE html>
        <html>
          <head>
              <title>Esp32</title>
              <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
              <meta name="viewport" content="width=device-width, initial-scale=1">
          </head>
          <body>
              <h1>Configurar conexion red wifi</h1>
              <br>
              <form action="" method="get">
                                <h4>Nombre de la red: </h4>
                                <input type="text" name="nom_red">
                                <h4>Escribir clave de la red: </h4>
                                <input type="text" name="cla_red">
                                <br><br><br>
                                <input type="submit" value="Grabar datos" />
                                
              </form>
          </body>
        </html>
        """
    elif (pag == 2): 
        html = """
        <!DOCTYPE html>
        <html>
          <head>
              <title>Esp32</title>
              <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
              <meta name="viewport" content="width=device-width, initial-scale=1">
          </head>
          <body>
              <h1>Conexion a red WIFI configurada</h1>
              <p>Resetear la placa y se conectara al la red seleccionada</p>
              
          </body>
        </html>
        """
    return html
      
      
#libreria conectar.py
      
class wifi():
    def __init__(self):
              
        #Se verifica si existe el archivo config.dat donde se guardan las credenciales      
        archi = (uos.listdir())  
        if "config.dat" in archi:
            print
        else:
            #Si no existe se crea
            datos = open("config.dat", "x")
            datos.close()
              
        #Se lee el archivo config.dat 
        datos = open("config.dat", "r")
        red = datos.readline()
        red = red.strip('\n')
        clave = datos.readline()
        clave = clave.strip('\n')
        datos.close()
        #Si el archivo config.dat esta vacio se asigna un valor a la variable red
        if (red == ""):
            red = "red"
        #Se inicia la red            
        red_wifi = network.WLAN(network.STA_IF)
        #Se verifica que no este conectada
        if not red_wifi.isconnected():
            #Si no esta conectada intenta conectarse
            red_wifi.active(True)
            #La siguiente linea es para configirar una ip estatica, sino puede eliminarse
            #red_wifi.ifconfig(('192.168.0.200', '255.255.255.0', '192.168.0.1', '192.168.0.1'))
            red_wifi.connect(red, clave)
            print('Conectando a: %s' % red)
            timeout = time.ticks_ms()
            #Espera a que se conecte 
            while not red_wifi.isconnected():
                if (time.ticks_diff (time.ticks_ms(), timeout) > 10000):
                    break
            if red_wifi.isconnected():
                #Si se conecta a la red muestra por consola los datos de la conexion
                print('Se conecto a: %s' % red)
                print('IP: %s\nSUBNET: %s\nGATEWAY: %s\nDNS: %s' % red_wifi.ifconfig()[0:4])
            else:
                #Si no se conecta, muestra por consola que fallo la conexion 
                red_wifi.active(False)
                print('Fallo la conexion a: %s' % red)
                #Se inicia la configuracion de un punto AP 
                #Asigna nombre y clave la red AP
                nombre = "Configuracion"
                clave = "12345678"
                #Configura la red AP
                ap = network.WLAN(network.AP_IF)
                ap.active(True)
                ap.config(essid=nombre, password=clave, authmode=network.AUTH_WPA2_PSK)
                      
                while not ap.active():
                    pass
      
                print("El punto de acceso está activo. Nombre Red:", nombre, "Clave:", clave)
                print("Dirección IP:", ap.ifconfig()[0])
                #Configura el servidor web
                s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                s.bind(('', 80))
                s.listen(5)
                print('Ready...!\n********************************\n')
                pag = 1
                while True:
                    #Recibe conexion del navegador y muestra la pagina de configuracion
                    conn, addr = s.accept()
                    print('Conexion a %s' % str(addr))
                    rta = conn.recv(1024)
                    rta = str(rta)
                    #Recibe la respuesta del navegador y si encuentra la cadena nom_red= inicia grabacion de las credenciales
                    if (rta.find('nom_red=') > 0):
                        #Lee y asigna los valores de nombre y clave cargados en la pagina
                        ini1 = rta.find('nom_red=') + 8
                        fin1 = rta.find('&cla_red=')
                        ini2 = fin1 + 9
                        fin2 = rta.find('HTTP/1.1')
                        nombre = rta[ini1:fin1]
                        clave = rta[ini2:fin2]
                        nombre = nombre.strip()
                        clave = clave.strip()
                        #Graba los valores de nombre y clave en el archivo config.dat
                        datos = open("config.dat", "w")
                        datos.write(nombre + "\n")
                        datos.write(clave + "\n")
                        datos.close()
                        #Indica abrir la pagina de confirmacion de la grabacion de datos
                        pag = 2
              
              
      
                    #Envia la pagina web que correspode al navegador
                    respuesta = pagina_web(pag)
                    conn.send('HTTP/1.1 200 OK\n')
                    conn.send('Content-Type: text/html\n')
                    conn.send('Connection: close\n\n')
                    conn.sendall(respuesta)
              
        else:
            #Si la placa ya estaba conectada a la red muestra por consola los datos de la conexion
            print('Esta conectada a: %s' % red)
            print('IP: %s\nSUBNET: %s\nGATEWAY: %s\nDNS: %s' % red_wifi.ifconfig()[0:4])
                  
      

    

A continuacion coloco a modo de ejemplo un pequeño codigo para mostrar como se debe implemetar el uso de esta liberia de conexion



    
import conectar

conec = conectar.wifi()
    

  

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