11.6. Palvelut ja ominaisuudet

Kun GAP on saanut kaksi laitetta avoimeen yhteyteen, sen yläpuolella oleva kerros – Generic Attribute Profile eli GATT – joutuu antamaan merkityksen kyseisen yhteyden läpi virtaaville tavuille. BLE:n valinta tässä on epätavallinen. Siinä missä TCP tarjoaa raa’an tavuvirran ja jättää sovelluksen tehtäväksi keksiä oma kehystyksensä, GATT tarjoaa pienen avain/arvo-tietokannan, jota toinen osapuoli isännöi ja jota toinen lukee, kirjoittaa tai tilaa.

Sovellussuunnittelijat käyttävät tuon tietokannan miettimiseen suurimman osan BLE-ajastaan. Se mitä kamera julkaisee puhelimelle, mitä se tarkkailee etäsensorista, miten Bluetooth-näppäimistö kertoo isännälleen mitä näppäintä painettiin – kaikki ovat ominaisuusarvoja jossakin GATT-tietokannassa jossakin.

11.6.1. Kaksi rooliakselia, ei yhtä

Yleinen sekaannuksen lähde: periferinen / keskuslaite ja palvelin / asiakas ovat kaksi toisistaan riippumatonta akselia, eivät synonyymejä.

  • Periferinen ja keskuslaite ovat GAP-rooleja, jotka asetetaan yhteyden muodostuksen aikana. Periferinen mainostaa ja siihen otetaan yhteys; keskuslaite skannaa ja aloittaa yhteyden. Tämä ratkeaa sillä hetkellä kun linkki nousee, eikä se muutu.

  • Palvelin ja asiakas ovat GATT-rooleja, jotka asetetaan ominaisuuskohtaista operaatiota kohden. Palvelin isännöi ominaisuutta; asiakas lukee, kirjoittaa tai tilaa sen.

Spesifikaatio erottaa nämä kaksi akselia toisistaan. Periferinen on yleensä palvelin (sykevyö julkaisee lukemansa) ja keskuslaite on yleensä asiakas (puhelin lukee ne), mutta BLE sallii minkä tahansa yhdistelmän – periferinen voi löytää ominaisuuden juuri yhteyteen saamastaan keskuslaitteesta, tai yksi yhteys voi isännöidä palveluja molemmilla puolilla samanaikaisesti.

Useimmat kamerasovellukset pitäytyvät tavanomaisessa parituksessa (periferinen + palvelin, tai keskuslaite + asiakas), joten tämän osion loppuosa käsittelee niitä yhtenä akselina, kun kuvattavana on tavanomainen tapaus. Kun ero on merkityksellinen, molemmat termit kirjoitetaan auki erikseen.

11.6.2. Tietokannan sisällä

GATT-tietokanta on puu. Lehdet kantavat varsinaiset tavut. Oksat ryhmittelevät toisiinsa liittyvät lehdet ihmiselle merkityksellisiksi yksiköiksi.

Puu, jonka ylimpänä solmuna on "GATT database". Sen alla on kolme Service-solmua, nimiltään "Generic Access (0x1800)", "Battery (0x180F)" ja "Environmental Sensing (0x181A)". Jokaisella palvelulla on lapsina Characteristic-solmuja; Battery-palvelulla on "Battery Level (0x2A19)", jolla on lapsena Descriptor "CCCD". Environmental Sensing -palvelulla on "Temperature (0x2A6E)" ja "Humidity (0x2A6F)".

GATT-tietokanta. Palvelut ryhmittelevät ominaisuuksia; ominaisuudet kantavat sovelluksen tavut; kuvaajat kantavat ominaisuutta koskevia metatietoja.

Solmuja on kolmenlaisia:

  • Palvelu on toisiinsa liittyvien arvojen looginen ryhmä. Bluetooth SIG julkaisee vakiomuotoisia palvelumäärityksiä yleisiin käyttötapauksiin – Battery Service akun varaustasolle, Environmental Sensing lämpötilalle / kosteudelle / paineelle, Heart Rate sykemittareille – jotta puhelimen yleiskäyttöinen sovellus voi tunnistaa palvelun, jota se ei ole koskaan ennen nähnyt. Sovellus voi myös vapaasti määritellä omia palvelujaan asioille, joita SIG ei ole standardoinut.

  • Ominaisuus on yksi nimetty arvo palvelun sisällä. Battery-palvelulla on yksi ominaisuus – Battery Level, yhden tavun prosenttiarvo. Environmental Sensing -palvelulla on erilliset ominaisuudet lämpötilalle, kosteudelle, paineelle ja niin edelleen. Ominaisuus on GATT-operaatioiden yksikkö – luet ominaisuuden, kirjoitat ominaisuuden, tilaat ominaisuuden.

  • Kuvaaja on ominaisuuteen liitettyä metatietoa. Jotkin kuvaajat ovat standardoituja – Client Characteristic Configuration Descriptor (CCCD) on kuuluisa, koska siihen kirjoittaminen on tapa, jolla asiakas kertoo palvelimelle ”lähetä minulle ilmoituksia tästä ominaisuudesta”. Toiset ovat käyttäjän määrittelemiä ja kantavat esimerkiksi esitysmuotoa tai laajennettuja ominaisuuksia.

GATT-palvelin (tyypillisesti periferinen) ilmoittaa tietokantansa kerran käynnistyksessä, eikä tietokanta muutu suorituksen aikana. GATT-asiakas (tyypillisesti keskuslaite) löytää tietokannan sisällön yhteyden muodostamisen jälkeen – kulkien puun läpi, lukien löytämiensä palvelujen UUID:t ja sitten kunkin sisällä olevat ominaisuudet.

11.6.3. UUID:t

Jokaisella palvelulla, ominaisuudella ja kuvaajalla on UUID (Universally Unique IDentifier), joka kertoo minkä tyyppinen asia se on. UUID:t tulevat kolmessa leveydessä:

  • 16-bittinen. Varattu Bluetooth SIG:n määrittelemille standardeille. Battery Service on 0x180F. Battery Level (ominaisuus) on 0x2A19. Täydellinen luettelo on julkaistu Bluetooth SIG:n assigned-numbers-sivustolla osoitteessa https://www.bluetooth.com/specifications/assigned-numbers/.

  • 32-bittinen. Harvoin käytetty välimuoto.

  • 128-bittinen. Mitä kaikki muut käyttävät – valmistaja tai sovellus generoi sellaisen satunnaisesti ja käyttää sitä omalle mukautetulle palvelulleen tai ominaisuudelleen. Omaa protokollaansa määrittelevät kamerat asuvat täällä.

bluetooth.UUID -luokka hyväksyy minkä tahansa kolmesta leveydestä:

import bluetooth

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

16-bittinen UUID koodautuu pieneen mainoshyötykuormaan, mikä on yksi syy siihen, miksi vakiopalvelut ovat suositeltavia silloin kun sellainen on olemassa – sykevyö, joka mainostaa 0x180D (Heart Rate), maksaa kaksi tavua; mukautettu UUID maksaa kuusitoista. Sovelluksille, jotka eivät tarvitse standardia yhteentoimivuutta, generoitu 128-bittinen UUID on oikea vastaus.

11.6.4. Mitä SIG-standardoidut palvelut tuovat

Perustelu standardipalvelun käytölle on suoraviivainen: olemassa olevat sovellukset osaavat jo puhua sille. Laite, joka mainostaa Heart Rate -palvelua (0x180D) ja paljastaa Heart Rate Measurement -ominaisuuden (0x2A37), toimii jokaisen kuntoilusovelluksen kanssa maailmassa ilman, että kenenkään tarvitsee kirjoittaa uutta koodia. Laite, joka toteuttaa saman datan uudelleen mukautetuilla UUID:lla, tarvitsee oman seuralaissovelluksensa ja oman protokolladokumenttinsa.

Standardeilla on hintansa. Kunkin ominaisuuden sisäiset tavujärjestelyt on määritelty – SIG päätti, että Heart Rate Measurement on yhden tavun lippukenttä, jota seuraa joko 8-bittinen tai 16-bittinen sykearvo, valinnaisesti seurattuna R-R-väleillä – ja vaatimustenmukaisen laitteen on noudatettava noita järjestelyjä. Mukautetut palvelut ovat vapaita tuosta rajoituksesta.

Pragmaattinen vastaus kameroille: käytä standardipalvelua silloin kun sellainen on olemassa hallussasi olevan datatyypin tapauksessa (Battery Service, Environmental Sensing), ja määrittele mukautettu palvelu 128-bittisellä UUID:lla kaikelle, mikä on sovelluksellesi erityistä.

11.6.5. Palvelin- ja asiakaspuolen oliot

Samoille käsitteellisille rakennuspalikoille (palvelu, ominaisuus, kuvaaja) jokainen GATT-kirjasto paljastaa kaksi rinnakkaista oliojoukkoa: