Cómo crear un servidor web con un ESP8266

En un post anterior expliqué cómo configurar y conectar un ESP8266 a una red WiFi desde código. Esto está muy bien, pero si no hacemos nada con esta conexión, realmente no sirve para nada tenerlo conectado a una WiFi. Por eso hoy voy a explicar cómo podemos crear un servidor web en nuestro micro controlador y responder a las peticiones http que recibamos.

Como en los anteriores ejemplos el único hardware que vamos a necesitar es nuestro micro controlador ESP8266 y un cable mini usb para conectarlo a nuestro ordenador. Una vez tengamos creado e inicializado el proyecto (si no sabes o no te acuerdas vuelve a leerte este post) lo primero será añadir las cabeceras necesarias, los credenciales de nuestra WiFi y la variable que utilizaremos para crear el servidor web.

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

char ssid[] = "";
char password[] = "";

ESP8266WebServer server(80);

Antes de los métodos setup y loop vamos a añadir dos métodos nuevos handleRequest y handleNotFound para tenerlo todo más organizado. El primero se encargará de responder a las peticiones http que vayan contra el directorio raíz, lo que viene siendo cuando escribamos la dirección IP de nuestra placa en el navegador. El segundo método se encargará de responder a todas las demás peticiones ya que no habrá encontrado nada que las pueda manejar, por ejemplo http://192.168.1.37/aaaa.

void handleRequest() {
  Serial.println("Request received");
  String body = "<h1>Hello world!</h1>";
  server.send(200, "text/html", body);
}

void handleNotFound() {
  Serial.println("Not found");
  String body = "<h1>Not found :(</h1>";
  server.send(404, "text/html", body);
}

Como ves la forma de enviar la respuesta a la petición es muy simple, sólo necesitamos llamar al método send del servidor web pasándole como parámetros el código http de respuesta, el tipo de contenido que vamos a enviar en el body y el contenido del body. Estos métodos siempre tendrán que ir definidos antes que el método setup ya que de otra forma no los podrá encontrar y el programa no compilará.

Lo siguiente será añadir el código necesario en el método setup. Dentro de el nos conectaremos a la red WiFi y configuraremos e inicializaremos el servidor web.

void setup() {
  Serial.begin(9600);
  Serial.println("Server test");

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }

  Serial.println("");
  Serial.println("WiFi connected");

  server.on(("/"), handleRequest);
  server.onNotFound(handleNotFound);
  server.begin();

  Serial.println("Server started");
  Serial.println(WiFi.localIP());
}

Como puedes ver, al configurar el servidor web le especificamos qué método tiene que ejecutar en el caso de que llegue una petición http a la raíz server.on("/") y qué método tiene que ejecutar para el resto de casos server.onNotFound() cuando no haya nada definido.

Ya sólo nos faltará añadir el método loop, que en este caso sólo va a ser necesario añadir una línea para que el servidor web vaya procesando las peticiones que reciba.

void loop() {
  server.handleClient();
}

Una vez tengamos todo este código completo, sólo nos quedará compilar y subir el código a nuestra placa para poder probarlo. Si accedemos a través de un navegador a la IP que nos haya salido por la consola podremos ver que nos devuelve el mensaje Hello world!.

En cambio si escribimos una ruta que no es la raíz como por ejemplo /aaaa, veremos que nos devuelve Not found ya que no encuentra nada para manejar esa ruta concreta.

Puedes encontrar el ejemplo completo en mi GitHub y si tienes cualquier duda no dudes en dejar un comentario.