Un BLE tag a saut unique atteint 10-30 metres de portee en interieur. Dans un entrepot de 20 000 m2, cela signifie des dizaines de passerelles pour une couverture totale. Les reseaux mesh inversent le modele : les tags relayent les paquets entre eux, etendant la portee saut par saut jusqu’a ce que les donnees atteignent une passerelle. BLE Mesh 1.0 (2017) a introduit le relay par flood gere ; Mesh 1.1 (2023) a ajoute le directed forwarding. Pour le suivi d’actifs, mesh resout trois problemes : extension de couverture sans cout proportionnel de passerelles, tolerance aux pannes via des chemins redondants et degradation progressive lorsque des tags individuels se deconnectent.
Cet article dissèque les reseaux mesh du point de vue des tags d’actifs alimentes par batterie. Nous couvrons les internals du protocole, la selection des noeuds relay, les calculs de budget d’energie, la latence et le debit, les limites de scalabilite de 100 a 5000+ noeuds, le provisionnement a grande echelle, l’architecture de securite et la comparaison des stacks de fabricants.
1. Pile de Protocole BLE Mesh
BLE Mesh fonctionne entierement sur les canaux d’advertising (37/38/39 a 2402/2426/2480 MHz) avec des PDU sans connexion. La pile a cinq couches :
| Couche | Fonction | Parametres Cles |
|---|---|---|
| Bearer | Transport sur ADV ou GATT | ADV: PDU 31 octets, 3 canaux; GATT: proxy, MTU 20 octets |
| Reseau | Adressage, relay, TTL | PDU 29 octets, TTL 7-bit, SEQ 24-bit, unicast 15-bit |
| Transport Inferieur | Segmentation, reassemblage | Segment 12 octets, ack 20s |
| Transport Superieur | Chiffrement app key | Chiffrement payload access, transMIC 4 octets |
| Access | Messages de modele, opcodes | Vendor 3 octets, SIG 2 octets |
La PDU reseau est compacte : 1 octet TTL, 3 octets SEQ (sequence 24-bit pour la protection contre les replays), 2 octets SRC, 2 octets DST et jusqu’a 12 octets de payload transport. La PDU entiere est chiffree avec la network key 128 bits. Les noeuds relay transferent les paquets sans dechiffrer le payload applicatif.
Pour les tags d’actifs, le bearer ADV est la seule option pratique. Les connexions GATT consomment 3-5 mA pendant les evenements de connexion, insoutenable pour les tags a pile bouton. Le mecanisme relay fonctionne exclusivement sur le bearer ADV.
2. Managed Flood : Comment Fonctionne le Relay
BLE Mesh utilise le relay par managed flood, pas de tables de routage. Chaque noeud avec la fonction relay activee retransmet les messages recus, soumis a trois controles :
- TTL (Time To Live) : Compteur 7-bit, decremente a chaque saut. Quand il atteint 0, le message s’arrete. TTL par defaut : 5-7 pour les entrepots, 10+ pour les campus.
- Cache de Messages : Chaque noeud stocke les messages recents vus, identifies par (SRC, SEQ). Minimum 2 entrees ; les implementations pratiques utilisent 32-256. Les messages dupliques sont silencieusement abandonnes, prevignant les boucles.
- Correspondance Network Key : Seuls les messages chiffres avec une network key connue sont relayes.
Timing de retransmission relay : apres avoir recu un message, le relay attend 3,5 ms (backoff fixe) plus 0-10 ms de delai aleatoire, puis retransmet sur les trois canaux d’advertising. Latence par saut : environ 4-15 ms.
Pourquoi managed flood au lieu du routage ? Les protocoles mesh traditionnels (Zigbee, Thread) utilisent des tables de routage qui necessitent de la memoire (8-16 octets par entree), des mises a jour periodiques de route (consommant de l’energie) et un temps de convergence quand la topologie change (secondes a minutes). Pour les tags d’actifs mobiles, la convergence des tables de routage est impraticable. Le managed flood evite les trois : pas d’etat de routage, pas de mises a jour de route, adaptation instantanee du chemin. Le cout est une duplication de messages et une utilisation de canal plus elevees.
3. Selection des Noeuds Relay pour Tags d’Actifs
Tous les tags ne devraient pas etre relay. La fonction relay ajoute 200-500 uA au courant moyen, catastrophique pour les tags a pile bouton. La strategie : designer les noeuds d’infrastructure comme relays, tandis que les tags d’actifs operent comme publieurs non-relay.
| Critere | Relay Eligible | Non-Relay |
|---|---|---|
| Source d’alimentation | Secteur ou grosse batterie | CR2032, CR2477 |
| Mobilite | Infrastructure fixe | Tags d’actifs mobiles |
| Position | Plafonds, couloirs, entrees | Aleatoire sur actifs |
| Environnement radio | RSSI stable (> -70 dBm) | Variable par mouvement |
Les deploiements de production utilisent 20-30 noeuds relay alimentes sur secteur pour la couverture de backbone mesh, tandis que 500-2000 tags d’actifs publient des donnees en tant que noeuds non-relay. Le ratio relay-vers-tag depend de l’echelle :
| Echelle | Relays | Tags | Ratio |
|---|---|---|---|
| Petit (2 000 m2) | 5-8 | 50-100 | ~10% |
| Moyen (10 000 m2) | 15-25 | 300-500 | ~5% |
| Grand (30 000 m2) | 40-60 | 1000-2000 | ~3% |
| Campus | 80-150 | 3000-5000 | ~2-3% |
4. Budget d’Energie : Relay vs Non-Relay
Tag Non-Relay (nRF52840)
| Etat | Courant | Intervalle | Moyenne |
|---|---|---|---|
| Sleep (retention RAM) | 1,5 uA | – | 1,5 uA |
| RC32K + RTC | 0,2 uA | – | 0,2 uA |
| Advertiser TX (+4 dBm) | 4,6 mA | 100 ms | 24,3 uA |
| Advertiser RX | 5,2 mA | 100 ms | 23,4 uA |
| Lecture capteur (SHT40) | 0,9 mA | 10 s | 0,18 uA |
| Total | – | – | ~49,6 uA |
CR2032 (175 mAh utile), intervalle 100 ms :
Duree de vie = 175 000 uAh / 49,6 uA = 3 528 h = 147 jours
Intervalle 1 seconde (mode basse consommation) :
Total moyen = 6,5 uA
Duree de vie = 175 000 / 6,5 = 26 923 h = 3,1 ans
Tag Relay (nRF52840, scan continu)
| Etat | Courant | Duty | Moyenne |
|---|---|---|---|
| Sleep | 1,5 uA | – | 1,5 uA |
| Scanner RX (3 canaux) | 5,2 mA | 30% | 1 560 uA |
| Relay TX | 4,6 mA | 0,5% | 23 uA |
| Advertising propre | 4,6 mA | 0,05% | 2,3 uA |
| Total | – | – | ~1 592 uA = 1,59 mA |
CR2032 : 175 000 / 1 592 = 110 heures = 4,6 jours (impraticable)
4x AA (2 500 mAh) : 2 500 000 / 1 592 = 1 571 h = 65 jours
Secteur : illimite
Conclusion : les noeuds relay necessitent une alimentation externe. Les tags a pile bouton ne doivent jamais activer le relay. Les deploiements de production utilisent une infrastructure relay dediee alimentee par le secteur.
5. Latence et Debit des Messages
Latence par Saut
Chaque saut relay ajoute : traitement du recepteur (1-3 ms) + backoff relay (3,5 + 0-10 ms) + evenement advertising (1,1 ms) = 5-16 ms typique, 20 ms pire cas.
5 sauts : 25-80 ms typique, 100-150 ms pire cas
10 sauts : 50-160 ms typique, 200-300 ms pire cas
Congestion du Canal
| Charge (msgs/s) | Utilisation | Taux de Perte | Notes |
|---|---|---|---|
| 50 | ~1% | <0,1% | Propre |
| 200 | ~4% | 0,5-1% | Normal pour 500 noeuds |
| 500 | ~10% | 2-5% | Limite approche |
| 1000 | ~21% | 8-15% | Congestion |
| 2000 | ~42% | 25-40% | Non fiable |
Pour mesh de 500 noeuds, 5% relays, TTL=7, 1 msg/10s :
Original : 500 x 0,1 = 50 msgs/s
Amplification relay : x3,3
Total : 165 msgs/s, utilisation 3,4%, perte <0,5%
A 1 msg/s (suivi en temps reel) :
Total : 1 650 msgs/s, utilisation 34%, perte 15-25% (subnetting requis)
6. Analyse de Scalabilite
| Noeuds | Relays | TTL | Charge | Perte | P95 | Verdict |
|---|---|---|---|---|---|---|
| 100 | 5 | 5 | 33/s | <0,1% | 40 ms | Excellent |
| 500 | 25 | 7 | 165/s | 0,5% | 80 ms | Bon |
| 1000 | 50 | 7 | 330/s | 2-3% | 120 ms | Acceptable |
| 2000 | 100 | 10 | 660/s | 5-8% | 200 ms | Marginal |
| 5000 | 250 | 10 | 1650/s | 15-25% | 500 ms | Subnet requis |
| 5000 (5 subnets) | 250 | 7 | 330/sub | 2-3% | 120 ms | Bon |
Strategie de Subnetting
- Geographique : Un subnet par etage/batiment. Noeuds pont aux entrees.
- Fonctionnel : Un subnet par application. Reduit le trafic croise.
- Hierarchique : Subnet backbone (relay seulement, secteur) connectant les subnets de tags. Le plus scalable.
Chaque subnet supporte 32 767 adresses unicast. La vraie contrainte est l'utilisation du canal, pas l'espace d'adressage.
7. Directed Forwarding (Mesh 1.1)
Mesh 1.1 (2023) a introduit le directed forwarding : des chemins pre-calcules pour les messages unicast au lieu du managed flood. Seuls les noeuds sur le chemin transferent le message.
Avantages : 60-80% moins d'utilisation de canal pour le trafic unicast, 5000+ noeuds par subnet sans subnetting, 20-30% de latence en moins.
Compromis : memoire de table de routage (0,4-3,2 Ko RAM), convergence de chemin (2-10s lors de changement topologique), necessite stack Mesh 1.1.
Recommande : activer le directed forwarding sur les noeuds relay d'infrastructure fixe, maintenir le managed flood pour les tags mobiles.
8. Provisionnement a Grande Echelle
Le provisionnement assigne l'adresse unicast, la network key, l'app key et l'IV index. Utilise PB-ADV (3-8s par dispositif) ou PB-GATT (10-20s).
Provisionnement par lot avec sessions paralleles :
Sequentiel : 1000 x 5s = 83 minutes
Lot (10) : 8,3 minutes
Lot (20) : 4,2 minutes
Limite pratique : 20 sessions paralleles avant que la congestion cause des echecs.
Allocation d'Adresses
| Plage | Objectif | Nombre |
|---|---|---|
| 0x0001-0x00FF | Provisionneurs | 255 |
| 0x0100-0x0FFF | Relay/infrastructure | 3 840 |
| 0x1000-0x7EFF | Tags d'actifs | 28 160 |
| 0x7F00-0x7FFF | Reserve | 256 |
9. Architecture de Securite
| Cle | Portee | Objectif |
|---|---|---|
| Device Key (128-bit) | Par dispositif, provisionneur seulement | Configuration, reset de noeud |
| Network Key (128-bit) | Par subnet, tous les noeuds | Chiffrement couche reseau |
| App Key (128-bit) | Par application | Couche access, donnees capteur |
Les noeuds relay transferent les messages avec la network key mais ne peuvent pas dechiffrer le payload applicatif. Un relay compromis obtient l'acces reseau mais pas aux donnees de capteur.
Mise a jour IV
Le SEQ 24-bit fournit la protection contre les replays. L'IV index (32-bit) s'incremente pour reinitialiser l'espace SEQ. Intervalle minimum : 96 heures. A 1 msg/10s par tag, le debordement SEQ prend 1 942 jours (5,3 ans). Les mises a jour IV sont rares pour les tags d'actifs.
Isolation Multi-Tenant
Des cles d'application multiples fournissent une isolation logique. Chaque tenant obtient une app key unique ; les tags ne peuvent pas lire les donnees des autres meme en partageant la meme network key et l'infrastructure relay.
10. BLE Mesh vs Thread vs Zigbee
| Parametre | BLE Mesh | Thread | Zigbee 3.0 |
|---|---|---|---|
| Debit PHY | 1-2 Mbps | 250 kbps | 250 kbps |
| Relay | Managed flood/directed | Routage RPL | Arbre + mesh |
| Etat de routage | 0 Ko | 1-4 Ko | 2-8 Ko |
| Max noeuds | 1000-5000/subnet | 250-500 | 250-500 |
| Courant sleep | 1,5-5 uA | 3-10 uA | 2-5 uA |
| TX (+4 dBm) | 4,6 mA | 8,0 mA | 8,0 mA |
| Noeud mobile | Excellent | Faible | Faible |
BLE Mesh gagne pour les tags d'actifs sur trois dimensions : courant TX le plus bas (PHY 1 Mbps vs 250 kbps), adaptation instantanee des noeuds mobiles (flood vs convergence de routage) et compatibilite native de radio BLE.
11. Integration de Passerelle
Une passerelle mesh participe au mesh (detient la network key) et a une connectivite IP (Ethernet, Wi-Fi, cellulaire). Elle recoit les messages mesh et les transfere au cloud via MQTT ou HTTPS.
Deux conceptions : (1) Passerelle proxy utilisant le service proxy GATT pour un acces ad hoc ; (2) Passerelle embarquee (nRF52840 + Wi-Fi) fonctionnant 24/7 avec un pont MQTT.
Densite de passerelle : 1 pour 200-500 noeuds mesh. Des passerelles multiples fournissent la redondance ; le cloud deduplique par (SRC, SEQ).
Tag --> Relay --> Relay --> Passerelle --> MQTT --> Dashboard
Bout-en-bout : 200-800 ms
12. Comparaison des Stacks Mesh
| Fabricant | SDK | SoC | Mesh 1.1 | RX | Notes |
|---|---|---|---|---|---|
| Nordic | NCS 2.5+ | nRF52840/nRF5340 | Oui | 5,2 mA | Meilleure doc, Zephyr |
| Silicon Labs | GSDK 4.3+ | EFR32BG22/BG24 | Oui | 4,8 mA | RX plus bas, BG24 96Ko |
| TI | BLE-STACK 5.x | CC2642R/CC2652R | Partiel | 5,9 mA | SimpleLink |
| Espressif | ESP-IDF | ESP32-C3/C6 | Non (1.0) | 8-12 mA | Passerelle Wi-Fi+BLE |
Pour les tags d'actifs, Nordic nRF52840 est le defaut : stack mature, meilleure documentation, plus bas courant combine sleep+scan. SiLabs EFR32BG24 est solide pour le directed forwarding (plus de RAM). ESP32-C3/C6 excelle pour les passerelles necessitant le Wi-Fi.
13. Exemples de Code
Configuration Relay (nRF Connect SDK / Zephyr)
#include
static void configure_relay_node(uint16_t addr)
{
int err;
uint8_t count, intvl;
err = bt_mesh_cfg_relay_set(net_key_idx, addr,
BT_MESH_RELAY_ENABLED,
BT_MESH_TRANSMIT(1, 10),
&count, &intvl);
if (err) {
printk("Relay set failed: %d", err);
return;
}
err = bt_mesh_cfg_ttl_set(net_key_idx, addr, 7);
}
Publication de Donnees de Capteur
#define SENSOR_DATA_OP BT_MESH_MODEL_OP_2(0x12, 0x00)
struct __attribute__((packed)) sensor_payload {
int16_t temperature;
uint16_t humidity;
uint16_t battery_mv;
};
static int publish_sensor(int16_t temp, uint16_t hum, uint16_t batt)
{
struct sensor_payload p = { temp, hum, batt };
struct bt_mesh_msg_ctx ctx = {
.addr = 0xC001,
.send_ttl = 7,
.app_idx = app_key_idx,
};
BT_MESH_MODEL_BUF_DEFINE(buf, SENSOR_DATA_OP, sizeof(p));
bt_mesh_model_msg_init(&buf, SENSOR_DATA_OP);
net_buf_simple_add_mem(&buf, &p, sizeof(p));
return bt_mesh_model_publish(&sensor_model);
}
Python: Estimateur de Scalabilite
class MeshScalability:
def __init__(self, n_nodes, relay_ratio, ttl, msg_interval_s, subnets=1):
self.n = n_nodes
self.relays = int(n_nodes * relay_ratio)
self.ttl = ttl
self.interval = msg_interval_s
self.subnets = subnets
self.capacity = 4800
def relay_amp(self):
return 1 + self.relays * 0.3 * min(self.ttl / 7.0, 1.0)
def total_load(self):
per_subnet = self.n / self.subnets
return (per_subnet / self.interval) * self.relay_amp()
def utilization(self):
return self.total_load() / self.capacity
def loss(self):
u = self.utilization()
if u < 0.04: return u * 0.1
elif u < 0.10: return 0.004 + (u - 0.04) * 0.3
elif u < 0.21: return 0.022 + (u - 0.10) * 0.5
else: return 0.077 + (u - 0.21) * 1.2
m = MeshScalability(500, 0.05, 7, 10)
print(f"Load: {m.total_load():.0f} msgs/s, Loss: {m.loss()*100:.1f}%")
14. Debogage et Diagnostic
- Sniffer mesh : Utiliser nRF Sniffer pour Bluetooth LE dans Wireshark. Filtrer par type advertising mesh (0x2B). Inspecter la decrement TTL, les retransmissions relay et les cache hits.
- Monitoring heartbeat : Configurer la publication heartbeat depuis les noeuds relay. La destination recoit des messages periodiques avec TTL et RSSI pour la visibilite de la sante du reseau.
- Statistiques relay : Suivre le comptage relay par noeud, le taux de cache hit et les echecs de retransmission. Un taux de cache hit eleve indique une bonne couverture ; un taux faible suggere des lacunes.
- Problemes courants : Epuisement TTL (augmenter TTL ou ajouter des relays), debordement de cache (augmenter la taille), congestion de canal (reduire le taux de publication ou subnet), timeout de provisionnement (reduire la taille du lot).
15. Checklist de Conception de Production
- [ ] Determiner le ratio relay vs non-relay (cible 3-10%)
- [ ] Calculer le budget d'energie : les noeuds relay doivent avoir une alimentation externe
- [ ] Definir le TTL : 5-7 un batiment, 10+ campus
- [ ] Configurer le cache de messages : minimum 32 entrees (192 octets RAM)
- [ ] Planifier l'architecture subnet pour les deploiements >1 000 noeuds
- [ ] Concevoir le flux de provisionnement par lot (max 20 paralleles)
- [ ] Configurer la hierarchie network/app key pour l'isolation multi-tenant
- [ ] Definir l'intervalle de publication : 10s monitoring, 1s temps reel (requiert subnetting)
- [ ] Stress test sous congestion : injecter 2x le trafic attendu et mesurer la perte
- [ ] Planifier la densite de passerelle : 1 pour 200-500 noeuds, avec redondance
- [ ] Activer le monitoring heartbeat
- [ ] Verifier la compatibilite Mesh 1.1 directed forwarding si >2 000 noeuds
- [ ] Tester le comportement des tags mobiles : verifier l'adaptation de chemin entre zones
- [ ] Documenter la procedure de mise a jour IV et le calendrier de key refresh
- [ ] Planifier l'OTA firmware : utiliser la distribution via modele mesh pour les mises a jour massives
Conclusion
Les reseaux mesh BLE transforment le suivi d'actifs d'un modele a saut unique sature de passerelles en un reseau scalable et auto-reparable. Les decisions d'ingenierie cles sont : (1) utiliser une infrastructure alimentee par le secteur pour les noeuds relay, jamais des tags a pile bouton ; (2) dimensionner le ratio relay-vers-tag a 3-10% selon la disposition physique ; (3) surveiller l'utilisation du canal et sous-reseauter avant de depasser 1 000 noeuds actifs ; (4) exploiter le directed forwarding de Mesh 1.1 pour la scalabilite du backbone ; (5) planifier le provisionnement par lot et la redondance de passerelle pour le deploiement de production.
L'analyse du budget d'energie est sans pitie : un tag CR2032 avec relay dure 4,6 jours, tandis qu'un tag non-relay a 1 seconde dure 3,1 ans. Cette difference de 2 400x dicte l'architecture : relays d'infrastructure avec secteur, tags a batterie comme publieurs non-relay. Separez cela correctement, et le mesh gere le reste. Que ce soit 50 tags dans un entrepot ou 5 000 dans un campus industriel, ces principes aident a architecturer un reseau mesh de BLE tag qui fonctionne en production.