como-hacer-un-servidor-asincrono-en-esp8266

Cómo hacer un servidor asíncrono en ESP32

  • 3 min

Un servidor asíncrono permite atender peticiones web sin bloquear el programa principal, algo especialmente útil en un ESP32 cuando además estamos leyendo sensores, actualizando salidas o gestionando otras comunicaciones.

El ejemplo está orientado a ESP32. En muchos casos también puede adaptarse a ESP8266 cambiando librerías y algunos detalles de pines.

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.

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. Donde vemos 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!).

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

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

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

  InitServer();
}

void loop(void)
{
}
Copied!

Por su parte, el fichero Server.hpp también se ha modificado, para adecuarse a la nueva librería. 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’.

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");
}
Copied!

Resultado

¡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.

esp8266-servidor-spiffs-hello-world

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.

Con esto tenemos una base mucho más cómoda para servir contenido web desde el ESP32. En proyectos reales, este enfoque suele ser preferible cuando la interfaz empieza a crecer o cuando el dispositivo tiene que seguir haciendo otras tareas mientras atiende clientes.

Descarga el código

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

github-full

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

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