11.14. Shrnutí¶
Prošli jste Bluetooth Low Energy od rádia až po Python API používané k jeho ovládání:
Motivace – BLE je odpovědí, když chce kamera komunikovat s něčím nablízku bez jakékoli infrastruktury mezi nimi. Telefon ve stejné místnosti, nositelné zařízení na zápěstí, beacon na zdi. Krátký dosah, žádná síť, ke které je třeba se připojit, téměř žádná spotřeba energie.
Rádio – 2,4 GHz, 40 kanálů: tři pro advertising, 37 pro data spojení, přeskakovaných v pseudonáhodné sekvenci s adaptivním vyhýbáním se zarušeným kanálům. Krátké pakety, povětšinou spící rádia.
Linková vrstva – rámcování paketů, adresování, plánování spojení, opakované odesílání a šifrování na linkové vrstvě. Nic z toho se z Pythonu nekonfiguruje; vše se projevuje v parametrech spojení a v MTU.
Generic Access Profile (GAP) – vyhledávání a správa spojení. Čtyři role: peripheral a broadcaster (vysílají advertising), central a observer (skenují). Advertising payloady nesou lokální název, UUID služeb, vzhled (appearance) a data specifická pro výrobce – 31 bajtů plus volitelná 31bajtová scan response. Interval spojení, latence periferie a supervision timeout určují, jaký pocit otevřené spojení vyvolává.
Generic Attribute Profile (GATT) – strom služeb, z nichž každá obsahuje charakteristiky, z nichž každá volitelně obsahuje deskriptory, identifikované pomocí UUID (16bitové pro standardy Bluetooth-SIG, 128bitové pro vlastní). Pět operací: read a write (vyžádání, iniciováno klientem), notify a indicate (vyslání, iniciováno serverem, odebírané přes Client Characteristic Configuration Descriptor). Velikost payloadu je omezena vyjednaným MTU.
Python API –
aiobleproměňuje každý BLE vzor v asyncio korutinu. Periferie jeaioble.advertise()ve smyčce přes spojení, s objektyService/Characteristicsestavenými jednou a potvrzenými pomocíaioble.register_services(). Central jeaioble.scan()k nalezení protějšku,connect()k otevření spojení,service()acharacteristic()k procházení vzdáleného GATT stromu a potéread()/write()/subscribe()/notified()pro samotná data. Odpojení se projeví jakoaioble.DeviceDisconnectedErroruvnitř korutiny, která čekala.Kanály L2CAP – únikový východ pro hromadné bajtové proudy, které se nehodí do GATT modelu klíč/hodnota.
aioble.DeviceConnection.l2cap_accept()/l2cap_connect()otevírají kanál pro jednotlivou aplikaci nad GAP spojením, s řízením toku pomocí kreditů pro send / recv a větším MTU, než dokáže GATT přenést.Párování a šifrování – BLE spojení jsou ve výchozím stavu veřejná.
aioble.DeviceConnection.pair()zahájí výměnu klíčů, jež vytvoří šifrované spojení;bond=True(výchozí) uchová klíče, takže následující spojení přeskočí handshake. Bezmitm=Truea použitelné IO schopnosti chrání šifrování proti pasivním odposlouchávajícím, ale ne proti aktivnímu přesměrování během původního párování.
To je dost na to, abyste psali kamerové aplikace, které publikují stav jako periferie, čtou senzorová data jako central, posílají živé hodnoty do telefonu přes BLE, zabezpečují spojení krokem spárování a vázání a – pro vzácný případ hromadného přenosu – vykročí z GATT do kanálu L2CAP.
11.14.1. Řešení potíží¶
Selhání BLE jsou většinou nesoulady mezi tím, co obě strany očekávají, a inspektor na straně telefonu je nejrychlejší způsob, jak zjistit, čí očekávání jsou mimo. Standardním nástrojem je nRF Connect for Mobile (Nordic Semiconductor, zdarma na Androidu a iOS): skenuje, připojuje se, prochází databázi GATT, čte a zapisuje charakteristiky a odebírá notifikace – takže chování na straně kamery lze testovat izolovaně, bez psaní jakékoli doprovodné aplikace.
Běžné způsoby selhání:
„Mé zařízení se objeví ve skeneru, ale nepřipojí se.“ Nejčastěji má advertising paket
connectable=False(režim broadcaster), nebo je předchozí spojení stále otevřené a kamera je už zaaioble.advertise(). Přidejte kolem volání advertise výpisy print, abyste to potvrdili.„exchange_mtu(512) proběhlo, ale mé notifikace jsou stále omezeny na 20 bajtů.“ Vyjednané MTU je
min(local, peer)– telefon nebo knihovna central možná na své straně nepožádaly o větší MTU, v kterémžto případě spojení zůstane na 23. Po návratuexchange_mtu()zkontrolujtemtu. Vezměte také na vědomí, žeexchange_mtu()funguje pouze jednou za spojení; zavolejte ho před první velkou operací.„Párování selhává s obecnou chybou.“ Dva obvyklí viníci: nesoulad IO schopností (žádání
mitm=Truena kameře deklarujícíio=3/ žádný vstup žádný výstup – není jak potvrdit číselný kód, takže párovací mechanismus selže) a divoce nesprávný reálný čas (wall-clock) na kameře, když ho protějšek vyžaduje. Před prvním pokusem o párování nastavte hodiny pomocíntptime.settime().„Notifikace nikdy nedorazí ke klientovi.“ Dvě věci ke kontrole, v pořadí: (a) byla charakteristika deklarována s
notify=True? – bit vlastnosti musí být nastaven na straně serveru; (b) zavolal klientsubscribe()? – bez zápisu Client Characteristic Configuration Descriptor (CCCD) je serveru sděleno, že žádný klient notifikace nechce, a server je tiše zahazuje.„Inzerovaný název je oříznutý nebo chybí.“ Advertising payload má 31 bajtů a pole flags + service-UUID + appearance si každé ukrojí svůj díl. Dlouhé
name=plus několik UUID služeb způsobí přetečení. Buď název zkraťte, nebo použijte aktivní skenování, aby scan response (dalších 31 bajtů) nesla přetečení. nRF Connect zobrazuje obě poloviny zvlášť, což činí rozdělení zřejmým.„L2CAP connect okamžitě vyvolá výjimku.“ Obvykle nesoulad PSM – obě strany se musí out of band dohodnout na stejném čísle PSM.
L2CAPConnectionErrornese stavový kód Bluetooth jako svůj první argument; stav2(„PSM not supported“) je tím prozrazujícím.„Vázaná spojení při každém opětovném připojení stále spouštějí úplný párovací handshake.“
aioble.security.load_secrets()nebylo při startu zavoláno. Bez něj jsou uložené klíče sice na flash, ale nikdy se nenačtou do paměti, takže identita protějšku je neznámá a párování běží pokaždé od začátku.
Když vše ostatní selže, nízkoúrovňový modul bluetooth zpřístupňuje IRQ callback, který se spustí pro každou podkladovou událost; krátké přihlášení k němu a vypisování událostí je ekvivalentem Wireshark trace pro stranu kamery.
11.14.2. Použití této reference později¶
Berte kapitoly o Bluetooth jako referenční materiál; vracet se pro přesné rozvržení advertising payloadu periferie nebo pro průběh skenování a odběru na straně central je zamýšleným využitím. Referenční stránky aioble — Asynchronní BLE a bluetooth — nízkoúrovňový Bluetooth uvádějí na jednom místě každou metodu, příznak a konstantu, když je otázka jen „jaký je přesný název tohoto volání“.