237 lines
9.3 KiB
Markdown
237 lines
9.3 KiB
Markdown
# Smart City Digital Twin Martinique — Diagramme des Flux de Données
|
||
|
||
**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
|
||
|
||
---
|
||
|
||
## Architecture Globale (Mise à jour 06/05/2026)
|
||
|
||
```mermaid
|
||
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
|
||
```
|
||
|
||
---
|
||
|
||
## Flux Détaillés (Mise à jour 06/05/2026)
|
||
|
||
### 1️⃣ Flux MQTT — Brokers
|
||
| 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**.
|
||
|
||
### 2️⃣ Flux IoT Agent — NGSI-LD
|
||
- **IoT Agent JSON** : Réception MQTT → Transformation en entités NGSI-LD
|
||
- **Port** : `4041`
|
||
- **Configuration** :
|
||
```bash
|
||
# 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)
|
||
|
||
### 3️⃣ Flux Context Brokers → QuantumLeap → CrateDB
|
||
1. **Orion-LD** / **Stellio** : Reçoivent les entités NGSI-LD de IoT Agent
|
||
2. **QuantumLeap** (port 8668) : Souscrit aux mises à jour NGSI-LD via Subscription
|
||
3. **CrateDB** (port 5432/4200) : Stockage temporel PostgreSQL-compatible
|
||
4. **Grafana** : Dashboards connectés à CrateDB (PostgreSQL datasource)
|
||
|
||
### 4️⃣ Flux InfluxDB — Temps Réel
|
||
- **API** : `http://localhost:8086/api/v2/write`
|
||
- **Bucket** : `iot_data`
|
||
- **Org** : `digitribe`
|
||
- **Mode** : Asynchrone (thread daemon) pour ne pas bloquer le publish MQTT
|
||
|
||
### 5️⃣ OpenRemote — MQTT Agent
|
||
L'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.
|
||
|
||
### 6️⃣ Flux Prometheus — Métriques
|
||
| 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 |
|
||
|
||
---
|
||
|
||
## Nouveaux Composants (06/05/2026)
|
||
|
||
### 🤖 IoT Agent JSON
|
||
- **Rôle** : Pont entre MQTT et NGSI-LD (Orion-LD / Stellio)
|
||
- **Port** : 4041
|
||
- **Statut** : ❌ En cours de réparation (erreur MongoDB)
|
||
- **Correction** : Fournir `IOTA_MONGO_URL=mongodb://mongodb:27017/iotagent`
|
||
|
||
### 📈 QuantumLeap
|
||
- **Rôle** : Analytics NGSI-LD → CrateDB
|
||
- **Port** : 8668
|
||
- **Statut** : ✅ Fonctionnel (interne), port non exposé sur l'hôte
|
||
- **Action** : Exposer le port dans docker-compose
|
||
|
||
### 🗄️ CrateDB
|
||
- **Rôle** : Base de données temporelle PostgreSQL-compatible
|
||
- **Port** : 4200 (UI), 5432 (PostgreSQL)
|
||
- **Statut** : ✅ Opérationnel
|
||
- **Usage** : Stockage des séries temporelles depuis QuantumLeap
|
||
|
||
---
|
||
|
||
## Tableau Récapitulatif (Mise à jour)
|
||
|
||
| 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 |
|
||
|
||
---
|
||
|
||
## Actions Prioritaires
|
||
|
||
1. **Corriger IoT Agent** : Ajouter MongoDB et configurer `IOTA_MONGO_URL`
|
||
2. **Exposer QuantumLeap** : Mapper le port 8668 dans docker-compose
|
||
3. **Déployer Orion-LD** : Créer le service s'il n'existe pas
|
||
4. **Libérer les ports** : Résoudre le conflit Stellio/OpenRemote sur le port 8080
|
||
5. **Configurer CrateDB** : Créer les tables pour QuantumLeap
|
||
6. **Mettre à jour le simulateur** : `ENABLE_PULSAR=false` (recommandé)
|
||
|
||
---
|
||
|
||
## Commandes Utiles
|
||
|
||
```bash
|
||
# 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 30
|
||
```
|
||
|
||
---
|
||
|
||
**Fichiers 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`
|