Recon MLAT Module¶
Le module MLAT (Multilateration) permet le positionnement de devices sans fil en utilisant la triangulation RSSI depuis plusieurs ESP32.
Configuration
Activer dans menuconfig:
Principe de Fonctionnement¶
Multilatération RSSI¶
La multilatération utilise les mesures de puissance du signal (RSSI) depuis plusieurs points connus pour estimer la position d'un émetteur.
┌─────────────────────────────────────────────┐
│ Zone de Couverture │
│ │
│ ESP32-A ●────────────────────● ESP32-B │
│ (0,0) │ RSSI: -45 │ (10,0) │
│ │ │ │
│ │ │ │
│ │ ┌──────┐ │ │
│ │ │ │ │ │
│ └───►│Target│◄───────┘ │
│ RSSI: -52 │ MAC │ RSSI: -48 │
│ └──────┘ │
│ ▲ │
│ │ │
│ │ RSSI: -55 │
│ │ │
│ ● ESP32-C │
│ (5,8) │
│ │
└─────────────────────────────────────────────┘
Position estimée = f(RSSI_A, RSSI_B, RSSI_C, positions connues)
Formule de Distance¶
La distance est estimée à partir du RSSI:
distance = 10 ^ ((TxPower - RSSI) / (10 * n))
Où:
- TxPower = RSSI à 1 mètre (-50 à -60 dBm typique)
- RSSI = Signal reçu
- n = Coefficient d'atténuation (2.0 en espace libre, 2.5-4.0 en intérieur)
Modes de Scan¶
| Mode | Technologie | Avantages | Inconvénients |
|---|---|---|---|
| BLE | Bluetooth LE | Précis, basse conso | Portée limitée (~10m) |
| WiFi | 802.11 Promiscuous | Longue portée | Moins précis, plus de bruit |
Architecture¶
┌─────────────────────────────────────────────────────────────────────┐
│ MLAT SYSTEM │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ ESP32-A │ │ ESP32-B │ │ ESP32-C │ │
│ │ Scanner │ │ Scanner │ │ Scanner │ │
│ │ │ │ │ │ │ │
│ │ Position: │ │ Position: │ │ Position: │ │
│ │ GPS(48.8,2.3)│ │ GPS(48.8,2.4)│ │ Local(5,8) │ │
│ │ │ │ │ │ │ │
│ │ Mode: BLE │ │ Mode: BLE │ │ Mode: WiFi │ │
│ │ Target: MAC │ │ Target: MAC │ │ Target: MAC │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ │ MLAT:G;48.8;2.3;-52 │ │
│ │ │ MLAT:G;48.8;2.4;-48 │
│ │ │ │ MLAT:L;5;8;-55 │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ C3PO SERVER │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────────┐ ┌────────────────┐ │ │
│ │ │ MLAT Engine │─►│ Position Solver │─►│ Web Dashboard │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ Collect │ │ Trilateration │ │ Map Display │ │ │
│ │ │ Aggregate │ │ Least Squares │ │ Live Updates │ │ │
│ │ └─────────────┘ └─────────────────┘ └────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
Systèmes de Coordonnées¶
Mode GPS (Outdoor)¶
Pour le tracking extérieur avec affichage sur carte réelle.
Coordonnées: (latitude, longitude) en degrés décimaux
Exemple:
- Paris: (48.8566, 2.3522)
- New York: (40.7128, -74.0060)
Configuration:
Format de données:
MLAT:G;48.856600;2.352200;-52
│ │ │ │
│ │ │ └── RSSI en dBm
│ │ └── Longitude
│ └── Latitude
└── G = GPS mode
Mode Local (Indoor)¶
Pour le tracking intérieur avec plan personnalisé.
Coordonnées: (x, y) en mètres depuis un point de référence
Exemple (bureau):
- Coin nord-ouest: (0, 0)
- Scanner A: (0, 0)
- Scanner B: (10, 0)
- Scanner C: (5, 8)
Configuration:
c2:> send scanner-1 mlat config local 0 0
c2:> send scanner-2 mlat config local 10 0
c2:> send scanner-3 mlat config local 5 8
Format de données:
MLAT:L;5.00;8.00;-55
│ │ │ │
│ │ │ └── RSSI en dBm
│ │ └── Y en mètres
│ └── X en mètres
└── L = Local mode
Commandes¶
mlat config¶
Configure la position du scanner.
Syntaxe:
Paramètres (GPS):
| Paramètre | Type | Range | Description |
|---|---|---|---|
lat |
float | -90 à 90 | Latitude en degrés |
lon |
float | -180 à 180 | Longitude en degrés |
Paramètres (Local):
| Paramètre | Type | Description |
|---|---|---|
x |
float | Position X en mètres |
y |
float | Position Y en mètres |
Exemples:
# Configuration GPS (outdoor)
c2:> send scanner-1 mlat config gps 48.8566 2.3522
[scanner-1] INFO: GPS position: (48.856600, 2.352200)
# Configuration locale (indoor)
c2:> send scanner-2 mlat config local 10 0
[scanner-2] INFO: Local position: (10.00, 0.00) meters
Gauche: Output ESP32 | Droite: Réponse dans C3PO
mlat mode¶
Sélectionne le mode de scan (BLE ou WiFi).
Syntaxe:
Modes:
| Mode | Description | Utilisation |
|---|---|---|
ble |
Scan BLE advertisements | Tracking précis, courte portée |
wifi |
Mode promiscuous, probe requests | Longue portée, devices WiFi |
Exemple:
c2:> send scanner-1 mlat mode ble
[scanner-1] INFO: mode set to BLE
c2:> send scanner-2 mlat mode wifi
[scanner-2] INFO: mode set to WiFi
Mode WiFi
En mode WiFi, le scanner capture les probe requests et beacons sur tous les canaux (channel hopping automatique).
Gauche: Output ESP32 | Droite: Réponse dans C3PO
mlat start¶
Démarre le scan pour une adresse MAC cible.
Syntaxe:
Paramètres:
| Paramètre | Type | Description |
|---|---|---|
mac |
string | Adresse MAC cible (formats: AA:BB:CC:DD:EE:FF, AA-BB-CC-DD-EE-FF, AABBCCDDEEFF) |
Prérequis:
- Position configurée via
mlat config - Mode sélectionné via
mlat mode
Exemple:
c2:> send scanner-1 mlat start AA:BB:CC:DD:EE:FF
[scanner-1] INFO: scanning for AA:BB:CC:DD:EE:FF at GPS(48.856600, 2.352200) [BLE]
Données envoyées au C2:
Toutes les 2 secondes, le scanner envoie la moyenne des RSSI collectés:
Gauche: Output ESP32 | Droite: Web Dashboard avec carte de positionnement
mlat stop¶
Arrête le scan en cours.
Syntaxe:
Exemple:
mlat status¶
Affiche l'état actuel du module MLAT.
Syntaxe:
Réponse (non configuré):
Réponse (configuré, arrêté):
Réponse (en cours):
[scanner-1] INFO: running [BLE] | GPS=(48.856600,2.352200) | target=AA:BB:CC:DD:EE:FF | rssi=-52 (10 samples)
Réponse (WiFi avec channel):
[scanner-2] INFO: running [WiFi] | local=(10.00,0.00)m | target=AA:BB:CC:DD:EE:FF | rssi=-48 (8) | ch=6
Gauche: Output ESP32 | Droite: Réponse dans C3PO
Configuration C2¶
Démarrer le MLAT Engine¶
Le C2 agrège automatiquement les données MLAT. Configurez les scanners via l'API:
# Depuis le Web Dashboard ou via API
POST /api/mlat/config
{
"target_mac": "AA:BB:CC:DD:EE:FF",
"coord_system": "local", # ou "gps"
"scanners": [
{"device_id": "scanner-1", "x": 0, "y": 0},
{"device_id": "scanner-2", "x": 10, "y": 0},
{"device_id": "scanner-3", "x": 5, "y": 8}
]
}
Web Dashboard¶
Le dashboard affiche:
- Carte en temps réel avec position estimée
- RSSI de chaque scanner
- Historique des positions
- Cercles de confiance
Déploiement¶
Placement des Scanners¶
Pour une précision optimale:
Règles de placement:
┌─────────────────────────────────────────┐
│ │
│ ● Scanner A │
│ │ │
│ │ ✓ Triangulation optimale: │
│ │ - Minimum 3 scanners │
│ │ - Espacement régulier │
│ │ - Éviter l'alignement │
│ │ │
│ └──────────────────● Scanner B │
│ │ │
│ ● Target │ │
│ │ │
│ ● Scanner C │
│ │
└─────────────────────────────────────────┘
✗ À éviter:
┌─────────────────────────────────────────┐
│ ●────●────● (scanners alignés) │
│ ● Target │
│ = Position ambiguë sur l'axe │
└─────────────────────────────────────────┘
Configuration Recommandée¶
| Paramètre | Valeur Recommandée |
|---|---|
| Nombre de scanners | 3 minimum, 4+ idéal |
| Distance inter-scanners | 5-15 mètres |
| Distance max cible | 20 mètres (BLE), 50 mètres (WiFi) |
| Intervalle d'envoi | 2 secondes |
| Échantillons RSSI | 10 (moyenne glissante) |
Précision¶
Facteurs Affectant la Précision¶
| Facteur | Impact | Mitigation |
|---|---|---|
| Obstacles (murs) | Forte atténuation | Calibrer le coefficient n |
| Réflexions (multipath) | Bruit RSSI | Moyenner sur plus d'échantillons |
| Interférences | Mesures erratiques | Utiliser BLE en intérieur |
| Distance | Précision dégradée | Ajouter des scanners |
| Mouvement | Latence position | Réduire l'intervalle d'envoi |
Précision Typique¶
| Environnement | Mode | Précision |
|---|---|---|
| Bureau ouvert | BLE | 1-3 mètres |
| Bureau cloisonné | BLE | 3-5 mètres |
| Extérieur dégagé | WiFi | 5-10 mètres |
| Intérieur complexe | WiFi | 10-20 mètres |
Cas d'Usage¶
Tracking d'Asset¶
Suivre un device spécifique dans un bâtiment:
# Configurer 4 scanners aux coins du bâtiment
c2:> send scanner-nw mlat config local 0 20
c2:> send scanner-ne mlat config local 30 20
c2:> send scanner-sw mlat config local 0 0
c2:> send scanner-se mlat config local 30 0
# Mode BLE pour précision
c2:> broadcast mlat mode ble
# Tracker un badge BLE
c2:> broadcast mlat start AA:BB:CC:DD:EE:FF
Surveillance Périmétrique¶
Détecter l'entrée d'un device connu:
# Scanners aux entrées
c2:> send scanner-door1 mlat config gps 48.856 2.352
c2:> send scanner-door2 mlat config gps 48.857 2.353
# Surveiller un téléphone cible
c2:> broadcast mlat start 11:22:33:44:55:66
Analyse de Flux¶
Étudier les déplacements dans un espace:
# Déployer un réseau de scanners
# Enregistrer les positions sur 24h
# Analyser les patterns de mouvement
Implémentation¶
Fichiers Sources¶
| Fichier | Description |
|---|---|
mod_mlat.c |
Module principal |
mod_trilat.c |
Algorithmes de trilatération (C2 side) |
Algorithme RSSI → Distance¶
static int8_t get_average_rssi(void) {
if (rssi_count == 0) return 0;
int32_t sum = 0;
size_t count = (rssi_count < RSSI_HISTORY_SIZE)
? rssi_count : RSSI_HISTORY_SIZE;
for (size_t i = 0; i < count; i++) {
sum += rssi_history[i];
}
return (int8_t)(sum / (int32_t)count);
}
Channel Hopping (WiFi)¶
static void channel_hop_task(void *arg) {
while (mlat_running && mlat_mode == MLAT_MODE_WIFI) {
vTaskDelay(pdMS_TO_TICKS(CHANNEL_HOP_MS)); // 200ms
current_channel = (current_channel % 13) + 1;
esp_wifi_set_channel(current_channel, WIFI_SECOND_CHAN_NONE);
}
vTaskDelete(NULL);
}
Dépannage¶
Pas de Données RSSI¶
| Cause | Solution |
|---|---|
| Cible hors portée | Rapprocher les scanners |
| Mauvaise MAC | Vérifier le format de l'adresse |
| BLE désactivé sur cible | Utiliser mode WiFi |
| Scanner pas configuré | Exécuter mlat config d'abord |
Position Instable¶
| Cause | Solution |
|---|---|
| Trop peu de scanners | Ajouter des scanners |
| Scanners alignés | Repositionner en triangle |
| RSSI bruyant | Augmenter RSSI_HISTORY_SIZE |
Précédent: Recon Camera | Suivant: Commands Reference