Écoute Forge IoT : forge iot:listen¶
Statut : commande de développement / pédagogie.
Elle écoute le broker MQTT configuré et insère chaque mesure reçue dans la tableiot_events.
Ce n'est pas un service de production (pas de daemon, pas de retry, pas de batch).
Objectif¶
Relier les briques Forge IoT en un flux local réellement utilisable :
Jusqu'ici, forge iot:simulate publiait des mesures, mais Forge n'avait pas de commande simple pour écouter et stocker.
C'est ce que comble forge iot:listen.
Usage¶
Aucune option pour ce premier ticket.
Aide via :
La commande reste active jusqu'à Ctrl+C, puis s'arrête proprement.
Sortie exemple¶
Forge IoT listen
[INFO] Broker MQTT : localhost:1883
[INFO] Topic : forge/+/+/telemetry
[INFO] Stockage : table iot_events via IotEventRepository
[INFO] En écoute. Ctrl+C pour arrêter.
[OK] atelier/esp32-001 temperature=22.4 °C
[OK] atelier/esp32-001 humidity=55 %
^C
[INFO] Arrêt demandé.
[OK] Écoute MQTT arrêtée proprement.
Résumé :
mesures reçues : 2
mesures stockées : 2
erreurs de contrat : 0
erreurs de stockage : 0
Chaque ligne [OK] correspond à une mesure validée par le contrat MQTT et insérée dans iot_events.
Arrêt propre¶
Sur Ctrl+C, la commande affiche [INFO] Arrêt demandé. puis, une fois la connexion fermée, [OK] Écoute MQTT arrêtée proprement..
La déconnexion du broker (disconnect) est toujours effectuée, même si l'écoute s'est interrompue sur une erreur.
Résumé de session¶
À l'arrêt, un petit résumé récapitule la session, utile en classe et pour le debug :
- mesures reçues : messages conformes au contrat MQTT ;
- mesures stockées : insertions réussies dans
iot_events; - erreurs de contrat : messages MQTT ignorés (payload ou topic invalide) ;
- erreurs de stockage : échecs d'insertion en base.
Message MQTT invalide¶
Un message qui ne respecte pas le contrat (topic mal formé, champ manquant, type incorrect…) est ignoré sans arrêter l'écoute :
Le code affiché (TOPIC_PATTERN, PAYLOAD_PARSE, PAYLOAD_FIELD_MISSING, PAYLOAD_FIELD_TYPE, PAYLOAD_VALUE_FORMAT) vient de la taxonomie du contrat MQTT.
Le compteur erreurs de contrat est incrémenté.
Contrairement à une erreur base, un message invalide ne fait pas tomber la commande : on continue d'écouter.
Parcours complet¶
forge iot:listen est le maillon central d'un flux qui réutilise toutes les commandes IoT déjà disponibles :
forge iot:doctor # package, config, migration, API HTTP
forge iot:init # copier la migration vers mvc/migrations/
forge migration:apply # créer la table iot_events
forge iot:doctor --db # confirmer que la table est lisible
forge iot:doctor --mqtt # confirmer que le broker répond
forge iot:listen # écouter et stocker (laisser tourner)
Dans un second terminal, publie des mesures :
Les mesures apparaissent dans le terminal forge iot:listen ([OK] …), puis sont lisibles via l'API HTTP :
Gestion des erreurs¶
Configuration invalide¶
Exit code 1.
Voir Configuration Forge IoT.
Broker inaccessible¶
Exit code 1.
Le broker n'est pas démarré ou l'hôte/port est faux ; diagnostique avec forge iot:doctor --mqtt.
Pour installer et lancer un broker local, voir Mosquitto local.
Erreurs base¶
La commande s'arrête au premier échec base (exit code 1), volontairement simple et pédagogique, et distingue trois cas, message sobre (jamais de stacktrace) :
Table iot_events absente :
Crée la table (forge iot:init puis forge migration:apply) puis relance forge iot:listen.
Connexion base impossible (MariaDB arrêté, mauvais identifiants, base inconnue…) :
Autre erreur SQL (cas générique) :
Connexion TLS¶
forge iot:listen bénéficie du TLS via le MqttSubscriber : si FORGE_IOT_MQTT_TLS_ENABLED=true, le subscriber appelle client.tls_set(...) avant de se connecter (ca_certs = FORGE_IOT_MQTT_TLS_CA_FILE si fourni, sinon les certificats système).
Pense à configurer aussi le port TLS du broker (généralement 8883) :
export FORGE_IOT_MQTT_HOST="mqtt.example.net"
export FORGE_IOT_MQTT_PORT="8883"
export FORGE_IOT_MQTT_TLS_ENABLED="true"
export FORGE_IOT_MQTT_TLS_CA_FILE="/etc/ssl/certs/mosquitto-ca.crt"
forge iot:listen
Sans TLS (défaut), la connexion reste en clair, adapté au Mosquitto local.
Détails : Configuration : TLS MQTT.
Limites¶
forge iot:listen est conçue pour le développement et la pédagogie, pas pour la production.
Sont hors périmètre :
- pas de daemon systemd ni de mode service ;
- pas de file d'attente, de retry/backoff, ni de batch insert ;
- pas de stockage multi-thread ;
- pas d'authentification avancée (mTLS, ACL côté broker) ;
- ne lance pas le simulateur (voir
forge iot:simulate) ; - ne modifie ni l'API HTTP ni le contrat MQTT.
Pour un déploiement réel, on brancherait MqttSubscriber dans un processus supervisé de l'application, ce qui dépasse ce ticket.