11.2. De BLE-stack

Net als bij netwerken is Bluetooth Low Energy opgebouwd als een stapel lagen, waarbij elke laag een enkel probleem oplost en een schone abstractie blootstelt aan de laag erboven. De onderstaande namen komen rechtstreeks uit de Bluetooth Core-specificatie en duiken op in de aioble- en bluetooth-API’s.

Een verticale stapel van vijf gelabelde vakken. Van onder naar boven: Physical (radio), Link Layer, GAP, GATT, Application. Een pijl aan de rechterkant wijst omhoog langs de stapel met het label "what we build". Een pijl aan de linkerkant wijst omlaag langs de stapel met het label "what is provided".

De Bluetooth Low Energy-stack. Elke laag reikt een schonere abstractie aan naar de volgende, hetzelfde patroon dat de netwerkstack gebruikt.

Physical layer. Verplaats bits tussen twee apparaten over de 2,4 GHz-radio. Kanaalselectie, modulatie, zendvermogen. De taak van de camera is om ingeschakeld te zijn; het silicium doet de rest.

Link layer. Verplaats pakketten tussen twee apparaten die afspreken met elkaar te praten. Voegt apparaatadressen toe zodat elk pakket op één buur kan worden gericht, plant de periodieke radiogebeurtenissen die een verbinding vormen, en handelt de hertransmissie af van elk pakket dat de ontvanger niet bevestigde.

Generic Access Profile (GAP). De ontdekkings- en verbindingslaag. Definieert vier rollen – broadcaster, observer, peripheral, central – en het advertising / scanning-protocol waarmee twee apparaten elkaar in de eerste plaats kunnen vinden, plus de procedure voor het openen en sluiten van een verbinding tussen hen. Hier leven adressen, advertentiepayloads, verbindingsparameters en koppeling.

Generic Attribute Profile (GATT). De datalaag. Zit bovenop een open GAP-verbinding en stelt een kleine sleutel/waarde-database bloot: de ene zijde host een boom van benoemde waarden die characteristics heten, de andere zijde leest, schrijft of abonneert zich erop. Hier stromen de daadwerkelijke toepassingsbytes.

Application. Wat de camera en de peer ook afspreken dat de bytes betekenen. De Bluetooth SIG publiceert standaard profielen – hartslag, batterijniveau, omgevingsdetectie – die veelgebruikte kenmerken definiëren zodat ongerelateerde apparaten kunnen samenwerken, maar elke toepassing is vrij om zijn eigen te definiëren.

11.2.1. Hoe de lagen zich tijdens runtime stapelen

Het patroon komt overeen met de netwerkstack:

  • De bytes van de toepassing gaan in een characteristic value.

  • GATT verpakt dat met een header die aangeeft tot welk kenmerk de bytes behoren.

  • GAP houdt een open verbinding draaiende zodat GATT ergens heeft om naartoe te verzenden.

  • De link layer verpakt het geheel in een pakket, geadresseerd aan het apparaatadres van de peer, en plant een radiogebeurtenis om het te verzenden.

  • De physical layer zet het pakket om in een korte uitbarsting van 2,4 GHz-radio.

De physical layer en de link layer zijn vanuit Python vrijwel onzichtbaar – het silicium en de radio-firmware handelen ze af. Vanaf GAP omhoog heeft de Python-code van de camera meer te zeggen.

11.2.2. Twee lagen die de gebruikersgerichte API stilletjes overslaat

De Bluetooth-specificatie noemt nog twee lagen die zich tussen de link layer en GAP/GATT bevinden: de Host Controller Interface (HCI) – het protocol dat de host-CPU gebruikt om een aparte radiochip aan te sturen – en L2CAP – de multiplexer die één link-layer-verbinding opsplitst in meerdere logische kanalen.

Geen van beide is zichtbaar in de aioble-API, maar geen van beide verdwijnt. HCI zit binnen de BLE-port en is onzichtbaar tenzij een aangepaste build van MicroPython in het spel is, en L2CAP is de drager waar GATT bovenop draait. Een toepassing die ruwe byte-streams wil, kan zijn eigen L2CAP-kanaal claimen (L2CAP-kanalen).