Skip to content

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:

Epsilon Bot Configuration → Modules → Recon Commands
Epsilon Bot Configuration → Recon Settings → Enable MLAT Module


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:

c2:> send scanner-1 mlat config gps 48.8566 2.3522

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:

c2:> send <device_id> mlat config gps <lat> <lon>
c2:> send <device_id> mlat config local <x> <y>

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

mlat_config Gauche: Output ESP32 | Droite: Réponse dans C3PO


mlat mode

Sélectionne le mode de scan (BLE ou WiFi).

Syntaxe:

c2:> send <device_id> mlat mode <ble|wifi>

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).

mlat_mode Gauche: Output ESP32 | Droite: Réponse dans C3PO


mlat start

Démarre le scan pour une adresse MAC cible.

Syntaxe:

c2:> send <device_id> mlat start <mac>

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:

  1. Position configurée via mlat config
  2. 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:

[scanner-1] INFO: MLAT:G;48.856600;2.352200;-52

mlat_start Gauche: Output ESP32 | Droite: Web Dashboard avec carte de positionnement


mlat stop

Arrête le scan en cours.

Syntaxe:

c2:> send <device_id> mlat stop

Exemple:

c2:> send scanner-1 mlat stop
[scanner-1] INFO: stopped


mlat status

Affiche l'état actuel du module MLAT.

Syntaxe:

c2:> send <device_id> mlat status

Réponse (non configuré):

[scanner-1] INFO: not configured | mode=BLE

Réponse (configuré, arrêté):

[scanner-1] INFO: stopped | mode=BLE | GPS=(48.856600,2.352200)

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

mlat_status 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