• Non ci sono risultati.

Prove sperimentali

Si `e scelto di utilizzare SQLite come database per il progetto grazie a suoi nu-merosi vantaggi tra cui la sua semplicit`a e portabilit`a, ma soprattutto per la velocit`a e le dimensioni ridotte sul disco.

Una serie di test sono stati eseguiti per valutare le prestazioni di Sqlite con-frontate a quelle di altri database quali PostgreSql e MySql. L’ambiente di test `e stato predisposto su una piattaforma Athlon a 1.6GHz , 1GB di memoria, un disco IDE e sistema operativo RedHat Linux 7.2.

Figura 6.9: Tabella delle performance tra i vari DBMS

Come si `e potuto constatare dai risultati dei test un applicativo che richiede frequenti operazioni di INSERT e SELECT su un numero di campi e di tabelle limitati, rende SQLite il sistema pi`u performante fra tutti. Questo `e il caso della nostra applicazione dove vengono usate molte SELECT e INSERT per gestire il monitoring in tempo reale dei parametri rilevati dai sensori di WSN (nel nostro caso specifico una ogni secondo per ogni sensore collegato).

6.6 Prove sperimentali 73 Per quanto riguarda le dimensioni sul disco 1000 tuple contenenti i dati rela-tivi ad una rilevazione effettuata da un sensore occupano 48,0kb di spazio fisico sul disco. Un rapido calcolo porta a dire che in un giorno di acquisizioni i para-metri di un singolo sensore vengono ad occupare poco pi`u di 4Mb di spazio sul disco i quali puoi verrano archiviati in una singola tupla all’interno della tabel-la archivio e canceltabel-lati, limitando cos`ı lo spazio che si verrebbe ad accumutabel-lare con il trascorrere dei giorni. Questo sistema porta ad una valutazione ottimale dello spazio complessivo occupato sul disco (meno di 30Mb occupati lasciando collegati una media di 7 sensori per 2 anni).

Capitolo 7

Conclusioni e sviluppi futuri

In questo lavoro `e stato raggiunto l’obiettivo principale di creare una applicazio-ne Web “user friendly” che riuscisse con un alto livello di astrazioapplicazio-ne a gestire i parametri ambientali di una Wireless Sensor Network. L’eterogeneit`a delle di-verse architetture hardware per le WSN e dei differenti protocolli e topologie di rete utilizzate ha reso necessario lo sviluppo di un sistema in grado di raccoglie-re ed aggraccoglie-regaraccoglie-re questi dati raccoglie-rendendoli disponibili all’utente tramite un comune sistema di interazione.

Questo sistema `e stato realizzato con un alto fattore di portabilit`a (utiliz-zando ambienti di lavoro diffusi e open source quali C++, html, PHP) ed `e stato progettato cercando di raggiungere gli obiettivi di aggregazione ed etero-geneit`a delle WSN. Infatti il sistema centrale e il suo modello di interrogazione dei sensori basato su query permette l’utilizzo di un “linguaggio” comune, indi-pendente dalle piattaforme hardware sottostanti. L’implementazione fisica delle WSN connesse conseguentemente non modifica la struttura del sistema centrale e del sistema di query. Si `e riuscito anche a limitare a poche le modifiche sul software standard del dispositivo della Texas Instruments rendendo l’applicazio-ne Web compatibile e integrabile con altre applicazioni esterl’applicazio-ne che interagisco con le WSN (il software ED standard non `e stato modificato).

Il software e la rete WSN realizzata in questo lavoro, risulta limitata al re-cupero e alla gestione dell’unico dato fornito dal sensore del dispositivo, ovvero la temperatura. Il sistema rimane comunque valido per ogni tipologia di dato numerico, adeguando lo schema relazionale delle tabelle, con i campi e vincoli

7. Conclusioni e sviluppi futuri 75 relativi ai dati forniti dalla rete. Le modalit`a di interrogazione, di segnalazione e comunicazione col sistema centrale non necessitano di sostanziali modifiche.

Per quanto riguarda gli sviluppi futuri, si pu`o notare come essi siano innu-merevoli. Per prima cosa si potrebbero aggiungere periferiche e sensori sugli end devices, implementando ulteriori funzionalit`a sensoristiche come la capacit`a di rilevare pressione, vibrazioni ed altro ancora, oppure capacit`a attuative.

Si potrebbe poi approfondire maggiormente la parte relativa alle reti multihop e alle reti formate da pi`u end devices in cascata, arrivando ad utilizzare reti di tipo mesh dove i profili di dinamicit`a, estensione ed autonomia del sistema sono migliori rispetto alla tipologia a stella utilizzata in questo progetto. Il protocollo di rete (gestione del routing) e l’hardware (poche risorse in termini di memoria e capacit`a computazionale) utilizzati non permettono facilmente di implementare questa tipologia di rete. Potrebbe risultare un’alternativa, lo sviluppo di un sistema di routing gestito in parte dal nodo e in parte dal software wrapper. La comunicazione dei nodi verso il wrapper avverrebbe in modo automatico, in quanto ogni nodo `e a conoscenza del nodo a lui connesso facente parte del “percorso” determinato verso il centro stella (potenzialmente il messaggio pu`o attraversare pi`u nodi). Invece la comunicazione dal centro stella verso i nodi (oppure da nodo a nodo, passando per`o dal centro stella) verrebbe elaborata dal wrapper, che conoscendo la struttura della rete, calcola il percorso del messaggio, includendolo al suo interno (payload oppure header di un apposito layer). Ogni nodo che riceve il messaggio da inoltrare, legge l’indirizzo successivo e invia il messaggio al nodo specificato, fino al raggiungimento della destinazione.

Parte III

Appendici

Capitolo 8

Codice

Viene mostrato ora il codice completo relativo ad ogni software scritto e realizzato per rendere operativo l’intero progetto.

8.1 Software wrapperdb.sqlite

/∗ ∗ wrapperdp . cpp Created on : 10−ago −2009 Author : Andrea I z z o L i c e n s e : P u b l i c Domain ∗/ #i n c l u d e <time . h> #i n c l u d e <io st re am > #i n c l u d e <s t d i o . h> #i n c l u d e <s t r i n g . h> #i n c l u d e <s t d l i b . h> #i n c l u d e ” windows . h” #i n c l u d e <sstream> #i n c l u d e ” S q l i t e L i b \ S q l i t e C o n n e c t i o n . h” 78

8.1 Software wrapperdb.sqlite 79 #d e f i n e MESSAGE LENGHT 22

#d e f i n e p o r t a ”COM1”

s t r i n g prepareQuery ( s t r i n g val1 , s t r i n g val2 , s t r i n g val3 , s t r i n g v a l 4 ) ;

char ∗∗ e x p l o d e ( char ∗ s t r i n g , char ∗ s e p a r a t o r ) ;

s t r i n g outSqliteAVG ( s t r i n g temp , s t r i n g batt , s t r i n g s i g n a l ) ; vo id a g g i o r n a A r c h i v i o ( ) ; u s i n g namespace S q l i t e C l a s s ; u s i n g namespace s t d ; // V a r i a b i l i G l o b a l i s t r i n g i q u e r y ; DWORD b y t e s r e a d ; BYTE charRead [ 1 ] ;

byte read [MESSAGE LENGHT ] ; HANDLE hComm; char ∗∗ s t r a r r a y ; char ∗ s t r d a t i ; // C r e a z i o n e p u n t a t o r e a l l ’ o g g e t t o d e l l a c l a s s e per l a // c o n n e s s i o n e d e l db S q l i t e C o n n e c t i o n ∗aConn ; /∗ ∗ La f u n z i o n e p r i n t e x c e p t i o n s e r v e per stampare a ∗ v i d e o e v e n t u a l i e r r o r i che s i possono ∗ v e r i f i c a r e durante l a l e t t u r a d e i d a t i d a l d atab a se . ∗/

80 8. Codice v o i d p r i n t e x c e p t i o n ( S q l i t e E x c e p t i o n ex ) {

cout << (”\nAN ERROR HAS OCCOURS . . . . ” ) << ”\n” ;

cout << (”STATEMENT : ”) << ex . GetStatement ( ) << ”\n” ; cout << (”ERROR NUMBER : ”) << ex . GetErrNumber ( ) << ”\n ” ; cout << (”ERROR DESCRIPTION : ”) << ex . G e t E r r D e s c r i p t i o n ( )

<< ”\n\n\n” ; }

/∗

∗ C i c l o Main ∗/

i n t main ( i n t argc , char ∗ argv [ ] ) { aConn = new S q l i t e C o n n e c t i o n ( ) ;

l o n g countD , countT ;

t i m e t ∗ tmppointer=NULL; countD = time ( tmppointer ) ;

// C r e a z i o n e d e l handle r e l a t i v o a l l a p e r t u r a d e l l a // p o r t a i n l e t t u r a (COM)

hComm = C r e a t e F i l e ( porta , GENERIC READ,

0 , //( s h a r e ) 0 : cannot s h a r e the COM p o r t 0 , // s e c u r i t y ( None )

OPEN EXISTING, // c r e a t i o n : o p e n e x i s t i n g 0 , // we want o v e r l a p p e d o p e r a t i o n

0 // no t e m p l a t e s f i l e f o r COM p o r t . . . ) ;

8.1 Software wrapperdb.sqlite 81 i f (hComm == INVALID HANDLE VALUE) {

cout <<(” E r r o r e a p e r t u r a COM” ) ;

e x i t ( 0 ) ; } / / E r r o r e n e l l ’ a p r i r e l a p o r t a cout << (”COM Aperta \n\n ” ) ;

// Apro i l database S q l i t e , s e non p r e s e n t e l o c r e a aConn−>Open (”C: / Program F i l e s /Apache S o f t w a r e

Foundation /Apache2 . 2 / h t d o c s / d b s e n s o r i . s q l i t e ” ) ; w h i l e ( t r u e ) {

// s i n c r o n i z z o l a l e t t u r a con i l primo c a r a t t e r e // d e l l a s t r i n g a r i c e v u t a

w h i l e (∗ charRead != ’ $ ’ )

ReadFile (hComm, // p o r t a HANDLE

charRead , // p u n t a t o r e a l dato da l e g g e r e 1 , // numero d i b y t e s da l e g g e r e

&b y t e s r e a d , // p u n t a t o r e n# d i b y t e s l e t t i NULL // deve e s s e r e NULL per Windows CE ) ;

f o r ( i n t i =0; i <MESSAGE LENGHT; i ++) {

// s i suppone che i d a t i una v o l t a a v v i a t o i l // t r a s f e r i m e n t o , a r r i v i n o prima d i o g n i TimeOut ReadFile (hComm, charRead , 1 , &b y t e s r e a d , NULL ) ; read [ i ] = ( char ) ( ∗ charRead ) ;

}

s t r d a t i = ( char ∗) read ;

s t r a r r a y=e x p l o d e ( s t r d a t i , ” , ” ) ;

82 8. Codice s t r a r r a y [ 2 ] , s t r a r r a y [ 3 ] ) ; // l i b e r o l a memoria a l l o c a precedentemente f o r ( i n t z = 0 ; s t r a r r a y [ z ] ; z++) { f r e e ( s t r a r r a y [ z ] ) ; } f r e e ( s t r a r r a y ) ; t r y { // BeginTrans e f f e t t u a i cambiamenti // d i r e t t a m e n t e su f i l e aConn−>BeginTrans ( ) ;

// Execute permette d i u s a r e comandi s q l aConn−>Execute ( i q u e r y ) ;

// c h i u d e l a t r a n s i z i o n e aConn−>CommitTrans ( ) ;

countT = time ( tmppointer ) ;

// a g g i o r n o l a t a b e l l a a r c h i v i o una // v o l t a l a g i o r n o (86400 s e c )

i f ( countT>=(countD +86400)) { a g g i o r n a A r c h i v i o ( ) ;

countD = time ( tmppointer ) ;

} }

c a t c h ( e x c e p t i o n e ) {

8.1 Software wrapperdb.sqlite 83 s c r i t t u r a s u l d a ta base ” ; aConn−>C l o s e ( ) ; d e l e t e aConn ; system (”PAUSE” ) ; r e t u r n 0 ; } } } /∗ ∗ La f u n z i o n e a g g i o r n a A r c h i v i o s e r v e per i n s e r i r e una ∗ t u p l a c o n t e n e n t e l a media d e i v a l o r i p r e l e v a t i ∗ da un s e n s o r e n e l l ’ a r c o d i una g i o r n a t a . Una v o l t a ∗ a g g i o r n a t o l ’ a r c h i v i o vengono r i m o s s e d a l da ta bas e ∗ d e i s e n s o r i t u t t e l e t u p l e u t i l i z z a t e n e l c a l c o l o ∗ d e l l a media . ∗/ v o i d a g g i o r n a A r c h i v i o ( ) { cout <<(”ARCHIVIO”)<<e n d l ;

aConn−>Open (”C: / Program F i l e s /Apache S o f t w a r e Foundation /Apache2 . 2 / h t d o c s / d b s e n s o r i . s q l i t e ” ) ; S q l i t e R e c o r d S e t ∗ aRecordSet ;

aRecordSet = new S q l i t e R e c o r d S e t ( ) ; s t r i n g tempAVG, battAVG , strenghtAVG ;

s t r i n g aquery (” S e l e c t ROUND(AVG(AVG( temperatura ) , 1 ) ,

ROUND(AVG( b a t t e r i a ) ) , ROUND(AVG( s e g n a l e ) , 1) from s e n s ” ) ;

// BeginTrans e f f e t t u a i cambiamenti d i r e t t a m e n t e su f i l e aConn−>BeginTrans ( ) ;

84 8. Codice t r y {

// Execute ( s t r i n g , S q l i t e R e c o r d ) , RecordSet e ’ l ’ o g g e t t o che // andra ’ a c o n t e n e r e i r e c o r d r i c a v a t i

aConn−>Execute ( aquery , aRecordSet ) ;

} c a t c h ( S q l i t e E x c e p t i o n ex ) { p r i n t e x c e p t i o n ( ex ) ; } i f ( ! aRecordSet−>IsEmpty ( ) ) { // MoveFirst c i f a p o s i z i o n a r e a l primo r e c o r d p r e l e v a t o aRecordSet−>MoveFirst ( ) ; // I l c i c l o a v v i e n e f i n c h e ’ non a r r i v i a m o a l l ’ u l t i m o r e c o r d w h i l e ( ! aRecordSet−>EndOfRecordSet ) { t r y { // F i l d V a l u e ( n ) p r e l e v a i l v a l o r e co nte nuto n e l l a c o l o n n a tempAVG = aRecordSet−>F i e l d V a l u e ( 0 ) ; battAVG = aRecordSet−>F i e l d V a l u e ( 1 ) ; strenghtAVG = aRecordSet−>F i e l d V a l u e ( 2 ) ;

i q u e r y=outSqliteAVG (tempAVG, battAVG , strenghtAVG ) ; aConn−>Execute ( i q u e r y ) ; } c a t c h ( S q l i t e E x c e p t i o n ex ) { p r i n t e x c e p t i o n ( ex ) ; } // MoveNext c i s p o s t a a l prossimo r e c o r d // aRecordSet−>MoveNext ( ) ; } } e l s e {

cout << ”Non e ’ s t a t o t r o v a t o nessun r e c o r d ! ! \ n ” ;

8.1 Software wrapperdb.sqlite 85 aConn−>Execute (”DELETE FROM s e n s ” ) ;

aConn−>CommitTrans ( ) ; // c h i u d e l a t r a n s i z i o n e

}

/∗

∗ La f u n z i o n e outSqliteAVG r e s t i t u i s c e una s t r i n g a ∗ c o n t e n e n t e l a query che andra ’ s u c c e s s i v a m e n t e

∗ e s e g u i t a per e f f e t t u a r e g l i i n s e r i m e n t i a l l ’ i n t e r n o ∗ d e l l ’ a r c h i v i o d e i s e n s o r i .

∗/

s t r i n g outSqliteAVG ( s t r i n g temp , s t r i n g batt , s t r i n g s i g n a l ){ s t r i n g queryAVG (”INSERT INTO a r c h i v i o

( temperatura , s e g n a l e , b a t t e r i a , data ) VALUES ( ’ ” ) ; char d a t e S t r [ 9 ] ;

s t r d a t e ( d a t e S t r ) ; queryAVG . append ( temp ) ; queryAVG . append ( ” ’ , ’ ” ) ; queryAVG . append ( s i g n a l ) ; queryAVG . append ( ” ’ , ’ ” ) ; queryAVG . append ( b a t t ) ; queryAVG . append ( ” ’ , ’ ” ) ; queryAVG . append ( d a t e S t r ) ; queryAVG . append ( ” ’ ) ” ) ; cout << queryAVG << e n d l ; r e t u r n queryAVG ; } /∗ ∗ La f u n z i o n e e x p l o d e r e s t i t u i s c e una m a t r i c e d i

86 8. Codice ∗ s t r i n g h e , c i a s c u n a d e l l e q u a l i e ’ una p a r t e ∗ d i s t r i n g o t t e n u t a d i v i d e n d o l a s t r i n g a o r i g i n a l e ∗ u t i l i z z a n d o s e p a r a t o r come s e p a r a t o r e d i s t r i n g a . ∗ I p a r a m e t r i d e l l a f u n z i o n e sono , n e l l ’ o r d i n e , ∗ l a s t r i n g a da s u d d i v i d e r e e ’ i l c a r a t t e r e ∗ d i s e p a r a z i o n e . ∗/

char ∗∗ e x p l o d e ( char ∗ s t r i n g , char ∗ s e p a r a t o r ) { char ∗∗ r e t ; i n t i = 0 ; r e t = ( char ∗∗) m a l l o c ( s i z e o f (∗ r e t ) ) ; r e t [ i ++] = s t r t o k ( s t r i n g , s e p a r a t o r ) ; w h i l e ( r e t [ ( i − 1 ) ] ) { r e t = ( char ∗∗) r e a l l o c ( r e t , s i z e o f (∗ r e t ) ∗ ( i + 1 ) ) ; r e t [ i ++] = s t r t o k (NULL, s e p a r a t o r ) ; } r e t u r n r e t ; } /∗ ∗ La f u n z i o n e prepareQuery r e s t i t u i s c e una s t r i n g a ∗ c o n t e n e n t e l a query che andra ’ s u c c e s s i v a m e n t e

∗ e s e g u i t a per e f f e t t u a r e g l i i n s e r i m e n t i a l l ’ i n t e r n o ∗ d e l d at ab as e .

∗/

s t r i n g prepareQuery ( s t r i n g val1 , s t r i n g val2 , s t r i n g val3 , s t r i n g v a l 4 ){

8.2 Software AP e ED 87

Documenti correlati