
BLE sottu un microscopiu (ATTы GATTы...)
Parte 1, panoramica
Hè passatu assai tempu da quandu a prima specificazione per Bluetooth 4.0 hè stata liberata. E, ancu s'è u tema BLE hè assai interessante, ancu mette assai sviluppatori per via di a so cumplessità. In i mo articuli precedenti, aghju vistu principarmenti à u livellu più bassu, Link Layer è Physical Layer. Questu ci hà permessu di evità di ricurdà à cuncetti cusì cumplessi è cunfusi cum'è u Protocolu Attributu (ATT) è u Profilu Attributu Generale (GATT). Tuttavia, ùn ci hè nunda di andà, senza li capisci, hè impussibile à sviluppà i dispusitivi compatible. Oghje vogliu sparte sta cunniscenza cun voi. In u mo articulu mi cunfiderà per i principianti da u situ Nordic. Allora cuminciamu.
Perchè tuttu hè cusì difficiule?
In u mo parè, era subitu chjaru chì a gestione di i dispositi via smartphones hè un tema assai promettente è longu. Per quessa, anu decisu di strutturallu immediatamente è à u massimu. Allora chì i pruduttori di diversi gadgets ùn venenu micca cù i so protokolli, chì saranu allora incompatibili. Da quì a difficultà. Dighjà à a prima tappa, anu pruvatu à strincà tuttu ciò chì hè pussibule in u protocolu BLE. È ùn importa micca s'ellu serà utile dopu o micca. Inoltre, anu furnitu a pussibilità di espansione a lista di i dispositi per u futuru.
Fighjemu a stampa induve u diagramma di u protocolu BLE hè disegnatu. Hè custituitu da parechji strati. U livellu fisicu più bassu (PHY) hè rispunsevule per u canali radio di u dispusitivu. Link Layer (LL) cuntene tutta a sequenza di bytes in u messagiu trasmessu. In articuli precedenti avemu studiatu esattamente questu. Host Controller Interface (HCI) hè un protokollu di scambiu trà strati BLE o chips se u Controller è Host sò implementati in chips differenti. U Protocollu di Controlu è Adattamentu di Link Logicu (L2CAP) hè rispunsevule per a furmazione di pacchetti, l'inquadramentu, u cuntrollu di l'errore è l'assemblea di pacchetti. Security Manager Protocol (SMP) hè rispunsevule per criptà i pacchetti. U Profilu di Accessu Generale (GAP) hè rispunsevule per u scambiu iniziale di dati trà i dispositi per determinà "Quale hè quale". Include ancu scanning è publicità. In questu articulu, aghju focu annantu à e duie parte restante di u protocolu - GATT è ATT. GATT hè una superstruttura di ATT, cusì sò strettamente intrecciati.

Per simplificà a storia, vogliu vultà à una analogia. L'aghju intesu in qualchì locu è mi piacerebbe sustene. Pensate à un dispositivu BLE cum'è una libreria cù parechje scaffali. Ogni scaffale hè un tema separatu. Per esempiu, avemu scaffali cù scienza fiction, matematica è enciclopedia. In ogni scaffale ci sò libri cù un tema specificu. È certi libri anu ancu marcati di carta cù note. Inoltre, avemu un picculu catalogu di carta di tutti i libri. Se vi ricordate, e biblioteche scolastiche sò una scatula stretta cù carte di carta. Cù sta analogia, u cabinet hè u prufilu di u nostru dispusitivu. I scaffali sò servizii, i libri sò caratteristiche, è u catalogu hè una tabella di attributi. I marcati in i libri sò descrittori, chì parleraghju ancu più tardi in più detail.
Qualchissia chì hà sviluppatu i dispositi sapi chì parechji prughjetti anu pezzi simili di codice. U fattu hè chì parechji dispusitivi anu funziunalità simili. Per esempiu, se i dispositi sò alimentati da batterie, u prublema di carica è monitorà u so livellu serà u listessu. U stessu passa per i sensori. In realtà, un approcciu orientatu à l'ughjettu à a prugrammazione "furnisce a capacità di creà oggetti chì combinanu pruprietà è cumpurtamenti in una unione autònuma chì pò esse riutilizzata". In u mo parè, BLE hà pruvatu un approcciu simili. I profili sò stati sviluppati da u Bluetooth Special Interest Group (SIG). I dispusitivi di diversi fabricatori chì anu i stessi profili duveranu travaglià cù l'altri senza difficultà. I profili, à u turnu, sò custituiti da servizii, è servizii di caratteristiche, supplementati da descrittori. In generale, pò esse cusì:

Per esempiu, cunzidira u schema di prufilu di un monitor di freccia cardiaca (bracciale fitness). Hè custituitu di dui servizii è parechje caratteristiche. Da quì a ghjerarchia di u prufilu diventa immediatamente chjaru. A caratteristica di u puntu di cuntrollu resetta u numeru tutale di gastru calori à zero.
1. U serviziu di freccia cardiaca include trè caratteristiche (0x180D):
a) Caractéristique de fréquence cardiaque obligatoire (0x2A37)
b) Caratteristica di posizione di u sensoru di u corpu opzionale (0x2A38)
c) Caractéristiques conditionnelles du point de contrôle de la fréquence cardiaque (0x2A39)
2. serviziu di mantenimentu di batterie (0x180F):
a) Caratteristica obbligatoria di carica di batteria (0x2A19)
UUID
Per avè un accessu unicu à l'elementi di u prufilu (servizii, caratteristiche è descrittori), avemu bisognu di numerali tutti in qualchì manera. Per questu scopu, un cuncettu cum'è Universally Unique ID (UUID) o Universally Unique Identifier hè introduttu. L'UUID hè indicatu in i parentesi di ogni linea. È ci hè una peculiarità quì. Per UUID, avemu decisu di utilizà un codice di 16 è 128 bits in longu. Perchè, dumandate? In u protocolu BLE, tuttu hè di cunservazione di l'energia. Dunque, a dimensione di 16 bits hè abbastanza raghjone. Hè improbabile chì più di 65 mila seranu creati in un futuru vicinu. servizii unichi è caratteristiche. À u mumentu, tuttu ciò ch'elli pudianu esse digià cuntatu (ricurdatevi da induve vene questu - "hà cuntatu ancu voi" :-)) Elementi numerati , , и pudete guardà i ligami.
Tuttavia, pensu chì tutti si ricordanu di a storia cù 4 bytes di indirizzi IP in Internet. Prima avemu pensatu chì era abbastanza, ma avà ùn pudemu micca passà à un indirizzu di 6 byte. Per ùn ripetiri stu sbagliu è dà rinuvamentu à e mani ghjucate di DIYers, SIG hà immediatamente decisu di introduci UUID 128-bit. Questu personalmente mi ricorda di a banda 433 MHz senza licenza, chì hè stata data à ogni tipu di Kulibins da u canali radio. In u nostru casu, un identificatore 128-bit di servizii è caratteristiche hè statu cultivatu. Questu significa chì noi, per i nostri servizii è i dispositi, pudemu usà quasi ogni valore di 128-bit. Tuttu u listessu, a probabilità di vene cun u stessu UUID tende à zero.
In fattu, i UUID brevi di 16 bit anu a so estensione à un valore di 128 bit. In a specificazione, sta estensione hè chjamata UUID Bluetooth Base è hà u valore 00000000-0000-1000-8000-00805F9B34FB. Se, per esempiu, l'UUID di l'attributu 16-bit hà u valore 0x1234, allura l'UUID 128-bit equivalente averà u valore 00001234-0000-1000-8000-00805F9B34FB. È ancu a formula currispondente hè datu:
128_bit_value = 16_bit_value * 2^96 + Bluetooth_Base_UUID
Ùn sò micca da induve vene stu numeru magicu. Se qualcunu di i lettori sanu, lasciate scrive in i cumenti (Un utilizatore cù u soprannomu Sinopteek hà digià fattu questu. Vede i cumenti). In quantu à vene cun UUID 128-bit, in principiu pudete aduprà un speciale quale farà per voi.
ATTy GATTy...
In verità, allora u divertimentu principia. Lasciami ricurdà chì ATT hè basatu annantu à una relazione cliente-servitore. Avà guardemu u dispusitivu di u servitore. Contene infurmazione cum'è i valori di u sensoru, u statu di l'interruttore di luce, i dati di locu, etc. Avà chì tutti i "participanti à a nostra sfilata" sò numerati, avemu bisognu di mette in qualchì manera in a memoria di u dispusitivu. Per fà questu, i mettemu in una tavula chjamata table d'attributi. Ricurdatevi bè questu. Questu hè u core di BLE. Questu hè ciò chì avemu da cunsiderà in più. Avà chjameremu ogni linea un attributu. Questa tavula hè situata in u fondu di a pila è, in regula, ùn avemu micca accessu direttu à questu. L'inizialemu è accedemu, ma ciò chì succede in l'internu hè oculatu da noi daretu à sette sigilli.
Fighjemu a stampa da a specificazione, ma prima di questu, vogliu immediatamente attirà l'attenzione à a cunfusione frequente in termini, à dì in descriptori. U rolu di u descrittore hè di cumplementà a descrizzione di a caratteristica. Quandu hè necessariu espansione e so capacità, allora i descrittori sò usati. Sò ancu attributi, è cum'è i servizii è e caratteristiche, sò situati in a tabella di l'attributi. Li esamineremu in detail in a seconda parte di l'articulu. In ogni casu, qualchì volta i descrittori riferite à u numeru di fila in a tabella di attributi. Questu deve esse tenutu in mente. Per evità a cunfusione, useremu u terminu "puntatore d'attributu" per questi scopi.

Allora un attributu hè un valore discretu chì hà e seguenti proprietà assuciate cun ellu:
1. Attribute Handle hè l'indici di a tavola chì currisponde à l'attributu
2. Attribute Type hè un UUID chì descrive u so tipu
3. U valore di l'attributu hè a dati indexatu da u punteru di l'attributu
4. Attribute Permissions sò a parte di un attributu, i permissions, chì ùn pò micca esse lettu o scrittu cù u protokollu attributu
Cumu capisce tuttu questu? L'attributu pointer hè, relativamente parlante, u so numeru in a nostra tavula.
Permette à un cliente di riferite un attributu in e dumande di lettura o scrittura. Pudemu numerate e nostre linee (attributi) da 0x0001 à 0xFFFF. In a nostra associazione cù a libreria, questu hè u numeru di carta in u catalogu di carta. In listessu modu, cum'è in u catalogu di a biblioteca, e carte sò disposti in ordine crescente di numeru. U numeru di ogni linea dopu deve esse più grande di a precedente. Cum'è in a biblioteca, qualchì volta alcune carte si perdenu, cusì cun noi, ci ponu esse lacune in a numerazione di a linea. Questu hè permessu. A cosa principal hè chì vanu progressivamente.
U tipu d'attributu determina ciò chì l'attributu rapprisenta. Per analogia cù a lingua C,
induve ci sò booleani, variàbili numerichi è strings, cusì hè quì. Per tipu d'attributu ricunnoscemu
ciò chì avemu trattatu è cumu pudemu cuntinuà à travaglià cù questu attributu. Quì sottu avemu da fighjulà certi tipi specifichi di attributi. Per esempiu, "dichjarazione di serviziu" (0x2800), "dichjarazione di caratteristiche" (0x2803), "dichjarazione di descrittore" (0x2902).
U valore di un attributu hè u so significatu propiu, perdona a tautologia. Se u tipu d'attributu hè una stringa, u valore di l'attributu pò esse, per esempiu, u slogan "Hello World !!!". Se u tipu d'attributu hè una "dichjarazione di serviziu", u so valore hè u serviziu stessu. E qualchì volta questu hè infurmazione nantu à induve truvà altre attributi è e so proprietà.
I permessi di l'attributu permettenu à u servitore capisce se l'accessu di lettura o scrittura hè permessu.
Nota chì sti permessi s'applicanu solu à u valore di l'attributu, è micca à u punteru, u tipu o u campu di permessu stessu. Quelli. se a registrazione di attributi hè permessa, allora pudemu cambià, per esempiu, a linea "Hello World !!!" à a linea "Bon ghjornu". Ma ùn pudemu micca pruibisce di scrive una nova linea o cambià u tipu d'attributu è designà a linea cum'è "dichjarazione di serviziu". Quandu un cliente cuntattate un servitore, u cliente dumanda i so attributi. Questu permette à u cliente di sapè ciò chì u servitore pò furnisce. Ancu s'ellu ùn hè micca necessariu di leghje è scrive i valori.
Chì pari
U cuncettu di GATT hè di raggruppà l'attributi in una tabella di attributi inseme in un ordine assai specificu è logicu. Fighjemu un ochju più vicinu à u prufilu di freccia cardiaca sottu. A colonna più a manca di sta tavula hè facultativa. Simply ci descrive ciò chì sta linea (attributu) hè. Tutte l'altri culonni sò digià familiari per noi.

À a cima di ogni gruppu avemu sempre un attributu di dichjarazione di serviziu. U so tipu hè sempre 0x2800, è u puntatore dipende da quanti attributi sò digià prisenti in a tavula. I so permessi sò sempre di sola lettura, senza alcuna autentificazione o autorizazione. Parleremu di sti cuncetti un pocu dopu. U valore hè un altru UUID chì identifica quale hè u serviziu. In a Table, u valore hè 0x180D, chì hè definitu da u Bluetooth SIG cum'è un serviziu di freccia di u core.
Dopu à l'annunziu di u serviziu, vene l'annunziu di a caratteristica. Hè simile in forma à una dichjarazione di serviziu. U so UUID hè sempre 0x2803, è i so permessi sò sempre di sola lettura senza alcuna autentificazione o autorizazione. Fighjemu à u campu di Valore Attributu, chì includenu qualchi dati. Sempre cuntene un puntatore, un UUID, è un settore di proprietà. Questi trè elementi descrizanu a dichjarazione sussegwenti di u valore caratteristiche. U puntatore denota naturalmente u locu di a dichjarazione di u valore di caratteristiche in a tabella di l'attributi. L'UUID descrive quale tipu d'infurmazione o valore pudemu aspittà. Per esempiu, u valore di a temperatura, u statu di l'interruttore di luce, o qualchì altru valore arbitrariu. È infine proprietà, chì descrizanu cumu u valore caratteristiche pò esse interazzione cù.
Un altru trappulu ci aspetta quì. Hè assuciatu cù permessi di attributi è proprietà caratteristiche. Fighjemu a stampa di e pruprietà di u campu di bit da a specificazione.

Comu pudete vede, ci sò ancu campi quì chì furniscenu capacità di lettura è scrittura. Puderete esse dumandate perchè avemu permessi di lettura / scrittura per l'attributu è a pruprietà
leghje / scrive per u valore caratteristiche? Ùn deve esse sempre listessi ? U fattu hè chì e pruprietà per u valore caratteristicu sò in realtà solu cunsiglii per u cliente utilizatu in GATT è strati d'applicazione. Quessi sò solu suggerimenti nantu à ciò chì u cliente puderia aspittà da l'attributu di dichjarazione caratteristica. Fighjemu questu in più detail. Chì tipi di permessi hà un attributu?
1. Permissions d'accessu:
- lettura
- record
- leghje è scrive
2. Permissione di autentificazione:
- autentificazione necessaria
- ùn hè micca necessariu autentificazione
3. Permissione d'autorizazione:
- l'autorizazione hè necessaria
- ùn hè micca bisognu d'autorizazione
A principal diferenza trà a risoluzione di l'attributu è e caratteristiche caratteristiche hè chì u primu s'applicà à i servitori, è l'ultimu à i clienti. U servitore pò esse permessu di leghje u valore caratteristicu, ma pò esse bisognu di l'autentificazione o l'autorizazione. Dunque, quandu u cliente dumanda e proprietà di a caratteristica, riceveremu chì a lettura hè permessa. Ma quandu pruvemu di leghje, avemu un errore. Dunque, pudemu parlà in modu sicuru di a priorità di i permessi nantu à e pruprietà. Da u latu di u cliente, ùn pudemu micca ottene a cunniscenza di quali permessi hà un attributu.
descrittore
Riturnemu à a nostra tavula. Dopu avè dichjaratu u valore di una caratteristica, e seguenti dichjarazioni d'attributi sò pussibuli:
1. Nova dichjarazione di e caratteristiche (un serviziu pò avè parechje caratteristiche)
2. Nova dichjarazione di serviziu (ci pò esse parechji in a tavula)
3. Dichjarà un manicu
In u casu di a caratteristica di misurazione di a freccia cardiaca, in a nostra tavula, a dichjarazione di u valore caratteristiche hè accumpagnata da a dichjarazione di u descrittore. Un descrittore hè un attributu cù infurmazioni supplementari nantu à una caratteristica. Ci sò parechji tippi di descrittori. Avemu da parlà di elli in detail in a seconda parte di stu articulu. Per avà, avemu da toccu solu à u Descriptore di Cunfigurazione Caratteristica Cliente (CCCD). Havi un UUID uguale à 0x2902. Utilizendu stu descrittore, u cliente hà a capacità di attivà l'indicazione o a notificazione nantu à u servitore. A diffarenza trà elli hè chjuca, ma ancu quì. A notificazione ùn hà micca bisognu di cunferma di a ricezione da u cliente. L'indicazione richiede questu, ancu s'ellu si trova à u livellu GATT, ùn ghjunghje micca à u livellu di l'applicazione. Perchè cusì, dumandate ? Alas, ùn sò micca sapè questu. Lasciami dì solu chì l'esperti nordici recomandanu l'usu di notificazioni. Inoltre, a verificazione di l'integrità di u pacchettu (usendu CRC) si trova in i dui casi.
cunchiusioni
À a fine di l'articulu, vogliu dì questu. L'ultima tavola hè un pocu cunfusa. Tuttavia, aghju sceltu perchè hè datu in , chì mi fiu. In a seconda parte di u mo articulu, intende di approfondisce in a specificazione BlueTooth 4.0. Schemi è disegni più curretti ci aspettanu quì. In a terza parte, mi piacerebbe analizà u logu ottenutu cù u prugramma Wireshark da unu di i gadgets è vede "live" tutta a tiuria chì avemu studiatu.
Impiegatu di u Gruppu di Cumpagnia
Pecherskikh Vladimir
Source: www.habr.com
