serveur-web-capteur.py
Sans aucune dépendance externe, la carte devient un serveur web : une page HTML affiche température du SoC et uptime, un endpoint JSON les expose aux tableaux de bord. Le réflexe réseau pour monitorer un SBC headless.
Matériel requis
Un ODROID-C4 (Amlogic S905X3, 4 Cortex-A55, 4 Go) sous Armbian ou Ubuntu Hardkernel, Ethernet gigabit, récepteur IR et connecteur 40 broches. Aucun composant ; la carte est déjà sur le réseau (câble ou Wi-Fi).
Câblage
Aucun câblage. Ouvrir le port 8080 si un pare-feu est actif ; connaître l'IP avec ip addr ou avahi (carte.local).
Fonctionnement
http.server sert un handler maison : do_GET choisit HTML ou JSON selon le chemin, lit sysfs/procfs à la volée. serve_forever boucle en acceptant les connexions.
Exécution
Sous Armbian (noyau mainline) : apt install gpiod python3-gpiod ; le C4 expose deux puces, gpio et gpio_ao (gpiodetect) — la LED bleue est d’ailleurs pilotable via /sys/class/leds.
Variantes
Ajouter des endpoints pour les capteurs (DHT, I2C), ou passer à Flask (pip install flask) pour du routage propre.
serveur-web-capteur.py
#!/usr/bin/env python3
# Mini serveur web (bibliotheque standard uniquement) : etat de la carte.
# http://<ip-de-la-carte>:8080/ -> page HTML
# http://<ip-de-la-carte>:8080/api -> mesures en JSON
import json
import time
from http.server import BaseHTTPRequestHandler, HTTPServer
def mesures():
with open("/sys/class/thermal/thermal_zone0/temp") as f:
temp = int(f.read()) / 1000.0
with open("/proc/uptime") as f:
uptime = float(f.read().split()[0])
return {"temperature_c": round(temp, 1),
"uptime_s": int(uptime),
"horodatage": time.strftime("%Y-%m-%dT%H:%M:%S%z")}
class Gestionnaire(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == "/api":
corps = json.dumps(mesures()).encode()
type_ = "application/json"
else:
m = mesures()
corps = (f"<h1>Carte : {m['temperature_c']} C</h1>"
f"<p>Uptime : {m['uptime_s']} s</p>").encode()
type_ = "text/html; charset=utf-8"
self.send_response(200)
self.send_header("Content-Type", type_)
self.end_headers()
self.wfile.write(corps)
if __name__ == "__main__":
print("Serveur sur le port 8080 (Ctrl-C pour arreter)")
HTTPServer(("0.0.0.0", 8080), Gestionnaire).serve_forever()