Dernière mise à jour : 06 Mai 2026
Projet : Smart City Digital Twin Martinique
Architecture : IoT-Agent intégré, QuantumLeap + CrateDB
pour l’analyse avancée
graph TB
subgraph Simulateur["🖥️ Simulateur (Host Python)"]
SIM[Smart City Simulator<br/>10 capteurs<br/>Intervalle: configurable]
end
subgraph MQTT_Brokers["📡 MQTT Brokers"]
EMQ[EMQX<br/>port 11883]
MOS[Mosquitto<br/>port 1883]
BUN[BunkerM<br/>port 1900<br/>MQTTS/TLS]
end
subgraph IoT_Agent["🤖 IoT Agent (NGSI-LD)"]
IOTA[IoT Agent JSON<br/>port 4041<br/>Transforme MQTT → NGSI-LD]
end
subgraph CB["🔗 Context Brokers (NGSI-LD)"]
ORI[Orion-LD<br/>NGSI-LD<br/>port 1026]
STE[Stellio<br/>NGSI-LD<br/>port 8080]
FRO[FROST-Server<br/>SensorThings<br/>port 8080]
end
subgraph Analytics["📈 Analytics & Time-Series"]
QL[QuantumLeap<br/>NGSI-LD → CrateDB<br/>port 8668]
CRATEDB[CrateDB<br/>PostgreSQL-compatible<br/>port 4200/5432]
end
subgraph Storage["💾 Stockage & Métriques"]
INF[InfluxDB<br/>Bucket: iot_data<br/>port 8086]
PRO[Prometheus<br/>Scrape: /metrics<br/>port 9090]
GEO[GeoServer<br/>WMS/WFS/WMTS<br/>port 8080]
end
subgraph IoT_Platform["🏢 Plateforme IoT"]
ORM[OpenRemote Manager<br/>MQTT Agent<br/>port 8080]
KC[Keycloak<br/>port 8080]
end
subgraph VIZ["📊 Visualisation"]
GRA[Grafana<br/>Dashboards<br/>port 3001]
MAP[MapStore<br/>WMS/WFS<br/>port 8080]
end
%% ── Flux Simulateur ──────────────────────────────────────────
SIM -->|"1️⃣ MQTT publish<br/>city/sensors/{type}/{id}"| EMQ
SIM -->|"1️⃣ MQTT publish"| MOS
SIM -->|"1️⃣ MQTT publish"| BUN
SIM -->|"5️⃣ InfluxDB v2 API<br/>async non-bloquant"| INF
%% ── Flux MQTT → IoT Agent ──────────────────────────────────
EMQ -->|"MQTT subscribe<br/>city/sensors/#"| IOTA
MOS -->|"MQTT subscribe"| IOTA
BUN -->|"MQTT subscribe"| IOTA
%% ── Flux IoT Agent → Context Brokers ───────────────────────
IOTA -->|"2️⃣ NGSI-LD POST<br/>/ngsi-ld/v1/entities"| ORI
IOTA -->|"2️⃣ NGSI-LD POST"| STE
%% ── Flux Context Brokers → QuantumLeap ───────────────────
ORI -->|"NGSI-LD Subscription<br/>→ QuantumLeap"| QL
STE -->|"NGSI-LD Subscription<br/>→ QuantumLeap"| QL
%% ── Flux QuantumLeap → CrateDB ────────────────────────────
QL -->|"Insert<br/>PostgreSQL wire"| CRATEDB
%% ── Visualisation ───────────────────────────────────────────
CRATEDB -->|"PostgreSQL Datasource"| GRA
INF -->|"Datasource Flux IoT"| GRA
ORI -->|"NGSI-LD Datasource"| GRA
STE -->|"NGSI-LD Datasource"| GRA
GEO -->|"WMS/WMTS"| MAP
ORM -->|MapSettings<br/>Martinique| MAP
ORM -->|"Live assets<br/>REST"| GRA
%% ── OpenRemote MQTT Agent ───────────────────────────────────
EMQ -->|"6️⃣ Subscribe<br/>city/sensors/#"| ORM
MOS -->|"6️⃣ Subscribe"| ORM
BUN -->|"6️⃣ Subscribe"| ORM
%% ── Métriques Prometheus ────────────────────────────────────
SIM -->|"7️⃣ /metrics<br/>port 8001"| PRO
EMQ -->|"/api/v5/metrics"| PRO
STE -->|"/actuator/prometheus"| PRO
INF -->|"/metrics"| PRO
ORM -->|"/actuator/prometheus"| PRO
GRA -->|"/metrics"| PRO
IOTA -->|"/metrics"| PRO
QL -->|"/metrics"| PRO
| Broker | Port | Protocol | Topics |
|---|---|---|---|
| EMQX | 11883 | MQTT | city/sensors/{type}/{id} |
| Mosquitto | 1883 | MQTT | city/sensors/{type}/{id} |
| BunkerM | 1900 | MQTTS (TLS) | city/sensors/{type}/{id} |
Le simulateur publie simultanément sur les 3 brokers vers IoT Agent.
IoT Agent JSON : Réception MQTT → Transformation en entités NGSI-LD
Port : 4041
Configuration :
# Enregistrement service
curl -X POST http://localhost:4041/iot/services \
-H 'Content-Type: application/json' \
-H 'fiware-service: smartcity' \
-d '{"services": [{"apikey": "smartcity-api-key", "cbroker": "http://orion-ld:1026", "entity_type": "Device", "ngsi_version": "ld"}]}'Entités créées dans : Orion-LD (port 1026) et Stellio (port 8080)
http://localhost:8086/api/v2/writeiot_datadigitribeL’agent MQTT d’OpenRemote souscrit aux topics
city/sensors/# sur les brokers MQTT. Les payloads sont
automatiquement parsés et les attributs des assets sont mis à jour.
| Service | Endpoint /metrics |
Statut |
|---|---|---|
| Simulator | localhost:8001 |
✅ |
| EMQX | emqx_emqx_1:8081/api/v5/metrics |
✅ |
| Stellio | stellio-api-gateway:8080/actuator/prometheus |
✅ |
| InfluxDB | smart-city-influxdb:8086/metrics |
✅ |
| OpenRemote | openremote-manager-1:8080/actuator/prometheus |
✅ |
| Grafana | smart-city-grafana:3000/metrics |
✅ |
| IoT Agent | iot-agent:4041/metrics |
⚠️ À vérifier |
| QuantumLeap | quantum-leap:8668/metrics |
⚠️ À vérifier |
IOTA_MONGO_URL=mongodb://mongodb:27017/iotagent| Composant | Technologie | Port | Statut |
|---|---|---|---|
| Simulator | Python + paho-mqtt | Host:8001 (metrics) | ✅ Actif |
| EMQX | MQTT Broker | 11883 | ✅ Connecté |
| Mosquitto | MQTT Broker | 1883 | ✅ Connecté |
| BunkerM | MQTTS Broker | 1900 | ✅ Connecté |
| IoT Agent | NGSI-LD Bridge | 4041 | ❌ Erreur MongoDB |
| Orion-LD | NGSI-LD Broker | 1026 | ⚠️ À vérifier |
| Stellio | NGSI-LD Broker | 8080 | ⚠️ Ports occupés par OpenRemote |
| FROST-Server | SensorThings API | 8080 | ⚠️ À vérifier |
| QuantumLeap | NGSI-LD → CrateDB | 8668 | ✅ Interne |
| CrateDB | PostgreSQL Time-Series | 4200/5432 | ✅ Opérationnel |
| OpenRemote | IoT Platform | 8080 | ⚠️ 403 (Service Account) |
| InfluxDB | Time Series DB | 8086 | ✅ Bucket iot_data |
| Grafana | Visualisation | 3001 | ✅ Dashboards + CrateDB |
| GeoServer | Geo Data | 8080 | ✅ REST OK |
| MapStore | Cartographie | 8080 | ✅ WMS/WMTS |
IOTA_MONGO_URLENABLE_PULSAR=false (recommandé)# Vérifier IoT Agent
curl -s http://localhost:4041/iot/services -H 'fiware-service: smartcity'
# Vérifier QuantumLeap
curl -s http://localhost:8668/version
# Vérifier CrateDB
psql -h localhost -p 5432 -U crate -c "SELECT * FROM ql_entities LIMIT 5;"
# Vérifier Orion-LD
curl -s http://localhost:1026/version
# Voir les logs IoT Agent
docker logs smart-city-iot-agent --tail 30Fichiers associés : - Simulateur :
~/smart-city-digital-twin-martinique/simulator.py -
Dashboard Grafana :
~/smart-city-digital-twin-martinique/grafana_dashboard_smartcity.json
- Ce diagramme :
~/smart-city-digital-twin-martinique/data-flow-diagram.md -
Session Resume :
~/smart-city-digital-twin-martinique/session_resume_2026-05-07.md