Bluetooth Cenni storici I primi studi sulla tecnologia Bluetooth partono nel 1994, quando la Ericsson Mobile Communication intraprende una serie di studi allo scopo di trovare delle alternative wireless per il collegamento tra telefoni e accessori (es. auricolari). Lo studio riguarda un collegamento radio che, non essendo direzionale, non necessita della cosiddetta “line of sight”, cioè della visibilità diretta, ed ha quindi degli evidenti vantaggi rispetto alle tecnologie infrarossi precedentemente utilizzate per collegare tra loro cellulari e dispositivi vari. Nel febbraio 1998 nasce il SIG (Special Interest Group), che è un gruppo di compagnie leader del settore delle telecomunicazioni e dell’elettronica, tra cui Ericsson, Nokia, Intel, IBM e Toshiba, che lavorano assieme per promuovere e definire le specifiche Bluetooth. In seguito entrano a far parte del SIG anche Microsoft, Lucent, 3Com e Motorola; al giorno d’oggi il SIG comprende più di 2000 compagnie. Nel luglio 1999 viene pubblicata la versione 1.0 delle specifiche Bluetooth, che viene seguita nel dicembre 1999 dalla versione 1.0b. Nel febbraio 2001 esce la versione 1.1, mentre sono ancora in fase di definizione le versioni 1.2 e 2.0. BLUETOOTH Generalità Bluetooth è una tecnologia radio studiata appositamente per trasmissioni a corto raggio (tipicamente 10 m) ed è caratterizzata da un bassissimo consumo di potenza, da un basso costo e da una bassa complessità. Queste caratteristiche consentono a Bluetooth di proporsi come la tecnologia del futuro nel campo delle comunicazioni wireless per apparecchi di piccole dimensioni alimentati a batteria. Inoltre è studiata anche per connettere e fare interagire tra di loro dispositivi diversi (telefoni, stampanti, notebook, PDA, impianti HiFi, TV, PC, cellulari, elettrodomestici, etc ), come riportato in Figura 1. Figura 1: Campi di utilizzo di Bluetooth Bluetooth permette anche di accedere a reti locali (LAN) tramite dei dispositivi denominati Access Point, nonché alla rete pubblica PSTN (Public Switched Telephon Network) e alla rete di telefonia mobile. Lo standard Bluetooth consente ai dispositivi di connettersi e comunicare tra loro in una regione limitata attraverso una rete ad hoc chiamata piconet (Figura ), che è costituita da un massimo di otto dispositivi attivi, di cui uno è il master, ossia colui che inizia lo scambio di dati, e gli altri sette sono gli slave, che funzionano in risposta al master, e non hanno altri collegamenti oltre a quello col master. Inoltre è possibile avere fino a 200 dispositivi in modalità “park”, cioè che non possono essere attivi nello scambio di dati col master, ma che restano sincronizzati con esso. 48 BLUETOOTH Figura 2: Esempio di piconet Caratteristica importante dei dispositivi Bluetooth è la loro capacità di creare e riconfigurare dinamicamente queste piconet senza richiedere l’intervento umano. Infatti se un dispositivo entra o esce dalla zona coperta dal master viene riconosciuto o tolto dalla rete automaticamente. Questo grazie all’operazione di inquiry, attraverso la quale i dispositivi Bluetooth periodicamente sono in grado di scoprire l’esistenza di altri nelle vicinanze. Questa possibilità di configurazione automatica permette, ad esempio, di sincronizzare i dati di un PC portatile e un PDA semplicemente avvicinando i due apparecchi oppure di passare automaticamente al vivavoce quando si entra in auto parlando al cellulare, fino al caso di un operatore industriale che con un palmare può muoversi all’interno di una fabbrica e monitorare e configurare i vari macchinari in maniera veloce ed efficiente. Tutto questo è possibile grazie al "Service Discovery Protocol" (SDP), che permette ad un dispositivo Bluetooth di determinare quali sono i servizi che gli altri apparecchi presenti nella piconet mettono a disposizione. Tale protocollo può fungere sia da server (ossia può essere interrogato da un altro dispositivo e rispondere con i propri servizi) sia da client (interrogando gli altri dispositivi) e ogni apparecchio dispone delle informazioni relative ai servizi di cui è capace e dei protocolli supportati: altri apparati potranno fare uso di queste informazioni per determinare le possibilità di interazione con i nodi della piconet. Questo è necessario perché, naturalmente, una stampante Bluetooth non offre le stesse possibilità di un PDA o di un’auricolare, pertanto occorre che ogni nodo conosca le funzioni e le possibilità di ogni altro nodo 49 BLUETOOTH della rete. Per fare un esempio concreto, se un telefonino Bluetooth vuole trasferire un messaggio di testo a un PDA, potrà interrogare quest’ultimo per sapere se è dotato di funzionalità e-mail, o se è in grado di ricevere un testo in altro modo. Quando un dispositivo si inserisce per la prima volta in una piconet, inoltre, effettuerà una "scansione" di tutti i nodi presenti per capire come può interagire con essi. Altra caratteristica importante dei dispositivi Bluetooth è quella di poter essere presenti in più di una piconet contemporaneamente, e di poter addirittura funzionare da master in una piconet e da slave nell’altra. Un gruppo di piconet legate tra loro viene chiamata scatternet (Figura 3). Figura 3: Esempio di scatternet Lo standard Bluetooth opera nella banda libera ISM (Industrial, Scientific and Medical) centrata attorno ai 2.4 GHz. Questa banda è occupata da un elevato numero di emettitori RF, dalle applicazioni wireless proprietarie, allo standard Wireless Ethernet (IEEE 802.11b), fino ad arrivare a generatori di rumore come i forni a microonde e le lampade al sodio da strada. Ciò ha reso necessario l’utilizzo di una tecnica di modulazione robusta alle interferenze: si è scelto una 2-FSK con il frequency hopping come tecnica di spread spectrum (FHSS). Questo sistema di comunicazione funziona secondo uno schema Time Division Multiplexing (TDM), dove l’unità base di operazione è uno slot di durata pari a 625 μs. Quando i dispositivi sono connessi, negli slot pari è abilitato a trasmettere il master, mentre negli slot dispari sono abilitati a rispondere gli slave, uno alla volta; in 50 BLUETOOTH particolare può rispondere lo slave che aveva ricevuto dati dal master nello slot precedente. In Figura 4 è mostrato un esempio di scambio di dati tra un master e 2 slave. Figura 4: Scambio di dati tra master e due slave L’utilizzo della tecnica FHSS comporta che ogni time slot sia caratterizzato da una frequenza di trasmissione differente, secondo una sequenza di valori frequenziali decisi dal master seguendo un particolare algoritmo di calcolo del frequency hopping. Il bitrate massimo raggiungibile in aria è pari a 1 Mbps. Lo stack Bluetooth Una chiave delle specifiche Bluetooth è il fatto che esse permettono a dispositivi di diverse case di lavorare tra di loro, in quanto non definiscono solo un sistema di trasmissione radio, ma definiscono uno stack software completo per consentire alle applicazioni di trovare dispositivi Bluetooth nella zona, scoprirne i servizi offerti e utilizzarli. Lo stack Bluetooth è definito da una serie di livelli, come si può vedere in Figura 5: 51 BLUETOOTH Figura 5: Stack Bluetooth Ciascun blocco di Figura 5 corrisponde a un capitolo delle specifiche Bluetooth; ciascun livello dello stack verrà descritto dettagliatamente nei paragrafi successivi. Confrontando lo stack Bluetooth con il più familiare modello di riferimento OSI per i protocolli di comunicazione (Figura 6), si può notare come i due modelli non coincidano esattamente tra di loro. Figura 6: Modello di riferimento OSI e Bluetooth 52 BLUETOOTH La Figura 6 può comunque aiutare per capire che tipo di relazione c’è tra un livello del modello OSI e un livello dello stack Bluetooth. Segue ora una descrizione dettagliata di ciascun livello dello stack Bluetooth, con particolare attenzione rivolta al livello Radio, specialmente per i vari ritardi in trasmissione e ricezione, e ai livelli HCI e L2CAP, ossia i livelli ai quali verrà sviluppato il software a microcontrollore per il controllo del modulo Bluetooth. 53 BLUETOOTH Radio Modulazione Il ricetrasmettitore Bluetooth opera nella banda ISM centrata attorno ai 2.4 GHz. Utilizza una modulazione di tipo 2-FSK, ossia una modulazione numerica che trasmette una certa frequenza per il livello logico alto, e un’altra per il livello logico basso. L’informazione digitale viene prefiltrata con un impulso Gaussiano, in modo che il passaggio da una frequenza all’altra non avvenga in modo brusco e si ottenga, quindi, una minore occupazione di banda. Essendo la banda ISM molto rumorosa, è necessario adottare delle tecniche di spread spectrum, in modo da limitare la probabilità d’errore. In particolare si utilizza la tecnica del frequency hopping (FHSS), che consiste nello sparpagliare il segnale su una banda maggiore facendo cambiare in continuazione la frequenza della portante. In Figura 7 è mostrato un esempio di trasmissione FHSS, dove ogni Th (tempo di hop) cambia la frequenza della portante (fh1, fh2, …) e, a seconda che il simbolo dt da trasmettere sia 0 o 1, viene trasmesso un segnale a una frequenza maggiore o minore della portante di quell’intervallo Th. Nello standard Bluetooth questo salto di frequenza avviene 1600 volte al secondo (ogni 625 μs, ossia un time slot del TDM), e i canali sono fissati e variano a seconda della zona geografica. Figura 7: Trasmissione FHSS 54 BLUETOOTH Nella maggior parte dei paesi la banda di frequenze va da 2400 MHz a 2483.5 MHz, e si hanno 79 canali spaziati di 1 MHz l’uno dall’altro, a partire da 2402 MHz fino a 2480 MHz. In alcuni paesi, a causa delle limitazioni nazionali sulle banda ISM, è stato specificato uno speciale algoritmo di frequency hopping; un esempio è la Francia, in cui la banda va dai 2446.5 MHz ai 2483.5 MHz, con 23 canali disponibili, spaziati tra loro di 1 MHz, a partire da 2454 MHz fino a 2476 MHz. La Figura 8 mostra le varie bande di frequenza al variare delle zone geografiche; i valori sono espressi in GHz. Figura 8: Bande di frequenze ISM per FHSS In Figura 9 si può vedere lo schema di funzionamento di un modulatore FHSS: Figura 9: Modulatore FHSS 55 BLUETOOTH La banda disponibile è divisa in N = 79 canali e salta tra questi in funzione della sequenza pnt generata nel modulatore, in base alla quale viene generata la portante fhi. Per ogni time slot la banda trasmessa è concentrata attorno alla frequenza della portante attuale, ed ha una larghezza Δfch dipende dal segnale 2-FSK trasmesso (Figura 10). Figura 10: Salto di canale FHSS Quindi il segnale FHSS è a banda stretta, in quanto tutta la potenza è concentrata attorno al canale in uso; mediando su più salti, la potenza trasmessa si sparge su tutto la banda utile WSS, che nel nostro caso va da 2.4000 GHz a 2.4835 GHz. Il fatto di trasmettere su una banda più larga comporta due vantaggi: una bassa densità di potenza, che significa che il segnale FHSS non disturba altri sistemi e non può essere rilevato da intrusi, garantendo un alto livello di sicurezza, e una ridondanza, data dal fatto che i messaggi presenti su differenti frequenze possono essere recuperati in caso di errore. Questo implica un’alta reiezione delle interferenze e del rumore. Ci sono due tipi di rumore che possono interferire: un rumore “narrowband”, ossia a banda stretta, e un rumore “wideband”, ossia a banda larga. In caso di rumore a banda stretta presente attorno a una determinata frequenza, esso disturberà solo il canale legato a quella frequenza, bloccando la trasmissione in un singolo time-slot. Questo è dovuto al fatto che in ricezione (Figura 11) il segnale utile subisce l’operazione inversa allo spreading (despreading), e torna a banda stretta, mentre il rumore a banda stretta subisce lo sparpagliamento, e non interferisce con il segnale utile. 56 BLUETOOTH Figura 11: Narrowband interference In caso di rumore a banda larga, che potrebbe essere la trasmissione di un altro segnale FHSS, che segue però un’altra sequenza di hopping, facendo l’operazione di despreading in ricezione, legata però alla nostra sequenza, il nostro segnale utile torna a banda stretta, mentre l’interferenza, non essendo correlata alla nostra sequenza, viene espansa ulteriormente (Figura 12). Figura 0.12: Wideband interference 57 BLUETOOTH Classi di potenza Le specifiche Bluetooth definiscono tre classi di potenza e le relative distanze che si possono raggiungere in trasmissione. Ciò è mostrato nella tabella 1: Power Class Output Power (Max) Distance (Max) 1 100 mW (20 dBm) 100 m 2 2.5 mW (4 dBm) 10 m 3 1 mW (0 dBm) 1m Tabella 1: Classi di potenza Bluetooth I dispositivi di Classe 1 hanno d’obbligo il requisito del controllo di potenza, che è opzionale per le classi 2 e 3. Comunque, per un minimo consumo di potenza, è preferibile avere il controllo di potenza. Il controllo di potenza agisce tramite un ricevitore che esamina un segnale di monitorazione della potenza, l’RSSI (Receiver Signal Strength Indication); in caso di segnale troppo debole viene mandato un segnale di controllo LMP_incr_pow (a livello Link Manager), che richiede di aumentare la potenza per avere un canale efficiente, mentre in caso di segnale più forte del necessario, c’è una richiesta di diminuire la potenza, con un segnale di controllo LMP_decr_pow_req. La misura RSSI compara il segnale ricevuto con due livelli di soglia, che definiscono il Golden Receive Power Range (Figura 13). Figura 13: Golden Receive Power Range 58 BLUETOOTH La soglia bassa corrisponde a un segnale ricevuto di potenza compresa tra i -56 dBm e i 6 dB sotto la sensibilità attuale del ricevitore. La soglia superiore è 20 dB sopra la soglia inferiore, con un’accuratezza di ± 6 dB. Parametri di prestazione del sistema RF Le specifiche Bluetooth forniscono dei parametri prestazionali per il sistema RF. Alcuni di questi parametri sono accettabili solo sulla carta, per cui molti dispositivi Bluetooth in commercio eccedono significativamente rispetto alle prestazioni di specifica. Bluetooth deve operare con un Bit Error Rate (BER) massimo dello 0.1%. Questo significa avere un ricevitore con una sensibilità di -70 dBm, anche se nella realtà i ricevitori Bluetooth superano questa specifica di 10 dBm o più. Le specifiche non forniscono valori per il tempo di assestamento nella sintetizzazione. In Figura 14 sono mostrati i tempi di operazione durante una transazione Rx/Tx. End of Data burst Protocol Proc. Baseband 384 + 10 μs 51 μs Synthesiser Setting 180 μs 10 μs 625 μs Figura 14: Requisiti per le temporizzazioni Dalla figura si nota che il processore del livello più basso prima decide in che stato mettere il controllore Baseband, che poi deve calcolare la nuova frequenza di trasmissione secondo la sequenza del FHSS e programmare il sintetizzatore. Questo impone un tempo di sintetizzatore di circa 180 μs, ma alcuni dispositivi in commercio hanno tempi migliori, compresi tra i 130 e i 170 μs. 59 BLUETOOTH Architettura del sistema RF Esistono diverse alternative di architetture radio; qui consideriamo una semplice modulazione eterodina a singolo bit per mostrare le componenti di un tipico sistema RF Bluetooth. Il diagramma a blocchi è illustrato in Figura 15. Figura 0.15: Sistema Radio I segnali di controllo TxOn (abilitazione della trasmissione), PaOn (Power Amp), VcoOn (abilitazione del sintetizzatore) e RxOn (abilitazione del ricevitore) sono sincronizzati con l’interruttore dell’antenna (Antenna Switch), che indica se trasmettere o ricevere nello slot temporale corrente. I dati entrano nel TxData in modo seriale, sotto il controllo del Baseband clock (TxClk); in ricezione, i dati entrano nel Baseband tramite la linea RxData, sotto il controllo del clock di ricezione (RxClk), che viene recuperato tramite un apposito circuito di clock recovery. Tipicamente viene utilizzato un PLL digitale. Il segnale Bluetooth Channel Numeber (ChanNo) deve essere fornito dal Baseband al sintetizzatore, per produrre l’esatta frequenza della portante nel mixer. La frequenza si ottiene come (2402 + ChanNo) MHz. 60 BLUETOOTH La funzione del circuito di clock recovery è di recuperare un segnale di clock valido da legare ai dati ricevuti. Esistono due modi per recuperare il clock nei sistemi Bluetooth: il primo consiste nel recuperare il clock conoscendo la sequenza di preamble di quattro bit più il primo bit della parola di sincronismo (synchword), mentre il secondo è una tecnica molto più comune (usata per es. nel DECT), dove si utilizza un PLL digitale. In entrambe i casi, la parte più importante dei dati da cui si recupera il clock sono i cinque bit della sequenza di preamble (incluso il primo della synchword). Comunque, la maggior parte dei sistemi RF perdono i primi uno, due o addirittura tre simboli a causa dei ritardi in ricezione e dei circuiti di soglia in continua. Il risultato di ciò è che solo uno o due simboli sono disponibili per il clock recovery, e l’esperienza dimostra che in realtà sono richiesti come minimo quattro o cinque bit. La risposta solita è muoversi nella synchword e usare alcuni di questi bit . Comunque, usando più di uno o due bit aumenta l’incertezza nella soglia di correlazione e riduce la sensibilità del ricevitore. Uno sviluppo futuro per il Bluetooth è quello di aumentare la sequenza di preamble. Ad esempio il DECT usa una sequenza di preamble di 16 bit. Temporizzazioni del sistema RF I diagrammi temporali mostrati nelle figure 2.16 e 2.17 illustrano le temporizzazioni dei vari segnali sul livello Radio. I segnali rappresentati nelle figure sono i seguenti: - ChanNo: fornisce il numero di canale per ottenere poi la frequenza attuale; - SynthOn: comanda l’accensione del VCO della parte radio, e viene attivato sia in ricezione che in trasmissione; - SynthOutputFrequency: indica la frequenza a cui è sintonizzata la radio; - TxOn: è il segnale di controllo della trasmissione, e abilita i dati ad essere trasmessi; - RxOn: è il segnale di controllo della ricezione, e viene ativato quando è possibile ricevere dati. 61 BLUETOOTH Figura 16: Temporizzazione in trasmissione Per quanto riguarda la trasmissione, il segnale SynthOn viene attivato quando comincia lo slot temporale della trasmissione. Il tempo tTO è chiamato Transmitter On delay, ed indica il tempo minimo da far trascorrere dopo avere attivato la linea di SynthOn prima di attivare la linea TxOn. Il tempo tPHD è il Phase Detect Off delay, e indica il tempo da far trascorrere dopo l’attivazione della linea TxOn prima di avviare la trasmissione dei dati. Questo tempo serve per fare stabilizzare la frequenza della portante. Figura 17: Temporizzazione in ricezione 62 BLUETOOTH Osservando la ricezione, il segnale SynthOn segue lo stesso andamento, ed anche qui si ha un ritardo tRO, Receiver On delay, che adesso indica il tempo da far trascorrere dopo l’attivazione della linea SynthOn prima di attivare la linea RxOn. Inoltre c’è il tempo TPHD, che indica il tempo da far trascorrere dopo l’attivazione della linea RxOn prima di avviare la ricezione dei dati. I valori specifici di questi tempi variano a seconda del dispositivo fisico utilizzato, e sono presenti sui data sheet della casa di produzione. Baseband Bisogna innanzitutto fare una distinzione tra “Link Controller” e “Baseband” in quanto le specifiche Bluetooth usano a volte questi due termini in modo ambiguo. Il Link Controller (LC) è responsabile del trasporto sul link dei vari pacchetti scambiati provenienti dal Link Manager (Figura 18), e deve mantenere questo collegamento attivo una volta stabilito, mentre il Baseband controlla il livello Radio, è responsabile della temporizzazione a basso livello, del controllo degli errori e della gestione dei collegamenti durante la trasmissione di un pacchetto. Figura 18: Link control e Baseband 63 BLUETOOTH Confrontando con lo stack OSI (Figura 6), il livello fisico è costituito da Radio e Baseband: il livello Radio interfaccia il Baseband con il canale in aria, mentre il Baseband formatta i dati provenienti dal LC, cioè si occupa della criptazione a basso livello per una trasmissione robusta e affidabile, riceve i dati dal canale e li passa nei livelli superiori dello stack. Come descritto in precedenza il sistema Bluetooth utilizza uno schema di trasmissione TDM con slot temporali di 625 μs, che è una combinazione tra una comunicazione a commutazione di pacchetto e una a commutazione di circuito. Alcuni time slot possono essere dedicati a pacchetti sincroni: infatti è possibile supportare fino a tre canali sincroni contemporaneamente, in coesistenza con canali dati asincroni. I canali sincroni hanno una velocità di 64 kbps in entrambe le direzioni, mentre i canali asincroni possono arrivare a 723.2 kbps in modalità asimmetrica (57.6 kpbs nell’altra direzione), o 433.9 kpbs in modalità simmetrica. Canale fisico Il canale è rappresentato da una sequenza pseudo casuale che indica il salto di frequenza attraverso i 79 canali (23 per i paesi con banda ISM limitata). Questa sequenza di salto è unica per la piconet ed è determinata dall’indirizzo del dispositivo master; la fase è invece determinata dal clock del master. Il canale è diviso in slot temporali associati ad un determinato salto di frequenza. Ogni unità che partecipa alla piconet dovrà essere sincronizzata sia temporalmente che frequenzialmente al canale. Ogni dispositivo deve essere in un determinato istante o master o slave; questi due ruoli sono così definiti: - master: dispositivo che inizia lo scambio di dati; - slave: dispositivo che risponde al master. Inoltre, quando sono in comunicazione, gli slave utilizzano la temporizzazione del master e saltano in frequenza seguendo la sequenza del master. 64 BLUETOOTH Figura 19: Slot timing per pacchetti singolo slot Come si può vedere in Figura 19, il master trasmette per primo allo slave; questo accade quando entrambi sono sintonizzati alla frequenza fk. Dopo 625μs i due dispositivi risintonizzano i loro livelli Radio ad una nuova frequenza fk+1, ed ora solo lo slave è autorizzato a trasmettere, e deve anche rispondere con un ACK o meno riguardo al pacchetto inviato nello slot precedente. Le specifiche Bluetooth definiscono pacchetti dati che possono essere lunghi 1, 3 o 5 time slot. In Figura 20 è mostrata la temporizzazione per pacchetti multi-slot, in particolare pacchetti da tre time slot. Figura 0.20: Slot timing per pacchetti multi-slot Usare pacchetti multi-slot consente di raggiungere maggiori data rate, a scapito però di una peggior affidabilità, in quanto un maggior numero di interferenze possono intervenire durante tre o cinque slot temporali rispetto a un singolo slot. Tutti i pacchetti 65 BLUETOOTH hanno lo stesso data header, per cui i pacchetti multi-slot hanno una maggiore efficienza dati. Temporizzazione Come molti protocolli di comunicazione, Bluetooth sincronizza la maggior parte delle operazioni a un clock interno. Questo assicura, per esempio, la sincronizzazione Tx-Rx nello scambio di dati tra due dispositivi, differenziando i pacchetti persi e quelli rispediti. Il clock Bluetooth è un contatore a 28 bit che si resetta a zero all’accensione e poi conta in ”free-run“, incrementandosi ogni mezzo slot, cioè 312.5 μs. Ogni dispositivo ha un suo clock interno, detto “native”, denominato CLKN. Quando un dispositivo opera come master, il suo clock interno CLKN viene usato come clock della piconet. Se un dispositivo opera come slave si deve invece sincronizzare al clock del master. Per fare questo, uno slave deve aggiungere un “offset value” al suo clock nativo (Figura 21), dal quale si ottiene una stima del clock del master, chiamata “piconet clock”, CLK. Il valore di questo “offset value” viene ricavato durante la procedura di paging (par. 2.6.5), quando il master manda allo slave un pacchetto FHS, che contiene il valore attuale del clock CLKN del master. Uno slave, per mantenere la sincronizzazione col master, si risincronizza ogni volta che riceve, grazie alla “synchronisation word”, attraverso la quale si riallinea al dispositivo trasmittente. Figura 21: Sincronizzazione tra master e slave 66 BLUETOOTH C’è un altro clock definito nel Bluetooth: CLKE, che si ottiene aggiungendo un altro offset al CLKN dello slave ed è usato nel caso specifico di in cui si stabilisce una connessione con uno slave prima di essere sincronizzati con il master. I due bit più bassi del clock (CLK[0] e CLK[1]) sono usati direttamente per delimitare gli slot di trasmissione e ricezione. Una trasmissione del master avviene sempre quando CLK[0:1] = 00, mentre una trasmissione di uno slave avviene quando CLK[0:1] = 10. Collegamenti fisici Il livello Baseband gestisce due tipi di collegamenti: - ACL (Asynchronous Connection-Less) E’ un collegamento punto-multipunto tra il master e gli slave della piconet. Negli slot non riservati ai collegamenti SCO, il master può scambiare pacchetti con ogni slave della piconet. Tra un master e uno slave può esistere solo un collegamento ACL. E’ una connessione a commutazione di pacchetto. Può trasportare dati sia dal livello L2CAP che dal livello Link Manager. Uno slave può trasmettere solo se è stato indirizzato nel precedente slot temporale. Per garantire l’integrità dei dati, i pacchetti ACL vengono ritrasmessi. - SCO (Synchronous Connection Oriented) E’ un collegamento simmetrico punto-punto tra il master e uno slave della piconet. Per questo tipo di collegamenti vengono riservati degli slot e può pertanto essere considerato come una connessione a commutazione di circuito. Il collegamento SCO viene utilizzato per la trasmissione della voce; un master può supportare un massimo di tre collegamenti SCO contemporaneamente. I pacchetti SCO non vengono mai ritrasmessi. Struttura dei pacchetti Bluetooth Segue ora una descrizione dei differenti tipi di pacchetti che vengono usati nella comunicazione tra dispositivi nei link ACL e SCO. Come si osserva in Figura 22, un 67 BLUETOOTH pacchetto standard Bluetooth è costituito da tre parti, ossia l’access code, il packet header e il payload. Figura 22: Struttura di un pacchetto Bluetooth Access Code Ogni pacchetto inizia con un access code. I compiti di questo campo sono la sincronizzazione, la compensazione dell’offset in continua e l’identificazione, in quanto l’access code viene ricavato dal Bluetooth Device Address del master, cioè ogni pacchetto sulla stessa piconet ha lo stesso channel access code. In Figura 23 viene riportato il formato, che è costituito da 72 o 68 bit a seconda che ci sia o meno il payload. Figura 23: Struttura dell'Access Code Bluetooth La prima parte dell’access code (preamble) è costituita da 4 bit (0101 o 1010 a seconda del primo bit della synchronisation word, per formare una parola di 5 bit, o 01010 o 10101), e serve per rilevare i fronti dei dati ricevuti e creare così un clock con il quale campionare il resto dei dati in ricezione. La synchronisation word è formata da 64 bit, di cui 24 sono costituiti dal LAP (Low Address Part) del dispositivo Bluetooth. L’access code è utilizzato nelle procedure di inquiry e di paging, in cui si usano pacchetti senza header e payload. 68 BLUETOOTH Sono definti tre tipi di access code: - Channel access Code (CAC): identifica la piconet; - Device Access Code (DAC): utilizzato per speciali procedure di segnalazione (es. paging e risposta al paging). Il paging è un’operazione che viene effettuata quando un dispositivo vuole creare una connessione e che porta alla sincronizzazione tra i due dispositivi. - Inquiry access Code (IAC): utilizzato nelle operazioni di inquiry, si suddivide in GIAC (General IAC) nel caso si vogliano trovare tutti i dispositivi nelle vicinanze e DIAC (Dedicated IAC) nel caso si vogliano trovare solo dispositivi particolari. Gli ultimi 4 bit dell’access code (trailer) sono presenti solo se è presente un payload, sono simili al preamble e servono per eseguire migliori compensazioni in continua e recupero del clock. Packet header Questo campo contiene delle informazioni di controllo del collegamento; il packet header (Figura 24) contiene 18 bit di informazione, protetti dal codice Forward Error Correction (FEC) di 1/3, che replica tre volte i dati, per un totale di 54 bit. Figura 0.24: Struttura del Packet header Il payload header consiste di sei campi: - AM_ADDR (3 bit): rappresenta l’indirizzo di un membro attivo della piconet; ad ogni slave viene assegnato dal master un indirizzo temporaneo di tre bit, e 69 BLUETOOTH tutti i pacchetti scambiati tra master e slave devono avere l’AM_ADDR dello slave. Un AM_ADDR di tutti zeri viene usato per i messaggi di broadcast. - TYPE (4 bit): tipo di pacchetto; - FLOW (1 bit): viene usato per il controllo di flusso dei pacchetti sui collegamenti ACL; FLOW = 0 significa che il buffer di ricezione è pieno e la trasmissione deve essere temporaneamente fermata. Nel periodo in cui FLOW = 0 tuttavia i pacchetti SCO continuano a essere trasmessi. - ARQN (1 bit): indicatore di acknowledge, indica al trasmettitore se i dati sono stati ricevuti correttamente (ARQN = 1) o meno (ARQN = 0). - SEQN (1 bit): fornisce una numerazione sequenziale al flusso dei dati, in quanto questo campo viene invertito ogni volta che si trasmette un nuovo pacchetto. Questo bit permette di evitare problemi in caso di errore sul bit ARQN, in qual caso continuerei a ricevere lo stesso pacchetto. - HEC (8 bit): Header Error Check, è utilizzato per controllare l’integrità dell’header. Payload Il formato del payload è diverso nel caso di pacchetto SCO o ACL. - ACL payload E’ costituito da un massimo di 2744 bit, ed è formato da tre campi (Figura 25), cioè il payload header, il payload vero e proprio e il codice controllore d’errore Cyclic Redundancy Check (CRC). Figura 0.25: Struttura del payload ACL 70 BLUETOOTH Il payload header è formato a sua volta a tre campi, cioè il L_CH (Logical Channel), che indica se è l’inizio o la continuazione di un pacchetto L2CAP o LMP, il flow flag e il length field (lunghezza) (Figura 26). Figura 26: Struttura del Payload header ACL - SCO payload Ha una lunghezza fissa di 240 bit (Figura 27), è preceduto dagli stessi access code e header di un pacchetto ACL benché i vari flow, ARQN e SEQN siano ridondanti in quanto il controllo di flusso e la ritrasmissione non vengono applicati nei link SCO. E’ assente anche il campo CRC. I dati presenti nel payload sono 10, 20 o 30 byte a seconda del FEC scelto (1/3, 2/3 o nessuno). Figura 27: Struttura di un pacchetto SCO Correzione d’errore FEC (Forward Error Correction) Aggiungendo dei bit di parità generati in funzione dei dati di ingresso, un certo numero di bit errati può essere rilevato e corretto. Ci sono tre tipi di FEC: 1/3, 2/3 e nessun FEC. 71 BLUETOOTH Il più forte, la codifica 1/3 FEC, consiste semplicemente nel nel ripetere ogni bit tre volte, e viene decodificato prendendo il valore del bit ricevuto più volte. Se un bit viene ricevuto due volte su tre ad un certo valore, quello è il valore corretto. La codifica 2/3 è un codice di Hamming (15,10), in cui ogni 10 bit vengono generati 5 bit di patità: quindi, ogni 10 bit in ingresso, ne escono 15. CRC (Cyclic Redundancy Check) Il CRC viene applicato su tutti i packet header (HEC) e su tutti i payload, per convalidare l’integrità dei dati ricevuti. Il CRC è in grado di segnalare un qualsiasi errore nei dati. ARQ Lo schema ARQ consiste nel fare ritrasmettere il pacchetto finché non viene ricevuto un segnale di acknowledge con cui si segnala che il pacchetto è stato ricevuto correttamente, o scade un determinato timeout. Tipi di pacchetto In tabella 2 sono presenti i vari tipi di pacchetti Bluetooth, con una breve descrizione. 72 Type Code SCO/ACL Nome - Comune ID 0000 Comune NULL 0001 Comune POLL 0010 Comune FHS 0011 ACL DM1 0100 ACL DH1 Porta 27 byte di informazione. Non è protetto da FEC. 1 0101 SCO HV1 Porta 10 byte di informazione. Usa FEC 1/3. 1 Descrizione Usato per trasmettere il DAC o il IAC nelle operazioni di page e inquiry. Non ha il payload. E’ utilizzato per ottenere informazioni sul link e sul flusso. Non necessita di ACK. Non ha il payload. E’ utilizzato dal master per sapere se gli slave sono attivi o meno. E’ un pacchetto di controllo speciale per rilevare indirizzo e clock del dispositivo che sta trasmettendo. UsaFEC 2/3. Porta 17 byte di informazione. Usa FEC 2/3. Slot 1/2 1 1 1 1 BLUETOOTH Porta 20 byte di informazione. Usa FEC 2/3. 0110 SCO HV2 0111 SCO HV3 1000 SCO DV 1001 ACL AUX1 1010 ACL DM3 Porta 121 byte di informazione. Usa FEC 2/3. 3 1011 ACL DH3 Porta 183 byte di informazione. Non usa FEC. 3 1110 ACL DM5 Porta 224 byte di informazione. Usa FEC 2/3. 5 1111 ACL DH5 Porta 339 byte di informazione. Non usa FEC. 5 Porta 30 byte di informazione. Non usa FEC. Combina sia dati che voce. Il campo dati usa FEC 2/3 e può essere ritrasmesso, mentre il campo voce no. Porta 30 byte di informazione. E’ uguale al DH1 ma non ha il CRC. 1 1 1 1 Tabella 2: Tipi di pacchetto Questi diversi tipi di pacchetti, differiscono l’uno dall’altro a seconda del numero di time slot occupati, della codifica di correzione d’errore utilizzata e del fatto che siano pacchetti voce SCO o dati ACL. L’identificazione del tipo di pacchetto avviene grazie al campo TYPE del packet header descritto precedentemente, Per il traffico ACL esistono sei tipi di pacchetti: DM1 e DH1 a uno slot, DM3 e DH3 a tre slot e DM5 e DH5 a cinque slot. DH significa Data High rate, mentre DM significa Data Medium rate. II pacchetti DM trasportano meno informazione utile, ma sono provvisti di una maggiore protezione all’errore, con una codifica FEC 2/3. I pacchetti DH invece non hanno FEC ma possono trasportare più dati utili. Per il traffico SCO esistono tre diversi tipi di pacchetto, che differiscono l’uno dall’altro semplicemente per il diverso tipo di codifica FEC utilizzato. Esiste poi un particolare tipo di pacchetto, il DV (Data Voice), in grado di trasportare sia dati che voce, la cui struttura è riportata in Figura 28. 73 BLUETOOTH Figura 28: Struttura pacchetto DV Il campo voce è di 10 byte, senza FEC (come HV1), e non può essere ritrasmesso. Il campo dati è protetto con una codifica FEC 2/3, un campo CRC, e i flag ARQ, SEQ e flow. In tabella 2.3 viene riportata la velocità di trasmissione dei vari pacchetti ACL, facendo distinzione tra una trasmissione simmetrica, che si ottiene usando lo stesso tipo di pacchetto in entrambe le direzioni, e una asimmetrica. In generale, è possibile avere delle applicazioni in cui la trasmissione in una direzione deve essere favorita rispetto a quella nella direzione opposta. La massima velocità di trasmissione ottenibile è di 732.2 kbps ottenuto con pacchetti DH5 in una direzione, mentre nell’altra si usano pacchetti DH1 con una velocità di 57.6 kbps. La massima velocità simmetrica utilizzata è di 433.9 kbps utilizzando pacchetti DH5 in ambo le direzioni. Tipo Velocità max simmetrica Velocità max asimmetrica (kbps) (kbps) Trasmissione Ricezione DM1 108.8 108.8 108.8 DH1 172.8 172.8 172.8 DM3 258.1 387.2 54.4 DH3 390.4 585.6 86.4 DM5 286.7 477.8 36.3 DH5 433.9 723.2 57.6 AUX1 185.6 185.6 185.6 Tabella 3: Velocità pacchetti ACL Il calcolo di queste velocità viene effettuato nel seguente: prendendo, ad esempio, un pacchetto DH1 in modalità simmetrica, si ha un payload massimo di 27 byte, che può essere trasmesso al massimo una volta ogni due time slot, cioè ogni 1.25 ms. Quindi: 74 BLUETOOTH DRsim − DH 1 = (27 ⋅ 8)bit = 172.8kbps 1.25ms Per un pacchetto DH5 in modalità simmetrica si ha invece: DRsim − DH 5 = (339 ⋅ 8)bit = 433.9kbps 10 ⋅ 625μs Guardando invece la modalità asimmetrica, è possibile prendere l’esempio di pacchetti DH5 in una direzione e DH1 nell’altra: in questo caso il payload del DH5 (339 byte) si potrà ripetere una volta ogni 5+1 time slot, cioè 3.75 ms. DRasim − DH 5 = (339 ⋅ 8)bit = 723.2kbps 3.75ms E’ possibile verificare anche che il pacchetto DH1 ci sta in un time slot: infatti trasmettendo un payload di 27 byte (216 bit) si ha un overhead di 150 bit, per cui in aria vanno effettivamente 366 bit; essendo il throughput di 1 Mbps, si ottiene: Tmax − DH 1 = (27 ⋅ 8 + 150)bit = 366μs 10 6 bps Canali logici Le specifiche Bluetooth definiscono cinque canali logici che sono trasportati sui link fisici SCO e ACL, e servono per trasportare informazioni a differenti livelli: - Link Control (LC): è un canale di controllo che viene trasportato nel packet header, e contiene informazioni di basso livello per il controllo del collegamento, tra cui l’ARQ e il SEQ. - Link Manager (LM): è un canale di controllo e trasporta informazioni scambiate tra i livelli Link Manager di due dispositivi collegati. E’ indicato con il campo L_CH = 11 nel payload header. - UA/UI: il canale UA (User Asynchronous) è utilizzato per trasportare i dati L2CAP e si identifica con L_CH = 10 per inizio pacchetti e 01 per continuazione pacchetti, mentre il canale UI (User Isochronous) serve nel caso di pacchetti che devono essere trasmessi via ACL ma per i quali non è possibile aspettare più di un certo tempo per avere la trasmissione senza errori; con il 75 BLUETOOTH canale UI si trasmette impostando un tempo massimo oltre il quale si passa alla trasmissione del pacchetto successivo. - US: il canale US (User Synchronous) viene usato per il trasporto dei dati SCO. Controllo di flusso Lo standard Bluetooth specifica di utilizzare delle code FIFO (First In First Out) sia in ricezione che in trasmissione, per i collegamenti SCO e ACL. In trasmissione il compito del Link Manager è quello di riempire le code, mentre il Link Controller si occupa dello svuotamento di esse. In Figura 29 si può osservare lo schema della routine di trasmissione. Figura 0.29: TX routine Gli interruttori S1 e S2 sono controllati dal Link Controller; sono presenti due registri per il traffico ACL e due per il traffico SCO: uno è chiamato registro current, a cui può accedere il Link Controller per la composizione del pacchetto, mentre l’altro è detto next, a cui accede il Link Manager per caricare nuovi dati. Lo schema della routine di ricezione è mostrato in Figura 30: 76 BLUETOOTH Figura 30: RX routine Anche in ricezione sia per il traffico ACL che per il traffico SCO vengono riservati due registri: uno a cui può accedere il Link Controller e caricare l’ultimo dato arrivato, e un altro in cui il Link Manager può andare a leggere il precedente dato arrivato. Se in trasmissione la code sono piene il Link Controller si occupa di evitare perdita di pacchetti e congestione. Se i dati non possono essere ricevuti, viene trasmessa un’indicazione di STOP sul canale LC di ritorno (bit Flow). Quando il trasmettitore riceve l’indicazione di STOP, ferma la sua coda FIFO. Quando il ricevitore torna ad essere pronto, trasmette un’indicazione di GO. Il sistema funziona in TDM e gli intervalli di trasmissione sono alternati a quelli di ricezione in modo sincrono. La piconet è sincronizzata al clock del master. Indirizzi Bluetooth Le specifiche Bluetooth definiscono quattro tipi di indirizzi: - BD_ADDR: è formato da 48 bit ed è unico per ogni dispositivo Bluetooth. Deriva dallo standard IEE802, ed è a sua volta diviso in tre campi: LAP (Lower Address Part) di 24 bit, UAP (Upper Addres Part) di 8 bit e NAP (Nonsignificant Address Part) di 16 bit. - AM_ADDR: è composto da tre bit, e identifica univocamente un dispositivo all’interno della piconet. - PM_ADDR: è composto da 8 bit, ed è assegnato ai dispositivi in modalità park. 77 BLUETOOTH - AR_ADDR: è composto da 8 bit, ed è utilizzato dai dispositivi in modalità park per determinare lo slot in cui possono mandare il proprio messaggio d’accesso. Questo indirizzo non è univoco e può essere assegnato a più dispositivi in park. Link Controller Il Link Controller (LC) è costituito da parti hardware e software, è responsabile del mantenimento del link una volta che è stato creato, esegue protocolli verso i livelli inferiore, come il protocollo ARQ e la codifica FEC, ed è trasportato nel canale logico LC (Link Control). Le funzioni svolte dal Link Controller sono le seguenti: - Trasferimento dati con le caratteristiche selezionate coi parametri del QoS (Qualità of Service); - Trasferimento asincrono con successo garantito utilizzando un protocollo ARQ; - Trasferimento sincrono; - Codifica audio, con data rate di 64 kbps; - Criptaggio. ARQ Il sistema ARQ (Acknowledgement/Request) viene utilizzato per la ritrasmissione di pacchetti corrotti. Come visto nel par. 2.5.4, in ogni packet header è presente il flag ARQN, che indica lo stato del pacchetto ricevuto in precedenza. ARQN = 1 significa che il pacchetto è stato ricevuto e decodificato correttamente, mentre ARQN = 0 (NAK) significa che la precedente trasmissione non è andata a buon fine; questa è detta tecnica del piggy-backed acknowledgement, cioè l’ACK viene “caricato a spalle” del payload del pacchetto di ritorno. Le possibili cause di ritrasmissione sono: - il ricevitore non rileva l’access code del pacchetto; - fallisce il controllo HEC (par 2.5.4), per cui non si sa a chi è indirizzato il pacchetto; 78 fallisce il controllo CRC. BLUETOOTH Ogni volta che un nuovo pacchetto viene trasmesso, il flag SEQN viene commutato, mentre in caso di ritrasmissione il bit non viene cambiato; questo permette al ricevitore di distinguere un pacchetto che possiede ARQN = 0 a causa di un errore sulla ricezione di ARQN da un pacchetto che effettivamente possiede un NAK. Quindi il ricevitore, in caso di ritrasmissione, confronta il SEQN precedente con quello ritrasmesso e se i due SEQN sono uguali scarta il nuovo payload, che è uguale al precedente, mentre se sono diversi ritiene valido anche l’ultimo payload arrivato. Il Link Manager può richiedere al Link Controller di effettuare un’operazione di flush del buffer, cioè di eliminazione di un pacchetto nel caso in cui questo continui ad essere trasmesso senza successo; ciò tipicamente avviene dopo un certo tempo in cui si prova a ritrasmettere, detto automatic_flush_timeout. Un master può spedire dati a tutti gli slave presenti nella piconet simultaneamente, usando dei pacchetti broadcast, cioè impostando AM_ADDR = 000. In questo caso però lo schema di utilizzo dell’ARQN non risulta più essere applicabile, per cui una soluzione è quella di ritrasmettere il pacchetto per un certo numero di volte. Stati del Link Controller Nei vari istanti, un apparecchio Bluetooth può essere in una serie di stati diversi. Vengono ora definiti i principali stati del Link Controller, prima di una dettagliata descrizione di come un dispositivo si muove da uno stato all’altro ed effettua operazioni di alto livello, come stabilire la connessione sotto il controllo di un’applicazione attraverso lo stack ed il Link Manager. - Standby In questo stato, il dispositivo è inattivo, nessun dato viene trasferito, e il livello Radio è spento. Dunque, il dispositivo è incapace di rilevare alcun access code. Questo stato è usato normalmente per abilitare le operazioni a basso consumo. - Inquiry E’ il processo tramite cui il dispositivo che intende diventare il master della piconet può provare a scoprire tutti gli altri apparecchi Bluetooth attivati nella sua area locale. Durante la procedura di inquiry, gli apparecchi che stanno 79 BLUETOOTH subendo un inquiry forniscono il pacchetto FHS (Frequency Hopping Synchronisation) al dispositivo che sta compiendo l’inquiry (Figura 31). Figura 31: Struttura del pacchetto FHS Il pacchetto FHS permette all’inquisitore di costruire una tabella delle informazioni essenziali richieste per fare una connessione, come il CLKN (clock nativo), che controlla la temporizzazione on-air, il BD_ADDR, che controlla la sequenza di frequency hopping e costituisce una parte dell’access code, e il BCH, che costituisce anch’esso una parte dell’access code. - Inquiry scan E’ l’atra metà della procedura di inquiry, e viene eseguita da tutti i dispositivi disponibili a diventare slave della piconet. Sebbene la scansione sia opzionale e sopra l’applicazione, molti dispositivi periodicamente entrano nello stato di inquiry scan per rendersi disponibili verso quelli in fase di inquiry. Essi ascoltano per un periodo esteso (questo è necessario, siccome non conoscono né la temporizzazione nè il comportamento del frequency hopping di alcun dispositivo inquirente) aspettando o un GIAC (General Inquiry Access Code) o un DIAC (Dedicated Inquiry Access Code). Quando essi ricevono un messaggio di inquiry valido, entrano nel sottostato di inquiry response e rispondono con un FHS come descritto sopra. Gli stati di inquiry e inquiry scan utilizzano una speciale sequenza di frequency hopping (veloce per inquiry e lenta per inquiry scan), che è realizzata per ridurre il tempo prima che avvenga sintonizzazione in frequenza. - Inquiry response In questo stato lo slave risponde con un pacchetto FHS. 80 la BLUETOOTH - Page Per stabilire una connessione, il dispositivo che è diventato master è istruito dall’applicazione per svolgere la procedura di page (chiamata). Il master prima entra nello stato di page, dove trasmette dei messaggi di paging diretti allo slave che prima ha mandato l’FHS (usando l’access code e le informazioni di temporizzazione acquisite nella procedura di inquiry). Lo slave acquisisce i messaggi di paging e il master entra nel sottostato di master response e risponde con il suo pacchetto FHS. - Page scan Come per l’inquiry scan, un dispositivo tipicamente entrerà nello stato di page scan periodicamente per permettere ai dispositivi nello stato di page di stabilire una connessione con essi. Una volta che un device nello stato di page scan ha ricevuto con successo un pacchetto di page, entra nel sottostato di slave response, dove acquisisce il pacchetto e aspetta l’FHS del master. Alla ricezione del pacchetto FHS, lo slave aggiorna il proprio CLK e la propria synchronisation word prima di entrare nello stato connection. Di nuovo, come nella procedura di inquiry, la procedura di page usa una speciale sequenza di hopping (veloce per il page e lenta per il page scan) , che serve a ridurre il tempo per la sintonizzazione di frequenza. E’ possibile avviare la procedura di paging senza un inquiry prioritario se l’indirizzo del dispositivo è già conosciuto, come può essere il caso con un arrangiamento dedicato per un laptop o un cordless, per esempio. Il device in stato di page è capace di indirizzare lo slave in questione, ma non essendoci nessun CLKE (stima del clock dello slave) disponibile, la procedura sarà molto più lunga. In teoria, il massimo della lunghezza è di 10 s. - Master response Il master entra in questo sottostato dopo che ha ricevuto una risposta dallo slave a un suo messaggio di page. Il master invia un pacchetto FHS allo slave e se questo risponde entra nello stato connection. 81 BLUETOOTH - Slave response Lo slave risponde al master ad una richiesta di page, e quando riceve dal master il pacchetto FHS entra nello stato connection. - Connection – Active Entrando nello stato connection, lo slave commuta al CLK del master (applicando l’offset al suo CLKN) e poi si sposta sulla sequenza di frequency hopping del master. Il master trasmette un pacchetto POLL (non ha il payload, è utilizzato dal master per sapere se gli slave sono attivi o meno) per verificare che il collegamento sia stato realizzato con successo. Lo slave deve poi rispondere con qualche tipo di pacchetto, tipicamente un NULL. Il flag ARQN viene settato a zero per un NAK, ma la trasmissione successiva il master attiva ARQN e SEQN (alterno). Se la connessione fallisce in questo modo, allora dopo un adatto timeout, entrambe i dispositivi ritornano nello stato di page e di page scan rispettivamente, e l’intero processo riparte. Anche se uno slave non può attualmente essere indirizzato per molti slot, esso sta sincronizzato al master durante una connessione effettuando la correlazione con l’access code del master – nel CAC Channel Access Code – in ogni pacchetto che il master trasmette, anche se non è destinato a quello slave. Il master deve stare in trasmissione periodicamente, anche se non ci sono dati da trasmettere. Userà dei pacchetti NULL per questo proposito se necessario. Una volta che uno slave ha commutato nel CAC e ha ricevuto il pacchetto header, troverà spesso che l’AM_ADDR non è il suo e deve interrompere la risposta. Fino a che il campo packet type dell’header non dirà quanti slot il pacchetto occuperà, potrà usare le informazioni per entrare in Low Power Sleep mode per l’intera durata della trasmissione del master. Durante lo stato di connessione, diversi scambi di dati e canali logici sono possibili. Come sempre, ogni dispositivo connesso deve portarsi nel sottostato Low Power come descritto sopra. 82 BLUETOOTH - Connection – Hold Nel modo Hold, un device cessa di supportare il traffico ACL per un periodo di tempo definito per liberare la banda per le altre operazioni come lo scanning, paging, inquiring o Low Power Sleep. Il dispositivo mantiene il proprio AM_ADDR. Dopo che l’hold time è finito, il dispositivo si sincronizza col CAC e comincia ad ascoltare il traffico di nuovo. - Connection - Sniff Nel modo sniff, a uno slave è dato un predefinito slot temporale e una periodicità per ascoltare il traffico. Lo slave ascolterà uno slot numero Dsniff ogni Tsniff slots per un periodo di timeout di Nsniff slots. Alla ricezione di un pacchetto durante questo tempo, esso continuerà a ascoltare finchè i pacchetti con il suo AM_ADDR termineranno. Esso poi aspetterà il prossimo periodo di sniff. - Connection - Park Nel modo Park, uno slave cede il suo AM_ADDR e ascolta il traffico solo occasionalmente. Per la maggior parte, il device è capace di entrare nella modalità Low Power. Il dispositivo solo necessita di svegliarsi a un definito istante, detto di “Beacon”, per sincronizzarsi al CAC prima di tornare in Low Power di nuovo. In questo modo, lo slave è capace di stare sincronizzato al master anche se esso segue un meno accurato oscillatore, LPO (Low Power Oscillator). 83 BLUETOOTH Operazioni del Link Controller Il diagramma degli stati del Link Controller è mostrato in Figura 32. Esso apparentemente mostra la strada per uscire dallo stato di standby e andare, attraverso l’inquiry, allo stato di connessione. In realtà, non c’è una via così diretta. Per effettuare una connessione, bisogna passare per lo stato di page (master) o page scan (slave). Il diagramma è concepito per mostrare che lo stato di inquiry può essere raggiunto sia da standby che da connection. Non mostra la strada per realizzare una connessione. Figura 0.32: Diagramma degli stati del Link Controller Una più semplice vista delle strade principali del diagramma è mostrata in Figura 33, dove è mostrato in modo chiaro come si crea una connessione partendo da zero, con a sinistra il master e a destra lo slave. 84 BLUETOOTH Figura 33: Transizione degli stati da standby a connection Come sempre in pratica, la transizione degli stati può essere più complessa. Per esempio, un master connesso già occupato con il traffico SCO può periodicamente fare delle operazioni di inquiry per cercare nuovi slave, delle operazioni di page per aggiungere slave alla piconet, o anche page scan o inquiry scan per diventare slave di un'altra piconet con un altro master. Infatti, un dispositivo in una scatternet pienamente attiva può commutare da alcuni dei principali stati ad altri come si muove tra connessione, link setup, inquiry e operazioni di risparmio energetico. E’ molto importante capire che l’apparentemente semplice macchina a stati vista prima rappresenta effettivamente solo lo stato di un collegamento tra due dispositivi in un determinato istante. Non appena si stabilisce un altro 85 BLUETOOTH collegamento, si entra in un altro ciclo della macchina a stati. Poi, un master può essere in connessione con uno slave e contemporaneamente essere in inquiry, paging o scanning con altri device. Infatti, mentre il page o l’inquiry può durare molti secondi, il master si muoverà effettivamente dalla connessione all’inquiry, allo scan o al page e tornerà alla connessione lavorando con l’insieme di dispositivi che interagiscono attorno ad esso. In pratica, l’entità dello stato di controllore richiede un insieme di contesti per ogni suo collegamento attivo. Questo è vero anche per il protocollo LC, e i pacchetti ARQN, SEQN e di ritrasmissione. Le prime implementazioni Bluetooth hanno piazzato la maggior parte di questi controlli in hardware, e ciò non è stato molto vantaggioso. Una chiave di volta per Bluetooth è stato dividere i ruoli dell’hardware da quelli del software. Scoperta di un dispositivo e inquiry In seguito alla natura ad hoc delle reti Bluetooth, dove dispositivi possono entrare e uscire dall’area della rete, la topologia della rete e degli appartenenti cambia in continuazione e deve venire aggiornata continuamente. Il LC usa gli stati di inquiry e inquiry scan per gestire il processo di discovery device, nella speranza di scoprire altri apparecchi o di essere scoperti, rispettivamente. Figura 34: Sequenza di messaggi per inquiry e inquiry scan 86 BLUETOOTH In Figura 34 sono mostrati i messaggi scambiati tra due dispositivi durante procedure di inquiry e inquiry scan. Il dispositivo inquisitore chiede: ”C’è qualcuno?”, mentre il dispositivo scanner (quello che è in fase di inquiry scan) ascolta se c’è qualche inquisitore. L’inquisitore chiama trasmettendo pacchetti ID contenenti un IAC (Inquiry Access Code). Di solito, si usa il GIAC (General), che è il più comune. Si può usare anche il DIAC (Dedicated). In origine il DIAC serviva per abilitare a entrare solo certi dispositivi, ma l’unico DIAC funzionante è il LIAC (Limited). Il LIAC è fatto per essere usato da un paio di dispositivi per un breve periodo. Dovrebbe essere il livello di applicazione a selezionare un device “noto”. Per risparmiare energia, viene effettuata un’inquiry solo se richiesto da un livello superiore (HCI), di solito periodicamente. Quando un device che è in fase di inquiry scan sente un inquiry, può rispondere immediatamente, ma potrebbero esserci molti scanner che lo vorrebbero fare assieme, le risposte interferirebbero tra di loro e l’inquisitore le scarterebbe tutte. Per fermare questo, viene usato un tempo casuale di back-off (RAND slot in Figura 35). Questa volta, se il dispositivo scanner sente l’inquiry, risponde dopo un time slot con il pacchetto FHS (Frequency Hopping Synchronisation). In questo modo, molti dispositivi possono rispondere all’inquiry, ma le loro risposte non si accavallano. Chiaramente l’inquisitore deve stare in inquiry per più del tempo massimo casuale di back-off. Figura 35: Temporizzazioni dell'inquiry 87 BLUETOOTH La Figura 35 mostra in dettaglio come un device inquisitore trasmette due volte per slot un ID con un fast hopping (la frequenza con cui trasmette cambia due volte per ogni slot, In(m), In(m+1),…), cercando di catturare un device in fase di inquiry scan, che cambia invece frequenza una volta ogni 2048 slot (1.28 sec, Sc(m)). L’inquisitore trasmette usando la sequenza di hopping di inquiry, e ascolta in entrambe le metà dello slot ad una data frequenza. Una volta che l’inquiry scanner riceve con successo un pacchetto ID (in Figura 35, coincidenza di frequenze In(m+1) = Sc(m)), aspetta per un tempo casuale di back-off, compreso tra 0 e 1023 slot, o più di 640ms per evitare collisioni. Dopo il periodo RAND, l’inquiry scanner entra nello stato di inquiry response, e alla prossima ricezione di un pacchetto ID (In(p+1) = Sc(m)), risponderà con un pacchetto FHS 625 μs più tardi. Entrambe i dispositivi saltano tra due differenti punti nella sequenze in base al valore del proprio bit CLKN[1], che è 0 per entrambi i dispositivi (par. 2.5.2). Si ha dunque Sc(m)=In(p+1), per cui la risposta è poi fatta nel prossimo slot quando CLKN[1]=1, e quindi lo scanner salta si sintonizza alla frequenza Sc(n) = In(s+1). Essendo l’inquisitore sullo stesso canale dello scanner, quando questo invia l’FHS il dispositivo che ha compiuto l’inquiry è pronto a ricevere. L’inquiry scanner rientra in inquiry scan nel prossimo canale (Sc(n+1)), alla sequenza di hop inquiry e aspetta un altro pacchetto ID. Non essendoci legami tra i due CLKN, non è un processo esatto ed è il motivo per cui ci sono errori. Il tempo di inquiry dipende da come si massimizza questa coincidenza. Se l’inquisitore riceve l’FHS nella prima metà dello slot, non può ricevere una risposta da un altro slave nella seconda metà dello slot, perché non ha tempo di saltare a un’altra frequenza. Allo stesso modo, se l’FHS arriva nella seconda metà dello slot, l’inquisitore dovrà perdere la trasmissione del primo ID del prossimo slot (Figura 36). Figura 36: Salto di frequenza durante l'inquiry response 88 BLUETOOTH L’inquisitore salta due volte per slot mentre il dispositivo in inquiry scan ascolta su una singola frequenza, per cui il tempo speso per avere un inquiry è la metà di quello che ci vorrebbe se l’inquisitore saltasse una volta per slot. Questo è possibile perché il pacchetto ID è corto. Se l’inquiry scanner non riceve il primo o il secondo ID entro il timeout scan, torna in stato di standby o connection. Lo stato di inquiry dura o quanto serve per avere un numero desiderato di risposte, o fino a che scade il tempo di timeout fissato dall’host. E’ possibile evitare l’inquiry interamente se è noto l’indirizzo del dispositivo, e passando direttamente al paging. Paging e realizzazione della connessione I sistemi Bluetooth sono realizzati per effettuare connessioni master-slave. Per stabilire un link, un dispositivo deve iniziare la connessione indirizzando una richiesta direttamente all'altro dispositivo chiedendo: “ti connetterai con me?”. L’operazione di paging consiste proprio in questo. Figura 37: Sequenza di messaggi per il paging e il page scanning 89 BLUETOOTH L'altro dispositivo deve parimenti stare ad ascoltare per una richiesta, cioè deve effettuare l’operazione di page scanning. Alla fine del paging, il pager diventa il master e il page scanner lo slave, anche se in seguito possono scambiarsi di ruolo. In Figura 37 sono mostrati i messaggi scambiati tra due dispositivi durante la realizzazione di una connessione, usando la procedura di paging. Il comando di creare una connessione fa entrare il dispositivo in paging, ed inizia a mandare una serie di pacchetti di paging (pacchetti ID basati sull'indirizzo del dispositivo chiamato). Nel frattempo, il dispositivo in fase di page scanning è configurato per fare periodicamente delle scansioni, che durano per un tempo prefissato. Il pager trasmette pacchetti ID con l'indirizzo dello scanner. Se lo scanner è in page scanning durante l’intervallo in cui il pager trasmette alla sua frequenza, allora riceve il pacchetto ID e risponde con un altro pacchetto ID, in cui usa il proprio indirizzo. Diversamente dall'inquiry qui c'è solo un device con quell'ID, così un solo dispositivo risponde e non c'è bisogno di attendere un tempo RAND. Il pager riceve l'ID e capisce che lo scanner è pronto a ricevere l'FHS. Lo scanner acquisisce l'FHS e risponde con un altro ID. Adesso lo scanner può estrarre dall'FHS i parametri necessari (Bluetooth CLK, AM_ADDR, etc…) da usare nella nuova connessione. Con questi parametri, lo scanner è in grado di calcolare la sequenza di hop del pager. Smette di usare la sequenza di hop speciale di page e si sposta nella sequenza speciale di hop di connessione assieme al pager, che è ora il master della nuova connessione. Dopo che entrambi i dispositivi si sono portati alla nuova sequenza di hop, il master manda un POLL per controllare che il cambio di sequenza sia avvenuto correttamente. Lo slave risponde con un pacchetto ACL (tipicamente un NULL). In seguito vengono scambiati vari pacchetti LMP (Link Manager Protocol). A questo punto, master e slave possono d'accordo scambiare ruoli se necessario. La Figura 38 mostra in dettaglio lo scambio di pacchetti e le temporizzazioni tra il pager e il page scanner durante la procedura di page. 90 BLUETOOTH Figura 38: Temporizzazione della procedura di paging Il master trasmette pacchetti ID sul canale che ha previsto lo slave, in base alla stima del CLKN dello slave (CLKE) ad alta velocità, due salti per slot. Questo è necessario, siccome il CLKE può essere inaccurato o inesistente perché un inquiry non l'ha stimato. I 32 canali della sequenza di hop sono divisi nei 16 attorno al canale previsto e gli altri 16 più lontani. Il gruppo interno di canali, detto treno A, viene provato prima, poi vengono provati gli altri, del treno B. Questo serve a dare maggiore velocità di risposta se è disponibile un CLKE, garantendo il successo anche nel caso peggiore in cui non ci sia. Come con l'inquiry, il pager salta due volte per slot per massimizzare la possibilità di prendere la frequenza dello scanner. Lo scanner segue la stessa sequenza di hop, ma effettua un salto ogni 2048 slots (1.28s). Nella Figura 38, Pg sta per pager hop channel, PgR sta per pager hop channel in stato di master response, ed è legato al page hop channel durante il quale l'ID viene ricevuto con successo dallo slave (Pg(n+1)). Una volta che lo scanner ha ricevuto il pacchetto ID, congela il clock e comincia a saltare in sequenza con il pager. Lo fa usando la sequenza di hop di page response. Quando il master riceve l'ID, trasmette il pacchetto FHS all'inizio del prossimo slot e permette allo slave di sincronizzarsi al suo riferimento di slot. Lo slave deve quindi aprire il suo correlatore 312.5 μs dopo che l'ID è stato spedito e tenerlo aperto almeno per 625 μs, siccome l'FHS potrebbe essere dato o in 312.5 μs o 625 μs. In seguito alla ricezione del pacchetto FHS, lo slave risponde con un ID; da ora entrambe i dispositivi usano il DAC dello slave, le temporizzazioni dello slave (slave 91 BLUETOOTH CLKN, master CLKE) e una sequenza di page derivata dal LAP dello slave. La trasmissione seguente è del master che usa il CAC (Channel Access Code) e il suo CLKN, che è lo slave in grado di ricevere in quanto è passato al master CACe CLK ed entrambi sono in stato di connessione. I dispositivi si scambiano ora POLL e NULL per verificare la connessione. Se il pacchetto POLL non viene ricevuto dopo un certo periodo, entrambe i dispositivi tornano nello stato di paging o page scanning rispettivamente. Operazioni della piconet In una piconet, il master trasmette e riceve da ciascuno degli slave che sono attivi in quell'istante e sono allocati con un AM_ADDR. Se non c'è niente da spedire, il master o omette quello slave o gli trasmette un pacchetto NULL. Se c'è in atto un collegamento voce sincrono (SCO) con uno degli slave, allora questo deve essere messo in comunicazione regolarmente in accordo alla velocità di SCO, ogni Tsco. Link ACL In Figura 39 è mostrato come un master sia capace di comunicare con diversi slave in sequenza secondo un traffico esclusivamente di tipo ACL. Figura 39: Traffico ACL 92 BLUETOOTH Il master trasmette sempre negli slot pari, gli slave nei dispari. Il diagramma mostra un esempio di traffico ACL in cui il master trasmette dati solo quando c'è qualcosa da spedire. In questo caso lo slave 3 è omesso, siccome non c'è nulla da mandargli in quel momento, e il master è in grado di saltare subito alla comunicazione con lo slave 4. Link SCO In Figura 40 è mostrato un master che trasmette con tre slave; in particolare è presente del traffico SCO con lo slave 2, per il quale sono riservati due slot ogni sei. Figura 40: Traffico SCO A causa del fatto che gli slots SCO sono riservati, lo slave SCO risponde nello slot 5 sia che abbia ricevuto o no dati dal master. Gli slot SCO possono essere spaziati per usare ogni coppia di slot, ogni seconda (due slot su quattro) o ogni terza coppia di slot (due su sei). Il fatto che la massima distanza tra due trasmissioni SCO consecutiva sia di sei slot, con il successivo riservato alla risposta, fa sì che al massimo un master può sostenere tre link SCO contemporaneamente con tre slave diversi, mentre uno slave può sostenere fino a tre link SCO con lo stesso master. Scambio di ruoli master/slave Bluetooth permette ai dispositivi di richiedere uno scambio di ruoli tra device in comunicazione. Per esempio, un master in una piconet può consentire a se stesso di essere chiamato (paged), connesso a un nuovo device e quindi saltare da slave a master e da master a slave per integrare un nuovo dispositivo nella piconet. Questo è fatto con una commutazione master/slave ed è utile nelle situazioni in cui una connessione è stata 93 BLUETOOTH appena fatta da un dispositivo che normalmente è uno slave, come un computer portatile che entra in una piconet controllata da un LAN Acces Point. Il meccanismo essenzialmente porta lo slave a spedire al master l’FHS; il master prende il CLK offset per compensare il CLKN dello slave, mentre lo slave commuta usando il proprio CLKN, e ogni device scambia gli access code. Il nuovo master spedisce anche un messaggio LMP, che contiene la parte bassa del CLK Bluetooth non contenuto nell’FHS assieme al sub-slot offset (ms) che permette al nuovo slave di sincronizzarsi. Architettura del livello Baseband/Link Controller La Figura 41 mostra una possibile struttura di un sistema Baseband/Link Controller. Figura 41: Architettura Baseband/Link Controller La strada percorsa dai dati può essere, in caso di traffico SCO, via diretta con l’interfaccia PCM, attraverso l’HCI, processati dall’audio CODEC, mentre in caso di traffico ACL via l’HCI. I dati vengono bufferizzati, così potrebbero venire letti seguentemente alla ricezione, alla velocità del sistema, o memorizzati aspettando la trasmissione. Tipicamente, un doppio buffer è usato per fare lo scheduling delle operazioni. Infatti, la doppia bufferizzazione in trasmissione, è quasi necessaria per un dispositivo multi-link 94 BLUETOOTH dove la ritrasmissione deve essere anticipata. Il data path è già stato discusso, esso codifica o decodifica i dati durante Tx o Rx, rispettivamente. Il correlatore Rx effettivamente sente i dati ricevuti, e quando abilitato, cerca il richiesto access code. Il sync word generator fornisce una valida sync word derivata dal LAP. Il timebase produce un CLKN: deve essere accurato con ±20 ppm. Il controllo di offset produce CLKE. La funzione di selezione di hop combina CLK con BD_ADDR per generare il canale e mandarlo alla radio. Infine, il sistema di criptaggio produce una parola chiave che viene letta e mandata al bitstream data path. Il cuore del sistema è il Link Controller, che controlla le funzioni e le operazioni citate. Tipicamente consiste di due macchine a stati, una per la trasmissione e una per la ricezione, che sono mostrate in Figura 42. Figura 42: Macchina a stati di trasmissione e ricezione LC 95 BLUETOOTH Sicurezza nel Bluetooth La tecnologia Bluetooth mette a disposizione un collegamento peer-to-peer per brevi distanze. Allo scopo di proteggere le informazioni trasmesse, il sistema deve avere delle misure di sicurezza sia a livello applicativo che di collegamento. Per quanto riguarda il livello di collegamento, sono presenti quattro entità: un indirizzo pubblico unico per ogni dispositivo, due chiavi segrete e un numero casuale che è diverso per ogni transazione (tab. 4). Entità Dimensione BD_ADDR 48 bit Chiave utente privata, autenticazione 128 bit Chiave utente privata, criptazione 8–128 bit RAND 128 bit Tabella 4: Entità utilizzata nell'autenticazione e nella criptazione Le chiavi di sicurezza sono derivate durante l’inizializzazione e non sono mai svelate. Normalemente, la chiave di criptazione è derivata dalla chiave di autenticazione durante il processo di autenticazione. Per quanto riguarda l’algoritmo di autenticazione, la dimensione della chiave è sempre di 128 bit. Nell’algoritmo di criptaggio, invece, la dimensione della chiave può variare da 8 a 128 bit. Questa dimensione può variare per due ragioni, cioè per i regolamenti presenti nei vari paesi e per facilitare un futuro aumento della sicurezza senza bisogno di riprogettare l’algoritmo di criptaggio e l’hardware. L’aumento della chiave, infatti, è il metodo più facile per aumentare la sicurezza. L’entità RAND è un numero casuale che viene generato all’interno dell’unità Bluetooth. Questo parametro non è statico e cambia velocemente. 96 BLUETOOTH Link Manager Un dispositivo Bluetooth viene guidato dall’host controller attraverso i comandi HCI, ma è il Link Manager che si occupa della traslazione di questi comandi in operazioni al livello Baseband, gestendo le seguenti operazioni: - legando gli slave alla piconet e allocando il loro indirizzo attivo; - rompendo la connessione per staccare gli slave dalla piconet; - configurando il link; - controllando le commutazioni master/slave; - stabilendo i collegamenti SCO (voce) e ACL (dati); - mettendo le connessioni in modalità basso consumo; - controllando la modalità test. Un LM Bluetooth comunica con un LM su un altro dispositivo Bluetooth usano l’LMP (Link Manager Protocol). Le specifiche Bluetooth definiscono solamente i messaggi LMP scambiati tra i LM e non scendono in nessun dettaglio su come le istruzioni del protocollo vengono fatte. In pratica, il LM controlla la gestione della piconet (crea e distrugge collegamenti), configura i collegamenti e le funzioni di sicurezza. LMP Protocol Data Units (PDU) Il protocollo Link Manager (LMP) è costituito essenzialmente da alcuni pacchetti base denominati PDU, che hanno la struttura mostrata in Figura 43. Figura 43: Struttura dei LMP PDU 97 BLUETOOTH Ogni messaggio LMP comincia con un singolo bit Translation IDentifier (TID) che è 0 se il master inizia la transazione e 1 se è lo slave. Poi c’è un OpCode di 7 bits, che definisce il tipo di messaggio LMP spedito. Infine ci sono una serie di parametri, ognuno dei quali occupa un intero byte. Il canale Link Manager Gli LMP PDU vengono passati come pacchetti single-slot nel canale logico LM. Questo canale è identificato settando nell’header del payload il logical channel field L_CH al valore 11. Il bit di flow è usato per interrompere i flussi L2CAP, per cui nel caso di messaggi LMP è sempre a 0 e in ogni caso viene ignorato dal ricevente. Setup dei collegamenti Il LM è responsabile del settaggio e della gestione delle connessioni a livello baseband che collegano device Bluetooth. I messaggi LMP possono essere usati per stabilire un link SCO in una connessione ACL esistente. Il LM mantiene i dati sugli slave su cui ha allocato un AM_ADDR. Figura 0.44: Sequenza di messaggi LMP per il settaggio di un link ACL 98 BLUETOOTH In Figura 44 vengono mostrati i messaggi inoltrati nel settaggio di una connessione ACL. Il Link Controller stabilisce un collegamento tra i dispositivi prima che i messaggi LMP siano scambiati. Una volta che il link ACL è stato stabilito, o il master o lo slave possono richiedere di creare un link SCO , come mostrato in Figura 45. Figura 45: Sequenza di messaggi LM per la creazione di un link SCO Infatti un link SCO può essere creato solo tra due dispositivi che possiedono già un collegamento ACL attivo tra di loro. Quando il master richiede una connessione SCO, manda un LMP_SCO_req contenete i parametri per il link, che sono: - SCO handle; - flags di controllo delle temporizzazioni; - Dsco: ritardo SCO, indica quando arriva il primo slot SCO; - Tsco: periodo che separa due slot SCO; - Tipo di pacchetto SCO usato (HV1, HV2, HV3, DV); - Codifica in aria: μ-law, A-law o CVSD. Lo slave risponde semplicemente con un LMP_accepted o con LMP_not_accepted. Un master può creare link SCO con più slave. E’ il master che decide le temporizzazioni del link SCO, perché se le scegliesse lo slave potrebbero accavallarsi con quelle di un altro link SCO. Quindi se uno slave manda un LMP_SCO_req, il master, se è in grado di creare un link SCO, risponde con un LMP_SCO_req, mandando nuovi parametri. Se non può, manda un LMP_not_accepted. 99 BLUETOOTH Sospensione del link LMP Se un master o uno slave vuole interrompere il collegamento, manda un LMP_detach (Figura 46). Figura 46: Sequenza di messaggi LMP per lo spegnimento di un link La ragione del distacco è inclusa nel messaggio; alcune possibili sono: - connessione terminata dall’utilizzatore; - poche risorse; - spegnimento. Scambio di ruolo Solitamente, chi fa il page diventa il master e chi fa il page scan diventa lo slave. In alcuni casi può essere necessario cambiare i ruoli. In tal caso, si interrompe il link, il master fa un’operazione di page-scan e lo slave fa un’operazione di page, ma in questo intervallo non si possono trasferire dati. Per evitare questa perdita di tempo, l’LMP fornisce un mezzo per scambiare i ruoli. Il dispositivo che vuole effettuare lo scambio di ruoli manda un LMP_switch_req. Durante questo scambio di ruolo è però necessario sincronizzare i dispositivi al clock del vecchio slave. Quindi questo manda un LMP_slot_offset per segnalare la differenza tra il suo clock e quello dell’altro dispositivo, e se lo scambio di ruoli è accettato, manda un pacchetto FHS (Figura 47). 100 BLUETOOTH Figura 47: Sequenza di messaggi per lo scambio di ruolo Controllo dei pacchetti multi-slot Quando un link viene creato, utilizza di default pacchetti single-slot; pacchetti multislot permettono un migliore utilizzo della banda, ma in alcune circostanze non possono essere usati: - su collegamenti rumorosi, in quanto i pacchetti multi-slot sono più facilmente corruttibili; - su collegamenti SCO, in quanto potrebbero non avere spazio a sufficienza. Figura 48: Sequenza di messaggi per il controllo di pacchetti multi-slot 101 BLUETOOTH Il master impone una dimensione massima per i pacchetti con la funzione LMP_max_slot; siccome lo slave non può rifiutarlo non serve che risponda con un LMP_accepted. Se lo slave spera di cambiare la dimensione massima, può mandare al master un LMP_max_slot_req. Se il master può permettere allo slave di usare questa dimensione massima, risponde con un LMP_accepted (Figura 48). Sicurezza Nel baseband c’è un meccanismo di criptaggio e decriptaggio. LMP fornisce un meccanismo di coordinamento e negoziazione delle chiavi di criptaggio. Modalità basso consumo LMP supporta il controllo della modalità di connessione basso consumo. In questo modo, un master o uno slave possono rimanere collegati ma stare in low-power per un tempo definito. Controllo di potenza Un dispositivo Bluetooth può regolare la propria potenza di emissione. Se un dispositivo ricevente non riceve bene può richiedere al trasmittente di aumentare la potenza col comando LMP_incr_power_req, mentre nel caso riceva un segnale più forte del dovuto, può chiedere una diminuzione della potenza, con un LMP_decr_power_req. Il controllo di potenza agisce tramite un ricevitore che esamina un segnale di monitorazione della potenza, l’RSSI (Receiver Signal Strength Indication). 102 BLUETOOTH Gestione degli errori Se il LM riceve un PDU con un opcode sconosciuto, replica con un LMP_not_accepted e con un codice che indica la ragione del non riconoscimento del LMP PDU. Quality of Service (QoS) Il LM permette di gestire la QoS del sistema. L’intervallo di poll, che è definito come il massimo tempo che intercorre tra due trasmissioni consecutive dal master a un particolare slave, viene controllato allocando la larghezza di banda e il tempo di latenza. Inoltre, master e slave negoziano il numero di ripetizioni per i pacchetti broadcast (NBC). Versione LMP Il LM supporta le richieste di versione (LMP_version_req) del protocollo LMP posseduto da un dispositivo. Questo risponde con tre parametri, VersNr,che specifica il numero della versione di LMP supportata, CompId, riguardo la compagnia che ha creato l’implementazione LM, e Sub-VersNr, che indica la versione di LM sviluppata dalla compagnia stessa. Caratteristiche supportate Alcune delle caratteristiche dello standard Bluetooth sono opzionali, come i pacchetti multi-slot, il criptaggio, le modalità basso consumo, l’RSSI, il controllo di potenza, i link SCO etc.; con il messaggio LMP_features_req si può ottenere un elenco delle caratteristiche supportate e di quelle che non lo sono. 103 BLUETOOTH Schema di funzionamento del Link Manager La Figura 49 schematizza le operazioni effettuate dal livello Link Manager. Figura 49: Operazioni LMP Come si nota, ci sono molte strade alternative in questo diagramma, la più semplice delle quali , dopo che è finita la fase di page o page response, è quella di scambiare solamente un messaggio di conferma del completamento della connessione. Altri percorsi più complicati possono includere il cambio di ruolo tra master e slave, l’autenticazione o il criptaggio dei dati. 104 BLUETOOTH Host Controller Interface (HCI) Questo livello mette a disposizione dei livelli superiori un’interfaccia uniforme per accedere alle capacità hardware (Figura 50). In sistemi dove i livelli più alti vengono eseguiti sul processore di un dispositivo che opera da host, mentre i livelli più bassi sono su un device Bluetooth, è richiesta un’interfaccia tra i livelli superiori e quelli inferiori. Lo standard Bluetooth definisce a questo scopo il livello HCI. Figura 50: Interfaccia HCI Il firmware HCI presente nel modulo Bluetooth traduce tutti i comandi provenienti dall’interfaccia HCI in comandi comprensibili dal Link Manager e dal livello Baseband. Il driver HCI presente sull’host riceve gli eventi (asincroni) dal modulo, che indicano cosa è avvenuto (es. ricezione dati). Il driver e il firmware comunicano tra di loro attraverso un livello di trasporto, che permette al driver di inviare dati senza conoscere il mezzo con cui vengono trasmesse 105 BLUETOOTH queste informazioni. Per questo livello sono definite tre tipi di interfacce, cioè USB, UART e RS232. Prendendo per esempio una scheda PCMCIA Bluetooth per PC, questa ha una struttura con il Baseband e il Link Manager implementati da un processore dedicato presente sulla card PCMCIA e i livelli più alti, come L2CAP, SDP, RFCOMM e le applicazioni, sul processore del PC, che funziona da host. Una scheda di questo tipo usa il livello HCI per separare i livelli inferiori e superiori per i seguenti motivi: - Host come i PC hanno molta capacità per gestire i livelli superiori, permettendo ai dispositivi Bluetooth di necessitare di meno memoria, di non avere bisogno di DSP dedicati a calcoli, per cui si riducono i costi; - L’host può essere in sleep ed essere invocato dall’inizio di una connessione; - L’HCI è utile per i test dei dispositivi Bluetooth. Figura 51: Posizione dell'HCI nello stack Bluetooth In Figura 51 è mostrato come lo stack Bluetooth può essere diviso in due parti collegate tra loro dal livello HCI. Perchè non spostare l’intero stack su un processore host? Questo potrebbe essere fatto, ma la temporizzazione degli slot Bluetooth implica che l’host dovrebbe essere in grado di rispondere in tempi dell’ordine dei microsecondi agli interrupt provenienti dal livello 106 BLUETOOTH Radio. Sebbene esistano microprocessori che garantiscono elevate prestazioni, è molto importante mettere i livelli inferiori su un processore dedicato (Baseband Controller) che garantisce risposte veloci. La standardizzazione dell’HCI ha permesso di sviluppare diversi driver che possono essere usati con una grande varietà di moduli Bluetooth, di diversa provenienza. E’ possibile avere sistemi Bluetooth dove tutti i livelli dello stack vengono eseguiti su un unico processore dedicato; un esempio sono gli auricolari Bluetooth, che devono essere piccoli, a basso costo, leggeri e a basso consumo. Pacchetti HCI Lo standard Bluetooth definisce i seguenti tipi di pacchetti per il livello HCI: - pacchetti di comando usati dall’host per controllare il modulo; - pacchetti di evento usati dal modulo per informare l’host delle variazioni di eventi; - pacchetti di dati per scambiare dati e voce tra host e modulo. In Figura 52 sono mostrati questi pacchetti e le loro direzioni di flusso. Figura 52: Tipi di pacchetti HCI Pacchetti di comando HCI Sono usati dall’host per controllare il modulo Bluetooth e monitorare lo stato. La struttura di un pacchetto di comando HCI è mostrata in Figura 53. 107 BLUETOOTH Figura 53: HCI Command Packet Questo tipo di pacchetto comincia con due bytes di OpCode, che identificanoin modo univoco il tipo di comando. L’OpCode è a sua volta diviso in due parti; OpCode Group Field (OGF) che identifica il gruppo di comandi, e OpCode Command Field (OCF) che identifica il comando nel gruppo. L’OGF occupa i 6 bit più alti, mentre l’OCF occupa i 10 bit più bassi dell’OpCode. In Figura 54 è riportato l’esempio di un comando HCI_Inquiry_Cancel, che ha OGF = 0x01 e OCF = 0x0002. Figura 54: Costruzione del campo Opcode di un pacchetto di comando HCI Il campo Opcode viene seguito da un campo di un byte contenente la lunghezza (in byte) dei parametri che seguono. In Figura 55 è mostrato il comando HCI_set_UART_baudrate, che serve per impostare la velocità di trasmissione sulla 108 BLUETOOTH seriale del modulo; questo comando ha OCF = 0x0009 e OGF = 0x3F. Il parametro 0x02 indica la velocità impostata (in questo caso è 115.2 kbps). Figura 55: Esempio di pacchetto di comando HCI Se un comando può essere completato subito, viene restituito un evento HCI_Command_Complete. Un’eccezione è quando si risponde a un reset, cioè al comando HCI_Reset. Qui è impossibile per il modulo mandare HCI_Command_Complete, e quindi lo manda prima dell’esecuzione dell’operazione. Se un comando non può essere completato subito, si torna un HCI_Commad_Status, fino a che l’operazione termina e viene restituito l’HCI_Command_Complete. Un esempio è il comando HCI_Inquiry, che inizia un inquiry. Il risultato dell’inquiry non può essere tornato fino a quando l’inquiry non è finita, e questo prenderà del tempo, così l’HCI_Command_Status sarà restituito immediatamente per dire che l’HCI_Inquiry è stato ricevuto. Più tardi, un HCI_Inquiry_Complete verrà ritornato. Pacchetti dati HCI Questo tipo di pacchetti sono utilizzati per scambiare dati attraverso l’HCI, sia per traffico ACL che SCO; a seconda del tipo di collegamento sono definti due pacchetti dati diversi. In Figura 56 è mostrata la struttura di un pacchetto dati ACL. 109 BLUETOOTH Figura 56: HCI Data Packet Il significato dei vari campi è il seguente: - connection handle: identifica univocamente il collegamento a un altro dispositivo; - Packet Boundary flag (PB): indica se il pacchetto è l’inizio o la continuazione di un pacchetto L2CAP più grande; - BroadCast flag: indica se il pacchetto deve essere trasmesso a tutte le unità Bluetooth presenti o ad una unità ben precisa (point to point); - Data Total Length: indica la lunghezza dei dati trasmessi, che al massimo è 65535 byte; - Dati: sono i dati effettivi da trasmettere. Un esempio di pacchetto dati ACL è mostrato in Figura 57: Figura 57: Esempio di pacchetto dati ACL Si nota che in un pacchetto Bluetooth, a qualsiasi livello, i parametri che occupano più di un byte vengono inviati nell’ordine dal byte più significativo a quello meno significativo. Nell’esempio, il campo Lunghezza dati ha valore 0x0006. Un pacchetto dati SCO ha la struttura riportata in Figura 58: 110 BLUETOOTH Figura 58: HCI SCO Data Packet I pacchetti dati SCO sono molto simili a quelli ACL, con alcune differenze: - Non ci sono i flag PB e BC; - Il campo Data Total Length è solo di un byte, restringendo il campo dati ad un massimo di 255 byte. Un esempio di pacchetto dati SCO è riportato in Figura 59: Figura 0.59: Esempio di pacchetto dati SCO Pacchetti evento HCI Il formato di un pacchetto evento HCI è mostrato in Figura 60: Figura 60: HCI Event Packet L’event code identifica l’evento. Il comando HCI_Set_Event_Mask è usato per dire al modulo Bluetooth di quali eventi si vuole avere informazioni e di quali no. Il comando HCI_Set_Event_Filter è usato per disabilitare il riporto degli eventi. 111 BLUETOOTH Un esempio di pacchetto evento HCI è mostrato in Figura 61: Figura 61: Esempio di pacchetto evento HCI Livello di trasporto HCI Per mandare pacchetti HCI dall’host al modulo Bluetooth è necessario avere un livello di trasporto; le specifiche Bluetooth definiscono tre tipologie di interfacce: - USB, Universal Serial Bus; - UART, Universal Asynchronous Receiver Transmitter; - RS232, interfaccia seriale con correzione dell’errore. Livello di trasporto UART Questo livello di trasporto permette di collegare l’host con l’host controller attraverso un’interfaccia seriale. Un esempio può essere il collegamento tra l’UART di un modulo Bluetooth e l’UART di un microprocessore, oppure con l’uscita seriale di un PC, opportunamente interfacciata tramite un MAX232 (Figura 62). Figura 62: Interfacciamento con seriale PC 112 BLUETOOTH Attraverso il livello di trasporto UART è possibile trasmettere quattro tipi di pacchetti HCI, come è mostrato in tab. 2.5: Tipo di pacchetto HCI Indicatore Comando 0x01 Dati ACL 0x02 Dati SCO 0x03 Evento 0x04 Tabella 5: Tipi di pacchetti su UART e indicatori HCI In tab. 2.5 sono mostrati anche gli indicatori, che servono per differenziare i quattro tipi di pacchetto e vengono messi davanti ad essi nella trasmissione. Sull’interfaccia UART è anche possibile utilizzare i due segnali RTS (Request To Send) e CTS (Clear To Send) (Figura 63); questi sono utili nel caso in cui il buffer del modulo si riempie: se l’uscita del modulo CTS = 0 è possibile mandare dati al modulo, mentre impostando l’ingresso del modulo RTS = 1, si disabilita il modulo dalla ricezione di dati. Figura 63: Connessioni per il livello di trasporto HCI UART I parametri di default a cui viene impostato l’UART del modulo sono riportati in tab. 6: 113 BLUETOOTH Velocità di trasmissione 57600 bps (Ericsson) Numero di bit 8 Bit di parità Nessuna parità Bit di Stop 1 bit di Stop Controllo di flusso RTS/CTS Tabella 6: Settaggi dell'UART Controllo di flusso HCI Il controllo di è utilizzato nella direzione host (microcontrollore, PC, etc.) – host controller (nel modulo Bluetooth) per evitare di spedire dati ACL al modulo quando questo ha il buffer di trasmissione pieno. Durante l’inizializzazione , l’host esegue il comando HCI_Read_Buffer_Size, che tornerà dei parametri, tra cui la dimensione massima dei pacchetti HCI ACL e SCO (header escluso) che possono essere trasmessi dal modulo, oltre al numero di pacchetti ACL e SCO che il modulo può contenere nel suo buffer prima della trasmissione. Quando è attiva una connessione l’host controller usa l’evento Number_of_Completed_Packet per indicare all’host la dimensione dei dati trasmessi e quindi della quantità di spazio che è stata liberata nel buffer. Grazie a tali informazioni l’host è sempre a conoscenza della quantità di dati che può trasmettere al modulo. Può anche accadere che sia necessario il controllo di flusso nella direzione inversa (host controller – host); ciò può accadere nel caso in cui l’host sia costituito da un microcontrollore poco potente. Per abilitare questo controllo si utilizza il comando Set_Host_Controller_To_Host_Flow_Control; una volta fatto ciò, con il comando Read_Host_Buffer l’host comunica all’host controller la dimensione del suo buffer per pacchetti HCI ACL. Quando il suo buffer si libera viene inviato al modulo il comando Host_Number_Of_Completed_Packet, per indicare che l’host ha finito di processare il pacchetto dati precedente. Per quanto riguarda i comandi HCI, se il comando inviato dall’host può essere eseguito immediatamente, il modulo risponde con un evento HCI_Command_Complete, mentre se il comando necessita di un certo tempo per essere eseguito, il modulo torna dapprima 114 BLUETOOTH un evento HCI_Command_Status, che indica quanti comandi sono in fase di esecuzione e quanti se ne possono ancora eseguire, fino a quando il comando termina, e si ritorna un HCI_Command_Complete (Figura 64). Figura 64: Sequenza di messaggi per un comando HCI Comandi HCI Le specifiche Bluetooth forniscono diverse categorie di comandi HCI, attraverso i quali è possibile configurare il modulo, controllare il collegamento, richiedere informazioni o attivare la modalità test. Ecco le diverse categorie di comandi HCI: Link Control Questa categoria di comandi consente all’host controller di controllare la connessione ad altri dispositivi Bluetooth; quando vengono usati questi comandi, il LM controlla come le piconet e le scatternet sono create e mantenute, e viene istruito su come modificare la connessione, effettuare inquiry e altri comandi LMP. 115 BLUETOOTH Questo gruppo caratterizzato da OGF = 0x01; esempi di comandi appartenenti ad esso sono HCI_inquiry (OCF = 0x0001), HCI_create_connection (OCF = 0x0005) e change_connection_packet_type (OCF = 0x000F). Link Policy Tramite questo gruppo di comandi l’host è in grado di cambiare il modo in cui il Link Manager gestisce la piconet., cambiando dei parametri di policy (politica). Questi comandi sono caratterizzati da OGF = 0x02. Esempi di comandi Link Policy sono HCI_hold_mode (OCF = 0x0001), HCI_write_link_policy_settings (OCF = 0x000D) e HCI_QoS_setup (OCF = 0x0007). Host Controller & Baseband Questi comandi permettono di accedere e controllare diversi elementi dell’hardware Bluetooth. I parametri influenzano il controllo dei dispositivi Bluetooth e le capacità dell’host controller, del Link Manager e del livello Baseband. L’host può usare questi comandi per modificare il comportamento del dispositivo locale che controlla. Sono caratterizzati da OGF = 0x04; alcuni esempi di comandi Host Controller & Baseband sono il HCI_write_scan_enable (OCF = 0x001A), il HCI_reset (OCF = 0x0003) e il HCI_set_host_controller_to_host_flow_control (OCF = 0x0031). Informational Parameters Questi comandi sono fissati dalla casa costruttricedell’hardware Bluetooth, e forniscono informazioni circa l’apparecchio Bluetooth e le capacità dell’host controller, del Link Manager e del Baseband. L’host non può modificare nessuno di questi parametri. Questa categoria di comandi ha OGF = 0x04, e alcuni esempi sono il HCI_read_local_version_information (OCF = 0x0001) e il HCI_read_buffer_size (OCF = 0x0005). Status Parameters L’host controller modifica tutti i suoi parametri di stato. Questi parametri forniscono informazioni circa lo stato attuale dell’host controller, del Link Manager e del Baseband. L’host non può modificare nessuno di questi parametri; può solo resettare 116 BLUETOOTH alcuni parametri specifici. Il gruppo ha OGF = 0x05; alcuni esempi sono il comando HCI_read_RSSI (OCF = 0x0005) e il HCI_get_link_quality (OCF = 0x0003). Testing Questi comandi sono usati per abilitare la modalità test sull’hardware Bluetooth, e permettono di sistemare alcuni parametri sulle condizioni di test. Sono caratterizzati da OGF = 0x06; esempi sono il read_loopback_mode (OCF = 0x0001) e il enable_device_under_test_mode (OCF = 0x0003). Inquiry Nel par. 2.6.4 si è visto come il livello Baseband usa l’operazione di inquiry per scoprire altri dispositivi Bluetooth nelle vicinanze; tutti gli aspetti del processo di inquiry sono controllabili attraverso l’HCI. Avvio di un inquiry Il comando HCI_inquiry viene usato per iniziare il processo di inquiry. Ha tre parametri: - Inquiry LAP – l’access code utilizzato; - Inquiry length – la lunghezza temporale dell’inquiry (in unità di 1.28 s); - Num_responses – il numero di risposte per cui aspettare. In Figura 65 è mostrato un esempio di comando di inquiry; si nota come il parametro Inquiry_LAP = 0x9E8833 (da Bluetooth Assign Number), Inquiry length = 5 (6.4 s) e Num_responses = 0, cioè numero illimitato di risposte. Figura 65: Comando HCI_inquiry 117 BLUETOOTH Gestione delle risposte all’inquiry Le risposte all’inquiry vengono riportate nell’evento HCI_Inquiry_Result. I parametri ritornati sono i seguenti: - Numero di risposte (1 byte); - BD_ADDR del dispositivo trovato (6 byte); - Page scan repetition mode (1 byte), R0 continuo, R1 page scan ogni 1.28 s, R2 ogni 2.56 s; - Page scan period mode (1 byte), P0 (≥ 20 s), P1 (≥ 40 s) e P2 (≥ 60 s); - Page scan mode (1 byte),; - Classe del dispositivo (3 byte); - Clock offset (2 byte), I bit CLKN[16:2] del clock del device che risponde all’inquiry. In Figura 66 è mostrato un esempio di risposta all’inquiry. Figura 66: Evento Inquiry_response La Figura 67 mostra la sequenza di messaggi HCI scambiati tra host e modulo Bluetooth durante una procedura di inquiry. Si nota come, mentre l’inquiry è in corso, il modulo ritorna un evento Command_status, e in seguito vengono restituiti due eventi di Inquiry_Result, uno per ciascun dispositivo Bluetooth trovato. 118 BLUETOOTH Figura 67: Sequenza di messaggi HCI durante un'operazione di inquiry Temporizzazione delle operazioni di inquiry Per fare in modo che un apparecchio Bluetooth funzionante da master in una piconet sia in grado di aggiornare continuamente la configurazione della propria rete ad hoc, si vorrebbe che esso fosse in fase di inquiry in continuazione, cioè sia alla ricerca continua di nuovi dispositivi; questo però comporterebbe elevati consumi in termini di batterie, per cui ci si limita ad effettuare operazioni di inquiry periodiche per brevi intervalli. Un host mette un modulo Bluetooth in inquiry periodica tramite il comando HCI_Periodic_Inquiry_Mode, che fa parte dei comandi LINK Control, nel quale si specificano alcuni parametri quali l’intervallo in cui si ripete l’inquiry e la lunghezza. Inquiry scan Nel paragrafo 2.6.4 è stato descritto come un dispositivo Bluetooth si rende disponibile ad essere scoperto da altri dispositivi entrando nella procedura di inquiry scan. Tramite l’HCI è possibile configurare alcuni parametri di questa procedura. Temporizzazione dell’Inquiry scan Si presenta anche qui il problema del consumo per dispositivi che opera un inquiry scanning. La soluzione è effettuare operazioni di scan per brevi intervalli periodicamente. Il GAP (Generic Access Profile) raccomanda di effettuare scansioni in 119 BLUETOOTH finestre di 10.625 ms distanziate al massimo di 2.56 s l’una dall,altra. Questo è in relazione al fatto che il GAP raccomanda anche di effettuare inquiry di durata di 10.24 s, in modo da essere sicuri che un dispositivo riesca a farsi scoprire (Figura 68). Figura 68: Temporizzazioni raccomandate per Inquiry e inquiry scan Abilitazione dell’Inquiry scan Per abilitare un dispositivo ad entrare in Inquiry scan bisogna utilizzare il comando HCI_Write_Scan_Enable, con il quale si sceglie se abilitare o meno anche il Page scan. Infatti questa procedura richiede un parametro (1 byte), che assume questi significati: - 0x00: default, nessuna scansione abilitata; - 0x01: abilitato solo Inquiry scan; - 0x02: abilitato solo Page scan; - 0x03: abilitate entrambe le scansioni. Creazione di una connessione Un dispositivo Bluetooth si connette ad altri effettuando delle operazioni di page, ossia delle “chiamate”, spedendo dei pacchetti ID (paragrafo 2.6.5). Un host utilizza il comando HCI_create_connection per iniziare la procedura di page. Questo comando appartiene alla categoria dei comandi Link Control, e contiene i seguenti parametri: - BD_ADDR: l’indirizzo Bluetooth del dispositivo a cui connettersi; - Packet type: tipo di pacchetto da utilizzare (DH1, DM1, DH3,etc.); 120 BLUETOOTH - Page_ scan_repetition_mode: intervallo tra due page consecutivi; - Page_scan_mode: modalità di page scan; - Clock_Offset: clock offset stimatodel dispositivo chiamato rispetto a quello locale; - Allow_role_switch: abilita o meno lo scambio di ruoli. In Figura 69a è mostrato un esempio di comando HCI_create_connection. Figura 69: a) Comando HCI_Create_Connection, b) evento HCI_Connection_Request, c) comando HCI_Accept_Connection_Request Se un page scan ha successo, il modulo Bluetooth del master spedisce pacchetti ID al modulo dello slave, il quale, se non è configurato per accettare automaticamente la connessione, annuncia all’ host che ha subito un’operazione di page, cioè è stato “chiamato”, spedendo un evento HCI_connection_Request (Figura 69b); l’host risponde con un HCI_Accept_Connection_Request (Figura 69c) o con un HCI_Reject_Connection_Request. In Figura 70 è mostrata la sequenza di pacchetti HCI scambiati tra host e modulo del futuro master e tra host e modulo del futuro slave durante il page e il page scan rispettivamente. 121 BLUETOOTH Figura 70: Sequenza di messaggi HCI nella creazione di una connessione E’ possibile impostare un tempo massimo per cui il modulo aspetta il comando HCI_Accept_Connection_Request. Questo si può fare tramite il comandi HCI_Write_Connectio_Timeout. Questo valore è di default pari a 5 s, ma può assumere valori tra 0.625 ms e 29 s. Se entro questo tempo l’host non dà risposta, la richiesta di connessione cade e come se l’host avesse inviato un messaggio HCI_Reject_Connection_Request. Se l’host accetta la connessione, dopo uno scambio di messaggi a livello Baseband e LM per l’instaurazione della connessione, i due moduli inviano ai rispettivi host dei pacchetti evento HCI_Connection_Complete (Figura 71). Figura 71: Evento HCI_Connection_Complete 122 BLUETOOTH Trasmissione e ricezione dati HCI Quando una connessione è creata attraverso il livello HCI, l’evento Connection_Complete che viene ritornato all’host contiene un campo di due byte chiamato connection_handle (Figura 71). Quando l’host trasmette e riceve dati, questo connection_handle viene utilizzato nel pacchetto dati HCI ACL per identificare la connessione. In Figura 72 è mostrato come i dati vengono scambiati. Figura 72: Sequenza di messaggi HCI per traffico ACL I pacchetti HCI_ACL_Data, contengono i dati da spedire dall’host al modulo Bluetooth del dispositivo trasmettitore. Questi pacchetti dati HCI vengono processati dai livelli inferiori dello stack, e ciò che va effettivamente in aria sono i pacchetti Baseband. In Figura 72 si nota che, sempre a livello Baseband, vengono restituiti dei segnali di ACK (In caso di segnale NAK avviene la ritrasmissione). Quando un pacchetto viene inviato con successo il modulo Bluetooth restituisce l’evento HCI_Number_Of_Completed_Packet, che contiene nei suoi parametri il numero di pacchetti inviati e il connection_handle in questione (quindi la connessione). 123 BLUETOOTH Logica Link Control and Adaptation Protocol (L2CAP) Questo livello preleva dati dai livelli superiori dello stack Bluetooth e dalle applicazioni e li inoltra verso i livelli inferiori. L2CAP mette a disposizione dei livelli superiori servizi dati connection-less e orientati alla connessione, oltre a eseguire operazioni di multiplexaggio, segmentazione e riassemblaggio dei pacchetti, e permette ai protocolli di livello superiore di trasmettere e ricevere pacchetti fino a 64 kbyte di lunghezza. Il Baseband supporta due tipi di collegamento, sincrono (SCO) e asincrono (ACL), mentre le specifiche Bluetooth L2CAP si riferiscono solo ai collegamenti ACL, senza definire nessun supporto per i link SCO. In Figura 73a è mostrata la posizione del livello L2CAP in un sistema senza host, mentre in Figura 73b è mostrato un sistema con host. Figura 73: Posizione del livello L2CAP nello stack Bluetooth Le principali funzioni del livello L2CAP sono: - Multiplexaggio dei diversi livelli superiori, permettendo loro di condividere i livelli inferiori; - Segmentazione e riassemblaggio dei pacchetti; - Gestione dei gruppi, mettendo a disposizione dei livelli superiori l’astrazione di gruppo sulla piconet; - 124 Gestione della Qualità of Service per i livelli superiori. BLUETOOTH Protocol Multiplexing L2CAP fornisce questo servizio per permettere a diversi protocolli di livello superiore di passare dati attraverso un singolo canale ACL; questo livello deve essere quindi in grado di distinguere i protocolli che girano a livello superiore, in quanto i livelli inferiori non supportano nessun tipo di campo per i livelli superiori, quali RFCOMM, SDP e Telephony Control. Per fare ciò si usa un campo detto PSM (Protocol Service Multiplex), che occupa due byte nei segnali L2CAP, e che indica il livello superiore che sta occupando il canale. In tab. 7 sono mostrati i possibili valori che può assumere il PSM. PSM value Description 0x0001 SDP 0x0003 RFCOMM 0x0005 Telephony Control < 0x1000 Riservato Tabella 7: Valori PSM Questa funzionalità permette di avere più applicazioni sullo stesso host che condividono lo stesso collegamento. L2CAP utilizza un numero di canale, detto channel identifier, per etichettare i pacchetti quando vengono ricevuti e indirizzarli verso il corretto posto. Un generico pacchetto L2CAP assume la struttura riportata in Figura 74: Figura 74: Struttura di un pacchettoL2CAP Gli identificatori di canale (tab. 7) sono dei numeri locali che identificano un terminale di un canale logico e sono costituiti da due byte. Il CID = 0x0001 viene usato per i 125 BLUETOOTH segnali di controllo, mentre i CID che vanno da 0x0040 in poi vengono allocati dinamicamente, cioè alla prima connessione viene assegnato CID = 0x0040, alla seconda CID = 0x0041 e così via in modo sequenziale. CID Descrizione 0x0000 ID nullo 0x0001 Canale di controllo 0x0002 Connection – Less 0x0003 – 0x003F Riservati 0x0040 – 0xFFFF Allocati Dinamicamente Tabella 8: CID e loro utilizzo Segmentazione e riassemblaggio I pacchetti definiti in banda base hanno delle dimensioni limitate; utilizzando il pacchetto più grande (DH5), si ha un MTU (Maximun Transfer Unit) di 339 byte, che limita notevolmente l’uso della banda da parte dei pacchetti che, a livello superiore, sono progettati per pacchetti più grandi. Il livello L2CAP si occupa di prendere pacchetti di dimensioni maggiori e di suddividerli in più pacchetti compatibili con il Baseband; inoltre assolve anche il riassemblaggio di tali pacchetti in banda base, riportandoli alle dimensioni idonee per i livelli superiori. Nella procedura di segmentazione il protocollo L2CAP deve scoprire la dimensione massima che può trasmettere il livello sottostante. Nel caso in cui L2CAP è presente sul dispositivo senza host (Figura 73a), la dimensione massima è data dal tipo di pacchetto utilizzato nel livello Baseband (es. DH3,DM5,etc.); nel caso di sistema con host, è presente il livello HCI, per cui è necessario eseguire all’inizializzazione dello stack un comando per determinare la dimensione del buffer HCI presente nel modulo Bluetooth utilizzato. La segmentazione utilizza poche risorse nei pacchetti in banda base; infatti i primi due bit del payload header (Figura 33), cioè il campo L_CH, sono definiti per segnalare 126 BLUETOOTH l’inizio di un pacchetto L2CAP (L_CH = 10) o la continuazione (L_CH = 01) (Figura 75). Figura 75: Segmentazione di un pacchetto L2CAP Qualità del servizio (QoS) Il processo di connessione a livello L2CAP permette di negoziare una certa qualità del servizio (banda passante, velocità di comunicazione, tempo di latenza, etc.) tra due unità Bluetooth che hanno instaurato un collegamento ACL. Il protocollo L2CAP si occupa poi di fare in modo che queste caratteristiche di comunicazione stabilite nella negoziazione siano garantite, per esempio eseguendo la funzione HCI_QoS_Setup, che si occupa di impostare i parametri del QoS per una connessione. Gestione dei gruppi Molti protocolli includono il concetto di gruppo di indirizzi. Il livello Baseband supporta il concetto di piconet, cioè di un insieme di dispositivi che seguono assieme lo stesso clock, mentre il livello L2CAP mette a disposizione dei livelli superiori l’astrazione di gruppo sulla piconet, permettendo così a alle applicazioni di mappare in modo efficiente dei gruppi di protocolli sulla piconet. Operazioni L2CAP I messaggi L2CAP vengono scambiati sul canale allocato al channel ID 0x0001, che viene usato per spedire informazioni di controllo tra livelli L2CAP per gestire e 127 BLUETOOTH configurare connessioni. L’implementazione L2CAP deve essere in grado di determinare l’indirizzo Bluetooth (BD_ADDR) del dispositivo che ha mandato il comando. Le specifiche Bluetooth assegnano dei nomi precisi ai messaggi scambiati dal livello L2CAP con i livelli inferiori, superiori e pari (Figura 76). Il prefisso L2CAP_ indica un messaggio scambiato tra entità di pari livello, L2CA_ indica i messaggi scambiati tra L2CAP e livelli superiori, mentre LP_ indica i messaggi scambiati tra L2CAP e livelli inferiori. Figura 76: Interazioni L2CAP con gli altri livelli In Figura 77 è rappresentata la sequenza con cui avvengono le richieste e le risposte tra i vari livelli. Le due linee verticali esterne rappresentano le interfacce L2CA sull’iniziatore (il dispositivo che inoltra la richiesta) e l’accettore (il dispositivo che risponde alla richiesta). Quando il protocollo comunica all’interfaccia L2CA dell’accettore la richiesta, questa manda un’indicazione (L2CA_Indication) ai livelli superiori, che risponderanno con una risposta L2CA_Response. All’interfaccia L2CA dell’iniziatore verrà tornata una conferma L2CA_Confirm. 128 BLUETOOTH Figura 77: Sequenza temporale di messaggi tra i livelli Azioni L2CAP verso i livelli inferiori - LP_Connect_Req: L2CAP richiede ai protocolli inferiori di creare una connessione; - LP_QoS_Req: richiede ai livelli inferiri di modificare un determinato parametro della QoS; - LP_Connect_Rsp: risposta positiva a una precedente indicazione di connessione; - LP_Connectt_Rsp_Neg: risposta negativa a una indicazione di connessione. Eventi verso L2CAP dai livelli inferiori - LP_Connect_Cfm: conferma la richiesta di creare una connessione a livello Baseband provenente da L2CAP; - LP_Connect_Cfm_Neg: indica il fallimento della richiesta di connessione; - LP_Connect_Ind: indica che i protocolli di livello inferiore hanno stabilito con successo una connessione; - LP_Disconnect_Ind: indica che i livelli più bassi sono stati disattivati da un comando LMP o da un timeout; - LP_QoS_Cfm: conferma la richiesta di QoS; - LP_QoS_Cfm_Neg: indica il fallimento della richiesta di QoS; - LP_QoS_Violation_Ind: indica che i livelli inferiori hanno rilevato una violazione delle specifiche riguardo la Quality of Service. 129 BLUETOOTH Azioni L2CAP verso i livelli superiori - L2CA_Connect_Ind: indica una richiesta di connessione; - L2CA_Connect_Cfm: conferma una richiesta di connessione; - L2CA_Connect_Cfm_Neg: indica il fallimento di una richiesta di connessione; - L2CA_Config_Ind: indica una richiesta di configurazione; - L2CA_Config_Cfm: conferma una richiesta di configurazione; - L2CA_Config_Cfm_Neg: indica il fallimento di una richiesta di configurazione; - L2CA_Disconnect_Ind: indica una richiesta di disconnessione; - L2CA_disconnect_Cfm: conferma una richiesta di disconnessione; - L2CA_Timeout_Ind: indica che è scaduto un determinato timeout; - L2CA_QoS_Violation: indica che è stato violato un parametro del QoS. Eventi verso L2CAP dai livelli superiori - L2CA_Connect_Req: richiesta da un livello superiore di creare un link; - L2CA_Connect_Rsp: risposta positiva da un livello superiore alla richiesta di connessione; - L2CA_Connect_Rsp_Neg: risposta negativa da un livello superiore alla richiesta di connessione; - L2CA_Config_Req: richiesta da un livello superiore di configurare il canale; - L2CA_Config_Rsp: risposta positiva da un livello superiore alla richiesta di configurazione del canale; - L2CA_Config_Rsp_Neg: risposta negativa da un livello superiore alla richiesta di configurazione del canale; - L2CA_Disconnect_Req: richiesta da un livello superiore di disconnettere il canale; - L2CA_Disconnect_Rsp: risposta positiva alla richiesta di disconnessione del canale; - L2CA_Data_Read: richiesta da un livello superiore di leggere i dati ricevuti dai livelli inferiori; - L2CA_Data_Write: richiesta da un livello superiore di trasmettere dati ai livelli inferiori. 130 BLUETOOTH Messaggi tra livelli L2CAP - L2CAP_Connect_Req: è stata ricevuto una richiesta di connessione; - L2CAP_Connect_Rsp: è stato ricevuto una conferma alla richiesta di connessione; - L2CAP_Connect_Rsp_Neg: è stata ricevuta una risposta negativa alla richiesta di connessione; - L2CAP_Config_Req: è stata ricevuta una richiesta di configurazione; - L2CAP_Confiq_Rsp: è stata ricevuta una conferma alla richiesta di configurazione; - L2CAP_Config_Rsp_Neg: è stata ricevuta una risposta negativa alla richiesta di configurazione; - L2CAP_Disconnect_Req: è stata ricevuta una richiesta di disconnessione; - L2CAP_Disconnect_Rsp: è stata ricevuta una conferma alla richiesta di disconnessione. - L2CAP_Connect_Rsp_Pnd: indica che la richiesta di connessione è stata ricevuta ed è in fase di elaborazione da parte del terminale remoto. Stati del canale L2CAP Il canale L2CAP può essere in vari stati: - CLOSED: in questo stato non è presente nessun canale; - W4_L2CAP_CONNECT_RSP: aspetta una risposta alla richiesta di connessione da parte di un terminale remoto; - W4_L2CA_CONNECT_RSP: aspetta una risposta da I livelli superior riguardo alla richiesta di connessione; - CONFIG: la connessione è stabilita, ma entrambi i dispositivi stanno ancora negoziando i parametri del canale. Per passare allo stato OPEN è necessario che entrambi i dispositivi siano pronti; - OPEN: la connessione è stabilita e configurata e i dati possono essere trasmessi e ricevuti; - W4_L2CAP_DISCONNECT_RSP: si sta apettando una risposta alla richiesta di chiusura della connessione; 131 BLUETOOTH - W4_L2CA_DISCONNECT_RSP: si apstta una risposta dai livelli superiori alla richiesta di chiusura della connessione. In Figura 78 è mostrato uno schema che evidenzia gli stati e gli eventi che causano le transizioni da uno stato all’altro del canale L2CAP durante la creazione e la chiusura di una connessione. Figura 78: Stati e eventi che provocano le transizioni del canale L2CAP 132 BLUETOOTH Pacchetti L2CAP Come tutti gli altri livelli Bluetooth, anche il livello L2CAP usa delle strutture di pacchetti comuni (Figura 79). Figura 79: Struttura pacchetti L2CAP Pacchetti dati L2CAP Il formato di un pacchetto dati L2CAP rispecchia il formato generico di Figura 79 e il campo dati contiene esclusivamente byte che rappresentano dati utili trasmessi. In Figura 80 è mostrato un pacchetto dati L2CAP visto dal livello HCI e poi dal livello L2CAP. Figura 80: Pacchetto dati L2CAP a livello HCI e L2CAP 133 BLUETOOTH Pacchetti di segnali L2CAP Un segnale L2CAP ha la struttura riportata in Figura 81. Figura 81: Struttura di un pacchetto di comando L2CAP Il primo byte indica l’Opcode del comando e identifica il contenuto del segnale; c’è poi un byte , Identifier, che serve , per far corrispondere una richiesta con la sua risposta. E’ utile in particolare per quelle richieste che devono essere spedite in più di un pacchetto. C’è poi il campo Length che indica la lunghezza dei dati del comando, e Data, che contiene i parametri della richiesta. In tabella 8 sono mostrati i vari opcode disponibili per i comandi L2CAP. Codice Descrizione 0x01 Comando rifiutato 0x02 Richiesta di connessione 0x03 Risposta a richiesta di connessione 0x04 Richiesta di configurazione 0x05 Risposta a richiesta di configurazione 0x06 Richiesta di disconnessione 0x07 Risposta a richiesta di disconnessione 0x08 Richiesta di echo 0x09 Risposta all’echo 0x0A Richiesta di informazioni 0x0B Risposta alla richiesta di informazioni Tabella 9: Codici comandi L2CAP 134 BLUETOOTH Un esempio di pacchetto di comando L2CAP, in particolare L2CAP_Connect_Req, cioè una richiesta di connessione, è mostrato in Figura 82: Figura 82: Pacchetto L2CAP_Connect_Req Si nota Opcode = 0x02, che indica L2CAP_Connect_Req, Identifier = 0x01, ad indicare che è la prima richiesta, Length = 0x0004, cioè ci sono quattro byte di dati, PSM = 0x0001, cioè il livello superiore è SDP e Source CID = 0x0040, cioè è il primo canale stabilito. Creazione di una connessione Il livello L2CAP utilizza link ACL per trasmettere dati senza errori attraverso i livelli inferiori dello stack Bluetooth. Per stabilire un collegamento, viene utilizzata la sequenza di messaggi illustrata in Figura 83. L’applicazione che inizia la connessione richiede al livello L2CAP di connettersi attraverso il comando L2CA_Connect_Req (1). Se non ci sono già link ACL esistenti, L2cCAP manda un comando HCI_create_connection (2) al livello HCI, che è quello immediatamente sotto. Il livello HCI inoltra al Link Manager la richiesta LM_Connect_Req (4), che provoca un messaggio a livello LM (LMP_Host_Connection_Req (5)) e le procedure di paging a livello Baseband. Il livello 135 BLUETOOTH LM del dispositivo che deve accettare la connessione manda all’HCI un messaggio LM_Connect_Req_Ind (7), ad indicare una richiesta di connessione dai livelli inferiori. Figura 83: Messaggi per la creazione di una connessione L2CAP su HCI L’HCI invia al livello L2CAP l’evento HCI_Connection_Request_Event (8); L2CAP risponde con un comando HCI_Accept_Connection_Request (9). 136 di accettazione della connessione, BLUETOOTH Per il preciso scambio di pacchetti a livello HCI si rimanda al paragrafo 2.8.7. L’HCI inoltra ai livelli inferiori la risposta positiva dell’host alla richiesta, con un LM_Connect_Rsp (10), si hanno poi due messaggi a livello LMP, LM_Accepted (11) e LM_setup_complete (12); il LM del dispositivo che richiede la connessione manda al proprio HCI il messaggio LM_Connect_Cfm (13) di conferma della connessione e poi i due HCI possono mandare entrambi l’evento HCI_Connectio_Complete_event al proprio L2CAP. Segue ora una serie di messaggi a livello L2CAP. Il messaggio L2CAP_Connect_Req (15) ha la struttura riportata in Figura 84, ed è codificato come visto in Figura 82. Figura 84: Struttura di un pacchetto L2CAP_Connect_Req Il messaggio di risposta L2CAP_Connect_Rsp, ha invece la struttura di Figura 85: Figura 85: struttura di un pacchetto L2CAP_Connect_Rsp Osservando tale pacchetto a livello HCI, si può vedere la sua codifica (Figura 86). 137 BLUETOOTH Figura 86: Pacchetto L2CAP_Connect_Rsp Il campo Destination CID contiene il CID che verrà usato per la connessione dal dispositivo che sta rispondendo, mentre il Source CID viene copiato dal L2CAP_Connect_Req. Configurazione di una connessione Una volta che la connessione è stata stabilita, deve essere configurata. Il livello L2CAP del dispositivo che ha iniziato la connessione manda un messaggio L2CAP_Config_Req, e il livello L2CAP dell’altro dispositivo dovrà rispondere con un messaggio L2CAP_config_Rsp in caso tutto vada bene, mentre se qualche parametro non va risponderà con un L2CAP_Config_Rsp_Neg. La codifica di un pacchetto L2CAP_Config_Req è mostrata in Figura 87. Figura 87: Pacchetto L2CAP_Config_Req 138 BLUETOOTH Tramite questo messaggio, è possibile configurare diversi parametri, variando il campo Type : - 0x01 per MTU – impostazione massima dimensione pacchetto L2CAP; - 0x02 per Flush_timeout – impostazione tempo in ms per cui il dispositivo deve tentare di ritrasmettere un pacchetto fino a quando l’ha trasmesso con successo; - 0x03 per QoS – impostazione parametri QoS. Nel progetto verrà impostata la massima dimensione per un pacchetto L2CAP di 200 byte. La codifica di un pacchetto L2CAP_Config_Rsp è mostrata in Figura 88. Figura 88: Pacchetto L2CAP_Config_Rsp Il campo RESULT = 0x0000 significa che l’operazione di configurazione è stata eseguita con successo. RFCOMM Il protocollo RFCOMM è posizionato sopra il livello L2CAP e mette a disposizione un’emulazione della porta seriale. Tramite questa emulazione, è possibile far girare tutte le applicazioni che basano il loro funzionamento sulla presenza della porta seriale senza apportare loro nessuna modifica. RFCOMM è basato su GSM T07.10, che è un protocollo asimmetrico usato dai cellulari GSM per multiplexare stringhe di dati su una linea seriale fisica, e mette a 139 BLUETOOTH disposizione delle applicazioni una porta seriale con i nove segnali RS232; supporta fino a 60 connessioni simultanee tra due dispositivi. Il protocollo PPP (Point to Point Protocol), che è utilizzato nei collegamenti internet, ha bisogno della presenza della porta seriale. Con il protocollo RFCOMM è possibile utilizzare il sistema PPP per creare una rete locale oppure collegarsi ad internet senza nessun cambiamento al programma che gestisce il PPP. All’interno dei profili dello standard Bluetooth è presente il profilo LAN, che permette di creare una rete locale senza fili tramite il Bluetooth. Questo profilo è possibile grazie a RFCOMM che permette di instaurare una connessione PPP e su questa far girare il TCP/IP o qualsiasi applicazione necessaria. RFCOMM comunica con le trame, che diventano data payload nei pacchetti L2CAP. Ci sono cinque tipi di trame diversi: - SABM (Start Asynchronous Balanced Mode), usato per i comandi di inizio; - UA (Unnumbered Acknowledge), usato in risposta quando connesso; - DISC (Disconnect), comandi di disconnessione; - DM (Disconnected Mode), usato in risposta a un comando quando disconnesso; - UIH (Unnumbered Information with Header Check) RFCOMM usa i canali, ognuno dei quali ha un DLCI (Data Link Connection Identifier), che è diverso da zero per spedire i dati e uguale a zero per spedire messaggi di controllo. A causa del fatto che le trame RFCOMM sono portate nel payload dei pacchetti L2CAP, è necessario settare una connessione L2CAP prima di una connessione RFCOMM. RFCOMM ha un valore PSM riservato per L2CAP, pari a 0x0003. Ogni trama L2CAP ricevuta con questo PSM sarà spedita a RFCOMM. La prima trama spedita al canale RFCOMM è SABM (Start Asynchronous Balanced Mode). Se il dispositivo RFCOMM rispondente si connette, va in ABM (Asynchronous Balanced Mode) e manda una trama UA (Unnumbered Acknowledgement). Se non si vuole connettere, rifiuta e manda una trama DM (Disconnected Mode). 140 BLUETOOTH Service Discovery Protocol (SDP) Il Service Discovery Protocol (protocollo per la ricerca dei servizi) mette a disposizione dei dispositivi Bluetooth un mezzo per scoprire le caratteristiche e i servizi offerti da altri dispositivi bluetooth presenti nelle vicinanze. Una volta che una connessione L2CAP è stata stabilita tra un client (cioè il dispositivo che inizia la richiesta di connessione) e un server SDP (cioè il dispositivo che riceve la richiesta), il client può navigare all’interno delle informazioni presenti nel server e decidere se la comunicazione tra i due dispositivi può continuare perché è stata trovata l’applicazione che serve oppure se disconnettersi. Per esempio se un dispositivo che vuole accedere a internet può interrogare un server SDP per verificare se è presente un access point. Per trovare una connessione a un servizio offerta da un server SDP, un client deve passare attraverso i seguenti passi: - stabilire una connessione L2CAP ad un device remoto usando il canale identificato dal PSM=0x0001; - cercare una classe specifica di servizi; - recuperare gli attributi necessari per connettersi ai servizi scelti; - stabilire una connessione separata (non SDP) per usare il servizio. Il canale L2CAP usato per il SDP può essere escluso una volta che non è richiesto a lungo, oppure può venire aperto se il client vuole chiedere al server database per altri servizi. Il valore del protocollo L2CAP e del Protocol Service Multiplexor (PSM) per SDP è definito come 0x0001. Avere PSM noto significa che una volta che un link ACL è stato stabilito, il client SDP automaticamente conosce il numero da usare per stabilire un link con il server SDP sul dispositivo remoto. Bluetooth non definisce un’interfaccia con l’uomo per il SDP; definisce solamente il protocollo di scambio di dati tra un server che offre servizi e un client che spera di usarli. 141 BLUETOOTH Profili Nello standard Bluetooth vengono definiti vari profili, nei quali vengono descritti i formati dei pacchetti per varie applicazioni (stampante, accesso LAN, IP su Bluetooth, etc.). Tramite la definizione di questi profili è possibile rendere interoperabili prodotti di produttori diversi. Inoltre tramite il SDP è possibile scoprire i servizi che un altro dispositivo mette a disposizione. Per esempio, se si è in un aeroporto e ci si vuole connettere a internet, è possibile fare un inquiry per scoprire se nelle vicinanze è presente un dispositivo Bluetooth, e poi con il SDP vedere se è un access point o meno. In caso positivo è possibile usare il profilo LAN per comunicare con l’access point. Un profilo molto interessante per il futuro è il BNEP (Bluetooth Network Encapsulation Protocol), e un diagramma dell’implementazione è mostrato in Figura 89. Figura 89: Stack Bluetooth con il protocollo BNEP Questo protocollo permette di trasmettere pacchetti IP direttamente sopra il livello L2CAP. Per far ciò L2CAP deve essere in grado di supportare un MTU (Maximun Transfer Unit) di 1691 byte. Questo in base alla dimensione massima di un pacchetto Ethernet (1500 byte), con l’aggiunta di un’intestazione BNEP (15 byte), un’intestazione L2CAP (4 byte) e altre intestazioni opzionali. Un pacchetto di 1691 byte corrisponde a 5 pacchetti DH5 (5*339), meno i 4 byte dell’header L2CAP. 142