11.3. De radio en de linklaag¶
De onderste twee lagen van de BLE-stack zijn vanuit het perspectief van Python bijna volledig automatisch – de radio-silicium en de lagen die MicroPython erbovenop draait, regelen alles, van het kiezen van een kanaal tot het opnieuw verzenden van een verloren pakket. Drie van de keuzes die ze maken, komen nog steeds door tot in de gebruikersgerichte API: vermogen, bereik en doorvoer.
11.3.1. De radio¶
BLE gebruikt dezelfde 2,4 GHz Industrial-Scientific-Medical (ISM) band als wifi, magnetrons en de meeste andere draadloze technologie voor korte afstand. De band is opgesplitst in 40 kanalen van 2 MHz breed.
Drie van de 40 kanalen zijn gereserveerd voor adverteren – korte uitzendingen die de aanwezigheid van een apparaat aankondigen aan iedereen die luistert. Ze zijn over de band verspreid zodat een luisteraar alle drie snel kan afspeuren en zodat interferentie op een van de kanalen het apparaat waarschijnlijk niet volledig uit de lucht haalt.
Zevenendertig zijn data-kanalen. Zodra twee apparaten verbinding maken, wisselen ze pakketten uit op deze kanalen, waarbij ze tussen de kanalen springen volgens een pseudo-willekeurige reeks waarover beide kanten het op het moment van verbinden eens worden. Adaptive frequency hopping laat beide kanten een kanaal als slecht markeren (zware wifi-interferentie, magnetron, naburig BLE-netwerk) zodat de reeks het overslaat.
De 40 BLE-kanalen op de 2,4 GHz-band. Drie zijn voor adverteren, de rest draagt verkeer op een open verbinding.¶
De radio verzendt korte pakketten – hooguit een paar milliseconden lang – en slaapt ertussenin. Die slaap is wat de technologie energiezuinig maakt. Een typische BLE-peripheral besteedt ruim minder dan één procent van zijn tijd aan daadwerkelijk verzenden; de rest is de radio die uitgeschakeld is tussen geplande gebeurtenissen.
11.3.2. De linklaag¶
De linklaag is de kleinste eenheid van BLE die communiceert met zijn tegenhanger op een ander apparaat. Deze regelt vier taken.
Pakketframing. Elk pakket draagt een korte header (channel access address, pakketlengte, controlebits), een payload en een CRC. De ontvanger controleert de CRC en gooit alles wat beschadigd is weg.
Adressering. Elk BLE-apparaat heeft een 48-bit apparaatadres dat het identificeert op de radio. Sommige zijn publiek – een hardware-identificator die de fabrikant heeft toegewezen en die voor altijd traceerbaar is. Sommige zijn willekeurig – gegenereerd op het apparaat, periodiek geroteerd en optioneel versleuteld zodat een afluisteraar twee transmissies niet kan koppelen aan dezelfde fysieke hardware. Adressen komen opnieuw aan bod in Adverteren en scannen.
Verbindingsplanning. Zodra twee apparaten verbinding maken, plant de linklaag periodieke radiogebeurtenissen op de hopping-reeks – een vast connection interval uit elkaar – en pakt welke gegevens dan ook die in de wachtrij staan van de GATT-laag erboven in elke gebeurtenis. Beide kanten gaan tussen gebeurtenissen weer slapen. Het connection interval is een knop die de applicatie kan opvragen (zie Verbindingen).
Betrouwbaarheid. Elk pakket op een verbinding wordt bevestigd door de andere kant. De linklaag verzendt alles opnieuw waarop geen antwoord kwam, zodat de lagen erboven een geordende, verliesvrije bytestroom zien. In tegenstelling tot UDP – verstuur een pakket, hoop op het beste aan de netwerkkant heeft BLE bij normaal gebruik geen aparte onbetrouwbare modus – elk pakket op een open verbinding wordt opnieuw geprobeerd totdat het aankomt of de verbinding als verloren wordt verklaard.
De linklaag is ook waar versleuteling draait zodra een paar apparaten het tijdens het pairen eens is geworden over een sleutel (zie Koppelen en binden). Elk pakket op een versleutelde verbinding wordt bij de ontvanger ontsleuteld voordat de lagen erboven het ooit zien.
11.3.4. Wat Python hiervan ziet¶
Bijna niets. De bluetooth- en aioble-API’s stellen geen kanalen, hopping-reeksen, pakket-CRC’s of hertransmissietimers bloot; die worden allemaal afgehandeld binnen de BLE-port en de radio. De onderdelen die wel doorkomen, zijn die welke de onderhandeling op het moment van verbinden blootstelt – connection interval, MTU, adrestype.