11.7. GATT operacije

Karakteristika samo stoji u GATT bazi podataka kao imenovana vrijednost. Ono što je čini korisnom jest mali, dobro definirani skup operacija koje klijent može pokrenuti nad njom. Svaka karakteristika deklarira koje operacije podržava kao bitmasku svojstava – poslužitelj koji nema ništa za izložiti može objaviti vrijednost samo za čitanje, kontrolni registar može biti samo za pisanje, a senzor koji emitira ažuriranja postavio bi bit za obavijest (notify). Klijent otkriva bitmasku tijekom otkrivanja i poštuje je.

Pet operacija jesu read, write, write without response, notify i indicate. Dijele se u dvije skupine – povlačenje (klijent traži) i guranje (poslužitelj šalje).

11.7.1. Povlačenje: read i write

Te su dvije najjednostavnije i izgledaju upravo poput poziva funkcija.

  • Read. Klijent traži trenutnu vrijednost, poslužitelj je šalje natrag. Jedan obilazak, klijent dobiva ono što je poslužitelj postavio za tu karakteristiku, poslužitelj ne dobiva ništa o tome tko je čitao.

  • Write. Klijent šalje nove bajtove, poslužitelj ih pohranjuje (i opcionalno pokreće aplikacijsku logiku nad novom vrijednošću). Postoje dvije varijante:

    • Write with response – poslužitelj potvrđuje, podižući svaku aplikacijsku pogrešku pri statusu različitom od nule. Pouzdano, jedan obilazak.

    • Write without response – poslužitelj tiho pohranjuje bajtove; klijent uopće ne dobiva potvrdu. Brže (bez čekanja na potvrdu tijekom obilaska) i korisno za emitiranje, uz cijenu saznavanja o pogreškama samo putem bočnog očitavanja.

U aioble, API na strani klijenta skriva odabir iza jedne metode aioble.ClientCharacteristic.write() s ključnom riječi response (True / False / None za automatski odabir na temelju onoga što ravnopravni član oglašava).

11.7.2. Guranje: notify i indicate

Model povlačenja pogrešan je za podatke senzora. Traka za mjerenje otkucaja srca koju telefon mora ispitivati svake sekunde trošila bi bateriju na stotinu nepotrebnih radijskih događaja; ona koja gura vrijednost samo kada ima novo očitanje upravo je smisao BLE-a.

GATT to rješava operacijama koje inicira poslužitelj. Klijent se pretplaćuje na karakteristiku; od tog trenutka, svaki put kada poslužitelj ažurira vrijednost, nova vrijednost gura se preko veze do klijenta. Dvije varijante:

  • Notify. Pošalji i zaboravi. Poslužitelj stavlja obavijest u red čekanja, sloj veze je prenosi tijekom sljedećeg događaja veze, klijent je prima. Nema potvrde na GATT razini; uobičajeno ponovno odašiljanje sloja veze rješava gubitke na strani radija, ali aplikacija ne vidi potvrdu da je vrijednost obrađena.

  • Indicate. Poslužitelj šalje obavijest i čeka klijentovu potvrdu na GATT razini prije slanja sljedeće. Jedna indikacija u trenutku. Koristi se kada poslužitelj treba znati da je klijent stvarno vidio vrijednost – karakteristika kritičnog alarma, potvrda konfiguracije.

Dva usporedna dijagrama poslužitelja i klijenta. Lijevo, klijent šalje "read", poslužitelj odgovara vrijednošću. Tri čitanja zaredom, svaki par strelica. Desno, klijent šalje jedan "subscribe", a zatim poslužitelj gura tri "notify" paketa u trenucima koje sam odabere, bez ikakvog klijentskog zahtjeva između.

Povlačenje (read) naspram guranja (notify). Uz obavijesti, klijent se pretplaćuje jednom, a poslužitelj gura nove vrijednosti kad god se promijene.

Pretplata se odvija pisanjem u deskriptor pridružen karakteristici – Client Characteristic Configuration Descriptor (CCCD, 0x2902). Pisanjem 0x0001 omogućuju se obavijesti, 0x0002 omogućuju se indikacije, 0x0000 onemogućuje oboje. Metoda aioble.ClientCharacteristic.subscribe() izvodi pisanje umjesto vas, s ključnim zastavicama notify=True i indicate=True.

Nakon pretplate, klijent čeka dolazna guranja pomoću notified() i indicated() – obje su async korutine koje se obustavljaju dok ne stigne sljedeće guranje.

11.7.3. MTU upravlja veličinom korisnog tereta

Svaka je operacija ograničena pregovorenim MTU-om na koji se veza ustalila pri uspostavi. Zadani MTU je 23 bajta, što ostavlja 20 bajtova za bajtove vrijednosti karakteristike nakon GATT zaglavlja. Sve veće od toga mora ili stati u veći MTU (pregovoren naviše putem aioble.DeviceConnection.exchange_mtu(), do 512 bajtova na kameri) ili biti podijeljeno u više karakteristika ili više obavijesti.

Klijentom inicirana čitanja i pisanja vrijednosti većih od MTU-a obrađuju se GATT-ovim dugim procedurama u pozadini (Read Long / Prepare-Write + Execute-Write); aioble ih izvodi transparentno, pa pozivanje read() / write() s prevelikom vrijednošću jednostavno košta više obilazaka. Poslužiteljem inicirane obavijesti i indikacije ne fragmentiraju se – jedno je guranje ograničeno MTU-om, a aplikacija dijeli sve veće u više obavijesti ili u potpunosti izlazi iz GATT-a.

Za doista velike prijenose – snimljenu sličicu, skup mjerenja, blob ugrađenog programa (firmware) – pravi je odgovor obično u potpunosti izaći iz GATT-a i umjesto njega koristiti L2CAP kanal (vidi L2CAP kanali).

11.7.4. Dvije strane na prvi pogled

Pet operacija različito se izlaže na svakoj strani veze: