sábado, 6 de febrero de 2016

Librería ESP8266WebServer (Arduino IDE)

La librería ESP8266WebServer se utiliza para simplificar la creación de un servidor web. Para explicar su funcionamiento voy a realizar un pequeño ejemplo que encenderá y apagará un led utilizando un navegador web. El led estará conectado a través de una resistencia de 330 ohmios al puerto D0.

El código completo del programa es el siguiente:

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

const char* ssid ="WLAN_E17C";
const char* password = "ced0ccb58c84e525e35f";
const int LED = 16; //GPI16 - D0

ESP8266WebServer server(80);

void led_on(){
 digitalWrite(LED,HIGH);
 server.send(200, "text/plain", "LED encendido");
}

void led_off(){
 digitalWrite(LED,LOW);
 server.send(200, "text/plain", "LED apagado");
}

void info() {
 server.send(200, "text/plain", "Hola mundo!");
}

void no_encontrado() {
 server.send(404,"text/plain","Error en la petición");
}

void setup() {
 //inicializa el puerto serie
 Serial.begin(115200);
 delay(10);
 //inicializa el led
 pinMode(LED,OUTPUT);
 digitalWrite(LED,LOW);
 //Inicializa el módulo wifi
 WiFi.mode(WIFI_STA); //Establece el módulo como cliente wifi
 WiFi.disconnect(); //Se desconecta de cualquier WiFi conectado previamente
 Serial.println(); 
 //conecta con la red wifi
 Serial.print("Connecting to ");
 Serial.println(ssid);
 WiFi.begin(ssid, password);
 while (WiFi.status() != WL_CONNECTED) {   // Espera por una conexión WiFi
    delay(500);
    Serial.print(".");
 }
 Serial.println("");
 Serial.println("WiFi connected");
 Serial.print("IP address: ");
 Serial.println(WiFi.localIP());
 digitalWrite(LED,HIGH);
 //definimos los paths
 server.on("/on",led_on);
 server.on("/off",led_off);
 server.onNotFound(no_encontrado);
 //inicializa el servidor web
 server.begin();
 Serial.println("Servidor HTTP activo");
}

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

El código es muy parecido al ejemplo de servidor web de este artículo. Lo que cambia es el propio servidor web.
Creamos un objeto servidor WEB que escuchará el puerto 80:

ESP8266WebServer server(80);

Con server.on indicamos una función como respuesta del servidor cuando el navegador solicita cierta URL. El ESP8266 nos permite definir comportamientos diferentes para “subdirectorios” de la URL, y así podríamos configurar diferentes respuestas para “/sub-url-1”, “/sub-url-2”, etc.:

server.on("/",info);
server.on("/on",led_on);
server.on("/off",led_off);
server.onNotFound(no_encontrado);

También podemos introducir el código directamente en vez de llamar a una función. Por ejemplo:

server.on(“/on”,[]() {
 digitalWrite(LED,HIGH);
});

Cuando el navegador se conecte al ESP8266 se va a ejecutar ese código que hemos puesto dentro de server.on, y que en el caso de que la URL apunte a la raiz (/) es una llamada a la función server.send, que lo que hace es responder al navegador. Para ello, hay que darle tres argumentos:
  • Código de respuesta: es un código que se utiliza en el protocolo HTTP para indicar diferentes eventos en las conexiones. Posiblemente te suene el 404 cuando das con un enlace roto, pues el código 200 es menos visible pero más común, es el que se devuelve cuando sí que se encuentra el contenido.
  • MIME-type: es un código que indica el tipo de contenido que se devuelve, puede ser texto, imagen…
  • Respuesta: El contenido de la respuesta en sí, en este caso tan solo queremos responder un “Hola mundo!” de prueba.

void info() {
 server.send(200, "text/plain", "Hola mundo!");
}

El método server.onNotFound() definiremos la función que queremos que actúe cuando la petición que recibimos no la tenemos definida. En este caso, vamos a llamar a la función no_encontrado() que hemos definido anteriormente.

Para iniciar el servidor web:

server.begin();

En loop() escuchamos las conexiones entrantes:

server.handleClient();

Fuentes:

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.