🛠 Serveur web embarqué : YunServer, YunClient et pages dynamiques
Objectifs
Sortir de l'API REST générique pour écrire VOTRE serveur web : la bibliothèque YunServer ouvre un port TCP côté Linux (via le démon avrbridge) et YunClient représente chaque connexion. Vous allez servir une page HTML + un endpoint JSON lus par un capteur réel, en comprenant que le HTTP est traité par Linux et que le 32U4 reste le seul à toucher les broches.
Matériel
- 1 Arduino Yún en ligne
- 1 capteur analogique sur A1 (potentiomètre ou LDR + 10 kΩ en pont diviseur)
- Navigateur sur le même réseau
- Notions de HTTP (requête/response, Content-Type) suffisantes
Code complet
// 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(",\"unité\":\"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"));
}
}
Vérification attendue
0 renvoie un JSON avec la lecture 0–1023 du capteur, rafraîchie à chaque requête. curl -v` montre l'en-tête Connection: close et une connexion propre. Ouvrez deux onglets : YunServer sérialise les requêtes — une requête bloquante (sleep mal placé) gèle le site, d'où l'exigence de handlers courts.
Erreurs fréquentes
- Oublier de vider les en-têtes : les lignes restantes sont avalées par votre parseur de chemin — le symptôme classique est un chemin qui commence par « User-Agent ».
- Oublier client.stop : les connexions s'empilent, le serveur sature après quelques rafraîchissements.
- Écrire la réponse sans \r\n\r\n final : le navigateur affiche « en attente » éternellement.
- Vouloir du long-polling ou des WebSockets avec YunServer : le modèle est requête/réponse courte ; pour du temps réel, poller le JSON toutes les 500 ms reste le plus simple (les exemples YunWebsocket de l'IDE explorent une autre piste côté Linux).
- Confondre listenOnLocalhost et listenOnAllIPs : par défaut le port n'est joignable QUE depuis Linux lui-même (donc depuis le réseau via le proxy uhttpd sur 8080) — listenOnAllIPs expose le port brut, à double tranchant.
- Bloquer dans process : chaque delay(1000) est un second de gel pour tous les clients ; déportez le lent côté Linux si possible.
Autres tutoriels pour cette carte
- 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
Exemples de code pour cette carte
clignotant-rest.inoArduinoconsole-bridge.inoArduinovaleurs-partagees.inoArduinoprocess-shell.inoArduinoserveur-json.inoArduinolecture-fichier.inoArduino