📡 IoT

iot-mqtt-architect

Architecture de messaging IoT avec MQTT incluant brokers, topics, QoS, sécurité et patterns.

⚡ Installation & lancement en 1 commande

Copiez-collez dans votre terminal : le skill s'installe dans ~/.claude/skills et Claude Code se lance directement dessus.

macOS / Linux
curl -fsSL https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.sh | sh -s -- iot-mqtt-architect --launch
Windows (PowerShell)
iex "& { $(iwr -useb https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.ps1) } iot-mqtt-architect -Launch"

🚀 Déjà installé ?

claude "/iot-mqtt-architect"

Ou tapez /iot-mqtt-architect dans une session Claude Code, ou décrivez simplement votre besoin — le skill se déclenche automatiquement via le skill-router.

🔑 Déclencheurs automatiques

Le skill s'active automatiquement quand votre demande contient :

MQTTbroker MQTTMosquittoIoT messagingtopic MQTTQoS

📦 Installation manuelle

git clone https://github.com/khalilbenaz/claude-skills-collection.git cp -r claude-skills-collection/skills/iot-mqtt-architect ~/.claude/skills/

Payload du plugin : skills/iot-mqtt-architect · source éditable : iot-skills/mqtt-architect

📖 Manuel

MQTT Architect

Workflow

1. Cadrage du système IoT

Recueillir avant toute conception :

Critère de décision broker :

ContexteBroker recommandé
Dev/petit projet (<1000 appareils)Mosquitto
Production scalable (>10k appareils)EMQX ou HiveMQ
Cloud managé sans opsAWS IoT Core, Azure IoT Hub
Edge gateway localMosquitto ou NanoMQ

2. Conception de la hiérarchie de topics

Schéma canonique recommandé :

{organisation}/{site}/{zone}/{device_id}/{metric}

Exemples concrets :

acme/tunis/atelier-a/machine-42/temperature
acme/tunis/atelier-a/machine-42/status
acme/paris/entrepot/capteur-07/humidity
acme/+/+/+/status          # wildcard single-level
acme/#                     # wildcard multi-level (usage monitoring)

Règles de nommage :

``` cmd/{device_id}/restart # commande → appareil tel/{device_id}/uptime # télémétrie → broker ```

3. Choix du niveau QoS

QoSGarantieCas d'usageCoût réseau
0Au plus une fois (fire & forget)Télémetrie haute fréquence, températureMinimal
1Au moins une fois (avec ack)Alertes, événements métierMoyen
2Exactement une fois (4-way handshake)Facturation, ordres critiques, actionneursÉlevé

Règle pratique : 80 % des topics → QoS 0 ; monter uniquement si la perte est inacceptable.

4. Configuration du broker (Mosquitto)

Installation Debian/Ubuntu :

apt install mosquitto mosquitto-clients

Fichier /etc/mosquitto/mosquitto.conf minimal sécurisé :

listener 8883
cafile   /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile  /etc/mosquitto/certs/server.key
require_certificate true
tls_version tlsv1.3

allow_anonymous false
password_file /etc/mosquitto/passwd
acl_file      /etc/mosquitto/acl

persistence true
persistence_location /var/lib/mosquitto/
log_dest file /var/log/mosquitto/mosquitto.log
log_type all

Créer un utilisateur :

mosquitto_passwd -c /etc/mosquitto/passwd device01

Fichier ACL (/etc/mosquitto/acl) :

# device01 ne publie que sur ses propres topics
user device01
topic write tel/device01/#
topic read  cmd/device01/#

Tester la connexion TLS :

mosquitto_pub -h broker.example.com -p 8883 \
  --cafile ca.crt --cert client.crt --key client.key \
  -u device01 -P secret \
  -t "tel/device01/temperature" -m '{"v":22.5,"ts":1719220000}'

5. Sécurité

Checklist obligatoire en production :

Rotation de mot de passe sans redémarrage Mosquitto :

mosquitto_passwd /etc/mosquitto/passwd device01
kill -HUP $(pidof mosquitto)

6. Implémentation client (Python — paho-mqtt)

import paho.mqtt.client as mqtt
import ssl, json, time

BROKER = "broker.example.com"
PORT   = 8883
TOPIC  = "tel/device01/temperature"

def on_connect(client, userdata, flags, rc, props=None):
    if rc == 0:
        print("Connecté")
        client.subscribe("cmd/device01/#", qos=1)
    else:
        print(f"Erreur connexion : {rc}")

def on_disconnect(client, userdata, rc, props=None):
    print(f"Déconnecté ({rc}), reconnexion auto...")

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="device01")
client.tls_set(ca_certs="ca.crt", certfile="client.crt", keyfile="client.key",
               tls_version=ssl.PROTOCOL_TLS_CLIENT)
client.username_pw_set("device01", "secret")

# Last Will Testament — détection déconnexion inattendue
client.will_set("tel/device01/status", payload='{"online":false}', qos=1, retain=True)

client.on_connect    = on_connect
client.on_disconnect = on_disconnect
client.connect(BROKER, PORT, keepalive=60)
client.loop_start()

# Publication périodique
while True:
    payload = json.dumps({"v": 22.5, "ts": int(time.time())})
    client.publish(TOPIC, payload, qos=0)
    time.sleep(5)

7. Patterns avancés

Request / Response (MQTT 5 response_topic) :

# Publisher envoie avec response_topic
props = mqtt.Properties(mqtt.PacketTypes.PUBLISH)
props.ResponseTopic = "response/device01/restart"
client.publish("cmd/device01/restart", "{}", qos=1, properties=props)

Shared Subscriptions (consommateurs multiples, EMQX/HiveMQ) :

$share/groupe-workers/tel/+/temperature

Charge répartie entre tous les subscribers du groupe — équivalent Kafka consumer group.

Bridge entre brokers (site → cloud) dans mosquitto.conf :

connection cloud-bridge
address cloud.example.com:8883
topic tel/# out 1
topic cmd/# in  1
remote_username bridge_user
remote_password secret
bridge_cafile /etc/mosquitto/certs/ca.crt

Retained messages — état courant accessible aux nouveaux subscribers :

mosquitto_pub -r -t "tel/device01/status" -m '{"online":true}' -q 1

8. Monitoring

Topics $SYS natifs Mosquitto :

mosquitto_sub -t '$SYS/#' -v
# $SYS/broker/clients/connected
# $SYS/broker/messages/received
# $SYS/broker/publish/messages/dropped

Intégration Prometheus via mqtt_exporter :

docker run -d -p 9234:9234 \
  -e MQTT_BROKER_HOST=broker.example.com \
  -e MQTT_BROKER_PORT=8883 \
  hikhvar/mqtt2prometheus:latest

Alertes critiques à configurer :

Anti-patterns et pièges

PiègeConséquenceCorrection
Port 1883 exposé sans TLSInterception de tous les messagesForcer 8883 + TLS dès le départ
Topic unique pour tout (ex: data/all)Impossibilité de filtrer, surcharge subscribersGranularité topic = 1 métrique
QoS 2 partoutLatence x4, congestion en masseQoS 2 uniquement pour actionneurs critiques
Client ID dupliquéDéconnexions en boucle des deux clientsUUID ou MAC par appareil
allow_anonymous true en prodN'importe qui peut publier/souscrireAuthentification obligatoire
Payload non structuré (valeur brute)Évolution impossibleJSON {"v": 22.5, "ts": 1719220000, "unit": "C"}
Absence de Last WillDéconnexions silencieuses non détectéeswill_set systématique sur topic status
Topics avec espaces ou majusculesInconsistances, bugs clientsConvention : snake_case ou kebab-case

Bonnes pratiques 2026