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

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.

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 <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)
{
}

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

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.

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 empezaremos con 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.

github-full

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

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