Cómo hacer un servidor asíncrono en ESP8266 o ESP32


Continuamos con las entradas del ESP8266 y el ESP32 viendo cómo configurar un servidor asíncrono con la ayuda de la librería AsyncServer.

Haremos referencia al ESP8266, pero el mismo código es compatible para el ESP32, ajustando el nombre de las librerías. Al final tenéis el código tanto para el ESP8266 como para el ESP32.

Llevamos varias entradas viendo cómo montar un servidor con el ESP8266. Progresivamente hemos llegado en la última entrada a una solución funcional, sirviendo ficheros estáticos comprimidos en Gzip desde la memoria SPIFFS.

¿Es posible mejorar esta solución? Sí, gracias a la genial librería ESPAsyncWebServer disponible en https://github.com/me-no-dev/ESPAsyncWebServer. Gracias a esta librería Open Source podemos crear un servidor asíncrono, es decir, que es capaz de atender a varios clientes de forma simultánea.

Además, la librería ESPAsyncWebServer dispone de ventajas adicionales como su velocidad, la sencillez de uso. Por supuesto, incorpora de serie la gestión de ficheros comprimidos en Gzip. Es decir, una maravilla de librería que dispone de muchas mejoras podéis consultar en la documentación de la página del proyecto.

Anuncio:

Por tanto, vamos a modificar nuestro código de ejemplo de servidor para funcionar con ESPAsyncWebServer. En primer lugar, el Skecth principal queda de la siguiente forma.

#include <ESP8266WiFi.h>
#include <ESPAsyncWebServer.h>
#include <FS.h>

#include "config.h"  // Sustituir con datos de vuestra red
#include "Server.hpp"
#include "ESP8266_Utils.hpp"

void setup(void)
{
	Serial.begin(115200);
	SPIFFS.begin();
	
	ConnectWiFi_STA();

	InitServer();
}

void loop(void)
{
}

Donde veremos que el cambio más notorio es que no tenemos nada en la función ‘loop’. No es necesario ya que, cómo hemos dicho, el servidor ESPAsyncWebServer es asíncrono (¡oh yeah!).

Por su parte, el fichero Server.hpp también se ha modificado, para adecuarse a la nueva librería.

AsyncWebServer server(80);

void InitServer()
{
	server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.html");

	server.on("/hello", HTTP_GET, [](AsyncWebServerRequest *request) {
		request->send(200, "text/plain", "Hola mundo (desde ESP8266)");
	});

	server.onNotFound([](AsyncWebServerRequest *request) {
		request->send(400, "text/plain", "Not found");
	});

	server.begin();
	Serial.println("HTTP server started");
}

No obstante, como vemos su uso es muy similar. Establecemos un ruteo para contenido estático en el SPIFFS, un endpoint ante llamadas GET a la URL /hello y, finalmente, un callback para ‘Not found’.

¡Así de fácil! Subimos los mismos ficheros de la página web “Hola mundo” que tenemos en la carpeta ‘data’ de las entradas anteriores (comprimidos en Gzip, o no, a vuestro gusto) y accedemos para comprobar, una vez más, que todo sigue funcionando correctamente.

La librería ESPAsyncWebServer es una gran opción para incluir en nuestros proyectos. De hecho, lo usaremos con frecuencia a partir de ahora en nuestros ejemplos como la solución preferida para servir contenido.

En la próxima entrada haremos un breve parón en el uso de ESP8266 como servidor, para ver la actualización de contenidos por el aire (OTA). Después empezaremoscon los ejemplos donde intercambiaremos información entre el ESP8266 y el cliente a través de distintos mecanismos (formularios, Ajax y websocket). ¡Hasta pronto!

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github.

Versión para el ESP8266: https://github.com/luisllamasbinaburo/ESP8266-Examples

Versión para el ESP32: https://github.com/luisllamasbinaburo/ESP32-Examples

Si te ha gustado esta entrada y quieres leer más sobre ESP8266 o el ESP32 puedes consultar la sección tutoriales de ESP8266/32
4.2 10 votes
Article Rating

Anuncio:

Previous Cómo servir contenido comprimido en Gzip con ESP8266 o ESP32
Next Cómo programar el ESP8266 o ESP32 por WiFi con Arduino OTA
2 Comments
oldest
newest
Inline Feedbacks
View all comments
martinis73
3 years ago

Genial! Estoy buscando opciones para visualizar/graphicar datos de 3 sensores online, y me parece genial tu propuesta con ESPAsyncWebServe. Que hay de la velocidad de datos que puede aceptar, no es escencial en este caso mio la velocidades de .2 segundo pero me gustaria saber pues este proyecto que hago es para encaminar aplicarlo en tales velocidades/outputs. Saludos.

Jordi
1 year ago

Un gran trabajo el de estos tutoriales. Estoy aprendiendo muchísimo contigo!!

Por favor, tengo una duda sobre el entorno de desarrollo a utilizar. Actualmente estoy con VisualStudio + vMicro, pero intentando instalar AsyncWebServer me han surgido problemillas y al ir a github veo como instalarlo con PlatformIO pero no hay referencias a vMicro.

Mi pregunta es, ¿que IDE recomendarias para el desarrollo, VisualStudio+vMicro o PlatformIO?

Muchas gracias por tu labor!