🛠 Serveur web embarqué : YunServer, YunClient et pages dynamiques
Objetivos
Salir de la API REST genérica para escribir TU propio servidor web: la biblioteca YunServer abre un puerto TCP en el lado Linux (a través del demonio avrbridge) y YunClient representa cada conexión. Vas a servir una página HTML y un endpoint JSON leídos por un sensor real, entendiendo que el protocolo HTTP es gestionado por Linux y que el 32U4 sigue siendo el único que accede a los pines.
Material
- 1 Arduino Yún conectado
- 1 sensor analógico en A1 (potenciómetro o LDR + 10 kΩ en divisor de tensión)
- Navegador en la misma red
- Conocimientos básicos de HTTP (solicitud/respuesta, Content-Type) suficientes
Código completo
// Serveur HTTP minimal sur le port 5555 : page + JSON capteur.
#include <Bridge.h>
#include <YunServer.h>
#include <YunClient.h>
YunServer serveur;
const uint8_t CAPTEUR = A1;
void setup {
Bridge.begin;
serveur.listenOnLocalhost; // écoute côté Linux
serveur.begin;
}
void loop {
YunClient client = serveur.accept;
if (!client) return; // aucune connexion en attente
process(client);
client.stop; // toujours fermer la connexion
}
void process(YunClient client) {
String methode = client.readStringUntil('\t'); // GET /temperature HTTP/1.1
String chemin = client.readStringUntil('\t');
client.readStringUntil('\r'); // reste de la ligne HTTP
client.readStringUntil('\n');
// Vide les en-têtes jusqu'à la ligne vide (sinon ils seront lus comme le corps)
String ligne;
while ((ligne = client.readStringUntil('\n')).length > 1) { }
if (chemin == "/temperature") {
int v = analogRead(CAPTEUR);
client.print(F("HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n"
"Connection: close\r\n\r\n"));
client.print(F("{\"capteur\":A1,\"brut\":"));
client.print(v);
client.println(F(",\"unite\":\"adc10\"}"));
} else if (chemin == "/") {
client.print(F("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n"
"Connection: close\r\n\r\n"
"<h1>Yun vivante</h1>"
"<p><a href='/temperature'>/temperature</a></p>"));
} else {
client.print(F("HTTP/1.1 404 Not Found\r\nConnection: close\r\n\r\n"));
}
}
Verificación esperada
0 devuelve un JSON con la lectura del sensor (0–1023), actualizada en cada solicitud. curl -v` muestra la cabecera Connection: close y una conexión limpia. Abre dos pestañas: YunServer serializa las solicitudes — una solicitud bloqueante (sleep mal colocado) congela el sitio, de ahí la exigencia de manejadores cortos.
Errores frecuentes
- Olvidar vaciar las cabeceras: las líneas restantes son consumidas por tu analizador de rutas — el síntoma clásico es una ruta que comienza por « User-Agent ».
- Olvidar client.stop: las conexiones se acumulan, el servidor se satura tras algunas actualizaciones.
- Escribir la respuesta sin \r\n\r\n final: el navegador muestra « en espera » eternamente.
- Querer usar long-polling o WebSockets con YunServer: el modelo es de solicitud/respuesta corta; para tiempo real, consultar el JSON cada 500 ms sigue siendo lo más simple (los ejemplos YunWebsocket del IDE exploran otra vía en el lado Linux).
- Confundir listenOnLocalhost y listenOnAllIPs: por defecto, el puerto solo es accesible DESDE el propio Linux (por lo tanto, desde la red a través del proxy uhttpd en el puerto 8080) — listenOnAllIPs expone el puerto bruto, lo cual es un arma de doble filo.
- Bloquear en process: cada delay(1000) es un segundo de congelación para todos los clientes; desplaza las operaciones lentas al lado Linux si es posible.
Otros tutoriales para esta placa
- Premiers pas sur la Yún : Bridge, Console et LED
- Connecter la Yún au WiFi et piloter une broche depuis le navigateur
- Envoyer un capteur analogique sur le réseau : potentiomètre et Bridge REST
- runShellCommandOnLinux : faire exécuter des commandes Linux depuis le sketch
- L'API REST du Bridge en détail : /arduino, /data et routes personnalisées
- Alerte email : bouton sur la Yún et envoi via sendmail
Ejemplos de código para esta placa
clignotant-rest.inoArduinoconsole-bridge.inoArduinovaleurs-partagees.inoArduinoprocess-shell.inoArduinoserveur-json.inoArduinolecture-fichier.inoArduino