11.3. Radion och länklagret¶
De två nedersta lagren i BLE-stacken är ur Pythons perspektiv nästan helt automatiska – radiokislet och de lager som MicroPython kör ovanpå det hanterar allt från att välja en kanal till att återsända ett förlorat paket. Tre av de val de gör syns ändå igenom i det användarvända API:et: effekt, räckvidd och genomströmning.
11.3.1. Radion¶
BLE använder samma 2,4 GHz Industrial-Scientific-Medical-band (ISM) som Wi-Fi, mikrovågsugnar och de flesta andra trådlösa tekniker med kort räckvidd. Bandet är uppdelat i 40 kanaler om 2 MHz vardera.
Tre av de 40 kanalerna är reserverade för annonsering – korta sändningar som tillkännager en enhets närvaro för alla som lyssnar. De är utspridda över bandet så att en lyssnare snabbt kan svepa över alla tre och så att störningar på någon av dem sannolikt inte slår ut enheten helt.
Trettiosju är datakanaler. När två enheter väl ansluter utbyter de paket på dessa, och hoppar mellan dem i en pseudoslumpmässig sekvens som de två sidorna kommer överens om vid anslutningstillfället. Adaptivt frekvenshopp låter endera sidan markera en kanal som dålig (kraftiga Wi-Fi-störningar, mikrovågsugn, närliggande BLE-nätverk) så att sekvensen hoppar över den.
De 40 BLE-kanalerna på 2,4 GHz-bandet. Tre är för annonsering, resten bär trafik på en öppen anslutning.¶
Radion sänder korta paket – som mest ett par millisekunder långa – och sover däremellan. Den sömnen är vad som gör tekniken energisnål. En typisk BLE-perifer enhet tillbringar långt under en procent av sin tid med att faktiskt sända; resten är radion avstängd mellan schemalagda händelser.
11.3.2. Länklagret¶
Länklagret är den minsta enheten i BLE som pratar med sin motsvarighet på en annan enhet. Det sköter fyra uppgifter.
Paketramning. Varje paket bär ett kort huvud (kanalåtkomstadress, paketlängd, kontrollbitar), en nyttolast och en CRC. Mottagaren kontrollerar CRC:n och förkastar allt som är korrupt.
Adressering. Varje BLE-enhet har en 48-bitars enhetsadress som identifierar den på radion. Vissa är publika – en hårdvaruidentifierare som tillverkaren har tilldelat, spårbar för alltid. Vissa är slumpmässiga – genererade på enheten, roterade periodvis och valfritt krypterade så att en avlyssnare inte kan koppla två sändningar till samma fysiska hårdvara. Adresser dyker upp igen i Annonsering och skanning.
Anslutningsschemaläggning. När två enheter väl ansluter schemalägger länklagret periodiska radiohändelser på hoppsekvensen – med ett fast anslutningsintervall mellan – och packar in vilken data som än står i kö från GATT-lagret ovanför i varje sådan. Båda sidor går tillbaka till att sova mellan händelserna. Anslutningsintervallet är ett reglage som applikationen kan begära (se Anslutningar).
Tillförlitlighet. Varje paket på en anslutning kvitteras av den andra sidan. Länklagret återsänder allt som inte fick något svar, så att lagren ovanför ser en ordnad, förlustfri byteström. Till skillnad från UDP – skicka ett paket, hoppas på det bästa på nätverkssidan har BLE inte ett separat opålitligt läge i normal användning – varje paket på en öppen anslutning försöks om tills det kommer fram eller länken förklaras förlorad.
Länklagret är också där kryptering körs när ett par enheter väl har kommit överens om en nyckel under parning (se Parkoppling och bindning). Varje paket på en krypterad länk dekrypteras hos mottagaren innan lagren ovanför någonsin ser det.
11.3.4. Vad Python ser av allt detta¶
Nästan ingenting. API:erna bluetooth och aioble exponerar inte kanaler, hoppsekvenser, paket-CRC:er eller återsändningstimers; allt det hanteras inuti BLE-porten och radion. De delar som syns igenom är de som anslutningstidens förhandling exponerar – anslutningsintervall, MTU, adresstyp.