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

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

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

Osa 1, ĂŒlevaade

On möödunud juba ĂŒsna kaua aega, sellest ajast, kui ilmus esimene spetsifikatsioon Bluetooth 4.0. Ja kuigi BLE teema on vĂ€ga huvitav, tĂ”ukab see paljusid arendajaid siiski tagasi, oma keerukuse tĂ”ttu. Oma varasemates artiklites olen peamiselt vaadanud kĂ”ige madalamat taset Link Layer ja Physical Layer. See vĂ”imaldas mitte tegeleda selliste keeruliste ja segaste mĂ”istetega nagu atribuudi protokoll (ATT) ja ĂŒldine atribuutide profiil (GATT). Kuid ilma nendeta ei ole vĂ”imalik arendada ĂŒhilduvaid seadmeid. TĂ€na soovin jagada teiega neid teadmisi. Oma artiklis tuginen Ă”pikule algajatele Nordic-i veebisaidilt. Nii et liikume edasi.

Miks on kÔik nii keeruline?

Minu arvates oli kohe selge, et seadmete juhtimine nutitelefonide kaudu on vĂ€ga perspektiivikas ja kestlik teema. SeetĂ”ttu otsustati see kohe maksimaalselt struktureerida. Et tootjad ei leiutaks erinevaid protokolle, mis hiljem ei ole ĂŒhilduvad. Sealt ka keerukus. Juba esimesel etapil pĂŒĂŒti BLE protokolli mahutada kĂ”ik, mis vĂ”imalik. Ja pole tĂ€htis, kas see osutub hiljem vajalikuks vĂ”i mitte. Lisaks kaaluti tulevikus seadmete nimekirja laiendamise vĂ”imalust.

Vaadakem pilti, kus on kujutatud BLE protokolli skeemi. See koosneb mitmest kihist. Alumine, fĂŒĂŒsiline kiht (PHY) vastutab seadme raadiosignaali eest. Link Layer (LL) sisaldab kĂ”iki edastatava sĂ”numi baitide jĂ€rjestusi. Eelnevates artiklites uurisime just seda. Host Controller Interface (HCI) on protokoll kihtide vĂ”i BLE kiipide vahelise suhtluse jaoks, kui Controller ja Host on erinevatel kiipidel. Pakkide vormimise, kaadrite jagamise, vigade kontrollimise ja pakkide kogumise eest vastutab Logical Link Control and Adaptation Protocol (L2CAP). Pakkide krĂŒpteerimise eest vastutab Security Manager Protocol (SMP). Üldkasutatava profiili (GAP) ĂŒlesanne on algne andmevahetus seadmete vahel, et mÀÀrata „Kes on kes“. Selle alla kuuluvad ka skaneerimine ja reklaamimine. Selles artiklis peatuge kahes ĂŒlejÀÀnud protokolli osas — GATT ja ATT. GATT on ATT-i kohal, seega on nad omavahel tihedalt seotud.

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

Kuna jutustamist lihtsustada, tahaksin kasutada analoogiat. Olen seda kuskil kuulnud ja sooviksin toetada. Kujutage ette BLE seadet kui raamaturiiulit, kus on mitu riiulit. Iga riiul on eraldi teema. NĂ€iteks, meil on riiulid ulmekirjanduse, matemaatika, entsĂŒklopeediate jaoks. Igal riiulil on raamatud, mis kĂ€sitlevad selle eraldi teema. MĂ”nes raamatus on isegi paberist jĂ€rjehoidjad mĂ€rkmete tegemiseks. Lisaks on meil vĂ€ike paberite kataloog, kus on kirja pandud kĂ”ik raamatud. Kui mĂ€letate kooli raamatukogusid — see on kitsas sahtel paberist kaardiendanitega. Selles analoogias on kapp meie seadme profiil. Riiulid on teenused, raamatud on omadused ja kataloog on atribuutide tabel. JĂ€rjehoidjad raamatutes on deskriptorid, millest rÀÀgin hiljem, pĂ”hjalikumalt.

Keenud, kes on seadmeid arendanud, teavad, et paljudes projektides on sarnased koodilĂ”igud. Asi on selles, et paljud seadmed omavad sarnast funktsionaalsust. NĂ€iteks, kui seadmed töötavad akude pealt, siis laadimise ja nende taseme kontrollimise probleem on ĂŒks ja sama. Sama kehtib ka andurite kohta. Tegelikult on objektorienteeritud lĂ€henemine programmeerimisel „pakub vĂ”imaluse luua objekte, mis ĂŒhendavad omadused ja kĂ€itumise iseseisvaks liiduks, mida saab seejĂ€rel korduvkasutada“. Minu arvates on BLE-s pĂŒĂŒdnud sarnast lĂ€henemist. Bluetooth Special Interest Group (SIG) on vĂ€lja töötanud profiilid. Erinevate tootjate seadmed, mis omavad sama profiili, peavad ĂŒksteisega hĂ”lpsasti töötama. Profiilid koosnevad omakorda teenustest, teenused omadustest, mida tĂ€iustatakse deskriptoritega. Üldiselt vĂ”ib see vĂ€lja nĂ€ha nii:

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

NĂ€iteks vaatame sĂŒdame löögisageduse monitori profiili diagrammi (fitness randmevara). See koosneb kahest teenusest ja mitmest omadusest. Selgub koheselt profiili hierarhia. Kontrollpunkti omadus nullib kalorikulu koguarv.

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

UUID

Kuna me peame ĂŒhemĂ”tteliselt viitama profiilielementidele (teenused, omadused ja descriptorid), tuleb need kuidagi nummerdada. Selleks tutvustatakse mĂ”istet Universally Unique ID (UUID) ehk Üksikasjalik Unikaalne Identifikaator. Iga rea sulgudes ongi mĂ€rgitud UUID. Siin on ĂŒks eripĂ€ra. UUID-de jaoks otsustati kasutada 16- ja 128-bitiseid koode. Miks, kĂŒsite? BLE protokollis allub kĂ”ik energiakokkuhoiule. SeetĂ”ttu on 16-bitine mÔÔt tĂ”enĂ€oliselt mĂ”istlik. VĂ€ga tĂ”enĂ€oliselt ei tule tulevikus ĂŒle 65 tuhande erilise teenuse ja omaduse loomist. Praegu on kĂ”ik, mis suudeti, juba arvesse vĂ”etud (mĂ€letate kust see tuleb — „ta on ka teid arvesse vĂ”tnud“ :-)) Nummerdatud elemendid. profiilidest, teenustest, omadustest ja descriptoritest vĂ”ite vaadata linkide kaudu.

Kuid ma arvan, et kĂ”ik mĂ€letavad lugu 4-byte IP aadressidest internetis. Alguses arvasime, et see on piisav, aga nĂŒĂŒd ei suuda me kuidagi 6-byte aadressile ĂŒle minna. Et vĂ€ltida selle vea kordamist ja anda ruumi nokitsejatele, otsustas SIG kohe tutvustada ka 128-bitiseid UUID-sid. See meenutab mulle litsentseerimata 433MHz sagedust, mis anti erinevate Kuliibinite suva kasutada. Meie puhul anti 128-bitine teenuste ja omaduste identifikaator samuti kellegi kĂ€tesse. See tĂ€hendab, et vĂ”ime oma teenuste ja seadmete jaoks kasutada praktiliselt mis tahes 128-bitist vÀÀrtust. Samas on tĂ”enĂ€osus sarnase UUID genereerimiseks olematu.

Tegelikult on lĂŒhikestel 16-bitistel UUID-del oma laiendus 128-bitistele vÀÀrtustele. Spetsifikatsioonis nimetatakse seda laiendust Bluetooth Base UUID-ks ja selle vÀÀrtus on 00000000-0000-1000-8000-00805F9B34FB. NĂ€iteks kui 16-bitise atribuutide UUID vÀÀrtus on 0x1234, siis vastav 128-bitine UUID on 00001234-0000-1000-8000-00805F9B34FB. Ja toimetatakse ka vastav valem:

                                128_bit_value = 16_bit_value * 2^96 + Bluetooth_Base_UUID

Kust see maagiline number pĂ€rineb, ei ole mulle teada. Kui mĂ”ni lugejatest teab — kirjutage kommentaaridesse (kasutaja nimega Sinopteek on juba seda teinud. Vaata kommentaare). Mis puutub 128-bitiste UUID-de genereerimisse, siis pĂ”himĂ”tteliselt saab kasutada spetsiaalset generaatorit, mis see teie eest teeb.

ATT-d GATT-d


Kuna edasi algab kĂ”ige huvitavam osa. Meenutan, et ATT pĂ”hineb kliendi-serveri suhtlemisel. Praegu vaatame serveri seadmeid. See sisaldab teavet, nagu anduri vÀÀrtused, valguse lĂŒliti olek, asukohateave jne. NĂŒĂŒd, kui kĂ”ik meie „paraadi osalised“ on nummerdatud, tuleb need sĂ€ttida seadme mĂ€llu. Selleks paigutame nad tabelisse, mida nimetatakse atribuutide tabeliks. Pidage seda meeles. See on BLE sĂŒdameasukoht. Just seda me edaspidi uurime. NĂŒĂŒd nimetame iga rida atribuudiks. See tabel asub protokolli sĂŒgavustes ja tavaliselt pole meil sellele otsest ligipÀÀsu. Me algatame selle ja pöördume selle poole, kuid mis seal sees toimub, on meie silmade eest seitsme pitseri taga.

Vaatame pilti spetsifikatsioonist, kuid enne seda tahan kohe tĂ€helepanu juhtida terminite sagedasele segadusele, nimelt descriptors. Deskriptorite roll on tĂ€iendada omaduse kirjeldust. Kui on vaja laiendada selle vĂ”imalusi, siis kasutatakse deskriptorit. Need on samuti atribuudid ja koos teenuste ja omadustega asuvad need atribuutide tabelis. Me kĂ€sitleme neid ĂŒksikasjalikult artikli teises osas. Kuid mĂ”nikord kutsutakse deskriptoriteks atribuutide tabelis rida number. Seda tuleb silmas pidada. Et mitte segadusse minna, kasutame nende eesmĂ€rkide jaoks mĂ”istet „atribuutide nĂ€idik“.
BLE mikroskoobi all (ATT-d GATT-id...)

Nii et atribuut on diskreetne vÀÀrtus, millel on jÀrgmised omadused, millega see on seotud:
1. Atribuudi nĂ€idik (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 nĂ€idiku jĂ€rgi.
4. Atribuutide Ă”igused (Attribute Permissions) — see on osa atribuudist, Ă”igused, mida ei saa lugeda ega kirjutada atribuutide protokolli kaudu.

Kuidas seda mÔista? Atribuudi nÀidik on, tinglikult öeldes, selle number meie tabelis.
See lubab kliendil viidata atribuudile lugemis- vÔi kirjutamissoovides. Me saame numereerida oma read (atribuudid) vahemikus 0x0001 kuni 0xFFFF. Meie seoses raamaturiidaga on see kaardi number paberkatkestustes. Sarnaselt raamatukogu kataloogiga on kaardid paigutatud numbrite kasvava jÀrjestuse jÀrgi. Iga jÀrgmise rea number peab olema suurem kui eelmine. Nagu raamatukogus, vÔivad mÔned kaardid vahel kaduma minna, nii et ka meie ridade numeraatsioonis vÔivad olla vahed. See on lubatud. Peamine on, et need lÀheksid kasvavas jÀrjekorras.

Atribuudi tĂŒĂŒp mÀÀrab, mis see atribuut endast kujutab. Sarnaselt C-keelele,
kus on boolean, numbrilised muutujad ja stringid, nii ka siin. Atribuudi tĂŒĂŒbi pĂ”hjal saame teada,
millega on tegu ja kuidas me selle atribuudiga edasi töötame. Allpool vaatleme mĂ”nda spetsiifilist atribuudi tĂŒĂŒpi. NĂ€iteks "teenuse deklaratsioon" (0x2800), "omaduste deklaratsioon" (0x2803), "deskriptorite deklaratsioon" (0x2902).

Atribuudi vÀÀrtus on tegelikult tema vÀÀrtus, vabandust tautoloogia pĂ€rast. Kui atribuudi tĂŒĂŒp on string, siis vĂ”ib atribuudi vÀÀrtus olla nĂ€iteks lause "Tere maailm!!!". Kui atribuudi tĂŒĂŒp on "teenuse deklaratsioon", siis on tema vÀÀrtuseks teenus ise. Ja vahel on see teave selle kohta, kust 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ÀÀrtusele, mitte viitamisele, tĂŒĂŒbile ja iseendale Ă”iguste vĂ€ljal. See tĂ€hendab, et kui atribuudi kirjutamine on lubatud, vĂ”ime nĂ€iteks muuta rida "Tere maailm!!!" read "Tere hommikust". Kuid me ei saa keelata uue rea kirjutamist ega muuta atribuudi tĂŒĂŒpi ja tĂ€histada rida kui "teenuse deklaratsioon". Kui klient pöördub serveri poole, kĂŒsib klient tema atribuute. See vĂ”imaldab kliendil teada saada, mida server saab pakkuda. Kuigi pole tingimata vajalik lugeda ja kirjutada vÀÀrtusi.

Kuidas see vÀlja nÀeb

GATTi kontseptsioon seisneb attribuutide rĂŒhmitamises atribuutide tabelis vĂ€ga spetsiifilisel ja loogilisel viisil. Vaatame lĂ€hemalt sĂŒdame löögisageduse profiili, mis on toodud allpool. Selle tabeli kĂ”ige vasakpoolne veerg on valikuline. See lihtsalt kirjeldab, millega see rida (attribuut) on. KĂ”ik ĂŒlejÀÀnud veerud on meile juba tuttavad.

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

Iga grupi ĂŒlaosas on meil alati teenuse deklareerimise atribuut. Selle tĂŒĂŒp on alati 0x2800 ja viide sĂ”ltub sellest, kui palju atribuute tabelis juba on. Selle lubamise Ă”igused on alati ainult lugemiseks, ilma igasuguse autentimise vĂ”i volituse kontrollita. Nendest mĂ”istetest rÀÀgime natuke hiljem. VÀÀrtus on veel ĂŒks UUID, mis mÀÀratleb, mis teenus see on. Tabelis on vÀÀrtus 0x180D, mida Bluetooth SIG mÀÀratleb kui sĂŒdame löögisageduse teenust.

Teenuse deklareerimist jĂ€rgib omaduse deklareerimine. Selle vorm on sarnane teenuse deklareerimisele. Selle UUID on alati 0x2803 ja lubamise Ă”igused on samuti alati ainult lugemiseks, ilma igasuguse autentimise vĂ”i volituse kontrollita. Vaatame atribuudi vÀÀrtuse vĂ€lja, mis sisaldab teatud andmeid. See sisaldab alati viidet, UUID-d ja omaduste kogumit. Need kolm elementi kirjeldavad jĂ€rgmise omaduse vÀÀrtuse deklareerimist. Viide tĂ€histab loomulikult omaduse vÀÀrtuse deklareerimise asukohta atribuutide tabelis. UUID kirjeldab, millist tĂŒĂŒpi teavet vĂ”i vÀÀrtust me oodata vĂ”ime. NĂ€iteks temperatuuri vÀÀrtus, valguslĂŒliti olek vĂ”i muu suvaline vÀÀrtus. Ja lĂ”puks omadused, mis kirjeldavad, kuidas saab omaduse vÀÀrtusega suhelda.

Siin ootab meid veel ĂŒks konks. See on seotud atributide Ă”iguste ja omaduste omadustega. Vaatame pilti bitivĂ€lja omadustest spetsifikatsioonist.

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

Nagu nĂ€ete, on siin olemas ka vĂ€ljadel lugemise ja kirjutamise vĂ”imalused. Te vĂ”ite kĂŒsida, miks meil on atribuudile ja omadusele lugemise/kirjutamise Ă”igused.
Kas on omaduse vÀÀrtuse lugemise / kirjutamise reeglid? Kas need ei peaks alati olema ĂŒhesugused? Asi on selles, et omaduste vÀÀrtuse omadused on tegelikult lihtsalt soovitused kliendile, mida kasutatakse GATT-is ja rakendustasandil. Need on lihtsalt vihjed, mida klient vĂ”ib omaduse kuulutamisest oodata. Uurime seda lĂ€hemalt. Milliseid Ă”igusi atribuudi juures on?

1. Access rights:
     — lugemine
     — kirjutamine
     — lugemine ja kirjutamine
2. Authentication rights:
     — autentimine vajalik
     — autentimine ei ole vajalik
3. Authorization rights:
     — autoriseerimine vajalik
     — autoriseerimine ei ole vajalik

Peamine erinevus atribuudi Ă”iguste ja omaduste vahel on see, et esimesed kĂ€ivad serverite kohta, teised aga klientide kohta. Serveril vĂ”ib olla lubatud lugeda omaduse vÀÀrtust, kuid samas vĂ”ib olla nĂ”ue autentimise vĂ”i autoriseerimise osas. SeetĂ”ttu, kui klient kĂŒsib omaduste kohta, saame teada, et lugemine on lubatud. Kuid lugemise katse korral saame vea. Seega vĂ”ib julgelt öelda, et Ă”igused on omadustest prioriteetsed. Me ei saa teada, millised Ă”igused atribuudi juures on, kliendi poolt.

Deskriptor

Naaseme meie tabelisse. PÀrast omaduse vÀÀrtuse kuulutamist vÔivad jÀrgneda jÀrgmised atribuudi kuulutused:
1. Uus omaduse kuulutamine (teenuses vÔib olla palju omadusi)
2. Uue teenuse deklaratsioon (tabelis vÔib neid olla palju)
3. Deskriptorite kuulutamine

Juhul, kui rÀÀgime sĂŒdame löögisageduse mÔÔtmisest, kaasneb meie tabelis parameetri vÀÀrtuse vĂ€ljakuulutamisega ka kirjelduse vĂ€ljakuulutamine. Kirjeldus on atribuuti, mis sisaldab tĂ€iendavat teavet parameetri kohta. On olemas mitu tĂŒĂŒpi kirjeldusi. Nendest rÀÀgime lĂ€hemalt artikli teises osas. Praegu keskendume vaid kliendi parameetri konfiguratsiooni kirjeldusele (Client Characteristic Configuration Descriptor — CCCD), mille UUID on 0x2902. Selle kirjelduse abil saab klient serveris aktiveerida nĂ€itamise vĂ”i teavitamise. Nende kahe vahel on vĂ€ike, kuid siiski oluline erinevus. Teavitamine ei nĂ”ua kliendi poolt vastuvĂ”tmise kinnitust. NĂ€itamine nĂ”uab seda kĂŒll, kuid toimub GATT tasemel, jĂ”udmata rakenduse tasemele. Miks nii, vĂ”ite te kĂŒsida? Kahjuks ei tea ma sellele vastust. Ütlen vaid, et Nordic'i spetsialistid soovitavad kasutada teavitamist. Eriti, et paketi terviklikkuse kontroll (CRC abil) toimub mĂ”lemas juhtumis.

KokkuvÔte

Artikli lĂ”pus tahaksin rÀÀkida ĂŒhest asjast. Viimane tabel on natuke segane. Kuid ma peatun sellel, kuna see on toodud artiklis, millele pĂ”hinen. Artikli teises osas kavatsema sĂŒveneda BlueTooth 4.0 spetsifikatsiooni. Seal ootavad meid tĂ€psemad skeemid ja joonised. Artikli kolmandas osas tahaksin analĂŒĂŒsida logi, mis on saadud Wireshark programmi abil ĂŒhelt seadmel ja nĂ€ha „otse“ kogu seda teooriat, mida koos uurime.

RĂŒhma ettevĂ”tte töötaja „Caesar Satellite“
Vladimir Pecherski

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster