11.5. Připojení

Jakmile si centrální zařízení vybere z proudu inzerce nějakou periferii a pošle jí connect request, obě strany opustí režim inzerce / skenování a přejdou do připojení. Rádio nyní plánuje svou činnost na datových kanálech linkové vrstvy a pseudonáhodně mezi nimi přeskakuje podle sekvence dohodnuté v okamžiku připojení. Vše nad linkovou vrstvou – GATT, zabezpečení, L2CAP – běží nad připojením, které se zde vytvoří.

11.5.1. Událost připojení

Dvě zařízení v BLE připojení nevysílají nepřetržitě. Dohodnou se na intervalu připojení a při každém intervalu obě strany probudí rádio, vymění si pakety čekající ve frontě, potvrdí přijaté a vrátí se do spánku. Každá taková výměna se nazývá událost připojení.

Časová osa s centrálním zařízením na horní stopě a periferií na dolní stopě. Na každé hranici intervalu připojení zobrazují obě stopy krátký impuls označený "TX/RX". Mezera mezi impulsy je označena "connection interval"; doba trvání každého impulsu je "connection event". Periferie má několik vynechaných událostí označených "peripheral latency: peripheral may skip if idle".

Rádio na každé straně je probuzeno pouze během krátkých událostí připojení, vše ostatní spí. Periferie může vynechat události v rámci peripheral latency.

Čísla, která to řídí, se vyjednávají v okamžiku připojení a linková vrstva je vynucuje. Aplikaci jsou viditelná jak jako ovládací prvky na straně požadavku, tak jako výsledné hodnoty hlášené zpět.

  • Interval připojení. 7,5 ms až 4 s, v krocích po 1,25 ms. Centrální zařízení zvolí hodnotu, o kterou periferie žádá, pokud není požadavek nepřiměřený. Kratší intervaly doručují data s nižší latencí za cenu vyšší aktivity rádia; delší intervaly šetří energii, ale každý obousměrný přenos je pomalejší.

  • Peripheral latency. Nezáporné celé číslo N. Periferie smí vynechat až N událostí připojení, pokud nemá co odeslat, a místo probuzení rádia kvůli prázdné výměně se vrátí do spánku. Užitečné pro senzory, které se probudí, aby jednou za sekundu nahlásily hodnotu, ale chtějí mít nízký responzivní interval připojení pro vzácnou okamžitou zprávu.

  • Supervision timeout. 100 ms až 32 s. Pokud jedna strana po tuto dobu nic neslyší od druhé, je spojení prohlášeno za ztracené a obě strany se vrátí k inzerci / skenování. Časový limit musí být delší než connection_interval * (1 + peripheral_latency) – linková vrstva odmítá hodnoty, které toto porušují.

aioble.Device.connect() přijímá min_conn_interval_us a max_conn_interval_us, takže centrální zařízení může požádat o konkrétní rozsah; skutečnou hodnotu, na které se rádio ustálilo, lze po navázání připojení přečíst zpět prostřednictvím konfigurace linkové vrstvy.

11.5.2. Co znamená „central“ a „peripheral“ uvnitř připojení

Role nastavené v době inzerce zůstávají i po navázání připojení:

  • Centrální zařízení řídí časování – vlastní řídicí stranu (master) přeskakovací sekvence a událostí připojení.

  • Periferie je reaktivní. Může požádat o změnu parametrů připojení (například pomalejší interval kvůli úspoře energie), ale centrální zařízení rozhoduje, zda ji přijme.

Role jsou nezávislé na tom, kdo hostí databázi GATT, což je samostatná osa. Podle konvence je periferie zároveň GATT serverem a centrální zařízení GATT klientem, ale BLE umožňuje hostovat služby GATT na kterékoli straně. Kamery téměř vždy dodržují konvenci: periferie + server pro aplikace typu „kamera publikuje data“, centrální zařízení + klient pro aplikace typu „kamera čte ze senzoru“.

11.5.3. Maximální přenosová jednotka (MTU)

Linková vrstva přenáší pakety, které jsou ve výchozím nastavení krátké – 27 bajtů užitečného zatížení, z nichž je pro GATT k dispozici pouze 23. To stačí na malé čtení nebo krátký příkaz, ale je to nepatrné oproti čemukoli vícebajtovému. Obě strany mohou tuto hodnotu vyjednat nahoru, až po limit, který podporuje firmware rádia (na moderních řadičích typicky několik set bajtů).

API aioble řídí vyjednávání prostřednictvím aioble.DeviceConnection.exchange_mtu() a výsledek je k dispozici v atributu mtu. Větší MTU znamená méně obousměrných přenosů pro jakoukoli hodnotu větší než ~20 bajtů, za malou cenu v paměti bufferu.

11.5.4. Životnost

Připojení trvá, dokud nenastane jedna z následujících situací:

  • kterákoli strana zavolá disconnect(),

  • vyprší supervision timeout (mimo dosah, vypnuté rádio, zhroucený protějšek), nebo

  • dojde k explicitnímu selhání linkové vrstvy (neshoda šifrování, odmítnutí párování).

Když připojení vypadne, každá operace GATT zařazená ve frontě nebo probíhající na něm vyvolá aioble.DeviceDisconnectedError a všechny bloky async with connection, ve kterých se aplikace nachází, čistě skončí. Periferie obvykle reaguje návratem k aioble.advertise() a čekáním na další centrální zařízení; centrální zařízení reaguje buď opětovným skenováním, nebo předáním informace o odpojení aplikaci.

Životnost je jedním z důvodů, proč je aioble užitečný. Synchronní BLE API by muselo vystavovat callbacky odpojení a masky událostí; verze pro asyncio převádí odpojení na výjimky uvnitř korutiny, která na operaci čekala, což je přesně to, pro co je úklid pomocí async with vytvořen.