Fleet management¶
Gérer dix devices manuellement est faisable ; gérer mille devices sans orchestration est impossible — le fleet management industrialise le cycle de vie complet de chaque appareil.
Le problème d'échelle¶
Un déploiement IoT démarre souvent modestement — vingt capteurs, une gateway, un serveur. Puis l'infrastructure grandit : 200 capteurs sur trois sites, 15 gateways, des smartphones de terrain, des tablettes de supervision. La gestion manuelle, qui fonctionnait en phase pilote, devient un gouffre opérationnel.
Sans outillage de fleet management, chaque opération banale devient un problème :
- Reconfiguration : changer l'adresse du broker MQTT sur tous les devices implique une connexion SSH manuelle sur chaque gateway, ou un accès physique à chaque capteur.
- Diagnostics : identifier quel device présente un problème nécessite de parcourir des dizaines de logs dispersés.
- Mises à jour : déployer un patch de sécurité sur 500 devices sans procédure automatisée prend plusieurs jours.
- Conformité : vérifier que tous les devices exécutent la bonne version du firmware est impossible sans inventaire centralisé.
Le fleet management répond à ces défis en établissant un jumeau numérique (device twin) pour chaque appareil et en offrant des primitives de gestion à l'échelle.
Cycle de vie d'un device¶
stateDiagram-v2
[*] --> Fabrication : Commande / réception
Fabrication --> Provisioning : Configuration initiale
Provisioning --> Enregistrement : Certificat + identité
Enregistrement --> Déploiement : Installation terrain
Déploiement --> Actif : Premier heartbeat reçu
Actif --> Maintenance : Anomalie détectée
Maintenance --> Actif : Intervention terminée
Actif --> MiseAJour : OTA déclenchée
MiseAJour --> Actif : Mise à jour réussie
MiseAJour --> Maintenance : Mise à jour échouée
Actif --> Suspendu : Désactivation temporaire
Suspendu --> Actif : Réactivation
Actif --> Décommissionnement : Fin de vie
Maintenance --> Décommissionnement : Non réparable
Décommissionnement --> [*] : Certificats révoqués, données archivées Provisioning zero-touch¶
Le provisioning zero-touch permet de configurer un device sans aucune interaction manuelle lors de son premier démarrage sur site. Le device se connecte, s'authentifie, et reçoit automatiquement sa configuration complète.
Mécanisme de provisioning par certificat X.509¶
Le workflow standard pour les gateways Linux et les MCU connectés :
Phase manufacture (usine ou entrepôt)
- Générer une paire de clés asymétriques sur le device (idéalement dans un TPM ou un élément sécurisé)
- Créer une Certificate Signing Request (CSR) contenant l'identifiant de l'appareil (numéro de série, MAC address)
- Signer la CSR avec la CA de l'entreprise → certificat device
- Enregistrer le certificat dans le serveur de fleet management
- Graver le certificat et la clé privée sur le device (stockage sécurisé)
Phase déploiement (terrain)
- Le device démarre et se connecte au réseau
- Il contacte le point de provisioning (DPS — Device Provisioning Service) via MQTT TLS
- Le DPS vérifie le certificat (signé par la CA connue)
- Le DPS renvoie la configuration initiale : endpoint MQTT de production, configuration réseau, paramètres applicatifs
- Le device s'enregistre auprès du fleet management et commence à reporter son état
# Extrait : client de provisioning sur une gateway Linux
import ssl
import paho.mqtt.client as mqtt
import json
def provision_device(device_id: str, cert_path: str, key_path: str, ca_path: str):
"""
Connexion au service de provisioning et récupération de la config initiale.
Le device s'authentifie par certificat client X.509.
"""
client = mqtt.Client(client_id=device_id, protocol=mqtt.MQTTv5)
# Authentification mutuelle TLS
client.tls_set(
ca_certs=ca_path,
certfile=cert_path,
keyfile=key_path,
tls_version=ssl.PROTOCOL_TLS_CLIENT
)
received_config = {}
def on_message(client, userdata, msg):
nonlocal received_config
received_config = json.loads(msg.payload)
print(f"[PROVISION] Config reçue : {received_config}")
client.disconnect()
def on_connect(client, userdata, flags, rc, properties):
# S'abonner au topic de réponse avant de publier la demande
client.subscribe(f"provision/response/{device_id}")
client.publish(f"provision/request", json.dumps({
"device_id": device_id,
"firmware_version": "2.3.1",
"hardware_revision": "B"
}))
client.on_connect = on_connect
client.on_message = on_message
client.connect("dps.industrial.local", 8883)
client.loop_forever(timeout=30.0)
return received_config
Device twins et desired state¶
Le concept de device twin (jumeau de device) est central dans les plateformes de fleet management modernes (AWS IoT Core, Azure IoT Hub, Thingsboard). Il représente l'état d'un device sous deux faces :
- Reported state : l'état tel que le device le rapporte actuellement (firmware installé, température CPU, configuration active, connectivité)
- Desired state : l'état que l'opérateur souhaite atteindre (firmware cible, configuration souhaitée, paramètres de reporting)
Le fleet management réconcilie en permanence ces deux états. Si un device est hors ligne, le desired state est mis en attente et appliqué dès la reconnexion.
{
"device_id": "gateway-usine-nord-07",
"reported": {
"firmware_version": "2.3.0",
"config_hash": "a3f8c2d1",
"uptime_s": 1847203,
"cpu_temp_c": 52.3,
"memory_free_mb": 892,
"mqtt_broker": "mqtt-prod-01.industrial.local:8883",
"reporting_interval_s": 60,
"connected_devices": 47,
"last_seen": "2026-04-15T09:12:33Z"
},
"desired": {
"firmware_version": "2.4.0",
"config_hash": "b5e9d4f2",
"reporting_interval_s": 30,
"mqtt_broker": "mqtt-prod-02.industrial.local:8883"
},
"delta": {
"firmware_version": "2.3.0 → 2.4.0",
"config_hash": "a3f8c2d1 → b5e9d4f2",
"reporting_interval_s": "60 → 30"
}
}
Le device souscrit à son topic de desired state et applique les changements de configuration dès réception. Si le changement implique une mise à jour firmware, il déclenche le processus OTA (voir chapitre suivant).
Groupes et politiques¶
Un fleet manager industriel ne gère pas les devices un par un — il les organise en groupes et applique des politiques à ces groupes.
Taxonomie de groupes¶
graph TD
ROOT[Flotte globale\n1 247 devices] --> SITE1[Site Usine Nord\n412 devices]
ROOT --> SITE2[Site Usine Sud\n387 devices]
ROOT --> SITE3[Site Logistique\n448 devices]
SITE1 --> GW1[Gateways\n18 devices]
SITE1 --> SENS1[Capteurs\n347 devices]
SITE1 --> MOBILE1[Mobiles terrain\n47 devices]
GW1 --> GW_PROD[Gateways production\n12 devices]
GW1 --> GW_UTIL[Gateways utilités\n6 devices]
GW_PROD --> CANARY[Canary group\n1 device\npour tests OTA]
GW_PROD --> STABLE[Stable group\n11 devices] Politiques de groupe¶
Chaque groupe porte une politique qui définit :
- La version firmware cible
- L'intervalle de reporting
- La retention des logs locaux
- Les règles d'alerte spécifiques au groupe
- Les plages de maintenance autorisées (fenêtres de mise à jour)
# Politique appliquée au groupe "Gateways production — Usine Nord"
group_id: gw-prod-usine-nord
firmware:
target_version: "2.4.0"
update_window:
- weekday: saturday
time_utc: "02:00–04:00"
rollout:
canary_pct: 10 # 10 % des devices d'abord
canary_wait_h: 48 # attendre 48 h avant rollout complet
auto_rollback_on_error_rate: 5 # rollback si > 5 % d'erreurs
reporting:
interval_s: 30
heartbeat_interval_s: 60
alerts:
cpu_temp_threshold_c: 75
memory_free_min_mb: 200
device_silence_timeout_min: 5
Tableaux de bord d'état de flotte¶
Un bon fleet manager expose une vue d'état synthétique qui répond à la question de l'opérateur : "est-ce que tout va bien, et si non, où est le problème ?"
| Indicateur | Valeur typique saine | Seuil d'alerte |
|---|---|---|
| Devices actifs / total | 99,5 % | < 95 % |
| Devices à jour (firmware) | 100 % | < 90 % |
| Devices avec erreurs actives | 0 % | > 1 % |
| Latence moyenne heartbeat | < 5 s | > 30 s |
| Queue de messages en attente | < 1 000 | > 10 000 |
| Provisioning en attente | 0 | > 0 depuis > 1 h |
Outils de fleet management open-source et commerciaux¶
| Outil | Type | Points forts | Limite |
|---|---|---|---|
| Thingsboard | Open-source / Cloud | Device twins, règles, dashboards | Complexité de déploiement |
| AWS IoT Core | Cloud AWS | Scalabilité, intégration AWS | Dépendance cloud, coût |
| Azure IoT Hub | Cloud Azure | Excellent MDM, Edge support | Dépendance Microsoft |
| Mender | Open-source | Spécialisé OTA Linux | Limité au firmware uniquement |
| Balena | Cloud / Autopilot | Fleet de conteneurs Linux | Coût, lock-in |
| Eclipse Hawkbit | Open-source | OTA pour MCU et Linux | Interface basique |
| Home Assistant | Open-source | Intégration protocoles larges | Non industriel |
Ce qu'il faut retenir¶
- Le device twin est l'abstraction centrale du fleet management : il sépare l'état reported (réel) du desired state (souhaité) et gère la réconciliation automatique.
- Le provisioning zero-touch par certificat X.509 est la base sécurisée pour l'enregistrement automatique de devices à grande échelle.
- Les groupes et politiques permettent d'appliquer des configurations et des stratégies de mise à jour à des centaines de devices en une seule opération.
- Le cycle de vie complet (fabrication → provisioning → déploiement → maintenance → décommissionnement) doit être tracé dans le fleet manager.
Chapitre suivant : Mises à jour OTA — déployer des firmwares en production sans couper le service ni risquer de bricker des devices terrain.