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.

A tree with a top node labelled "GATT database". Below it, three Service nodes labelled "Generic Access (0x1800)", "Battery (0x180F)", and "Environmental Sensing (0x181A)". Each Service has child Characteristic nodes; the Battery service has "Battery Level (0x2A19)" with a child Descriptor "CCCD". The Environmental Sensing service has "Temperature (0x2A6E)" and "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: