relazione

Transcript

relazione
Università degli Studi di Bologna
Facoltà di I ng egneria
A.A. 2006/2007
di Nicola Bonoli
(Matricola 0000196199)
Giugno 2007
Abstract. La recente affermazione e diffusione della tecnologia Bluetooth nei
dispositivi di nuova generazione come telefoni cellulari, smartphone, palmari,
computer portatili e fotocamere digitali, ha aperto un nuovo scenario : il Proximity
Marketing.
Sfruttando la tecnologia Bluetooth è infatti possibili distribuire, ai dispositivi
consenzienti, contenuti di svariato genere e formato, senza dover sostenere un costo
relativo ad ogni invio.
BlueMark realizza tale servizio con un occhio di riguardo ad aspetti quali privacy,
spamming, QoS ed availability.
Introduzione
BlueMark è un sistema in grado di distribuire contenuti multimediali verso telefoni cellulari abilitati
alla ricezione Bluetooth®.
Può essere utilizzato per promuovere informazioni su prodotti e offerte commerciali oppure
distribuire servizi, notizie e informazioni utili.
L’area di copertura del sistema è influenzata dalla locazione del trasmettitore Bluetooth e una
maggiore copertura può essere garantita, ad oggi, attraverso una opportuna disposizione di più
trasmettitori.
Tale scenario apre nuovi problemi dovuti alla coordinazione di questi dispositivi in modo tale da
evitare fenomeni di “spamming” via Bluetooth.
E’ opportuno infatti che il possessore del dispositivo Bluetooth non sia ulteriormente disturbato da
successive richieste di trasferimento di contenuti in seguito ad una precedente ricezione o rifiuto.
Ciò deve verificarsi indipendentemente dalla propria posizione e, di conseguenza, dal trasmettitore
Bluetooth coinvolto.
Al tempo stesso deve essere possibile garantire la fornitura del servizio anche a fronte di guasti
hardware permettendo a più trasmettitori di agire nella stessa area di copertura.
Analisi dei Requisiti
Dispositivi Client
Non sono altro che i dispositivi dotati di tecnologia Bluetooth in stato “rilevabile”. Il possessore del
dispositivo dovrà ricevere un avviso di invio del contenuto e, nel caso lo voglia ricevere, dovrà
acconsentire all’invio. Nel caso non desideri ricevere il contenuto sarà sufficiente rifiutare e non sarà
più disturbato.
BlueMark Server
E’ incaricato di recuperare e fornire i contenuti richiesti dai BlueMark Proxy destinati ai dispositivi
Client. Deve essere in grado di gestire richieste concorrenti per poter fornire il servizio a più
BlueMark Proxy garantendo quindi la scalabilità del sistema. Non è esplicitamente richiesta
availability lato Server.
BlueMark Proxy
E’ incaricato di effettuare il discovery dei dispositivi Client, verificare lo stato di tali dispositivi e
gestire, secondo le politiche impostate, la trasmissione dei contenuti in modo da evitare il cosiddetto
fenomeno del “blueSpam”.
Tutto ciò avendo come obiettivo quello di consegnare il contenuto nel minor tempo possibile ed al
maggior numero di dispositivi rilevati. I contenuti possono essere di diverso tipo: immagini GIF o
JPEG, file audio MP3 o applicazioni Java (file JAR).
Deve garantire il rispetto della privacy utilizzando informazioni impersonali (come il device UUID)
per l’identificazione e la gestione del dispositivo.
Deve inoltre coordinarsi con gli altri BlueMark Proxy in modo da rispettare le politiche di
trasmissione.
Deve essere in grado di garantire la continuità del servizio ripristinando, velocemente, il
funzionamento corretto a fronte di un guasto singolo, garantendo quindi nel sistema l’assenza di punti
critici di singolarità.
Il progetto del Proxy dovrà inoltre tenere presenti aspetti come l’identificazione dei colli di bottiglia e
considerare la gestione delle risorse. Dovrà essere progettato nell’ottica di permettere, attraverso
estensioni future, il soddisfacimento di vincoli relativi alla QoS come, ad esempio, priorità tra i
dispositivi client, tailoring, sicurezza.
Macroscelte progettuali
In fase di progetto sono state effettuate svariate scelte che verranno, di seguito, commentate trattando
in primo luogo le scelte relative a BlueMark Server ed, in seguito quelle relative al BlueMark Proxy.
Per entrambi si è scelto il linguaggio di programmazione Java. La trasparenza dal sistema operativo
non è garantita lato Proxy a causa della stretta relazione tra il sistema operativo e lo stack Bluetooth.
BlueMark Server
Interazioni con i Proxy: la scelta di CORBA
La scelta di Corba per le interazioni tra Proxy e Server nasce da tre motivazioni principali:
integrazione, eterogeneità e concorrenza.
Corba permette infatti di operare su una infrastruttura per l’interazione tra ambienti eterogenei e
fornisce funzioni di conversione in formato generico e un protocollo di interazione comune.
Ciò garantisce a livello Server trasparenza del sistema operativo e dei protocolli di rete, trasparenza
del linguaggio di programmazione, trasparenza della posizione.
Inoltre, guardando ad eventuali sviluppi futuri di BlueMark, garantisce trasparenza alla replicazione
del Server e facile gestione della tolleranza ai guasti lato Server garantendo facilmente il requisito di
availability lato Server.
Corba fornisce inoltre il supporto per la gestione di richieste concorrenti sgravando il programmatore
da tale compito e controbilanciando lo sforzo implementativo di una interazione tramite Corba
rispetto alla più semplice implementazione tramite RMI.
La scelta di Corba, ed in particolare dell’ORB di Java (ordb), è sembrata quindi la più appropriata.
BlueMark Proxy
Proxy e Bluetooth: BlueCove e Avetana OBEX
Lo stack protocollare Bluetooth è il software che ha accesso diretto ai dispositivi Bluetooth mentre
profili Bluetooth descrivono l’interoperabilità tra le piattaforme e i requisiti di consistenza e
permettono quindi la comunicazione tra dispositivi eterogenei dotati di tecnologia Bluetooth.
Per lo scambio di dati esistono due profili: RFCOMM e OBEX Push.
RFCOMM è più indicato per trasferire stream di dati esattamente come si farebbe con una porta
seriale. OBEX è invece indicato quando i dati da scambiare sono file, insieme alle informazioni
associate come il tipo di file, la data e la dimensione.
Risulta ovvia quindi la scelta di OBEX per il trasferimento dei contenuti dal Proxy ai dispositivi.
Microsoft ha integrato nativamente il supporto a Bluetooth nella versione XP SP2 mentre in ambiente
Java le API JSR-82 rappresentano l’ambiente di sviluppo ufficiale per la tecnologia Bluetooth.
BlueCove è una implementazione Java delle API JSR-82 che si interfaccia con lo stack Bluetooth
Microsoft. Originariamente è stata sviluppata dalla Intel ed è attualmente gratuita e curata da
volontari.
Poiché lo stack Bluetooth Microsoft supporta esclusivamente connessioni RFCOMM anche
BlueCove supporta solo queste. E’ possibile ottenere il sevizio di OBEX Push attraverso l’utilizzo
dell’implementazione opensource AvetanaOBEX.
Gestione della persistenza: database MySQL
La persistenza si rende indispensabile per tenere traccia dello stato dei dispositivi Client coinvolti ed
implementare i meccanismi che rispettino le politiche del sistema.
A tal fine sarebbe stato sufficiente utilizzare dei semplici file testuali o strutture dati dinamiche come
array o vector. Tali soluzioni sono state scartate a favore dell’utilizzo di un database relazionale che
permette non solo di ottenere una maggiore persistenza rispetto alle strutture dati dinamiche ma anche
una notevole facilità e velocità di manipolazione tramite le query SQL.
Inoltre permette di separare facilmente, nel caso fosse necessario, il nodo Proxy dal Database Server,
con una semplicissima configurazione tramite il file di testo di configurazione del Proxy.
La scelta di MySQL deriva dal notevole vantaggio di sgravarsi da eventuali oneri derivanti
dall’acquisto di un database commerciale.
Availability: replicazione decentralizzata e Token Ring
Il requisito fondamentale della availability impone di scartare soluzioni centralizzate come, ad
esempio, quella di mantenere lo stato dei dispositivi client sul Server. Si è optato pertanto per una
soluzione che evitasse al massimo i punti critici associando ad ogni Proxy un database e coordinando
i Proxy tramite token ring. La comunicazione tra i Proxy avviene tramite scambio di messaggi e alla
semantica di ciascuno di essi sono associate determinate operazioni sul nodo che li riceve.
Attraverso la configurazione ad anello logico tutti i Proxy possono quindi comunicare ed aggiornare
la propria copia locale e, al ricevimento di un particolare messaggio, denominato BMTOKEN,
potranno avviare la proceduta di richiesta di invio ai dispositivi.
La scelta della token ring deriva inoltre dalla possibilità di gestire la caduta di un nodo attraverso una
opportuna procedura di recovery e, al tempo stesso, consente di ridurre il numero di connessioni fra
Proxy rispetto ad una soluzione con configurazione a stella.
Availability: comunicazione tramite socket TCP
La scelta delle socket TCP è legata ai requisiti di availability e QoS.
Infatti garantiscono trasferimenti di byte affidabili ed ordinati e permettono altresì di rilevare la
caduta del nodo precedente o del nodo successivo nell’anello semplicemente attraverso la gestione
delle eccezioni generate da eventuali errori di connessione. Esse sono quindi determinanti per l’avvio
della procedura di recovery senza dover gestire un clock globale che, soprattutto in ambito distribuito,
è di difficile implementazione.
Load Balancing: considerazioni e Thread Pool
Pur non essendo richiesto, il bilanciamento del carico potrebbe essere un requisito del sistema in
particolare nel caso in cui più BlueMark Proxy operino nella stessa area di copertura. Il sistema è
stato progettato in modo da poter facilmente implementare una politica di bilanciamento del carico
semplicemente limitando il numero di invii per ogni proxy. L’attuale implementazione tuttavia non ha
un limite complessivo sugli invii poiché mira a raggiungere il maggior numero di dispositivi trovati
trascurando gli aspetti di bilanciamento del carico. Per evitare tuttavia di sovraccaricare il singolo
nodo con eccessivi cambi di contesto nonché congestionare il traffico in uscita dal dispositivo
bluetooth è stato implementato un Thread Pool (di capacità limitata a 5 thread per proxy) nel quale
ogni thread è incaricato dell’invio del contenuto al dispositivo.
Architettura Finale
Alla luce delle scelte progettuali appena trattate si è delineata una architettura complessiva del
sistema BlueMark schematizzata dalla seguente figura:
BlueMark Server
L’implementazione del BlueMark Server è costituita da 4 package:
Package BMServerDatabase
Realizza la funzione di accesso al database lato Server, utilizzato per organizzare i contenuti messi a
disposizione dei Proxy e recuperarne i riferimenti locali. Il database di del Server associa ad ogni
contenuto una tabella.
In base al tipo di dispositivo (DeviceId)
può essere impostato un differente
contenuto in termini di nome del file di
destinazione e di tipo di file. Viene inoltre
specificato il percorso locale al Server per
recuperare il file associato.
Il campo ‘ContentType’ permette di
specificare se il contenuto è di tipo statico
o dinamico.
Nel caso sia dinamico il file specificato
potrebbe essere semplicemente il file di
origine dal quale il Server potrebbe creare
ed inviare il file da trasmettere finale.
La seguente figura mostra il contenuto della tabella associata al contenuto avente identificativo ‘1’.
Questo contenuto è stato utilizzato in fase di test del sistema BlueMark.
Package CORBAFileDownload
E’ l’implementazione del servizio di download del file lato Server. Tramite il riferimento all’oggetto
remoto il Proxy può infatti recuperare il file, ottenere il nome del file ed il tipo di file in modo da
portare a termine correttamente il trasferimento verso i dispositivi.
La specifica IDL del servizio è quindi la seguente (FileInterface.idl):
interface FileInterface
{
typedef sequence<octet> Data;
Data downloadFile(in string ID,in string DeviceType);
string getFileName(in string ID);
string getFileType(in string ID);
};
Come si può notare il metodo downloadFile riceve come argomento, oltre all’identificativo univoco
del contenuto, anche una specifica del tipo di dispositivo destinatario del contenuto in modo da poter
gestire un eventuale tailoring dei contenuti.
Package RemoteDevices
Contiene una interfaccia nella quale sono specificate costanti relative ai tipi di dispositivo.
Ovviamente tale package è previsto in funzione di estensioni future del Server.
Package Utilities
Contiene due classi utili alla configurazione
del Server. In particolare la classe
NodeStructure.java rappresenta un generico
nodo in termini di identificativo univoco,
indirizzo IP e porta.
La classe
ServerStructure.java riceve tramite file di
testo i parametri di configurazione del
Server permettendo di assegnare un
identificativo al Server stesso (riga 1), un
riferimento al Naming Service Corba (riga
2) e al database Server (riga 3).
BlueMark Proxy
La figura seguente schematizza la struttura del Proxy a livello di package. Le interazioni tra i thread
costituenti il Proxy avvengono attraverso i meccanismi di sincronizzazione e verranno dettagliate
durante l’analisi dei singoli package.
Package Remote Devices, Utilities e ThreadPool
Sono in parte già stati descritti nell’analisi del BlueMark Server. Il package utilities contiene la classe
StringUtils.java utilizzata per manipolazione di stringhe e la classe ProxyStructure.java che, a partire
da un file di configurazione testuale determina i parametri di configurazione del Proxy.
In particolare vengono impostati (in ordine di riga):
1.
Identificativo, IP e porta di ascolto del nodo stesso
2.
Identificativo, IP e porta di ascolto del nodo precedente nel ring logico
3.
Identificativo, IP e porta di ascolto del nodo successivo
4.
Identificativo, IP e porta di ascolto del secondo nodo successivo
5.
Identificativo, IP e porta di ascolto del Naming Server
6.
Identificativo, IP e porta di ascolto del Database Server
7.
Identificativo del contenuto
8.
Tipo del contenuto (statico o dinamico)
Il package ThreadPool contiene l’implementazione di un pool di thread e consente di mettere in
esecuzione o di accodare, se si è raggiunto il massimo numero di thread (impostato a 5
nell’implementazione di BlueMark), un generico thread tramite il metodo doTask(Runnable task).
Package BlueMarkCorbaClient
Realizza l’iterazione con il Naming Service permettendo al Proxy di ottenere, attraverso l’handle
sull’oggetto remoto ed il metodo downloadFile, il file specificato. Il file viene memorizzato dal Proxy
nella cartella buffer locale ‘C:/tmp/proxybuffer’ e, nel caso di contenuto statico, non viene più
richiesto al BlueMark Server se già presente nella cartella buffer.
Package BMProxyDB
Questo package permette le interazioni tra il Proxy ed il database MySQL locale. La classe
MySqlDb.java implementa la classe astratta DBManager.java definendo le principali operazioni SQL
sul database MySQL.
La classe DBUtils.java, servendosi dei metodi definiti in MySqlDb.java, implementa tutti i metodi
necessari ad interfacciare il Proxy con il database.
Ogni modifica in scrittura sul database viene propagata lungo l’anello logico tramite l’invio di un
messaggio opportunamente definito. L’identificativo del Proxy allegato al messaggio permette di
bloccare il forwarding del messaggio quando esso giunge al Proxy precedente dell’anello ed evitare
quindi inutili ritrasmissioni.
La classe DbUpdater.java, infine, permette di effettuare automaticamente le operazioni di update del
database in base ai messaggi ricevuti dai Proxy nella token ring attraverso il metodo
update(BMMessage message).
Le seguenti immagini mostrano la struttura della tabella ‘contenttable’ presente in ciascun Proxy che
costituisce lo stato globale del sistema BlueMark.
La tabella sarà presente in ogni Proxy ed il contenuto dovrà essere gestito in modo da garantire
coerenza nell’applicazione delle politiche di gestione.
Il campo ‘Proxy’ identifica il Proxy che ha trattato o sta trattando l’invio verso un determinato
dispositivo identificato dall’UUID.
Il campo ‘Status’ contiene lo stato associato al dispositivo. Può assumere i seguenti valori:
- SENDING: è in corso il tentativo di invio del contenuto verso il dispositivo client
- SENT: l’invio del contenuto è terminato con successo
- DENIED: l’invio del contenuto non è stato autorizzato dal possessore del dispositivo
- TIMEOUT: il possessore del dispositivo non ha risposto alla richiesta o si è verificato un errore
nella trasmissione
Package BluetoothUtils
E’ uno dei package più complessi di BlueMark Proxy poiché al suo interno sono implementate tutte le
funzionalità relative alla connessione Bluetooth.
L’entità fondamentale è il thread BTManager implementato in BTManager.java attraverso il quale
vengono gestite le fasi di discovery dei dispositivi e, alla ricezione del token, il push dei contenuti ai
dispositivi applicando le politiche di invio citate nell’analisi dei requisiti. Viene quindi effettuato il
passaggio del token che abilita il Proxy successivo.
La classe BlueToothInquirer.java implementa il thread incaricato del discovery dei dispositivi. La
fase di discovery è sempre attiva ed indipendente dalla ricezione del token. I dispositivi rilevati sono
inseriti in una hashtable dalla quale saranno prelevati alla ricezione del token, sarà verificato il loro
stato sul database e, nel caso sia possibile inviar loro il contenuto, sarà inserito il thread definito da
OBEXPushUtility.java nel Thread Pool. In questo momento al dispositivo sarà associato lo stato
‘SENDING’.
La politica di gestione di BlueMark prevede che sia possibile tentare l’invio solo nel caso in cui il
dispositivo non sia inserito nel database (e sia quindi una ‘nuova scoperta’) o nel caso in cui sia in
stato ‘TIMEOUT’.
In tutti gli altri casi il dispositivo viene ignorato poiché già gestito da un altro Proxy.
Al termine delle proprie operazioni il thread OBEXPushUtility stabilisce il risultato dell’invio.
La gestione del timeout è affidata al thread Timer.java che allo scadere di un intervallo temporale
prefissato pone a ‘TIMEOUT’ lo stato del dispositivo ed annulla l’invio.
E’ utile sottolineare che il token può essere passato subito dopo aver posto i dispositivi verso cui si
tenta l’invio in stato ‘SENDING’ poiché tale stato è sufficiente per impedire al Proxy successivo di
tentare un invio verso quel dispositivo. Il risultato finale dell’operazione di invio può essere quindi
trasmesso anche successivamente al passaggio del token. Tale scelta deriva inoltre dalla necessità di
fare fluire il token nell’anello senza dover attendere la terminazione di tutti gli invii che, in caso di
‘TIMEOUT’ si prolunga di molto. I dispositivi che generano un ‘TIMEOUT’ saranno comunque
ricontattati dal primo proxy che, durante l’esecuzione, possiede il token ed ha trovato lo stesso
dispositivo in fase di discovery.
Inoltre lo stato di ‘TIMEOUT’ si rivela fondamentale nella gestione della fase di recovery.
Si sottolinea infine che lo stato che potremmo chiamare ‘DISCOVERED’ non viene tracciato poiché
inutile ai fini dell’applicazione delle corrette politiche di funzionamento del sistema. Infatti anche se
fossero mantenuti in modo persistente tutti i dispositivi trovati non sarebbe possibile ne escluderli da
successive fasi di discovery e nemmeno dare per scontata la loro persistenza all’interno del range di
copertura in modo da “bypassare” il discovery stesso. Inoltre tale stato può essere tranquillamente
ignorato in fase di caduta del nodo e quindi è inutile anche ai fini della fase di recovery.
Provocherebbe, al contrario, una grossa mole messaggi di aggiornamento lungo l’anello.
Package TokenRing
Il package TokenRing.Message definisce struttura e tipologie di messaggi e token che circolano nel
ring logico.
Il package TokenRing.Socket realizza invece una mailbox (MessageBoxThread) attraverso socket TCP
di input ed output definite dalle classi InputThread.java ed OutputThread.java.
Il MessageBoxThread si occupa di gestire ricezione ed invio dei messaggi e dei token sia un fase di
funzionamento normale sia in fase di recovery. Provvede ad attivare la fase di recovery nel caso si
verifichi un timeout sul canale di input ed inoltre svolge il delicato di compito di “smistare” i
messaggi al manager del database per consentire il corretto aggiornamento del database. Gestisce
automaticamente le operazioni di forwarding dei messaggi e la persistenza dei messaggi di
input/output in caso di malfunzionamenti.
Il package TokenRing.Recovery contiene l’implementazione delle operazioni necessarie a ripristinare
il corretto funzionamento del sistema. In esso sono presenti la classe relative al thread coordinatore
(CoordinatorRecoveryThread.java) e quella relativa al generico thread di recovery
(RecoveryThread.java). Entrambi implementano l’interfaccia RecoveryThreadInterface.java.
Package core
Costituisce l’entry point di BlueMark Proxy. La classe Main.java riceve in input il file di testo
contenente la configurazione del nodo e mette in esecuzione il thread Proxy definito in
ProxyNode.java.
Il thread Proxy, dopo avere impostato i parametri di configurazione, avvia il database manager ed il
Corba client ottenendo un handle sull’oggetto remoto.
Successivamente determina, dai parametri di configurazione, se il Proxy è unico (modalità
standalone) oppure inserito in una token ring. Nel primo caso avvia il discovery e ad intervalli
prefissati si auto-abilita agli invii.
Nel secondo caso viene avviato il thread relativo alla mailbox ed inizia la fase di inizializzazione.
Il solo Proxy avente identificativo ‘1’ effettua ripetuti tentativi di invio del token BNINITTOKEN che
abilita i Proxy lungo l’anello e avvia le operazioni di discovery. Alla ricezione dello stesso token, che
segnala quindi la corretta configurazione dell’anello, il Proxy ‘1’ crea ed avvia la circolazione del
token BMTOKEN che abilita le operazioni di invio.
Availability: Fase di Recovery
La fase di recovery ha come obiettivo il ripristino della token ring e del corretto funzionamento del
sistema in seguito alla caduta di un Proxy. Si ipotizza il guasto singolo e si garantisce quindi il
recovery in questo caso. Nella trattazione della fase di recovery si farà riferimento al caso mostrato in
figura sottostante cioè una Token Ring di 5 Proxy in cui il Proxy 2 ha cessato di funzionare.
Il malfunzionamento verrà “percepito” sia dal Proxy 1 (sul canale di output) che dal Proxy 3 (sul
canale di input).
Il Proxy 1, in seguito a ripetuti tentativi di invio non riusciti, memorizza i messaggi in output evitando
quindi di perderli definitivamente. L’avvio della procedura di recovery avviene sempre dal nodo
successivo a quello caduto (il Proxy 3 nel caso dell’esempio) con l’invio del token
BMELECTIONTOKEN che segnala l’avvio della procedura di recovery e al tempo stesso comunica ai
Proxy l’identificativo del coordinatore e del nodo caduto. In questo modo ulteriori avvii di procedure
di recovery, dovute al verificarsi del timeout sulla accept nel thread di input, non daranno luogo ad
inconsistenze dovute alla presenza di due o più coordinatori.
Pertanto alla ricezione del BMELECTIONTOKEN i nodi non coordinatori avvieranno il thread
RecoveryThread e passeranno il token verificando che il nodo caduto non sia il successivo. In questo
caso il forward avverrà al secondo nodo successivo (cioè il coordinatore), scavalcando quindi il nodo
caduto.
Al ritorno del token al Proxy 3 viene avviato il RecoveryCoordinatorThread che provvede a
coordinare il recovery.
Tutti i messaggi in input o in output generati dai Proxy non sono quindi ora inviati ma inseriti in
apposite strutture dati in modo da poter essere recuperati al termine del recovery.
Il Proxy coordinatore invia ora il BMRECOVERYTOKEN avente lo scopo di ottenere tutte le
informazioni necessarie al ripristino dell’anello.
Pertanto il Proxy 1 dovrà aggiornare il token con il proprio identificativo in modo da stabilire il nuovo
nodo precedente al coordinatore ed il Proxy 4 dovrà settare il proprio identificativo per comunicare al
Proxy 1 il nuovo nodo secondo successivo.
Inoltre il nodo possessore del BMTOKEN lo comunicherà segnalando il proprio identificativo nel
token stesso.
Al ritorno del BMRECOVERYTOKEN, il coordinatore sarà quindi in possesso di tutte le informazioni
necessarie alla ricostruzione dell’anello.
Tutte queste informazioni sono inviate con il token BMUPDATETOKEN grazie al quale tutti i proxy
aggiornano le proprie strutture dati e, al ritorno del token al coordinatore, il ring logico è stato quindi
ripristinato.
A questo punto viene riattivata la messagebox su tutti i nodi per poter gestire i messaggi bufferizzati
durante la fase di recovery ed aggiornare quindi correttamente tutti i database.
Prima di ripartire è necessaria un’ulteriore operazione: il proxy caduto potrebbe aver lasciato dei
dispositivi in stato ‘SENDING’ senza aver completato le operazioni di invio. Per evitare che tali
dispositivi siano, come da politiche di sistema, ignorati, è opportuno portare i soli dispositivi associati
al proxy caduto dallo stato ‘SENDING’ allo stato ‘TIMEOUT’ in modo da consentire successivi invii.
Nessuna operazione invece sarà fatta per i dispositivi aventi stato finale ‘SENT’ o ‘DENIED’.
Potrebbero verificarsi 2 richieste di invio consecutive ad un dispositivo già in stato finale se la caduta
si verificasse tra la fase di invio e l’invio dei messaggi di aggiornamento finali (che sarebbero
inevitabilmente persi). Per evitare tale problema sarebbe sufficiente porre a ‘DENIED’ ogni
dispositivo in stato ‘SENDING’ associato al proxy caduto. In questo modo però potrebbero non
ricevere il contenuto anche i dispositivi che hanno accettato esplicitamente.
Si è scelto pertanto la prima strada non considerando l’invio di due sole richieste (peraltro
conseguente a concause non frequenti) come un fenomeno di “blueSpam”. Al contrario il mancato
invio di un contenuto ad un utente che lo desideri costituisce un grosso problema in termini di
availability e QoS.
La procedura di recovery termina facendo ripartire il BMTOKEN dal nodo possessore o, nel caso il
token sia stato perduto, dal nodo coordinatore che provvede a ricrearlo.
La procedura di recovery funziona correttamente anche in caso di ulteriori guasti singoli fino a
portare il sistema in una condizione di Proxy standalone.
Fase di Test
Configurazione Hardware / Software
Nella fase di test del progetto sono stati utilizzati due PC collegati tramite rete locale. A ciascuno è
stato collegato un adattatore USB Bluetooth di classe II (copertura 10 metri). Il sistema operativo è
per entrambi Windows XP con SP2. Si è utilizzato inoltre il JRE 1.5.0_06.
Dell Dimension 4550 ‘NOMAD’
(Pentium 4 2.53GHz 384MB RAM)
con Belkin FBT003v2
Indirizzo IP: 192.168.1.5
Dell Latitude D800 ‘D800’
(Pentium M 1.70GHz 512MB RAM)
con D-Link Bluetooth DBT-120
Indirizzo IP: 192.168.1.2
Tutti i test sono stati effettuati utilizzando il Naming Service di Java (orbd) su porta 1050 e il
database MySQL Community Edition 5.0.41 su porta 3306. Per semplicità entrambe le istanze sono
in esecuzione sul Dell D800. In condizioni operative reali sarà necessario installare, per avere
maggiore affidabilità, il database MySQL su ogni dispositivo hardware in modo da tollerare una reale
caduta hardware. Nella fase di test si simula infatti la caduta del Proxy terminandone “brutalmente”
(Ctrl+c) l’esecuzione e non spegnendo o danneggiando il sistema fisicamente.
Come già evidenziato è possibile impostare Token Ring, Naming Service e Database Server tramite il
file testuale di configurazione.
Dispositivi Bluetooth
I dispositivi bluetooth utilizzati come Client durante i test sono:



Telefono cellulare Sony Ericsson T610 (UUID: 000e072431db)
Telefono cellulare Nokia 6151 (UUID: 001bee5283f2)
Bluetooth integrato nel portatile D800 (UUID: 0010c65abadc)
Introduzione ai test
Per ogni test effettuato sono riportati, all’interno della cartella ‘Test’, i relativi file di configurazione
(cartella ‘config’) ed i log di esecuzione dei Proxy coinvolti. Il comportamento del Server è inserito
unicamente nel primo test ed è stato omesso dai successivi poiché sostanzialmente identico.
Test #1: Esecuzione base (un unico Proxy)
Questo test è propedeutico ai test successivi e permette di comprendere il funzionamento del sistema
senza valutarne l’affidabilità essendo in esecuzione sullo stesso nodo il BlueMark Server ed un unico
BlueMark Proxy. Osservando l’esecuzione del Server si nota infatti come il file, che successivamente
sarà inviato ai dispostivi Client consenzienti, venga inviato al Proxy una sola volta. Ciò si verifica
poiché il Proxy in caso di contenuti definiti statici memorizza il file nella cartella temporanea e non
richiede al server il file ad ogni invio.
Dall’esecuzione del Proxy invece di può notare che il sistema rileva tutti e tre i dispositivi e tenta
quindi l’invio. Si può verificare che il D800 ed il Nokia 6151 hanno accettato e ricevuto il contenuto
mentre il T610 ha rifiutato il contenuto. L’immagine sottostante mostra lo stato del database del
Proxy al termine delle operazioni appena commentate.
In seguito a questo test è interessante rilevare che, tra l’avvio del BlueMark Proxy e la ricezione del
file sul primo dispositivo che lo accetta, sono trascorsi circa 30 secondi assumendo che il possessore
del cellulare attenda 3 secondi prima di accettare il file. Le velocità di trasferimento del file sono
inoltre variabili in base al dispositivo Client.
Test #2: Esecuzione (due Proxy su due nodi differenti)
In questo test si sono verificate le reali interazioni nel caso di due Proxy.
Il BlueMark Proxy è stato quindi avviato su ciascuno dei due nodi identificando come Proxy ‘1’
quello in esecuzione sul D800 mentre come Proxy ‘2’ quello sul Dimension 4550.
Dal log dell’esecuzione si può notare come i due Proxy si coordino negli invii evitando richieste
ripetute allo stesso dispositivo. Tutti e tre i dispositivi accettano l’invio e ricevono quindi il contenuto.
L’esecuzione su due nodi ha evidenziato che il dispositivo Bluetooth D-Link è, rispetto al dispositivo
Bluetooth Belkin, leggermente più veloce in fase di discovery dei dispositivi client.
La fase di discovery risulta essere quella più onerosa in termini di dispendio di tempo (all’incirca 10
secondi) pertanto la scelta di un dispositivo bluetooth non efficiente può influire negativamente sulle
prestazioni dell’intero sistema.
In condizioni operative reali sarà opportuno utilizzare adattatori Bluetooth di classe I che offrono,
oltre ad una maggiore copertura, maggiore velocità nelle operazioni di discovery e trasferimento dei
contenuti.
Test #3: Esecuzione con timeout nell’invio (due Proxy su due nodi differenti)
Lo scopo di questo test è stato di simulare il comportamento del sistema nel caso in cui il possessore
del dispositivo Client non si accorga della richiesta di invio del file, si attardi nella risposta o, come
ultima ipotesi, si verifichi una disconnessione durante il trasferimento a causa dello spostamento del
client al di fuori del range di copertura del dispositivo bluetooth associato al Proxy.
In tutti questi casi il sistema dovrà quindi associare al dispositivo lo stato ‘TIMEOUT’ e, nel caso di
successivi rilevamenti del dispositivo client, dovrà ritentare l’invio.
Le immagini si riferiscono alla tabella ‘contenttable’ relativa al Proxy ‘2’ prima e dopo l’invio del
contenuto al dispositivo client 000e072431db e mostrano come il sistema, in seguito al timeout
rilevato dal Proxy ‘1’, sia in grado di inviare il contenuto tramite il Proxy ‘2’ aggiornando lo stato
correttamente al termine delle operazioni.
Test #4: Esecuzione (cinque Proxy complessivi su due nodi diversi)
L’esecuzione di questo test ha evidenziato come sia possibile estendere la token ring anche a più di
due Proxy. In un contesto reale (con, ad esempio, 5 adattatori bluetooth) si hanno, notevoli vantaggi
sia in termini di velocità dei trasferimenti sia ovviamente in termini di area di copertura.
Nell’esempio si sono eseguiti i Proxy ‘1’ e ‘2’ su D800 ed i Proxy ‘3’,’4’,’5’ su Dimension4550.
Il portatile D800 è stato allontanato dal Dimension4550 in modo da non sovrapporre i range di
copertura e testare il sistema in caso di effettiva distribuzione spaziale dei Proxy.
I dispositivi Client sono stati così distribuiti: i due cellulari sono stati lasciati accanto al
Dimension4550 (cioè ai Proxy ‘3’,’4’ e ‘5’) mentre il dispositivo Client inglobato nel case del
portatile è , ovviamente, all’interno del range di copertura dei Proxy ‘1’ e ‘2’.
Tutti e tre i dispositivi Client rilevati hanno accettato l’invio ed i Proxy ‘1’,’3’ e’4’ hanno effettuato i
trasferimenti dopo aver richiesto al server il contenuto da inviare.
Il Proxy ‘1’ ha gestito il solo dispositivo client nel proprio range (quello integrato nel D800 stesso) e
in seguito al riavvicinamento del portatile D800 al Dimension4550 non è stato più ricontattato dai
Proxy ‘3’,’4’ e ‘5’.
Test#5: Esecuzione e fase di recovery (cinque Proxy complessivi su due nodi diversi)
La configurazione dei dispositivi resta invariata rispetto a quella utilizzata nel test precedente.
Sono stati attivati il dispositivo Client T610 e D800 mentre il bluetooth del Client Nokia6151 è stato
momentaneamente disattivato. Come si può notare dai log di esecuzione i dispositivi sono stati
rilevati e al D800 è stato inviato il contenuto. Il T610 ha risposto negativamente all’invito di invio.
E’ stato quindi simulato un guasto sul Proxy ‘4’ che ha portato all’avvio della fase di recovery avente
come coordinatore il nodo successivo, cioè il Proxy ‘5’. Al termine della fase di recovery, è stato
attivato il dispositivo Client Nokia 6151 e ad esso viene inviato il contenuto dal Proxy ’5’
dimostrando il corretto funzionamento del sistema anche dopo la fase di recovery.
Gli altri due dispositivi Client sono rimasti attivi e nel range di copertura ma non sono più stati
ricontattati poiché già gestiti precedentemente.
La fase di recovery viene gestita correttamente anche in seguito a nuove cadute fino al
raggiungimento della modalità standalone. Il sistema pertanto continua a funzionare sempre, ed anche
con un solo Proxy, a patto che, come ipotizzato, si verifichino guasti singoli.
Conclusioni, problematiche e sviluppi futuri
Il sistema BlueMark raggiunge gli obiettivi prefissati garantendo in particolare alta availability e il
rispetto delle politiche richieste.
Il valore del timeout sul canale di input costituisce un parametro fondamentale per il corretto
funzionamento dell’intero sistema e deve essere calibrato in modo da non avviare la procedura in caso
di semplice congestionamento ma solo in caso di effettiva caduta. Si potrebbe pertanto inserire nel
ring un token del tipo BMRINGALIVE che viene semplicemente passato all’interno dell’anello senza
dipendere dal completamento di operazioni sul Proxy (come avviene per il BMTOKEN).
Essendo stato sviluppato a scopo di progetto la maggior parte dei parametri sono stati “cablati” nel
codice. Pertanto come sviluppo futuro si potrebbe rendere possibile l’impostazione di questi parametri
tramite, ad esempio, una semplice interfaccia grafica.
Durante i test sono stati evidenziati problemi di gestione delle connessioni Bluetooth. Nel caso infatti
si verifichi una disconnessione dal dispositivo durante il trasferimento si possono creare condizioni di
instabilità che talvolta hanno causato il blocco del Proxy associato (e l’avvio della fase di recovery).
Tali aspetti sono stati volontariamente tralasciati in quanto esulano dagli obiettivi del progetto.
Sarebbe opportuno testare il sistema con una moltitudine di dispositivi Client in modo da verificare la
effettiva prestazione in caso di ‘affollamento’ di dispositivi. Sarebbe inoltre utile verificare la corretta
comunicazione tra Proxy e dispositivi Client ed in particolare la giusta percezione da parte del Proxy
delle risposte positive e negative dei Client. Una errata percezione della risposta, ad esempio negativa,
genera fastidiose ritrasmissioni al dispositivo Client.
Si è tentato inoltre di effettuare un ultimo test inviando due contenuti diversi ad ogni dispositivo
Client trovato. Ciò non è stato possibile poiché ad ogni Proxy è associata nel database una unica
tabella ‘contenttable’ che non discrimina sulla base del contenuto.
Per risolvere il problema è sufficiente creare una tabella ‘contenttable’ per ogni contenuto ed
effettuare una banale modifica a livello di codice che associa ogni contenuto alla relativa tabella del
database.