BLE all mikroskoobi all (ATTid GATTid…)

BLE mikroskoobi all (ATT-d GATT-d...)

BLE mikroskoobi all (ATT-d ja GATT-d
)

Osa 1, ĂŒlevaade

On möödunud juba piisavalt aega, mil ilmus esimene Bluetooth 4.0 spetsifikatsioon. Kuigi BLE teema on vĂ€ga huvitav, pelgavad paljud arendajad seda veel oma keerukuse tĂ”ttu. Minu eelnevates artiklites olen arutanud enamasti linkkihistiku ja fĂŒĂŒsikalise kihistiku kĂ”ige madalamat taset. See vĂ”imaldas mul mitte puutuda kokku nii keeruliste ja segaste mĂ”istetega nagu atribuudiprotokoll (ATT) ja ĂŒldine atribuudiprofiil (GATT). Siiski ei pÀÀse neist, nende mĂ”istmata ei ole vĂ”imalik koostalitlusvĂ”imelisi seadmeid arendada. TĂ€na soovin jagada teiega neid teadmisi. Artiklis tuginen Ă”petust Nordic-i algajate juhendile. Nii et alustame.

Miks on kÔik nii keeruline?

Minu arvates oli kohe selge, et seadmete haldamine nutitelefonide kaudu on vĂ€ga perspektiivikas ja pikaajaline teema. SeetĂ”ttu otsustati see struktuuri lĂ€bi mĂ”elda ja maksimaalselt ellu viia. Et erinevate vidinate tootjad ei leiutaks oma protokolle, mis hiljem vĂ”ivad olla ĂŒhilduvad. Sealt ka keerukus. Juba esimesel etapil pĂŒĂŒti BLE protokolli suruda kĂ”ik, mis vĂ€hegi vĂ”imalik. Ja pole tĂ€htis, kas see hiljem tuleb kasuks vĂ”i mitte. Lisaks arvati tulevikus seadmete loendi laiendamise vĂ”imalust.

Vaadakem pilti, kus on kujutatud BLE protokolli skeem. See koosneb mitmest kihist. KĂ”ige alumine, fĂŒĂŒsiline kiht (PHY) vastutab seadme raadiosignaali eest. Link Layer (LL) sisaldab kĂ”iki bite jĂ€rjestusi edastatavas sĂ”numis. Eelnevates artiklites oleme just seda uurinud. Host Controller Interface (HCI) on protokoll vahetamiseks kihtide vĂ”i BLE kiipide vahel, kui Controller ja Host on erinevates kiipides. Pakettide koostamise, konverteerimise raamideks, vigade kontrollimise ja pakettide kogumise eest vastutab Logical Link Control and Adaptation Protocol (L2CAP). Pakettide krĂŒpteerimise eest vastutab Security Manager Protocol (SMP). Üksuse kĂ€itusprofiil (GAP) vastutab andmete esialgse vahetuse eest seadmete vahel, et mÀÀrata, kes on kes. Selle alla kuuluvad samuti skaneerimine ja reklaamimine. Selles artiklis peatun protokolli kahel ĂŒlejÀÀnud osal — GATT ja ATT. GATT on ATT ĂŒleehitus, seega on nad tihedalt seotud.

BLE mikroskoobi all (ATT-d GATT-d...)

Kergendamiseks tooksin ma kasutusele analoogia. Olen seda kusagil kuulnud ja tahaksin seda toetada. Kujutage ette BLE-seadet kui raamaturiiulit, kus on mitmeid riiuleid. Iga riiul esindab erinevat teemat. NĂ€iteks on meil riiulid ulme, matemaatika ja entsĂŒklopeediate jaoks. Igal riiulil on teemaga seotud raamatud. MĂ”nedes raamatutes on isegi paberist jĂ€rjehoidjad mĂ€rkmete jaoks. Lisaks on meil vĂ€ike paberikataloog kĂ”igist raamatutest. Kui mĂ€letate kooli raamatukogasid — see on kitsas kapp paberkaartidega. Sellise analoogia jĂ€rgi on kapp meie seadme profiil. Riiulid on teenused, raamatud on omadused ja kataloog on atribuutide tabel. Raamatute jĂ€rjehoidjad on deskriptorid, millest ma rÀÀgin hiljem ĂŒksikasjalikumalt.

Iga, kes on seadmeid arendanud, teab, et paljudes projektides on sarnased kooditĂŒkid. Probleem on selles, et paljudel seadmetel on sarnane funktsionaalsus. NĂ€iteks, kui seadmed töötavad aku toel, on laadimise ja taseme kontrollimise probleem sama. See kehtib ka sensorite kohta. Tegelikult on objekti-orienteeritud lĂ€henemine programmeerimisel. "annab vĂ”imaluse luua objekte, mis ĂŒhendavad omadused ja kĂ€itumise iseseisvaks liiduks, mida saab seejĂ€rel korduvalt kasutada".. Minu arvates tehti BLE-s sarnase lĂ€henemise katse. Bluetoothi Erifookusgrupi (SIG) poolt töötati vĂ€lja profiilid. Erinevatelt tootjatelt olevad seadmed, millel on samad profiilid, peaksid omavahel hĂ”lpsasti sobima. Profiilid koosnevad omakorda teenustest ja teenused omadustest, mida tĂ€iendavad kirjeldajad. Üldiselt vĂ”ib see vĂ€lja nĂ€ha nii:

BLE mikroskoobi all (ATT-d GATT-d...)

NĂ€iteks vaatame sĂŒdame löögisageduse monitori (fitness-rannekell) profiiliga seotud skeemi. See koosneb kahest teenusest ja mitmest omadusest. Selgelt on nĂ€ha profiili hierarhia. Kontrollpunkti omadus nullib ĂŒldise kalorite arvestuse.

1. SĂŒdame löögisageduse teenus sisaldab kolme omadust (0x180D):
    a) Kohustuslik löögisageduse omadus (0х2A37)
    b) Valikuline kehaanduri asendi omadus (0x2A38)
    c) Tingimuslik sĂŒdame löögisageduse kontrollpunkti omadus (0x2A39)
2. Aku teenus (0x180F):
    a) Kohustuslik aku laadimistaseme omadus (0x2A19)

UUID

Kuna me saaksime ĂŒhemĂ”tteliselt viidata profiilielementidele (teenustele, omadustele ja deskriptoritele), tuleb need kĂ”ik korralikult nummerdada. Selle eesmĂ€rgi saavutamiseks tutvustatakse mĂ”istet Universally Unique ID (UUID) ehk Üldiselt Unikaalne Identifikaator. Iga rea sulgudes ongi nĂ€idatud UUID. Siin on ĂŒks eripĂ€ra. UUID jaoks otsustati kasutada 16- ja 128-bitist koodi. Miks, kĂŒsiksite? BLE protokollis on kĂ”ik suunatud energia sÀÀstmisele. SeetĂ”ttu on 16-bitisus tĂ€iesti mĂ”istlik. EbatĂ”enĂ€oline, et lĂ€hitulevikus luuakse ĂŒle 65 tuhande unikaalse teenuse ja omaduse. Praeguseks on kĂ”ik arvestatud, mis suudeti (kas mĂ€letate, kust see on — „ta arvutas ka teid“ :-)) Numereeritud elemendid. profiilide, teenuste, omaduste ja deskriptorite vĂ”ite vaadata linkide kaudu.

Kuid ma arvan, et kĂ”ik mĂ€letavad lugu neljast baitist IP-aadressist internetis. Algul arvati, et see on piisav, aga nĂŒĂŒd ei suudeta kuidagi ĂŒle minna kuue baitise aadressile. Et vĂ€ltida sama vea kordamist ja anda vĂ”imalus kĂ€sitööliste nĂ€ppudele, otsustas SIG kohe tutvustada ka 128-bitiseid UUID-sid. See meenutab mulle isiklikult litsentseerimata 433 MHz sagedust, mis anti igasugustele kĂ€tetöölistele raadioala valdusesse. Meie puhul on antud 128-bitine identifikaator teenuste ja omaduste jaoks. See tĂ€hendab, et saame oma teenuste ja seadmete jaoks kasutada praktiliselt ĂŒkskĂ”ik millist 128-bitist vÀÀrtust. Looduslikult kipub sama UUID loomise tĂ”enĂ€osus olema nulli lĂ€hedane.

Tegelikult on lĂŒhikesed 16-bitised UUID-d oma laienduseks 128-bitistele vÀÀrtustele. Spetsifikatsioonis nimetatakse seda laiendust Bluetooth Base UUID ja selle vÀÀrtus on 00000000-0000-1000-8000-00805F9B34FB. NĂ€iteks kui 16-bitise attribuudi UUID vÀÀrtus on 0x1234, siis vastav 128-bitine UUID vÀÀrtus on 00001234-0000-1000-8000-00805F9B34FB. Ja isegi antakse vastav valem:

                                128_bit_value = 16_bit_value * 2^96 + Bluetooth_Base_UUID

Kust see maagiline number pÀrineb, ei oska ma öelda. Kui keegi lugejatest teab, siis palun kirjutage kommentaaridesse (kasutaja nimega Sinopteek on seda juba teinud. Vaadake kommentaare). Mis puutub 128-bitiste UUID-de genereerimisse, siis pÔhimÔtteliselt vÔib kasutada spetsiaalset generaatorit, mis teeb selle teie eest valmis.

ATT-d GATT-d


Edasi hakkab tĂ”eliselt huvitav osa. Tuletan meelde, et ATT pĂ”hineb kliendi ja serveri suhtlusel. NĂŒĂŒd vaatame serveri seadmeid. See sisaldab sellist teavet nagu anduri vÀÀrtused, valgusti olek, asukohateave jne. NĂŒĂŒd, kui kĂ”ik meie "paradi osalised" on nummerdatud, tuleb nad kuidagi seadme mĂ€llu paigutada. Selleks paneme nad tabelisse, mida nimetatakse atribuutide tabeliks. Pidage seda meeles. See on BLE sĂŒda. Just seda me edaspidi kĂ€sitleme. NĂŒĂŒd nimetame iga rida atribuudiks. See tabel asub virna sĂŒgavuses ja tavaliselt pole meil sellele otsest juurdepÀÀsu. Me initsialiseerime selle ja pöördume selle poole, kuid mis seal sees toimub, on meie eest peidetud seitsme pitseri taga.

Vaatame specifikatsiooni pilti, kuid enne seda tahan juhtida tĂ€helepanu terminoloogias esinevale segadusele, nimelt deskriptoritele. Deskriptorite roll on tĂ€iendada omaduse kirjeldust. Kui on vaja laiendada selle vĂ”imalusi, siis kasutatakse deskriptoreid. Need on ka atribuudid ja koos teenuste ja omadustega asuvad nad atribuuditaotluse tabelis. Uurime neid hoolikalt artikli teises osas. Siiski mĂ”nikord nimetatakse deskriptoriteks atribuuditaotluse tabelis rea numbrit. Seda tuleks silmas pidada. Me kasutame nende eesmĂ€rkide jaoks terminit „atribuutide viit”.
BLE mikroskoobi all (ATT-d GATT-d...)

Nii et atribuut on diskreetne vÀÀrtus, millel on jÀrgmised omadused:
1. Atribuudi viit (Attribute Handle) — see on tabeli indeks, mis vastab atribuudile.
2. Atribuudi tĂŒĂŒp (Attribute Type) — see on UUID, mis kirjeldab selle tĂŒĂŒpi.
3. Atribuudi vÀÀrtus (Attribute Value) — need on andmed, mida indekseeritakse atribuudi viita kaudu.
4. Atribuutide Ă”igused (Attribute Permissions) — see on osa atribuudist, Ă”igused, mida ei saa lugeda ega kirjutada atribuudiprotokolli kaudu.

Kuidas seda kĂ”ike mĂ”ista? Atribuudi viit — see on tinglikult öeldes selle number meie tabelis.
See vĂ”imaldab kliendil viidata atribuudile lugemise vĂ”i kirjutamise pĂ€ringutes. Saame numeerida oma ridu (atribuutide) alates 0x0001 kuni 0xFFFF. Meie raamatukapid assotsieerimisel — see on kaardi number paberkataloogis. Sarnaselt sellele, kuidas raamatukogus on kaardid jĂ€rjestatud numbrite kasvuga. Iga jĂ€rgnev rida peab olema suurem kui eelmine. Nagu raamatukogus, vĂ”ivad ka mĂ”ned kaardid kaduma minna, meie ridadel vĂ”ivad olla vahed. See on lubatud. Peamine on see, et need lĂ€hevad kasvavas jĂ€rjekorras.

Atribuudi tĂŒĂŒp mÀÀrab, millega see atribuut esindab. Sarnaselt C-keelele,
kus on boolsed, numbrilised muutujad ja stringid, on see siin samuti. Atribuudi tĂŒĂŒbi jĂ€rgi saame teada,
millega me tegeleme ja kuidas me selle atribuudiga edasi töötame. Allpool vaatame mĂ”ningaid spetsiifilisi atribuuditĂŒĂŒpe. NĂ€iteks 'teenuse deklaratsioon' (0x2800), 'deklaratsioon omadusest' (0x2803), 'deklaratsioon deskriptorist' (0x2902).

AtribuudivÀÀrtus on selle tegelik vÀÀrtus, vabandust tautoloogia pĂ€rast. Kui atribuudi tĂŒĂŒp on string, siis vĂ”ib atribuudi vÀÀrtus olla nĂ€iteks slogan "Hello World !!!". Kui atribuudi tĂŒĂŒp on "teenuse deklaratsioon", siis on selle vÀÀrtuseks teenus ise. MĂ”nikord sisaldab see teavet, kus leida teisi atribuute ja nende omadusi.

Atribuutide Ôigused vÔimaldavad serveril mÔista, kas lugemine vÔi kirjutamine on lubatud.
Pange tĂ€hele, et need Ă”igused kehtivad ainult atribuudi vÀÀrtuse kohta, mitte viitaja, tĂŒĂŒbi ega ise Ă”iguste vĂ€lja kohta. St, kui atribuudi kirjutamine on lubatud, saame nĂ€iteks rida "Hello World !!!" muuta reale "Good morning". Kuid me ei saa keelata uue rea kirjutamist vĂ”i muuta atribuudi tĂŒĂŒpi ning mÀÀrata rida kui "teenuse deklaratsioon". Klient kĂŒsib serverile juurdepÀÀsu, et teada saada, milliseid atribuute server pakub. Kuigi pole tingimata vaja vÀÀrtusi lugeda ja kirjutada.

Kuidas see vÀlja nÀeb

GATT kontseptsioon seisneb atribuutide rĂŒhmitamises atribuutide tabelis vĂ€ga spetsiifilises ja loogilises jĂ€rjekorras. Vaatame lĂ€hemalt allpool toodud sĂŒdame löögisageduse profiili. Selle tabeli vasakpoolsem veerg ei ole kohustuslik. See lihtsalt kirjeldab, millega tegemist on (atribuut). KĂ”ik ĂŒlejÀÀnud veerud on meile juba tuttavad.

BLE mikroskoobi all (ATT-d GATT-d...)

Iga grupi ĂŒlaosas on meil alati teenuse deklaratsiooni atribuut. Selle tĂŒĂŒp on alati 0x2800, ning selle nĂ€itaja sĂ”ltub sellest, kui palju atribuute tabelis juba olemas on. Selle lahendused on alati ainult lugemiseks, ilma igasuguste autentimise vĂ”i autoriseerimise kontrollideta. Nendest mĂ”istedest rÀÀgime hiljem. VÀÀrtus on veel ĂŒks UUID, mis mÀÀratleb, mis teenus see on. Tabelis on vÀÀrtus 0x180D, mille Bluetooth SIG mÀÀratleb sĂŒdame löögisageduse teenusena.

SeejĂ€rel, kui teenus on kuulutatud, tuleb vĂ€lja kuulutada ka omaduste kirjeldus. Selle vorm on sama, mis teenuse kuulutamisel. Selle UUID on alati 0x2803, ja Ă”igused on samuti alati vaid lugemiseks, ilma igasuguste autentimise vĂ”i autoriseerimise nĂ”ueteta. Vaatame nĂŒĂŒd vĂ€lja Attribute Value, mis sisaldab teatud andmeid. See sisaldab alati nĂ€itajat, UUID-d ja omaduste kogumit. Need kolm elementi kirjeldavad jĂ€rgnevat omaduse vÀÀrtuse kuulutamist. NĂ€itaja tĂ€histab loogiliselt selle omaduse vÀÀrtuse kuulutamise kohta atribuutide tabelis. UUID mÀÀratleb, millist tĂŒĂŒpi teavet vĂ”i vÀÀrtust me eeldada saame. NĂ€iteks temperatuurivÀÀrtus, valguse lĂŒliti olek vĂ”i mĂ”ni muu meelevaldne vÀÀrtus. Ja lĂ”puks omadused, mis kirjeldavad, kuidas omaduse vÀÀrtusega suhelda on vĂ”imalik.

Siin ootab meid veel ĂŒks ĂŒllatus. See on seotud atribuutide Ă”iguste ja omaduste omadustega. Vaatame pilti bitifiltri omadustest spetsifikatsioonist.

BLE mikroskoobi all (ATT-d GATT-d...)

Nagu nĂ€ete, on siin samuti vĂ€ljad, mis annavad lugemise ja kirjutamise vĂ”imalused. VĂ”ite kĂŒsida, miks meil on lugemis-/kirjutamisĂ”igused atribuudile ja omadusele
lugemise/kirjutamise jaoks omaduse vÀÀrtusele? Kas need ei peaks olema alati ĂŒhesugused? Tegelikult on omadused omaduse vÀÀrtuse jaoks lihtsalt soovitused kliendile, mida kasutatakse GATT-i ja rakendustasanditel. Need on lihtsalt vihjed selle kohta, mida klient vĂ”ib oodata omaduse kuulutuse atribuudilt. Vaatame seda lĂ€hemalt. Millised on atribuudil olemasolevad Ă”igused?

1. JuurdepÀÀsuload:
     — lugemine
     — kirjutamine
     — lugemine ja kirjutamine
2. Autentimise luba:
     — autentimine on nĂ”utav
     — autentimine ei ole nĂ”utav
3. AutoriÔiguse luba:
     — autoriseerimine on nĂ”utav
     — autoriseerimine ei ole nĂ”utav

Peamine erinevus atribuudi Ă”iguste ja omaduste vahel on see, et esimesed kehtivad serverite kohta, teised aga klientide kohta. Serveril vĂ”ib olla lubatud omaduse vÀÀrtuse lugemine, kuid selleks vĂ”ib olla nĂ”ue autentimiseks vĂ”i autoriseerimiseks. SeetĂ”ttu, kui klient kĂŒsib omaduste kohta, saame, et lugemine on lubatud. Kuid lugemiseks ĂŒritamisel saame vea. Seega vĂ”ib julgelt öelda, et Ă”iguste prioriteet on omaduste ees. Me ei saa kliendi poolelt teada, millised Ă”igused atribuudi osas on.

Kirjeldaja

Naaseme meie tabeli juurde. PÀrast omaduse vÀÀrtuse kuulutamist on vÔimalikud jÀrgmised atribuudi kuulutused:
1. Uus omaduse kuulutus (teenuses vÔib olla palju omadusi)
2. Uus teenuse deklaratsioon (tabelis vÔib neid palju olla)
3. Kirjeldaja kuulutus

Kui rÀÀgime sĂŒdame löögisageduse mÔÔtmise omadustest, siis meie tabelis tĂ€histatakse omaduse vÀÀrtuse avaldamist descriptor'i avaldamisega. Descriptor on atribuut, mis sisaldab lisainfot omaduse kohta. On olemas mitu tĂŒĂŒpi descriptor'e. Nendest arutame pĂ”hjalikult teises osa artiklist. Praegu kĂ€sitleme ainult kliendi omaduste konfiguratsiooni descriptor'it (Client Characteristic Configuration Descriptor — CCCD). Selle UUID on 0x2902. Selle descriptor'i abil saab klient serveris aktiveerida indikaatori vĂ”i teate. Nende vahel on vĂ€ike erinevus, kuid see on siiski olemas. Teade ei vaja kliendilt kinnitus, kuid indikaator seda nĂ”uab, ehkki see toimub GATT tasemel, mitte jĂ”udes rakenduse tasemele. Miks nii, kĂŒsite? Kahjuks ei ole see mulle teada. Ütlen vaid, et Nordic'i spetsialistid soovitavad kasutada teateid. Eriti kuna paketi terviklikkuse kontroll (CRC abil) toimub mĂ”lemas olukorras.

KokkuvÔte

Artikli lĂ”pus tahaksin rÀÀkida ĂŒhest asjast. Viimane tabel on pisut keeruline. Siiski olen ma sellele keskendunud, kuna see on esitatud artiklis, millele toetun. Artikli teises osas kavatsema sĂŒveneda BlueTooth 4.0 spetsifikatsiooni. Seal ootavad meid tĂ€psemad skeemid ja joonised. Kolmandas osas tahaksin analĂŒĂŒsida Wiresharki programmi abil ĂŒhe seadme logifaili ja nĂ€ha "otse" kogu seda teooriat, mida koos Ă”pime.

Grupi töötaja «Tsezar Satellit»
Pecherski Vladimir

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster