11.3. A rádió és a kapcsolati réteg¶
A BLE-verem alsó két rétege Python szempontjából szinte teljesen automatikus – a rádió-szilícium és a rétegek, amelyeket a MicroPython felette futtat, mindent kezelnek a csatorna kiválasztásától az elveszett csomag újraküldéséig. Az általuk hozott választások közül három mégis átlátszik a felhasználó felé eső API-ba: a teljesítmény, a hatótávolság és az átviteli teljesítmény.
11.3.1. A rádió¶
A BLE ugyanazt a 2,4 GHz-es ipari-tudományos-orvosi (ISM) sávot használja, mint a Wi-Fi, a mikrohullámú sütők és a legtöbb más rövid hatótávolságú vezeték nélküli technológia. A sávot 40 darab, 2 MHz széles csatornára osztják.
A 40 csatorna közül három a hirdetés számára van fenntartva – rövid közvetítések, amelyek bejelentik egy eszköz jelenlétét bárkinek, aki figyel. Ezek szét vannak osztva a sávban, hogy egy hallgató mindhármat gyorsan végigpásztázhassa, és hogy az egyiken jelentkező zavar valószínűleg ne tegye teljesen némává az eszközt.
Harminchét adatcsatorna. Miután két eszköz csatlakozik, ezeken cserélnek csomagokat, közöttük egy ál-véletlenszerű sorozaton ugrálva, amelyben a két oldal a kapcsolat létrejöttekor megállapodik. Az adaptív frekvenciaugrás lehetővé teszi, hogy bármelyik oldal rossznak jelöljön egy csatornát (erős Wi-Fi-zavar, mikrohullámú sütő, szomszédos BLE-hálózat), így a sorozat kihagyja azt.
A 40 BLE-csatorna a 2,4 GHz-es sávon. Három a hirdetésre szolgál, a többi a forgalmat viszi egy nyitott kapcsolaton.¶
A rádió rövid csomagokat továbbít – legfeljebb néhány ezredmásodperc hosszúakat –, és közöttük alszik. Ez az alvás teszi a technológiát alacsony fogyasztásúvá. Egy tipikus BLE-peripheral az idejének jóval kevesebb mint egy százalékát tölti tényleges átvitellel; a többi az ütemezett események közötti kikapcsolt rádió.
11.3.2. A kapcsolati réteg¶
A kapcsolati réteg a BLE legkisebb egysége, amely egy másik eszközön lévő párjával kommunikál. Négy feladatot kezel.
Csomagkeretezés. Minden csomag egy rövid fejlécet (csatorna-hozzáférési cím, csomaghossz, vezérlőbitek), egy hasznos terhelést és egy CRC-t hordoz. A vevő ellenőrzi a CRC-t, és eldob mindent, ami sérült.
Címzés. Minden BLE-eszköznek van egy 48 bites eszközcíme, amely azonosítja a rádióban. Némelyik nyilvános – egy hardverazonosító, amelyet a gyártó rendelt hozzá, örökre nyomon követhető. Némelyik véletlenszerű – az eszközön generálva, időszakosan forgatva, és opcionálisan titkosítva, hogy egy lehallgató ne tudjon két átvitelt ugyanahhoz a fizikai hardverhez kötni. A címek újra előkerülnek itt: Hirdetés és pásztázás.
Kapcsolatütemezés. Miután két eszköz csatlakozik, a kapcsolati réteg periodikus rádióeseményeket ütemez az ugrási sorozaton – egy fix kapcsolati intervallummal egymástól –, és minden eseménybe becsomagolja a felette lévő GATT-rétegtől sorban álló adatokat. Mindkét oldal visszaalszik az események között. A kapcsolati intervallum egy szabályozó, amelyet az alkalmazás kérhet (lásd Kapcsolatok).
Megbízhatóság. Egy kapcsolaton lévő minden csomagot a másik oldal nyugtáz. A kapcsolati réteg újraküld mindent, ami nem kapott választ, így a felette lévő rétegek egy rendezett, veszteségmentes bájtfolyamot látnak. A hálózati oldalon lévő UDP – küldj egy csomagot, remélj a legjobbat-vel ellentétben a BLE-nek normál használat során nincs külön megbízhatatlan módja – egy nyitott kapcsolaton lévő minden csomagot újrapróbál, amíg meg nem érkezik, vagy a kapcsolatot elveszettnek nem nyilvánítják.
A kapcsolati réteg az is, ahol a titkosítás fut, miután egy eszközpár megegyezett egy kulcsban a párosítás során (lásd Párosítás és kötés). Egy titkosított kapcsolaton lévő minden csomagot a vevőnél visszafejtenek, mielőtt a felette lévő rétegek egyáltalán látnák.
11.3.4. Mit lát ebből a Python¶
Szinte semmit. A bluetooth és aioble API-k nem tárnak fel csatornákat, ugrási sorozatokat, csomag-CRC-ket vagy újraküldési időzítőket; ezeket mind a BLE-port és a rádió belsejében kezelik. A valóban átlátszó részek azok, amelyeket a kapcsolat-időbeli egyeztetés feltár – kapcsolati intervallum, MTU, címtípus.