11.2. BLE-stacken

Liksom nätverk är Bluetooth Low Energy uppbyggd som en stack av lager, där varje lager löser ett enda problem och exponerar en ren abstraktion till lagret ovanför. Namnen nedan kommer direkt från Bluetooth Core-specifikationen och dyker upp i aioble- och bluetooth-API:erna.

En vertikal stack med fem märkta rutor. Från botten till topp: Physical (radio), Link Layer, GAP, GATT, Application. En pil till höger pekar uppåt längs stacken med etiketten "vad vi bygger". En pil till vänster pekar nedåt längs stacken med etiketten "vad som tillhandahålls".

Bluetooth Low Energy-stacken. Varje lager lämnar en renare abstraktion uppåt till nästa, samma mönster som nätverksstacken använder.

Fysiskt lager. Flytta bitar mellan två enheter över 2,4 GHz-radion. Kanalval, modulering, sändareffekt. Kamerans uppgift är att vara påslagen; kislet sköter resten.

Länklager. Flytta paket mellan två enheter som kommer överens om att prata med varandra. Lägger till enhetsadresser så att varje paket kan riktas mot en granne, schemalägger de periodiska radiohändelser som utgör en anslutning och hanterar omsändning av varje paket som mottagaren inte kvitterade.

Generic Access Profile (GAP). Upptäckts- och anslutningslagret. Definierar fyra roller – broadcaster, observer, peripheral, central – och annonserings- / skanningsprotokollet som låter två enheter hitta varandra till att börja med, plus proceduren för att öppna och stänga en anslutning mellan dem. Det är här adresser, annonseringsnyttolaster, anslutningsparametrar och parkoppling bor.

Generic Attribute Profile (GATT). Datalagret. Sitter ovanpå en öppen GAP-anslutning och exponerar en liten nyckel/värde-databas: ena sidan är värd för ett träd av namngivna värden som kallas karakteristiker, den andra sidan läser, skriver eller prenumererar på dem. Det är här de faktiska applikationsbytena flödar.

Applikation. Vad än kameran och motparten kommer överens om att bytena betyder. Bluetooth SIG publicerar standardiserade profiler – hjärtfrekvens, batterinivå, miljöavkänning – som definierar vanligt använda karakteristiker så att orelaterade enheter kan samverka, men varje applikation är fri att definiera sina egna.

11.2.1. Hur lagren staplar sig vid körning

Mönstret matchar nätverksstacken:

  • Applikationens byte går in i ett karakteristikvärde.

  • GATT omsluter det med ett huvud som identifierar vilken karakteristik bytena tillhör.

  • GAP håller en öppen anslutning igång så att GATT har någonstans att skicka.

  • Länklagret omsluter alltihop i ett paket, adresserat till motpartens enhetsadress, och schemalägger en radiohändelse för att sända det.

  • Det fysiska lagret förvandlar paketet till en kort skur av 2,4 GHz-radio.

Det fysiska lagret och länklagret är nästan osynliga från Python – kislet och radions fasta programvara hanterar dem. Från GAP och uppåt får kamerans Python-kod mer att säga till om.

11.2.2. Två lager som det användarvända API:et diskret hoppar över

Bluetooth-specifikationen namnger ytterligare två lager som sitter mellan länklagret och GAP/GATT: Host Controller Interface (HCI) – protokollet som värd-CPU:n använder för att driva ett separat radiochip – och L2CAP – multiplexern som delar upp en länklageranslutning i flera logiska kanaler.

Inget av dem är synligt i aioble-API:et, men inget av dem försvinner heller. HCI sitter inuti BLE-porten och är osynligt om inte ett anpassat bygge av MicroPython används, och L2CAP är bäraren som GATT körs ovanpå. En applikation som vill ha råa byteströmmar kan göra anspråk på sin egen L2CAP-kanal (L2CAP-kanaler).