{"id":84024,"date":"2020-06-04T19:42:32","date_gmt":"2020-06-04T17:42:32","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/ble-pod-mikroskopom-atty-gatty"},"modified":"2020-06-04T19:42:32","modified_gmt":"2020-06-04T17:42:32","slug":"ble-pod-mikroskopom-atty-gatty","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/ble-pod-mikroskopom-atty-gatty","title":{"rendered":"BLE sub microscop (ATT-uri GATT-uri&#8230;)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"BLE sub microscop (ATT-uri GATT-uri...)\" src=\"\/wp-content\/uploads\/2020\/06\/d8587bf897b27457b354549b99399bcc.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>BLE sub microscop (ATT-uri GATT-uri&#8230;)<\/h2>\n<p> <b>Partea 1, revizuire<\/b><\/p>\n<p>A trecut deja o perioad\u0103 destul de mare de timp de c\u00e2nd a ap\u0103rut prima specifica\u021bie pentru Bluetooth 4.0. \u0218i, de\u0219i subiectul BLE este foarte interesant, \u00eenc\u0103 \u00eei sperie pe mul\u021bi dezvoltatori din cauza complexit\u0103\u021bii sale. \u00cen articolele mele anterioare, am abordat \u00een principal cel mai de jos nivel, Link Layer \u0219i Physical Layer. Acest lucru a permis s\u0103 nu fie necesar\u0103 abordarea unor concepte at\u00e2t de complexe \u0219i confuze precum protocolul atributelor (ATT) \u0219i profilul general al atributelor (GATT). Totu\u0219i, nu este de ales, f\u0103r\u0103 a le \u00een\u021belege, nu este posibil s\u0103 se dezvolte dispozitive compatibile. Ast\u0103zi a\u0219 dori s\u0103 \u00eemp\u0103rt\u0103\u0219esc cu voi aceste cuno\u0219tin\u021be. \u00cen articolul meu, m\u0103 voi baza pe <noindex><a rel=\"nofollow\" href=\"https:\/\/devzone.nordicsemi.com\/nordic\/short-range-guides\/b\/bluetooth-low-energy\/posts\/ble-characteristics-a-beginners-tutorial\">tutorial<\/a><\/noindex> pentru \u00eencep\u0103tori de pe site-ul Nordic. Deci, s\u0103 \u00eencepem.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>De ce este totul at\u00e2t de complicat?<\/h3>\n<p>\nDin punctul meu de vedere, a fost imediat clar c\u0103 gestionarea dispozitivelor prin intermediul smartphone-urilor este un domeniu foarte promi\u021b\u0103tor \u0219i de lung\u0103 durat\u0103. De aceea, s-a decis s\u0103 fie structurat de la \u00eenceput \u0219i c\u00e2t mai mult posibil. Ca s\u0103 nu vin\u0103 produc\u0103torii de diverse gadget-uri cu propriile lor protocoale, care ulterior nu vor fi compatibile. De aici provine complexitatea. Chiar \u0219i \u00een prima etap\u0103, protocolul BLE a \u00eencercat s\u0103 \u00eencorporeze tot ce era posibil. \u0218i nu conteaz\u0103 dac\u0103 se va dovedi util ulterior sau nu. \u00cen plus, s-a prev\u0103zut posibilitatea extinderii listei de dispozitive pentru viitor.<\/p>\n<p>S\u0103 ne uit\u0103m la imaginea care ilustreaz\u0103 schema protocolului BLE. Acesta este compus din mai multe straturi. Cel mai de jos, stratul fizic (PHY) este responsabil pentru canalul radio al dispozitivului. Link Layer (LL) con\u021bine \u00eentreaga secven\u021b\u0103 de octe\u021bi din mesajul transmis. \u00cen articolele anterioare am studiat exact acesta. Host Controller Interface (HCI) este protocolul de comunica\u021bie \u00eentre straturi sau cipurile BLE, dac\u0103 Controller \u0219i Host sunt implementate pe cipuri diferite. Formarea pachetelor, divizarea \u00een cadre, controlul erorilor \u0219i asamblarea pachetelor sunt responsabilit\u0103\u021bile Logical Link Control and Adaptation Protocol (L2CAP). Pentru criptarea pachetelor este responsabil Security Manager Protocol (SMP). Profilul de acces general (GAP) se ocup\u0103 de schimbul ini\u021bial de date \u00eentre dispozitive, pentru a determina \u201eCine este cine\u201d. Acesta include de asemenea scanarea \u0219i publicitatea. \u00cen acest articol m\u0103 voi opri asupra celor dou\u0103 p\u0103r\u021bi r\u0103mase ale protocolului \u2014 GATT \u0219i ATT. GATT este un overlay asupra ATT, prin urmare, acestea sunt foarte interconectate.<\/p>\n<p><img decoding=\"async\" alt=\"BLE sub microscop (ATT-uri GATT-uri...)\" src=\"\/wp-content\/uploads\/2020\/06\/8060076152cfe3ae648eca362889e571.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPentru a simplifica nara\u021biunea, a\u0219 dori s\u0103 fac o analogie. Am auzit-o undeva \u0219i a\u0219 vrea s\u0103 o sus\u021bin. Imagina\u021bi-v\u0103 un dispozitiv BLE ca un bibliotec\u0103 cu mai multe rafturi. Fiecare raft reprezint\u0103 o tem\u0103 distinct\u0103. De exemplu, avem rafturi cu literatur\u0103 \u0219tiin\u021bifico-fantastic\u0103, matematic\u0103, enciclopedii. Pe fiecare raft stau c\u0103r\u021bi pe tema respectiv\u0103. Iar \u00een unele c\u0103r\u021bi exist\u0103 chiar \u0219i semne de carte cu \u00eensemn\u0103ri. \u00cen plus, avem un mic catalog pe h\u00e2rtie cu toate c\u0103r\u021bile. Dac\u0103 v\u0103 aminti\u021bi de bibliotecile \u0219colare \u2014 este un sertar \u00eengust cu c\u0103r\u021bi de h\u00e2rtie. \u00cen aceast\u0103 analogie, biblioteca este profilul dispozitivului nostru. Rafturile sunt serviciile, c\u0103r\u021bile sunt caracteristicile, iar catalogul este tabelul atributelor. Semnele de carte din c\u0103r\u021bi reprezint\u0103 descriptoarele, despre care voi vorbi mai \u00een detaliu mai t\u00e2rziu.<\/p>\n<p>To\u021bi cei care au dezvoltat dispozitive \u0219tiu c\u0103 \u00een multe proiecte exist\u0103 segmente de cod asem\u0103n\u0103toare. Asta pentru c\u0103 multe dispozitive au func\u021bionalit\u0103\u021bi similare. De exemplu, dac\u0103 dispozitivele func\u021bioneaz\u0103 pe baterii, problema \u00eenc\u0103rc\u0103rii \u0219i monitoriz\u0103rii nivelului acestora va fi la fel. Acela\u0219i lucru se aplic\u0103 \u0219i senzorilor. Practic, abordarea orientat\u0103 pe obiect \u00een programare <i>\u201eofer\u0103 posibilitatea de a crea obiecte care combin\u0103 propriet\u0103\u021bi \u0219i comportamente \u00eentr-o uniune autonom\u0103, care poate fi folosit\u0103 de mai multe ori\u201d<\/i>. \u00cen opinia mea, BLE a \u00eencercat o abordare similar\u0103. Grupul Bluetooth Special Interest Group (SIG) a dezvoltat profile. Dispozitivele de la diferi\u021bi produc\u0103tori, care au profiluri identice, ar trebui s\u0103 func\u021bioneze f\u0103r\u0103 probleme unele cu altele. Profilele, la r\u00e2ndul lor, sunt compuse din servicii, iar serviciile din caracteristici, completate de descriptoare. \u00cen general, aceasta poate ar\u0103ta astfel:<\/p>\n<p><img decoding=\"async\" alt=\"BLE sub microscop (ATT-uri GATT-uri...)\" src=\"\/wp-content\/uploads\/2020\/06\/34cbbeee142d40e56dff7626ef752d42.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe exemplu, s\u0103 lu\u0103m \u00een considerare schema profilului monitorului de ritm cardiac (br\u0103\u021bar\u0103 fitness). Acesta const\u0103 din dou\u0103 servicii \u0219i mai multe caracteristici. Din aceasta devine imediat clar\u0103 ierarhia profilului. Caracteristica punctului de control reseteaz\u0103 num\u0103r\u0103toarea total\u0103 a caloriilor la zero. <\/p>\n<p>1. Serviciul de ritm cardiac include trei caracteristici (0x180D):<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;a) Caracteristica obligatorie a frecven\u021bei cardiace (0x2A37)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;b) Caracteristica op\u021bional\u0103 a pozi\u021biei senzorului corporal (0x2A38)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;c) Caracteristica condi\u021bionat\u0103 a punctului de control al ritmului cardiac (0x2A39)<br \/>\n2. Serviciul de \u00eentre\u021binere a bateriei (0x180F):<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;a) Caracteristica obligatorie a nivelului de \u00eenc\u0103rcare a bateriei (0x2A19)<\/p>\n<h3>UUID<\/h3>\n<p>\nPentru a putea face referire clar\u0103 la elementele profilului (servicii, caracteristici \u0219i descriptori), trebuie s\u0103 le numerot\u0103m \u00een vreun fel. Pentru aceast\u0103 scop se introduce no\u021biunea de Universally Unique ID (UUID) sau Identificator Unic Universal. \u00cen parantezele fiec\u0103rei linii este indicat UUID-ul. \u0218i aici exist\u0103 o particularitate. Pentru UUID s-a decis s\u0103 se foloseasc\u0103 un cod cu o lungime de 16 \u0219i 128 de bi\u021bi. De ce, v\u0103 \u00eentreba\u021bi? \u00cen protocolul BLE totul este subordonat economisirii energiei. Prin urmare, dimensiunea de 16 bi\u021bi este complet rezonabil\u0103. Este pu\u021bin probabil ca, \u00een viitorul apropiat, s\u0103 fie create mai mult de 65 de mii de servicii \u0219i caracteristici unice. P\u00e2n\u0103 acum, tot ce au putut, au fost deja num\u0103rate (aminti\u021bi-v\u0103 de unde provine \u2014 \u201eel v-a num\u0103rat \u0219i pe voi\u201d :-)) Elementele numerotate <noindex><a rel=\"nofollow\" href=\"https:\/\/www.bluetooth.com\/specifications\/gatt\/\">profiluri<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.bluetooth.com\/specifications\/gatt\/services\/\">servicii<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.bluetooth.com\/specifications\/gatt\/characteristics\/\">caracteristici<\/a><\/noindex> \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.bluetooth.com\/specifications\/gatt\/descriptors\/\">descriptori<\/a><\/noindex> pute\u021bi vizualiza prin linkuri.<\/p>\n<p>Cu toate acestea, cred c\u0103 to\u021bi \u00ee\u0219i amintesc povestea cu cei 4 bi\u021bi ai adresei IP \u00een internet. La \u00eenceput s-a crezut c\u0103 este suficient, iar acum \u00eenc\u0103 nu putem trece la adresa de 6 bi\u021bi. Pentru a nu repeta aceast\u0103 gre\u0219eal\u0103 \u0219i a oferi libertate unor m\u00e2ini iscusite, SIG a decis imediat s\u0103 introduc\u0103 \u0219i UUID-uri de 128 de bi\u021bi. Acest lucru \u00eemi aminte\u0219te personal de banda neautorizat\u0103 de 433MHz, care a fost l\u0103sat\u0103 \u00een seama diverselor me\u0219te\u0219uguri de radior. \u00cen cazul nostru, i-a fost \u00eencredin\u021bat un identificator de servicii \u0219i caracteristici de 128 de bi\u021bi. Aceasta \u00eenseamn\u0103 c\u0103 putem folosi practic orice valoare de 128 de bi\u021bi pentru serviciile \u0219i dispozitivele noastre. Oricum, probabilitatea de a inventa un UUID identic tinde spre zero.<\/p>\n<p>De fapt, UUID-urile scurte de 16 bi\u021bi au o extensie la valoarea de 128 de bi\u021bi. \u00cen specifica\u021bie, aceast\u0103 extensie se nume\u0219te Bluetooth Base UUID \u0219i are valoarea 00000000-0000-1000-8000-00805F9B34FB. Dac\u0103, de exemplu, UUID-ul atributului de 16 bi\u021bi are valoarea 0x1234, atunci UUID-ul corespunz\u0103tor de 128 de bi\u021bi va avea valoarea 00001234-0000-1000-8000-00805F9B34FB. \u0218i este, de asemenea, oferit\u0103 o formul\u0103 corespunz\u0103toare:<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;128_bit_value = 16_bit_value * 2^96 + Bluetooth_Base_UUID<\/p>\n<p>De unde provine acest num\u0103r magic, nu \u0219tiu. Dac\u0103 cineva dintre cititori \u0219tie \u2014 s\u0103 scrie \u00een comentarii (Utilizatorul cu pseudonimul Sinopteek a f\u0103cut deja asta. Consulta\u021bi comentariile). C\u00e2t despre inventarea UUID-urilor de 128 de bi\u021bi, practic se poate folosi un <noindex><a rel=\"nofollow\" href=\"https:\/\/www.famkruithof.net\/uuid\/uuidgen\">generator<\/a><\/noindex>, care va face acest lucru pentru dumneavoastr\u0103.<\/p>\n<h3>ATT-urile GATT-urilor\u2026<\/h3>\n<p>\n Aici \u00eencepe cu adev\u0103rat partea interesant\u0103. Vreau s\u0103 v\u0103 reamintesc c\u0103 ATT se bazeaz\u0103 pe o rela\u021bie client-server. Acum analiz\u0103m structura serverului. Acesta con\u021bine informa\u021bii precum valorile senzorilor, starea \u00eentrerup\u0103torului de lumin\u0103, datele de localizare etc. Acum, c\u00e2nd to\u021bi \u00abparticipan\u021bii paradei noastre\u00bb sunt numerota\u021bi, trebuie s\u0103 \u00eei plas\u0103m cumva \u00een memoria dispozitivului. Pentru aceasta, \u00eei punem \u00eentr-un tabel, care se nume\u0219te tabelul atributelor. \u021aine\u021bi minte acest lucru bine. Asta este inima BLE. Tocmai acesta \u00eel vom explora mai departe. Acum, fiecare linie o vom numi atribut. Acest tabel se afl\u0103 ad\u00e2nc \u00een stiv\u0103 \u0219i, de obicei, nu avem acces direct la el. \u00cel ini\u021biem \u0219i ne adres\u0103m lui, dar ce se \u00eent\u00e2mpl\u0103 acolo \u00een\u0103untru, este ascuns de noi sub \u0219apte pecete. <\/p>\n<p>S\u0103 examin\u0103m imaginea din specifica\u021bie, dar \u00eenainte de asta, vreau s\u0103 subliniez imediat confuzia frecvent\u0103 din termeni, mai precis \u00een descriptorii. Rolul descriptorului este de a completa descrierea caracteristicii. C\u00e2nd trebuie s\u0103 extindem capacit\u0103\u021bile acesteia, atunci utiliz\u0103m descriptorii. Ace\u0219tia sunt, de asemenea, atribute, \u0219i la fel, \u00eempreun\u0103 cu serviciile \u0219i caracteristicile, se afl\u0103 \u00een tabelul atributelor. Vom analiza \u00een detaliu acest lucru \u00een a doua parte a articolului. Totu\u0219i, uneori descriptorii sunt numi\u021bi num\u0103rul liniei din tabelul atributelor. Trebuie s\u0103 avem asta \u00een vedere. Noi, pentru a nu ne confunda, vom folosi termenul \u201eindicator de atribut\u201d pentru aceste scopuri.<br \/>\n<img decoding=\"async\" alt=\"BLE sub microscop (ATT-uri GATT-uri...)\" src=\"\/wp-content\/uploads\/2020\/06\/6df836477b153c396bdba9068129bb6f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA\u0219adar, atributul este o valoare discret\u0103 care are urm\u0103toarele propriet\u0103\u021bi asociate:<br \/>\n1. Indicatorul atributului (Attribute Handle) \u2014 este indexul din tabelul care corespunde atributului <br \/>\n2. Tipul atributului (Attribute Type) \u2014 este UUID-ul care descrie tipul acestuia <br \/>\n3. Valoarea atributului (Attribute Value) \u2014 este datele, indexate de indicatorul atributului <br \/>\n4. Permisiunile atributelor (Attribute Permissions) \u2014 sunt o parte a atributului, permisiuni care nu pot fi citite sau scrise folosind protocolul atributelor.<\/p>\n<p>Cum s\u0103 \u00een\u021belegem toate acestea? Indicatorul atributului este, \u00een termeni generali, num\u0103rul s\u0103u \u00een tabelul nostru.<br \/>\nAcesta permite clientului s\u0103 se refere la un atribut \u00een cererile de citire sau scriere. Putem numerota liniile noastre (atributele) de la 0x0001 la 0xFFFF. \u00cen asocia\u021bia noastr\u0103 cu un raft de c\u0103r\u021bi - este num\u0103rul c\u0103r\u021bii din catalogul de h\u00e2rtie. La fel ca \u00een catalogul unei biblioteci, c\u0103r\u021bile sunt aranjate \u00een ordinea cre\u0219terii numerelor. Num\u0103rul fiec\u0103rei linii ulterioare trebuie s\u0103 fie mai mare dec\u00e2t cel precedent. Asemenea unei biblioteci, uneori se pierd anumite c\u0103r\u021bi, a\u0219a c\u0103 \u0219i \u00een numerotarea liniilor pot exista intervale. Acest lucru este acceptabil. Principalul lucru este ca acestea s\u0103 fie ordonate \u00een ordine cresc\u0103toare.<\/p>\n<p>Tipul atributului determin\u0103 ce reprezint\u0103 acest atribut. Prin analogie cu limbajul C,<br \/>\nunde exist\u0103 variabile booleene, numerice \u0219i \u0219iruri, a\u0219a \u0219i aici. Dup\u0103 tipul atributului afl\u0103m <br \/>\ncu ce avem de-a face \u0219i cum trebuie s\u0103 lucr\u0103m ulterior cu acest atribut. Mai jos vom analiza unele tipuri specifice de atribute. De exemplu, \u201edeclara\u021bia de serviciu\u201d (0x2800), \u201edeclara\u021bia caracteristicii\u201d (0x2803), \u201edeclara\u021bia descriptorului\u201d (0x2902).<\/p>\n<p>Valoarea atributului este, de fapt, valoarea sa, scuze pentru tautologie. Dac\u0103 tipul atributului este \u0219ir, atunci valoarea atributului poate fi, de exemplu, sloganul \u201eHello World !!!\u201d. Dac\u0103 tipul atributului este \u201edeclara\u021bia de serviciu\u201d, atunci valoarea sa este serviciul \u00een sine. Uneori este informa\u021bia despre unde se pot g\u0103si alte atribute \u0219i propriet\u0103\u021bile lor.<\/p>\n<p>Permisiunile atributelor permit serverului s\u0103 \u00een\u021beleag\u0103 dac\u0103 accesul la citire sau scriere este permis. <br \/>\nRe\u021bine\u021bi c\u0103 aceste permisiuni se aplic\u0103 doar valorii atributului, nu \u0219i pointerului, tipului \u0219i c\u00e2mpului de permisiuni \u00een sine. Adic\u0103, dac\u0103 scrierea atributului este permis\u0103, putem schimba, de exemplu, \u0219irul \u201eHello World !!!\u201d cu \u0219irul \u201eGood morning\u201d. Dar nu putem interzice scrierea unui nou \u0219ir sau schimba tipul atributului \u0219i s\u0103 denumim \u0219irul \u201edeclara\u021bia de serviciu\u201d. Atunci c\u00e2nd clientul se adreseaz\u0103 serverului, acesta solicit\u0103 atributele sale. Acest lucru permite clientului s\u0103 afle ce poate oferi serverul. Cu toate acestea, nu este obligatoriu s\u0103 citeasc\u0103 \u0219i s\u0103 scrie valori.<\/p>\n<h3>Cum arat\u0103 asta<\/h3>\n<p>\nConceptul GATT are ca scop gruparea atributelor din tabelul atributelor \u00eentr-o ordine foarte specific\u0103 \u0219i logic\u0103. S\u0103 analiz\u0103m mai atent profilul frecven\u021bei cardiace prezentat mai jos. Coloana din st\u00e2nga a acestui tabel nu este obligatorie. Aceasta ne descrie ce reprezint\u0103 aceast\u0103 linie (atribut). Toate celelalte coloane ne sunt deja cunoscute.<\/p>\n<p><img decoding=\"async\" alt=\"BLE sub microscop (ATT-uri GATT-uri...)\" src=\"\/wp-content\/uploads\/2020\/06\/110813482dacb0f19cb49e735f4a9e34.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cen partea de sus a fiec\u0103rei grupe, avem \u00eentotdeauna atributul de declara\u021bie a serviciului. Tipul s\u0103u este \u00eentotdeauna 0x2800, iar pointerul depinde de c\u00e2te atribute sunt deja prezente \u00een tabel. Permisiunile sale sunt \u00eentotdeauna disponibile doar pentru citire, f\u0103r\u0103 vreo verificare de autenticitate sau autorizare. Aceste concepte le vom discuta mai t\u00e2rziu. Valoarea este un alt UUID, care define\u0219te ce este acest serviciu. \u00cen tabel, valoarea este 0x180D, definit\u0103 de Bluetooth SIG ca serviciu de frecven\u021b\u0103 cardiac\u0103. <\/p>\n<p>Dup\u0103 declara\u021bia serviciului, urmeaz\u0103 declara\u021bia caracteristicii. Ca form\u0103, aceasta este similar\u0103 declara\u021biei serviciului. UUID-ul s\u0103u are \u00eentotdeauna valoarea 0x2803, iar permisiunile sunt, de asemenea, disponibile doar pentru citire, f\u0103r\u0103 vreo verificare de autenticitate sau autorizare. S\u0103 ne uit\u0103m la c\u00e2mpul Valoarea Atributului, care include anumite date. Acesta con\u021bine \u00eentotdeauna un pointer, UUID \u0219i un set de propriet\u0103\u021bi. Aceste trei elemente descriu declara\u021bia ulterioar\u0103 a valorii caracteristicii. Pointerul desemneaz\u0103, \u00een mod natural, locul declara\u021biei valorii caracteristicii \u00een tabelul atributelor. UUID-ul descrie ce tip de informa\u021bie sau valoare putem a\u0219tepta. De exemplu, valoarea temperaturii, starea \u00eentrerup\u0103torului de lumin\u0103 sau orice alt\u0103 valoare arbitrar\u0103. \u0218i, \u00een final, propriet\u0103\u021bile, care descriu cum putem interac\u021biona cu valoarea caracteristicii. <\/p>\n<p>Aici ne a\u0219teapt\u0103 \u00eenc\u0103 o capcan\u0103. Aceasta este legat\u0103 de permisiunile atributelor \u0219i propriet\u0103\u021bile caracteristicilor. S\u0103 ne uit\u0103m la imaginea propriet\u0103\u021bilor c\u00e2mpului bit din specifica\u021bie.<\/p>\n<p><img decoding=\"async\" alt=\"BLE sub microscop (ATT-uri GATT-uri...)\" src=\"\/wp-content\/uploads\/2020\/06\/7397f7f69e573ae3084cbacdcd318829.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDup\u0103 cum vede\u021bi, sunt prezente \u0219i c\u00e2mpuri care ofer\u0103 posibilit\u0103\u021bi de citire \u0219i scriere. V\u0103 pute\u021bi \u00eentreba de ce avem permisiuni de citire\/scriere pentru atribut \u0219i proprietate. <br \/>\nCitirea\/scrierea pentru valoarea caracteristicii? Nu ar trebui s\u0103 fie \u00eentotdeauna acelea\u0219i? Faptul este c\u0103 propriet\u0103\u021bile pentru valoarea caracteristicii sunt, de fapt, doar recomand\u0103ri pentru client, folosite \u00een GATT \u0219i \u00een straturile aplica\u021biei. Acestea sunt doar sugestii despre ce poate a\u0219tepta clientul de la atributul declara\u021biei caracteristicii. S\u0103 ne ocup\u0103m mai \u00een detaliu de aceasta. Ce tipuri de permisiuni exist\u0103 pentru atribut? <\/p>\n<p>1. Permisiuni de acces:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp; \u2014 citire<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp; \u2014 scriere<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp; \u2014 citire \u0219i scriere<br \/>\n2. Permisiune de autentificare:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp; \u2014 autentificarea este necesar\u0103<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp; \u2014 autentificarea nu este necesar\u0103<br \/>\n3. Permisiune de autorizare:<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp; \u2014 autorizarea este necesar\u0103<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp; \u2014 autorizarea nu este necesar\u0103<\/p>\n<p>Principala diferen\u021b\u0103 \u00eentre permisiunile atributelor \u0219i propriet\u0103\u021bile caracteristicilor este c\u0103 primele se refer\u0103 la servere, iar cele din urm\u0103 la clien\u021bi. Un server poate avea permisiunea de a citi valoarea caracteristicii, dar poate avea \u0219i cerin\u021ba de autentificare sau autorizare. Prin urmare, atunci c\u00e2nd clientul solicit\u0103 propriet\u0103\u021bile caracteristicii, vom ob\u021bine c\u0103 citirea este permis\u0103. Dar, la \u00eencercarea de a citi, vom ob\u021bine o eroare. De aceea, putem afirma cu certitudine c\u0103 permisiunile au prioritate asupra propriet\u0103\u021bilor. Cunoa\u0219terea permisiunilor de care dispune un atribut nu poate fi ob\u021binut\u0103 din partea clientului.<\/p>\n<h3>Descriptor<\/h3>\n<p>\nS\u0103 ne \u00eentoarcem la tabelul nostru. Dup\u0103 declara\u021bia valorii caracteristicii, sunt posibile urm\u0103toarele declara\u021bii ale atributelor: <br \/>\n1. O nou\u0103 declara\u021bie a caracteristicii (\u00een serviciu pot exista multe caracteristici)<br \/>\n2. O nou\u0103 declara\u021bie a serviciului (\u00een tabel pot exista multe)<br \/>\n3. Declara\u021bia descriptorului <\/p>\n<p>\u00cen cazul caracteristicii de m\u0103surare a frecven\u021bei cardiace, \u00een tabelul nostru, anun\u021bul valorii caracteristicii este \u00eenso\u021bit de anun\u021bul descriptorului. Descriptorul este un atribut cu informa\u021bii suplimentare despre caracteristic\u0103. Exist\u0103 mai multe tipuri de descriptor. Vom discuta despre acestea \u00een detaliu \u00een a doua parte a acestui articol. Acum, ne vom ocupa doar de descriptorul de configurare a caracteristicilor clientului (Client Characteristic Configuration Descriptor - CCCD). Acesta are un UUID egal cu 0x2902. Prin intermediul acestui descriptor, clientul are posibilitatea de a activa pe server indica\u021bia sau notificarea. Diferen\u021ba dintre ele este mic\u0103, dar totu\u0219i exist\u0103. Notificarea nu necesit\u0103 confirmare din partea clientului. Indica\u021bia \u00eens\u0103 cere asta, de\u0219i se \u00eent\u00e2mpl\u0103 la nivel GATT, f\u0103r\u0103 a ajunge la nivelul aplica\u021biei. De ce a\u0219a, ve\u021bi \u00eentreba? Din p\u0103cate, acest lucru nu \u00eemi este cunoscut. Pot spune doar c\u0103 speciali\u0219tii de la Nordic recomand\u0103 utilizarea notific\u0103rii. Cu at\u00e2t mai mult, deoarece verificarea integrit\u0103\u021bii pachetului (prin intermediul CRC) se realizeaz\u0103 \u00een ambele cazuri.<\/p>\n<h3>Concluzie<\/h3>\n<p>\nLa finalul articolului, a\u0219 vrea s\u0103 spun urm\u0103torul lucru. Ultimul tabel este oarecum confuz. Totu\u0219i, m-am oprit asupra lui pentru c\u0103 este prezentat \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/devzone.nordicsemi.com\/nordic\/short-range-guides\/b\/bluetooth-low-energy\/posts\/ble-characteristics-a-beginners-tutorial\">pe care l-a\u021bi citit<\/a><\/noindex>, pe care m\u0103 bazez. \u00cen a doua parte a articolului meu inten\u021bionez s\u0103 m\u0103 aprofundez \u00een specifica\u021bia Bluetooth 4.0. Acolo ne a\u0219teapt\u0103 scheme \u0219i desene mai corecte. \u00cen a treia parte, a\u0219 dori s\u0103 analizez un log ob\u021binut cu ajutorul programului Wireshark de la unul dintre gadgeturi \u0219i s\u0103 v\u0103d \u201e\u00een direct\u201d toat\u0103 teoria pe care o studiem.<\/p>\n<p>Angajat al Grupului de Companii <noindex><a rel=\"nofollow\" href=\"https:\/\/www.csat.ru\/\">\u201eCezar Satelit\u201d<\/a><\/noindex><br \/>\nPeceri\u0219ti Vladimir<br \/>\n<br \/>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/505078\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>BLE \u043f\u043e\u0434 \u043c\u0438\u043a\u0440\u043e\u0441\u043a\u043e\u043f\u043e\u043c (ATT\u044b GATT\u044b&#8230;) \u0427\u0430\u0441\u0442\u044c 1, \u043e\u0431\u0437\u043e\u0440\u043d\u0430\u044f \u0423\u0436\u0435 \u043f\u0440\u043e\u0448\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0441 \u0442\u0435\u0445 \u043f\u043e\u0440, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0448\u043b\u0430 \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043d\u0430 Bluetooth 4.0. \u0418, \u0445\u043e\u0442\u044f \u0442\u0435\u043c\u0430 BLE \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430, \u043e\u043d\u0430 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043e\u0442\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u0438\u0437-\u0437\u0430 \u0441\u0432\u043e\u0435\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0412 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u044f \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0441\u0430\u043c\u044b\u0439 \u043d\u0438\u0436\u043d\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c Link Layer \u0438 Physical Layer. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":84025,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-84024","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"BLE \u043f\u043e\u0434 \u043c\u0438\u043a\u0440\u043e\u0441\u043a\u043e\u043f\u043e\u043c (ATT\u044b GATT\u044b...) \u0427\u0430\u0441\u0442\u044c 1.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/ble-pod-mikroskopom-atty-gatty\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47BLE \u043f\u043e\u0434 \u043c\u0438\u043a\u0440\u043e\u0441\u043a\u043e\u043f\u043e\u043c (ATT\u044b GATT\u044b\u2026) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"BLE \u043f\u043e\u0434 \u043c\u0438\u043a\u0440\u043e\u0441\u043a\u043e\u043f\u043e\u043c (ATT\u044b GATT\u044b...) \u0427\u0430\u0441\u0442\u044c 1.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/ble-pod-mikroskopom-atty-gatty\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-06-04T17:42:32+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-06-04T17:42:32+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47BLE sub microscop (ATT-uri GATT-uri\u2026) | ProHoster","description":"BLE sub microscop (ATT-uri GATT-uri...) Partea 1.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/ble-pod-mikroskopom-atty-gatty","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47BLE \u043f\u043e\u0434 \u043c\u0438\u043a\u0440\u043e\u0441\u043a\u043e\u043f\u043e\u043c (ATT\u044b GATT\u044b\u2026) | ProHoster","og:description":"BLE \u043f\u043e\u0434 \u043c\u0438\u043a\u0440\u043e\u0441\u043a\u043e\u043f\u043e\u043c (ATT\u044b GATT\u044b...) \u0427\u0430\u0441\u0442\u044c 1.","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/ble-pod-mikroskopom-atty-gatty","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-06-04T17:42:32+00:00","article:modified_time":"2020-06-04T17:42:32+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"84024","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 15:06:38","updated":"2022-09-28 11:11:59","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/84024","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=84024"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/84024\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/84025"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=84024"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=84024"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=84024"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}