11.2. Stos BLE¶
Podobnie jak sieci, Bluetooth Low Energy jest zbudowany jako stos warstw, z których każda rozwiązuje jeden problem i udostępnia czystą abstrakcję warstwie powyżej. Nazwy poniżej pochodzą wprost ze specyfikacji Bluetooth Core i pojawiają się w interfejsach API aioble oraz bluetooth.
Stos Bluetooth Low Energy. Każda warstwa przekazuje czystszą abstrakcję do następnej – ten sam wzorzec, którego używa stos sieciowy.¶
Warstwa fizyczna. Przenosi bity między dwoma urządzeniami przez radio 2,4 GHz. Wybór kanału, modulacja, moc nadawania. Zadaniem kamery jest być zasilonej; krzem robi resztę.
Warstwa łącza. Przenosi pakiety między dwoma urządzeniami, które zgadzają się ze sobą rozmawiać. Dodaje adresy urządzeń, aby każdy pakiet mógł być skierowany do jednego sąsiada, harmonogramuje okresowe zdarzenia radiowe składające się na połączenie i obsługuje retransmisję każdego pakietu, którego odbiorca nie potwierdził.
Generic Access Profile (GAP). Warstwa wykrywania i połączenia. Definiuje cztery role – broadcaster, observer, peripheral, central – oraz protokół rozgłaszania / skanowania, który w ogóle pozwala dwóm urządzeniom się odnaleźć, a także procedurę otwierania i zamykania połączenia między nimi. To tutaj mieszczą się adresy, ładunki rozgłaszania, parametry połączenia oraz parowanie.
Generic Attribute Profile (GATT). Warstwa danych. Siedzi na szczycie otwartego połączenia GAP i udostępnia niewielką bazę danych klucz/wartość: jedna strona hostuje drzewo nazwanych wartości zwanych charakterystykami, druga strona je odczytuje, zapisuje lub subskrybuje. To tutaj przepływają rzeczywiste bajty aplikacji.
Aplikacja. Cokolwiek kamera i partner uzgodnią, że oznaczają bajty. Bluetooth SIG publikuje standardowe profile – tętno, poziom baterii, pomiary środowiskowe – które definiują powszechnie używane charakterystyki, dzięki czemu niespokrewnione urządzenia mogą ze sobą współpracować, ale każda aplikacja może swobodnie definiować własne.
11.2.1. Jak warstwy układają się w czasie działania¶
Wzorzec pasuje do stosu sieciowego:
Bajty aplikacji trafiają do wartości charakterystyki.
GATT opakowuje je nagłówkiem identyfikującym, do której charakterystyki należą bajty.
GAP utrzymuje otwarte połączenie w działaniu, aby GATT miało dokąd wysyłać.
Warstwa łącza opakowuje całość w pakiet, zaadresowany do adresu urządzenia partnera, i harmonogramuje zdarzenie radiowe, aby go nadać.
Warstwa fizyczna zamienia pakiet w krótką serię radia 2,4 GHz.
Warstwa fizyczna i warstwa łącza są niemal niewidoczne z poziomu Pythona – krzem i oprogramowanie układowe radia je obsługują. Od GAP w górę kod Pythona kamery ma więcej do powiedzenia.
11.2.2. Dwie warstwy, które API skierowane do użytkownika dyskretnie pomija¶
Specyfikacja Bluetooth wymienia jeszcze dwie warstwy, które znajdują się między warstwą łącza a GAP/GATT: Host Controller Interface (HCI) – protokół, którego procesor hosta używa do sterowania osobnym układem radiowym – oraz L2CAP – multiplekser, który dzieli jedno połączenie warstwy łącza na kilka kanałów logicznych.
Żadna z nich nie jest widoczna w API aioble, ale żadna też nie znika. HCI mieści się wewnątrz portu BLE i jest niewidoczne, chyba że w grę wchodzi niestandardowa kompilacja MicroPython, a L2CAP jest nośnikiem, na którym działa GATT. Aplikacja, która potrzebuje surowych strumieni bajtów, może zarezerwować własny kanał L2CAP (Kanały L2CAP).