La plupart des produits BLE Tag sont livrés comme de simples beacons publicitaires : le téléphone les scanne, lit la charge utile et s’en va. Ce modèle échoue dès que tu veux configurer l’étiquette, la faire sonner, pousser un firmware ou lire des capteurs tamponnés. Il te faut alors une vraie connexion GATT, et la gestion de la connexion devient le point dur. Cet article dépasse le marketing : appairage, liaison, LE Secure Connections, conception GATT, paramètres de connexion et les bizarreries iOS/Android qui cassent vraiment les livraisons.

Appairage vs Liaison

L’appairage est la poignée de main live qui génère la LTK. La liaison (bonding) est l’appairage plus la persistance de cette LTK (et IRK/CSRK) en flash, pour reprendre le chiffrement sans réappairage. Une étiquette qui appaire sans lier force un réappairage à chaque relance de l’app, ce qui est inacceptable pour un traceur grand public.

Legacy Pairing vs LE Secure Connections

Legacy Pairing (4.0 à 4.1) dérive la LTK d’une clé temporaire et reste vulnérable à l’écoute passive : capture une fois l’échange et tu obtiens la LTK. LE Secure Connections (4.2+) négocie d’abord un ECDH P-256, si bien que la LTK ne passe jamais sur l’air. Pour toute étiquette portant position ou identité, Secure Connections est la seule base acceptable.

Caractéristique Legacy Pairing LE Secure Connections
Accord de clé Temporary Key ECDH P-256
Écoute passive LTK récupérable Sûr
MITM (Numeric Comparison) Non Oui
Version min. 4.0 4.2

Modèles d’association

Le modèle d’association décide comment l’utilisateur confirme le lien. Just Works est silencieux mais sans protection MITM, correct pour un traceur mais risqué pour une serrure. Numeric Comparison (Secure Connections uniquement) affiche un code à 6 chiffres des deux côtés.

Modèle Action utilisateur MITM Usage typique
Just Works Aucune Non Traceurs, faible valeur
Passkey Entry 6 chiffres Oui Config industriel
Numeric Comparison Confirmer code Oui Étiquettes sûres
OOB Tap/NFC Oui Provisioning

Hiérarchie des clés

Après l’appairage, la pile stocke : LTK (chiffrement de lien 128 bits), IRK (adresse privée résolvable), CSRK (écritures signées authentifiées) et graines ER/DHK. L’IRK est ce qui permet à un téléphone appairé de reconnaître l’étiquette après rotation d’adresse.

Conception du service GATT

Un GATT pragmatique pour traceur :

UUID Service / Caract. Propriété
0x180F Battery Service Read
0x180A Device Information Read
0x2A06 Alert Level (Find Me) Write
Fxxx Config (intervalle, TX power) Read/Write
Fxxx Bouton / dernier appui Notify
Fxxx Firmware revision Read

Garde la caractéristique de config protégée derrière la liaison ; sinon, n’importe qui à portée réécrit le TX power et annule les limites de portée.

Paramètres de connexion

Trois valeurs gouvernent toute connexion :

  • Connection Interval : 7.5 ms à 4000 ms. iOS limite le minimum négocié à ~20 ms en pratique.
  • Slave Latency : 0 à 499 événements que l’étiquette peut sauter.
  • Supervision Timeout : 100 ms à 32000 ms ; doit dépasser (1 + latency) x interval x 2.

Profil basse conso : interval 1000 ms, latency 9, timeout 11 s signifie que l’étiquette saute 9 événements sur 10, se réveillant environ une fois par seconde. Le courant moyen passe de la plage mA (connecté, 30 ms) à la dizaine de uA.

Reconnexion sans vider la batterie

Les étiquettes purement publicitaires émettent une adresse statique ou aléatoire ; un téléphone appairé ne les retrouve pas fiablement après rotation d’adresse. Utilise une Resolvable Private Address générée depuis l’IRK, annonce avec White List active et laisse le téléphone appairé résoudre la RPA. La taille de la White List sur les SoC courants est de 8 à 32 entrées, suffisant pour un téléphone et quelques gateways.

Bizarreries iOS / Android qui cassent les livraisons

  • iOS : le scan en arrière-plan de CoreBluetooth ne matche que les services dont l’UUID figure dans l’advertisement. Si l’étiquette masque l’UUID de service, l’app ne se réveille pas en arrière-plan. Les intervalles < ~20 ms sont rejetés. ANCS exige une connexion appairée pour délivrer les alertes.
  • Android 12+ : BLUETOOTH_CONNECT et BLUETOOTH_SCAN sont des permissions runtime ; sans elles le scan renvoie vide. Il faut gérer l’invite « détecter appareils à proximité » et la limitation du scan arrière-plan (~1/h pour les apps en cache).
  • Les deux : garder la connexion en continu brûle le CR2032 en quelques jours. Connecte à la demande, puis déconnecte.

Compromis de puissance

Mode Courant typique Durée CR2032
Publicité seule (200 ms) ~5 à 15 uA 1 à 3 ans
Connecté, 30 ms rafales 1 à 3 mA jours à semaines
Connecté à la demande dizaine de uA 1 à 2 ans

Règle : par défaut publicité seule. Ouvre une connexion uniquement pour config, alerte ou OTA, puis ferme-la.

Pièges

  • Appairage sans liaison conduit à une boucle de réappairage à chaque lancement.
  • Legacy Pairing sur étiquette de position fuit une LTK récupérable.
  • Adresse aléatoire statique sans IRK signifie que le téléphone appairé ne trouve pas l’étiquette.
  • Garder la connexion « au cas où » tue la batterie.
  • Masquer l’UUID de service sous iOS bloque le réveil arrière-plan.

Bien gérer la connexion est ce qui sépare une étiquette de démo d’un produit réellement livrable. Pour les designs de référence qui implémentent déjà Secure Connections et un GATT sain, voir notre ligne de module Bluetooth et la famille plus large BLE Tag.