GATT: proč potvrzení stojí celý interval
Nad linkovou vrstvou sedí GATT — model, ve kterém má zařízení služby, služby mají charakteristiky a charakteristiky mají hodnoty. Je to jednoduché a naprosto zásadní pro výkon, protože každá operace má jinou cenu v intervalech.
| operace | paketů | čeká na odpověď? | cena |
|---|---|---|---|
| notifikace | 1 | ne | 1 interval |
| zápis bez odpovědi | 1 | ne | 1 interval |
| indikace | 2 | ano | 2 intervaly |
| zápis s odpovědí | 2 | ano | 2 intervaly |
| čtení | 2 | ano | 2 intervaly |
Ta dvojka je horší, než vypadá
Potvrzovaná operace nemůže poslat další, dokud nedorazí odpověď — a ta přijde nejdřív v příští schůzce. Při intervalu 30 ms to znamená 16 operací za sekundu, ať je PHY jakkoli rychlé. Nepotvrzovaná notifikace se pošle šestkrát za schůzku, tedy dvěstěkrát za sekundu.
Dvanáctinásobný rozdíl mezi „read“ a „notify“, a nemá to nic společného s rychlostí rádia. Aplikace, která čte hodnotu v cyklu (polling), je proto vždycky mnohonásobně pomalejší než ta, která si nechá posílat notifikace — a to je nejčastější výkonnostní chyba v BLE aplikacích vůbec.
Návrhové pravidlo
- Data od periferie → notifikace. Nikdy nečíst v cyklu.
- Povel k periferii → zápis bez odpovědi, pokud aplikace umí ztrátu ošetřit sama (a v robotice by měla — viz RoboLinkLab).
- Zápis s odpovědí jen tam, kde na potvrzení opravdu záleží: konfigurace, kalibrace, příkazy, které se nesmí ztratit.
- Indikaci skoro nikdy. Je to notifikace s potvrzením, tedy dvojnásobná cena za jistotu, kterou většinou zajistí aplikační protokol líp.
Souvislost, kterou je snadné přehlédnout: tohle je táž past jako v NetLabu — spolehlivost na nižší vrstvě stojí latenci a při krátkých zprávách se nevyplácí. BLE dává na výběr obojí a výchozí volba v mnoha knihovnách je ta drahá.