Para empezar a trabajar con servidores web asíncronos y conectividad mediante WiFi en microcontroladores como el ESP32 o ESP8266, es necesario descargar e instalar las siguientes librerías.
Esta librería permite manejar servidores web de manera eficiente sin bloquear el procesador. Es útil cuando queremos responder a solicitudes HTTP sin detener otros procesos en el microcontrolador.
Puedes descargar la librería desde el siguiente enlace de GitHub:
ESPAsyncWebServer
La librería AsyncTCP es necesaria para gestionar las conexiones TCP de forma no bloqueante. Es especialmente útil para microcontroladores que necesitan manejar varias conexiones al mismo tiempo.
Descárgala desde:
AsyncTCP
Si estás trabajando con un ESP8266, no descargues la librería ESPAsyncTCP, aunque GitHub lo sugiera en algunos casos. El ESP8266 usa la librería AsyncTCP, y no es necesario instalar la variante específica para ESPAsync.
Además de manejar servidores web, podemos enviar datos a un servidor usando WiFi. Esto es útil cuando necesitamos comunicar información dinámica, como el estado de un sensor, a un servidor web.
Podemos utilizar la librería WiFi.h para conectarnos a una red WiFi y luego enviar datos a un servidor HTTP. El siguiente ejemplo muestra cómo conectarse a un servidor y enviar una cadena de texto:
#include <WiFi.h>
WiFiClient client;
const char* host = "fmesasc.com";
const int port = 80;
void setup() {
Serial.begin(115200);
// Conectar a la red WiFi
WiFi.begin("tuSSID", "tuPASSWORD");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Conectando a WiFi...");
}
Serial.println("Conectado a la red WiFi");
// Intentamos conectar al servidor
if (!client.connect(host, port)) {
Serial.println("Conexión con el host fallida");
return;
}
Serial.println("Conexión con el servidor exitosa!");
// Enviar una cadena de texto al servidor
client.print("Hello from ESP32!");
Serial.println("Desconectando...");
client.stop();
}
void loop() {
// El loop puede quedar vacío si solo queremos enviar la cadena una vez.
}
En lugar de enviar siempre un mensaje estático, también podemos enviar datos dinámicos, como las lecturas de un sensor:
#include <WiFi.h>
WiFiClient client;
const char* host = "fmesasc.com";
const int port = 80;
float getTemperature() {
// Función simulada para obtener la temperatura
return random(20, 30); // Devuelve un valor aleatorio entre 20 y 30
}
void setup() {
Serial.begin(115200);
// Conectar a la red WiFi
WiFi.begin("tuSSID", "tuPASSWORD");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Conectando a WiFi...");
}
Serial.println("Conectado a la red WiFi");
// Intentamos conectar al servidor
if (!client.connect(host, port)) {
Serial.println("Conexión con el host fallida");
return;
}
Serial.println("Conexión con el servidor exitosa!");
// Obtener la temperatura y enviarla al servidor
float temperature = getTemperature();
client.print("Temperatura actual: ");
client.print(temperature);
client.println(" °C");
Serial.println("Datos enviados al servidor");
Serial.println("Desconectando...");
client.stop();
}
void loop() {
// Aquí puedes realizar otras tareas, o repetir el envío de datos periódicamente.
}
A continuación, un ejemplo completo que combina ambas funcionalidades. El ESP32 actuará como servidor web, y además, enviará datos a otro servidor remoto cuando sea necesario.
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
const char* ssid = "tu-SSID";
const char* password = "tu-password";
const char* host = "fmesasc.com";
const int port = 80;
AsyncWebServer server(80); // Crear un servidor en el puerto 80
WiFiClient client;
void setup(){
Serial.begin(115200);
// Conectar a la red Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Conectando a WiFi...");
}
Serial.println("Conectado a la red WiFi");
// Configuración del servidor web
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", "Hola, Mundo!");
});
server.begin();
}
void loop(){
// Enviar datos al servidor remoto
if (!client.connect(host, port)) {
Serial.println("Conexión con el host fallida");
return;
}
Serial.println("Conexión con el servidor exitosa!");
client.print("Hola desde ESP32");
Serial.println("Desconectando...");
client.stop();
}
Este ejemplo permite que el ESP32 funcione tanto como servidor web local para responder a solicitudes HTTP como cliente para enviar datos a un servidor remoto. Combina lo mejor de ambos mundos: respuesta asíncrona local y conectividad global mediante WiFi.