11.6. Usluge i karakteristike

Kada je GAP doveo dva uređaja u otvorenu vezu, sloj iznad njega – Generic Attribute Profile, GATT – mora bajtovima koji teku tom vezom dati značenje. BLE-ov izbor ovdje je neuobičajen. Tamo gdje TCP izlaže sirovi tok bajtova i prepušta aplikaciji da izmisli vlastito uokvirivanje, GATT izlaže malu bazu podataka tipa ključ/vrijednost koju jedna strana ugošćuje, a druga čita, zapisuje ili se na nju pretplaćuje.

Ta baza podataka je ono o čemu dizajneri aplikacija provode većinu svog BLE vremena razmišljajući. Što kamera objavljuje telefonu, što prati na udaljenom senzoru, kako Bluetooth tipkovnica govori svom domaćinu koja je tipka pritisnuta – sve su to vrijednosti karakteristika u nekoj GATT bazi podataka negdje.

11.6.1. Dvije osi uloga, ne jedna

Čest izvor zabune: peripheral / central i server / client su dvije neovisne osi, a ne sinonimi.

  • Peripheral i central su GAP uloge, postavljene tijekom uspostave veze. Peripheral se oglašava i na njega se povezuje; central skenira i pokreće vezu. To se utvrđuje u trenutku kada se veza uspostavi i ne mijenja se.

  • Server i client su GATT uloge, postavljene po svakoj operaciji nad karakteristikom. Server ugošćuje karakteristiku; client je čita, zapisuje ili se na nju pretplaćuje.

Te dvije osi specifikacija razdvaja. Peripheral je obično server (traka za mjerenje srčanog ritma objavljuje svoja očitanja), a central je obično client (telefon ih čita), ali BLE dopušta bilo koju kombinaciju – peripheral može otkriti karakteristiku na centralu s kojim se upravo povezao, ili jedna veza može ugostiti usluge na obje strane istovremeno.

Većina aplikacija za kameru drži se konvencionalnog sparivanja (peripheral + server ili central + client), pa ih ostatak ovog odjeljka tretira kao jednu os kada je opisan konvencionalni slučaj. Kada razlika ima značaj, oba pojma su izričito napisana.

11.6.2. Unutar baze podataka

GATT baza podataka je stablo. Listovi nose stvarne bajtove. Grane grupiraju povezane listove u ljudski razumljive cjeline.

Stablo s gornjim čvorom označenim "GATT database". Ispod njega tri čvora Service označena "Generic Access (0x1800)", "Battery (0x180F)" i "Environmental Sensing (0x181A)". Svaki Service ima podređene čvorove Characteristic; Battery usluga ima "Battery Level (0x2A19)" s podređenim Descriptorom "CCCD". Usluga Environmental Sensing ima "Temperature (0x2A6E)" i "Humidity (0x2A6F)".

GATT baza podataka. Usluge grupiraju karakteristike; karakteristike nose bajtove aplikacije; deskriptori nose metapodatke o karakteristici.

Postoje tri vrste čvorova:

  • Usluga (service) je logička grupa povezanih vrijednosti. Bluetooth SIG objavljuje standardne definicije usluga za uobičajene slučajeve upotrebe – Battery Service za razinu baterije, Environmental Sensing za temperaturu / vlažnost / tlak, Heart Rate za mjerače srčanog ritma – tako da generička aplikacija na telefonu može prepoznati uslugu koju nikada prije nije vidjela. Aplikacija je također slobodna definirati vlastite usluge za stvari koje SIG nije standardizirao.

  • Karakteristika (characteristic) je jedna imenovana vrijednost unutar usluge. Battery usluga ima jednu karakteristiku – Battery Level, jednobajtni postotak. Environmental Sensing ima odvojene karakteristike za temperaturu, vlažnost, tlak i tako dalje. Karakteristika je jedinica GATT operacija – čitate karakteristiku, zapisujete karakteristiku, pretplaćujete se na karakteristiku.

  • Deskriptor (descriptor) je metapodatak pridružen karakteristici. Neki deskriptori su standardizirani – Client Characteristic Configuration Descriptor (CCCD) je najpoznatiji, jer je zapisivanje u njega način na koji client govori serveru „šalji mi obavijesti o ovoj karakteristici”. Drugi su korisnički definirani i nose stvari poput formata prikaza ili proširenih svojstava.

GATT server (obično peripheral) deklarira svoju bazu podataka jednom pri pokretanju i baza se ne mijenja tijekom rada. GATT client (obično central) otkriva što se nalazi u bazi podataka nakon povezivanja – prolazi kroz stablo, čita UUID-ove usluga koje pronađe, a zatim karakteristike unutar svake od njih.

11.6.3. UUID-ovi

Svaka usluga, karakteristika i deskriptor ima UUID (Universally Unique IDentifier) koji identificira koja je to vrsta stvari. UUID-ovi dolaze u tri širine:

  • 16-bitni. Rezervirani za standarde koje definira Bluetooth SIG. Battery Service je 0x180F. Battery Level (karakteristika) je 0x2A19. Potpuni popis objavljen je na stranici dodijeljenih brojeva Bluetooth SIG-a na https://www.bluetooth.com/specifications/assigned-numbers/.

  • 32-bitni. Rijetko korišten srednji put.

  • 128-bitni. Ono što koriste svi ostali – proizvođač ili aplikacija nasumično generira jedan i koristi ga za svoju prilagođenu uslugu ili karakteristiku. Kamere koje definiraju vlastiti protokol pripadaju ovamo.

Klasa bluetooth.UUID prihvaća bilo koju od tri širine:

import bluetooth

BATTERY_SERVICE = bluetooth.UUID(0x180F)
CUSTOM_SERVICE = bluetooth.UUID("12345678-1234-5678-9abc-def012345678")

16-bitni UUID kodira se u mali oglasni teret, što je jedan od razloga zašto su standardne usluge poželjnije kada neka postoji – traka za mjerenje srčanog ritma koja oglašava 0x180D (Heart Rate) stoji dva bajta; prilagođeni UUID stoji šesnaest. Za aplikacije kojima nije potrebna standardna interoperabilnost, generirani 128-bitni UUID je pravi odgovor.

11.6.4. Što vam donose usluge standardizirane od strane SIG-a

Argument za korištenje standardne usluge je jednostavan: postojeće aplikacije već znaju kako razgovarati s njom. Uređaj koji oglašava Heart Rate uslugu (0x180D) i izlaže karakteristiku Heart Rate Measurement (0x2A37) radi sa svakom fitness aplikacijom na svijetu, a da nitko ne napiše novi kod. Uređaju koji ponovno implementira iste podatke s prilagođenim UUID-ovima potrebna je vlastita prateća aplikacija i vlastiti dokument protokola.

Standardi ipak imaju svoju cijenu. Rasporedi bajtova unutar svake karakteristike su specificirani – SIG je odlučio da je Heart Rate Measurement jednobajtno polje zastavica iza kojeg slijedi ili 8-bitna ili 16-bitna vrijednost srčanog ritma, opcionalno praćena R-R intervalima – i sukladan uređaj mora slijediti te rasporede. Prilagođene usluge slobodne su od tog ograničenja.

Pragmatičan odgovor za kamere: koristite standardnu uslugu kada postoji za vrstu podataka koju imate (Battery Service, Environmental Sensing), a definirajte prilagođenu uslugu sa 128-bitnim UUID-om za sve specifično za vašu aplikaciju.

11.6.5. Objekti na strani servera i na strani clienta

Za iste konceptualne gradivne blokove (usluga, karakteristika, deskriptor), svaka GATT biblioteka izlaže dva paralelna skupa objekata: