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