11.2. La pile BLE¶
Comme les réseaux, le Bluetooth Low Energy est construit sous forme d’une pile de couches, chacune résolvant un problème unique et exposant une abstraction propre à la couche supérieure. Les noms ci-dessous proviennent directement de la spécification Bluetooth Core et apparaissent dans les API aioble et bluetooth.
La pile Bluetooth Low Energy. Chaque couche transmet une abstraction plus propre à la suivante, le même schéma qu’utilise la pile réseau.¶
Couche physique. Déplacer des bits entre deux appareils via la radio 2,4 GHz. Sélection du canal, modulation, puissance d’émission. Le rôle de la caméra est d’être sous tension ; le silicium fait le reste.
Couche de liaison. Déplacer des paquets entre deux appareils qui acceptent de communiquer entre eux. Ajoute des adresses d’appareil pour que chaque paquet puisse viser un seul voisin, planifie les événements radio périodiques qui constituent une connexion, et gère la retransmission de tout paquet que le récepteur n’a pas acquitté.
Generic Access Profile (GAP). La couche de découverte et de connexion. Définit quatre rôles – broadcaster, observer, peripheral, central – ainsi que le protocole d”annonce / de balayage qui permet à deux appareils de se trouver mutuellement en premier lieu, plus la procédure d’ouverture et de fermeture d’une connexion entre eux. C’est là que résident les adresses, les charges utiles d’annonce, les paramètres de connexion et l’appairage.
Generic Attribute Profile (GATT). La couche de données. S’appuie sur une connexion GAP ouverte et expose une petite base de données clé/valeur : un côté héberge un arbre de valeurs nommées appelées caractéristiques, l’autre côté les lit, les écrit ou s’y abonne. C’est là que circulent les octets réels de l’application.
Application. Tout ce sur quoi la caméra et le pair s’accordent quant à la signification des octets. Le Bluetooth SIG publie des profils standard – fréquence cardiaque, niveau de batterie, détection environnementale – qui définissent des caractéristiques couramment utilisées afin que des appareils sans lien puissent interopérer, mais toute application est libre de définir les siennes.
11.2.1. Comment les couches s’empilent à l’exécution¶
Le schéma correspond à la pile réseau :
Les octets de l’application vont dans une valeur de caractéristique.
GATT les enveloppe d’un en-tête identifiant à quelle caractéristique appartiennent les octets.
GAP maintient une connexion ouverte en fonctionnement afin que GATT ait un endroit où envoyer.
La couche de liaison enveloppe l’ensemble dans un paquet, adressé à l’adresse d’appareil du pair, et planifie un événement radio pour le transmettre.
La couche physique transforme le paquet en une brève rafale de radio à 2,4 GHz.
La couche physique et la couche de liaison sont presque invisibles depuis Python – le silicium et le micrologiciel radio s’en chargent. À partir de GAP et au-dessus, le code Python de la caméra a davantage son mot à dire.
11.2.2. Deux couches que l’API destinée à l’utilisateur saute discrètement¶
La spécification Bluetooth nomme deux couches supplémentaires qui se situent entre la couche de liaison et GAP/GATT : l”Host Controller Interface (HCI) – le protocole que le processeur hôte utilise pour piloter une puce radio distincte – et L2CAP – le multiplexeur qui scinde une connexion de couche de liaison en plusieurs canaux logiques.
Aucune des deux n’est visible dans l’API aioble, mais aucune ne disparaît. HCI réside à l’intérieur du port BLE et est invisible à moins qu’une version personnalisée de MicroPython ne soit en jeu, et L2CAP est le support sur lequel GATT s’appuie. Une application qui souhaite des flux d’octets bruts peut revendiquer son propre canal L2CAP (Canaux L2CAP).