01.06.2013 Views

Facoltà di Ingegneria Corso di Laurea Magistrale in Ingegneria ...

Facoltà di Ingegneria Corso di Laurea Magistrale in Ingegneria ...

Facoltà di Ingegneria Corso di Laurea Magistrale in Ingegneria ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

UNIVERSITÀ POLITECNICA DELLE MARCHE<br />

<strong>Facoltà</strong> <strong>di</strong> <strong>Ingegneria</strong><br />

<strong>Corso</strong> <strong>di</strong> <strong>Laurea</strong> <strong>Magistrale</strong> <strong>in</strong> <strong>Ingegneria</strong> Informatica<br />

Progetto <strong>di</strong> un sistema <strong>di</strong> videosorveglianza basato su<br />

tecnologie multi-agente<br />

Relatore:<br />

Prof. Aldo Franco Dragoni<br />

Correlatori:<br />

Dott. Gianluca Dolc<strong>in</strong>i<br />

Dott. Luca Palazzo<br />

Anno Accademico 2011/2012<br />

Tesi <strong>di</strong>:<br />

Andrea Bal<strong>di</strong>ni


“Un viaggio <strong>di</strong> mille miglia <strong>in</strong>izia con un solo passo”<br />

Lao Tse


In<strong>di</strong>ce<br />

1. Introduzione .................................................................................................................... 1<br />

1.1. Stato dell’arte ........................................................................................................... 2<br />

1.2. Obiettivi della tesi ..................................................................................................... 3<br />

1.3. Struttura ................................................................................................................... 4<br />

2. Ambiente <strong>di</strong> sviluppo ....................................................................................................... 5<br />

2.1. Gli agenti software .................................................................................................... 6<br />

2.2. Sistemi Multi-Agente ................................................................................................ 8<br />

2.3. Architetture sistemi Multi-Agente ............................................................................. 9<br />

2.4. Lo standard FIPA ..................................................................................................... 12<br />

2.4.1. FIPA Request Interaction Protocol Specification ............................................... 15<br />

2.4.2. FIPA Contract Net Interaction Protocol Specification ....................................... 17<br />

2.4.3. FIPA Agent Management Specification ............................................................ 19<br />

2.5. FIPA-ACL ................................................................................................................. 23<br />

2.5.1. FIPA Comunicative Act Library Specification .................................................... 25<br />

2.5.2. FIPA SL Content Languages Specification ......................................................... 27<br />

2.5.3. FIPA Agent Message Transport Service Specification ....................................... 28<br />

2.6. JADE: Java agent development environment .......................................................... 32<br />

2.6.2. Architettura JADE............................................................................................. 34<br />

2.6.3. Message Transport Service .............................................................................. 35<br />

2.6.4. IMTP ( Internal Message Transport Protocol ) .................................................. 36<br />

2.6.5. Special agents .................................................................................................. 37<br />

2.6.6. JADE Packages ................................................................................................. 40<br />

2.6.7. Classe Agent .................................................................................................... 41<br />

2.6.8. Comportamenti degli agenti ............................................................................ 42<br />

2.6.9. Protocolli <strong>di</strong> <strong>in</strong>terazione ................................................................................... 45<br />

2.6.10. Supporto alle ontologie.................................................................................... 47<br />

v


2.7. Android ................................................................................................................... 51<br />

2.7.1. Basi della programmazione Android ................................................................ 53<br />

2.8. JADE-LEAP ............................................................................................................... 60<br />

2.8.1. Jade-Leap runtime environment ...................................................................... 60<br />

2.8.2. Split execution ................................................................................................. 62<br />

2.9. JADE-based Android application ............................................................................. 64<br />

2.10. Integrazione <strong>di</strong> JADE e Android <strong>in</strong> Eclipse ............................................................ 67<br />

3. Progettazione del sistema .............................................................................................. 71<br />

3.1. Software <strong>di</strong> partenza ............................................................................................... 71<br />

3.2. Analisi dei requisiti .................................................................................................. 77<br />

3.3. Architettura del sistema .......................................................................................... 78<br />

3.3.1. Agente Android................................................................................................ 81<br />

3.3.2. Agente Manager .............................................................................................. 86<br />

3.4. L’ontologia per il servizio <strong>di</strong> videosorveglianza ........................................................ 90<br />

4. Implementazione ........................................................................................................... 92<br />

4.1. Implementazione ontologia .................................................................................... 92<br />

4.2. Implementazione applicazione centrale .................................................................. 97<br />

4.2.1. Struttura applicazione videosorveglianza ......................................................... 97<br />

4.2.2. Avvio applicazione “videosorveglianza” ........................................................... 99<br />

4.2.3. Implementazione agente manager ................................................................ 100<br />

4.3. Implementazione applicazione Android ................................................................ 111<br />

4.3.1. File AndroidManifest.xml e struttura applicazione ......................................... 111<br />

4.3.2. Creazione agente Android .............................................................................. 114<br />

4.3.3. Implementazione agente Android .................................................................. 116<br />

4.3.4. Interazione agente e logica <strong>di</strong> elaborazione del video .................................... 124<br />

5. Test e risultati .............................................................................................................. 131<br />

5.1. Test sulle prestazioni <strong>di</strong> analisi del video ............................................................... 131<br />

5.2. Test recovery del sistema <strong>di</strong> videosorveglianza ..................................................... 133<br />

6. Conclusioni e sviluppi futuri ......................................................................................... 136<br />

Appen<strong>di</strong>ceA Software..................................................................................................... 139<br />

vi


R<strong>in</strong>graziamenti .................................................................................................................... 140<br />

Bibliografia .......................................................................................................................... 142<br />

vii


Elenco delle figure<br />

Figura 2-1 Modello architettura <strong>di</strong> tipo Reattiva .................................................................... 10<br />

Figura 2-2 Schema architettura PRS ...................................................................................... 11<br />

Figura 2-3 Architettura Layered <strong>di</strong> tipo orizzontale e verticale .............................................. 12<br />

Figura 2-4 Raggruppamenti delle specifiche FIPA .................................................................. 13<br />

Figura 2-5 FIPA Request Protocol .......................................................................................... 16<br />

Figura 2-6 FIPA ContractNet Interaction Protocol .................................................................. 19<br />

Figura 2-7 Agent Platform ..................................................................................................... 20<br />

Figura 2-8 Ciclo <strong>di</strong> vita <strong>di</strong> un agente ....................................................................................... 21<br />

Figura 2-9 Architettura JADE ................................................................................................. 35<br />

Figura 2-10 GUI dell'Agente RMA .......................................................................................... 37<br />

Figura 2-11 Diagramma delle classi <strong>di</strong> JADE tools .................................................................. 39<br />

Figura 2-12 Contenuto comunicazione fra Agenti .................................................................. 48<br />

Figura 2-13 Modello <strong>di</strong> riferimento per i Content .................................................................. 50<br />

Figura 2-14 Architettura Android .......................................................................................... 52<br />

Figura 2-15 Struttura applicazione Android ........................................................................... 54<br />

Figura 2-16 Lettura file Manifest da Eclipse ........................................................................... 54<br />

Figura 2-17 Ciclo <strong>di</strong> vita <strong>di</strong> una attività................................................................................... 57<br />

Figura 2-18 Componenti schermo Android ............................................................................ 59<br />

Figura 2-19 Architettura JADE Leap ....................................................................................... 62<br />

Figura 2-20 Stand alone e Split execution mode .................................................................... 63<br />

Figura 2-21 Android SDK manager ......................................................................................... 69<br />

Figura 3-1 Architettura del sistema <strong>di</strong> videosorveglianza ....................................................... 79<br />

Figura 3-2 Architettura sistema <strong>di</strong> videosorveglianza con piattaforma recovery .................... 80<br />

Figura 3-3 Interfaccia agente Android ................................................................................... 82<br />

Figura 3-4 Operazioni agente Andorid ................................................................................... 84<br />

Figura 3-5 Componenti software dell'agente Android ........................................................... 85<br />

Figura 3-6 Operazioni agente manager ................................................................................. 88<br />

Figura 3-7 Componenti software agente manager ................................................................ 89<br />

viii


Figura 3-8 Ontologia del sistema <strong>di</strong> videosorveglianza .......................................................... 91<br />

Figura 4-1 Struttura applicazione Videosorveglianza ............................................................. 98<br />

Figura 4-2 Avvio applicazione videosorveglianza visto dalla GUI dell'RMA ............................. 99<br />

Figura 4-3 Struttura applicazione Android ........................................................................... 113<br />

Figura 5-1 Diagramma dei FPS ottenuto dall'estratto <strong>di</strong> 12 secon<strong>di</strong> dei test ........................ 133<br />

ix


Elenco delle tabelle<br />

Tabella 2-1 Parametri del messaggio FIPA-ACL ...................................................................... 25<br />

Tabella 2-2 Atti comunicativi e significato ............................................................................. 26<br />

Tabella 2-3 Parametri messaggio .......................................................................................... 30<br />

Tabella 2-4 Modalità esecuzione nei vari ambienti ................................................................ 62<br />

Tabella 5-1Risultati prestazioni analisi video ....................................................................... 132<br />

x


Elenco dei listati<br />

Listato 3-1 Metodo run() <strong>di</strong> CvBaseView ............................................................................... 73<br />

Listato 3-2 Metodo processFrame() <strong>di</strong> FdView ...................................................................... 75<br />

Listato 4-1 Concept Acknowledge ......................................................................................... 93<br />

Listato 4-2 AgentAction ConfermaFunzionamento ................................................................ 93<br />

Listato 4-3 Concept Immag<strong>in</strong>e ............................................................................................... 94<br />

Listato 4-4 Concept Identita .................................................................................................. 94<br />

Listato 4-5 AgentAction Identifica ......................................................................................... 95<br />

Listato 4-6 Ontologia Videosorveglianza ............................................................................... 97<br />

Listato 4-7 Avvio applicazione videosorveglianza .................................................................. 99<br />

Listato 4-8 Metodo setup() dell'agente manager ................................................................. 101<br />

Listato 4-9 Metodo register() dell'agente manager ............................................................. 102<br />

Listato 4-10 Metodo deregister() dell'agente manager ....................................................... 102<br />

Listato 4-11 Implementazione <strong>in</strong>terfaccia dell'agente manager........................................... 103<br />

Listato 4-12 Behaviour DFRegistraManager ........................................................................ 104<br />

Listato 4-13 behaviour ControllaAckcyclic ........................................................................... 106<br />

Listato 4-14 Behaviour ControllaAck ................................................................................... 107<br />

Listato 4-15 Behaviour RespondImage ................................................................................ 110<br />

Listato 4-16 File AndoridManifest.xml ................................................................................. 112<br />

Listato 4-17 Creazione agente Android................................................................................ 116<br />

Listato 4-18 Metodo oncreate() <strong>di</strong> FdActivity ...................................................................... 116<br />

Listato 4-19 Metodo setup() dell'agente Android ................................................................ 117<br />

Listato 4-20 Interfaccia agente Android............................................................................... 119<br />

Listato 4-21 Behaviour DFRegistraCamera .......................................................................... 120<br />

Listato 4-22 Behaviour Rispon<strong>di</strong>Ack .................................................................................... 121<br />

Listato 4-23 Behaviour SendImage ...................................................................................... 123<br />

Listato 4-24 Metodo processFrame() con <strong>in</strong>terazione agente Android ................................ 128<br />

Listato 4-25 Thread <strong>di</strong> controllo risposta <strong>di</strong> identificazione volti .......................................... 130<br />

Listato 5-1 Log dell'execution time ...................................................................................... 131<br />

xi


Sommario<br />

In questo lavoro <strong>di</strong> tesi viene presentato un sistema <strong>di</strong> videosorveglianza basato su<br />

tecnologia multi-agente. Come punto <strong>di</strong> partenza il Laboratorio <strong>di</strong> Intelligenza Artificiale e<br />

Sistemi <strong>in</strong> Tempo Reale (AIRT Lab) mi ha fornito <strong>di</strong> un sistema <strong>in</strong> tempo reale <strong>di</strong> <strong>in</strong>seguimento<br />

<strong>di</strong> volti, me<strong>di</strong>ante un robot dotato <strong>di</strong> sistema operativo real time Erika Enterprise e<br />

smartphone Android. L'architettura realizzata prevede la presenza <strong>di</strong> due <strong>di</strong>st<strong>in</strong>ti applicativi<br />

ad agente. Un applicativo "centrale" <strong>in</strong> grado <strong>di</strong> gestire le telecamere che partecipano alla<br />

videosorveglianza ed un applicativo su ogni <strong>di</strong>spositivo partecipante. L'architettura ad agenti<br />

è stata creata utilizzando il framework JADE, <strong>in</strong> particolare l'applicativo "centrale" prevede la<br />

creazione <strong>di</strong> una Jade Platform contenente un agente "manager" <strong>in</strong> grado <strong>di</strong> sod<strong>di</strong>sfare le<br />

richieste <strong>di</strong> identificazione <strong>di</strong> volti e mantenere una lista aggiornata dei <strong>di</strong>spositivi funzionanti<br />

che partecipano alla videosorveglianza tramite un perio<strong>di</strong>co acknowledgement. A tale<br />

piattaforma si collegheranno gli agenti residenti nell'applicativo delle telecamere, il quale<br />

<strong>in</strong><strong>di</strong>vidua i volti delle persone, ne seleziona uno da seguire e tramite l'agente richiede<br />

l'identità del viso selezionato all'agente manager, il quale fornirà l'identità del volto nel caso<br />

sia conosciuto o una risposta <strong>di</strong> identità sconosciuta. Le telecamere che partecipano al<br />

sistema <strong>di</strong> videosorveglianza sviluppato sono smartphone Android, dato che con l’avanzare<br />

delle tecnologie hardware è possibile prevedere che il sistema operativo Android sia presente<br />

anche <strong>in</strong> <strong>di</strong>spositivi come telecamere. A prova <strong>di</strong> questo vi è la recente uscita della Samsung<br />

Galaxy Camera, una fotocamera compatta dotata <strong>di</strong> Android. La comunicazione realizzata fra<br />

l'applicativo centrale e l'applicativo su smartphone Android avviene sempre attraverso lo<br />

scambio <strong>di</strong> messaggi ACL che rispettano i protocolli FIPA <strong>in</strong> modo da tenere aperta<br />

l'opportunità <strong>di</strong> far partecipare alla videosorveglianza qualsiasi <strong>di</strong>spositivo dotato <strong>di</strong><br />

telecamera e <strong>in</strong> grado <strong>di</strong> rispettare la comunicazione usata. Il sistema così creato <strong>in</strong>tende<br />

sod<strong>di</strong>sfare i requisiti richiesti da un servizio <strong>di</strong> videosorveglianza, aggiungendo al servizio i<br />

vantaggi dell'uso degli agenti software, quale la tolleranza ai guasti richiesta dalle moderne<br />

applicazioni operanti <strong>in</strong> rete. Infatti nel caso che la piattaforma ad agenti smetta <strong>di</strong><br />

xii


funzionare, l'applicativo presente nel <strong>di</strong>spositivo Android proverà a non cessare la sua attività<br />

cercando la presenza <strong>di</strong> un'altra piattaforma <strong>in</strong> cui poter ricreare il suo agente e riprist<strong>in</strong>are il<br />

servizio.<br />

xiii


1. Introduzione<br />

Il notevole sviluppo <strong>di</strong> Internet, la m<strong>in</strong>iaturizzazione dei <strong>di</strong>spositivi hardware e la<br />

proliferazione delle connessioni mobili hanno cambiato notevolmente le abitu<strong>di</strong>ni <strong>di</strong> vita<br />

delle persone. L'aumento del numero <strong>di</strong> servizi offerti dalla rete hanno avuto come<br />

conseguenza lo sviluppo dei sistemi <strong>di</strong>stribuiti e la necessità <strong>di</strong> sod<strong>di</strong>sfare livelli <strong>di</strong> tolleranza<br />

ai guasti, sicurezza e scalabilità sempre maggiori. Un sistema <strong>di</strong>stribuito, <strong>in</strong>fatti, permette <strong>di</strong><br />

superare sia la programmazione tra<strong>di</strong>zionale, <strong>in</strong> cui un programma gira su una macch<strong>in</strong>a, sia<br />

la programmazione con approccio client-server, <strong>in</strong> cui un'applicazione è sud<strong>di</strong>visa <strong>in</strong> due o<br />

più moduli, che possono risiedere su macch<strong>in</strong>e <strong>di</strong>verse e <strong>di</strong>alogano tra loro conservando però<br />

una gerarchia ben def<strong>in</strong>ita. Infatti, avendo a <strong>di</strong>sposizione un ambiente <strong>di</strong> rete, si possono<br />

concepire applicazioni <strong>di</strong>stribuite, formate da una comunità <strong>di</strong> componenti detti agenti che<br />

non solo comunicano fra loro, ma possono anche essere <strong>in</strong> grado <strong>di</strong> spostarsi da un computer<br />

a un'altro <strong>in</strong>sieme con i propri dati. Un’altra possibilità offerta da questo para<strong>di</strong>gma <strong>di</strong><br />

programmazione è quella <strong>di</strong> eseguire agenti portatili anche su <strong>di</strong>spositivi mobili, dotati <strong>in</strong><br />

genere <strong>di</strong> risorse limitate, sia <strong>in</strong> term<strong>in</strong>i <strong>di</strong> potenza <strong>di</strong> calcolo che <strong>di</strong> <strong>di</strong>sponibilità <strong>di</strong> memoria.<br />

Nasce qu<strong>in</strong><strong>di</strong> l’idea <strong>di</strong> sviluppare un sistema <strong>di</strong> videosorveglianza che faccia uso della<br />

tecnologia multi-agente, dato che la videosorveglianza è un settore dove sicurezza,<br />

modularità e <strong>di</strong>stribuzione possono risultare caratteristiche fondamentali per la qualità del<br />

servizio offerto. Inoltre la possibilità <strong>di</strong> eseguire agenti su <strong>di</strong>spositivi mobili permette<br />

l'<strong>in</strong>serimento <strong>di</strong> agenti sulle eventuali telecamere che partecipano alla videosorveglianza. La<br />

videosorveglianza è qu<strong>in</strong><strong>di</strong> un settore teoricamente idoneo all'uso <strong>di</strong> un sistema <strong>di</strong>stribuito<br />

che sia programmato ad agenti e questo lavoro <strong>di</strong> tesi si pone l’obiettivo <strong>di</strong> verificarlo.<br />

1


1.1. Stato dell’arte<br />

Introduzione<br />

Gli impianti <strong>di</strong> videosorveglianza consentono il monitoraggio del territorio, delle abitazioni o<br />

del proprio ufficio <strong>in</strong> maniera efficace e poco <strong>di</strong>spen<strong>di</strong>osa. Questi impianti sono tipicamente<br />

realizzati da un <strong>in</strong>sieme <strong>di</strong> telecamere opportunamente <strong>in</strong>stallate nei luoghi da controllare e<br />

collegate ad un registratore <strong>di</strong> immag<strong>in</strong>i (Digital Video Recorder) che ne consente<br />

l’acquisizione e la conservazione per un certo tempo su hard <strong>di</strong>sk.<br />

Lo stato dell’arte attuale consente <strong>di</strong> realizzare impianti <strong>di</strong> videosorveglianza <strong>in</strong> tecnologia<br />

analogica e su tecnologia IP. Le caratteristiche delle telecamere <strong>di</strong>sponibili sul mercato<br />

consentono poi <strong>di</strong> avere prestazioni particolari quali il brandeggio, ovvero telecamere tipo<br />

Speed Dome con supporto motorizzato che possono essere teleguidate dall’operatore<br />

tramite joystick con rotazione della visuale <strong>di</strong> 360°, oppure montare a bordo <strong>in</strong>novativi<br />

processori de<strong>di</strong>cati (DSP) per l’elaborazione video quali il motion detection ovvero la<br />

rilevazione <strong>di</strong> oggetti <strong>in</strong> movimento, o l’<strong>in</strong><strong>di</strong>viduazione <strong>di</strong> oggetti statici particolari su uno<br />

scenario quali borse o pacchi suscettibili <strong>di</strong> rischio attentati. Inoltre vi sono algoritmi <strong>di</strong> analisi<br />

delle immag<strong>in</strong>i che permettono <strong>di</strong> riprodurre i processi <strong>di</strong> osservazione proprio<br />

dell'<strong>in</strong>telligenza umana <strong>in</strong> modo automatizzato e negli ultimi anni molti stu<strong>di</strong> si sono<br />

concentrati sul riconoscimento dei volti. Recentemente sono stati sviluppati sistemi che<br />

prevedono l'utilizzo <strong>di</strong> telecamere wireless che <strong>in</strong>viano le immag<strong>in</strong>i ad un PC, responsabile<br />

dell'elaborazione video. Questo fà si che nelle sale <strong>di</strong> controllo ci siano generalmente poche<br />

persone con il compito <strong>di</strong> osservare contemporaneamente un elevato numero <strong>di</strong> monitor che<br />

mostrano le riprese del sistema <strong>di</strong> videosorveglianza, abbassando i costi del servizio. Una<br />

architettura <strong>di</strong>stribuita utilizzata dagli attuali sistemi <strong>di</strong> videosorveglianza è client/server web<br />

based con ip-cam e server centralizzato per la gestione dello stream<strong>in</strong>g e dell’archiviazione<br />

video, dove il sistema è personalizzabile <strong>in</strong> relazione al numero delle videocamere ed alle<br />

funzionalità richieste, è possibile <strong>di</strong>mensionare il sistema server per ottimizzare costi e<br />

prestazioni. ([1])<br />

2


Introduzione<br />

1.2. Obiettivi della tesi<br />

Questa tesi ha come obiettivo la progettazione <strong>di</strong> un sistema <strong>di</strong> videosorveglianza basato su<br />

tecnologia multi-agente. Per realizzare l'obiettivo il Laboratorio <strong>di</strong> Intelligenza Artificiale e<br />

Sistemi <strong>in</strong> Tempo Reale mi ha fornito <strong>di</strong> una applicazione Android per l'<strong>in</strong>seguimento <strong>di</strong> volti<br />

sviluppata da Simone Saraceni ([12]) e una applicazione per il riconoscimento dei volti<br />

sviluppata da Gianluca Dolc<strong>in</strong>i ([15]). Il mio lavoro <strong>di</strong> tesi consiste nell'agentificare le<br />

applicazioni date e creare un sistema <strong>di</strong> videosorveglianza ad agenti che rispetti i seguenti<br />

punti:<br />

1. Utilizzo del framework JADE per l'implementazione della struttura ad agenti.<br />

2. Def<strong>in</strong>izione <strong>di</strong> una ontologia per lo scambio dei messaggi <strong>in</strong> uno scenario <strong>di</strong><br />

videosorveglianza, per esempio per richieste e risposte:" identifica questo<br />

soggetto...", "il soggetto identificato è...".<br />

3. Riconoscimento dei <strong>di</strong>spositivi malfunzionanti collegati al servizio <strong>di</strong> videosorveglianza<br />

tramite la richiesta <strong>di</strong> un perio<strong>di</strong>co acknowledge.<br />

4. Inserimento degli <strong>in</strong><strong>di</strong>rizzi e dei servizi offerti dai vari <strong>di</strong>spositivi collegati al sistema <strong>di</strong><br />

videosorveglianza nel DF della piattaforma ad agenti.<br />

5. Creazione <strong>di</strong> un sistema <strong>di</strong> videosorveglianza resistente ad una <strong>di</strong>struzione accidentale<br />

della piattaforma ad agenti su cui risiedono gli agenti rappresentanti le telecamere.<br />

Il sistema risulterà composto da due applicativi ad agenti, un applicativo centrale per la<br />

creazione della JADE Platform contenente un agente <strong>in</strong> grado <strong>di</strong> gestire gli agenti residenti<br />

nelle telecamere (smartphone Android), un secondo applicativo presente <strong>in</strong> ogni <strong>di</strong>spositivo<br />

Android che vuole partecipare alla videosorveglianza.<br />

Tale sistema può apportare vantaggi nel settore della videosorveglianza, <strong>in</strong> particolare<br />

l’utilizzo degli agenti permetterebbe la creazione <strong>di</strong> una reale applicazione <strong>di</strong>stribuita, dove<br />

sia imme<strong>di</strong>ato aggiungere o elim<strong>in</strong>are telecamere, e qu<strong>in</strong><strong>di</strong> <strong>in</strong> grado <strong>di</strong> sod<strong>di</strong>sfare i requisiti <strong>di</strong><br />

scalabilità, oltre che alla già citata proprietà <strong>di</strong> tolleranza ai guasti.<br />

Nel seguito della tesi verrà presentato il sistema sviluppato, mostrandone il funzionamento.<br />

3


1.3. Struttura<br />

Introduzione<br />

Nel capitolo 2 viene fornita una panoramica dell’ambiente <strong>di</strong> sviluppo, nella quale vengono<br />

presentati gli agenti software, le pr<strong>in</strong>cipali specifiche FIPA, il framework JADE, il sistema<br />

Android, l’add-on <strong>di</strong> JADE per <strong>di</strong>spositivi mobili Jade-Leap e una piccola guida all’<strong>in</strong>stallazione<br />

<strong>di</strong> Jade e Android nell’ambiente <strong>di</strong> sviluppo Eclipse.<br />

Nel capitolo 3 sono descritte le prime fasi del lavoro, ossia l’analisi dei requisiti e la<br />

progettazione del sistema.<br />

La fase <strong>di</strong> implementazione è descritta nel capitolo 4; dove viene illustrato il lavoro svolto per<br />

la realizzazione dell’applicativo ad agenti centrale e dell’applicativo ad agenti per il<br />

<strong>di</strong>spositivo Android.<br />

Nel capitolo 5 sono riportati i risultati ottenuti nei vari test effettuati sul sistema <strong>di</strong><br />

videosorveglianza realizzato.<br />

Il capitolo 6 conclude la tesi con un riepilogo del lavoro svolto, contenente anche alcune<br />

riflessioni sugli sviluppi futuri.<br />

4


Ambiente <strong>di</strong> sviluppo<br />

2. Ambiente <strong>di</strong> sviluppo<br />

In questo lavoro <strong>di</strong> tesi si è fatto un approfon<strong>di</strong>to stu<strong>di</strong>o dello standard FIPA e <strong>di</strong> quanto<br />

presente <strong>in</strong> letteratura relativamente alle tecnologie ad Agenti ed agli strumenti <strong>di</strong> sviluppo.<br />

La Foundation for Intelligent Physical Agents (FIPA) è un’associazione <strong>in</strong>ternazionale <strong>di</strong><br />

aziende creata nel 1996 con lo scopo <strong>di</strong> def<strong>in</strong>ire standards per agenti e per piattaforme <strong>di</strong><br />

supporto per agenti. L’obiettivo pr<strong>in</strong>cipale <strong>di</strong> FIPA è promuovere specifiche per<br />

l’<strong>in</strong>teroperabilità ed il riuso che facilit<strong>in</strong>o la cooperazione e la gestione <strong>di</strong> sistemi <strong>di</strong> agenti<br />

<strong>in</strong>telligenti sviluppati da <strong>di</strong>verse compagnie ed organizzazioni. A tale scopo FIPA sta<br />

lavorando per produrre specifiche per la creazione e gestione <strong>di</strong> agenti, messaggi, l<strong>in</strong>guaggi <strong>di</strong><br />

comunicazione fra agenti, protocolli <strong>di</strong> <strong>in</strong>terazione, architetture <strong>di</strong> trasporto dei messaggi,<br />

def<strong>in</strong>izione <strong>di</strong> ontologie.<br />

Per implementare il nostro sistema multiagente si è scelto, come framework, JADE ( “Java<br />

Agent Development Framework” ) ([8]). Questo è stato sviluppato da TILab s.p.a ( Telecom<br />

Italia Lab ) ed è scaricabile gratuitamente dal suo sito <strong>in</strong>ternet. Esso gode <strong>di</strong> buone<br />

caratteristiche: è open source, è scritto completamente <strong>in</strong> java, fornisce un ottimo supporto<br />

<strong>in</strong> fase “run time” e <strong>di</strong>spone <strong>di</strong> una serie <strong>di</strong> agenti, già implementati, che permettono <strong>di</strong><br />

monitorare lo stato della piattaforma e degli agenti ad essa connessi. In particolare, tramite<br />

l’add-on Jade-Leap è stato possibile implementare l’agente mobile residente nello<br />

smartphone Android, che viene impiegato come telecamera. In questo capitolo viene<br />

presentato l’ambiente <strong>di</strong> sviluppo, fornendo una panoramica degli aspetti legati al software.<br />

5


Ambiente <strong>di</strong> sviluppo<br />

2.1. Gli agenti software<br />

Un agente è un’entità software presente <strong>in</strong> ambienti vari ed eterogenei, capace <strong>di</strong> agire<br />

autonomamente <strong>in</strong> questo ambiente, <strong>in</strong> modo da poter portare a term<strong>in</strong>e gli obiettivi per i<br />

quali è stato progettato. Altri attributi comunemente associati agli agenti sono i seguenti :<br />

• Mobilità: è la capacità <strong>di</strong> un agente <strong>di</strong> spostarsi all'<strong>in</strong>terno dell'ambiente <strong>in</strong> cui opera, per<br />

poter raggiungere le risorse <strong>di</strong> cui necessita o le <strong>in</strong>formazioni <strong>di</strong> cui è alla ricerca. Per gli<br />

agenti fisici il movimento avviene all'<strong>in</strong>terno <strong>di</strong> un ambiente reale, mentre per gli agenti<br />

software si <strong>in</strong>tende il trasferimento da un nodo all'altro <strong>di</strong> una rete <strong>di</strong> computer. La mobilità<br />

rappresenta un ulteriore aspetto <strong>di</strong> autonomia, <strong>in</strong> quanto la scelta del percorso da seguire o<br />

del sito su cui fermarsi sono lasciate al giu<strong>di</strong>zio dell'agente; si possono <strong>di</strong>st<strong>in</strong>guere due livelli<br />

<strong>di</strong> mobilità:<br />

- Esecuzione Remota: l’Agente (programma + dati) viene spostato su un altro Host ed<br />

eseguito <strong>in</strong>teramente <strong>in</strong> remoto.<br />

- Migrazione: durante la propria esecuzione un Agente è <strong>in</strong> grado <strong>di</strong> spostarsi <strong>di</strong> propria<br />

<strong>in</strong>iziativa <strong>in</strong> un altro nodo. Qu<strong>in</strong><strong>di</strong> è capace <strong>di</strong> sospendere la propria esecuzione,<br />

migrare ( programma + dati + stato <strong>di</strong> esecuzione ) e riattivarsi dal punto <strong>di</strong><br />

sospensione.<br />

• Cooperazione: si ha <strong>in</strong>vece quando più agenti sono impegnati nel conseguimento <strong>di</strong> un<br />

obiettivo comune: questo implica sia aspetti <strong>di</strong> comunicazione che <strong>di</strong> coor<strong>di</strong>namento,<br />

necessari per organizzare i partecipanti all'operazione seguendo una certa strategia, e per<br />

permettere lo scambio dei risultati parziali raggiunti;<br />

• Appren<strong>di</strong>mento: è un aspetto molto <strong>di</strong>scusso perché legato al concetto <strong>di</strong> <strong>in</strong>telligenza; si<br />

tratta della capacità <strong>di</strong> fare tesoro delle esperienze passate, per servirsene al momento <strong>di</strong><br />

dover prendere una determ<strong>in</strong>ata decisione. La conoscenza conservata da un agente può<br />

essere <strong>di</strong> <strong>di</strong>verso genere, e spaziare da un s<strong>in</strong>golo bit <strong>di</strong> stato ad un <strong>in</strong>tero database.<br />

• Adattamento: <strong>in</strong><strong>di</strong>ca la proprietà dell'agente <strong>di</strong> mo<strong>di</strong>ficare il proprio comportamento <strong>in</strong><br />

seguito alle mutate con<strong>di</strong>zioni dell'ambiente circostante. L'agente si <strong>di</strong>ce adattativo se è <strong>in</strong><br />

6


Ambiente <strong>di</strong> sviluppo<br />

grado <strong>di</strong> cambiare autonomamente il proprio comportamento per adeguarsi alle situazioni <strong>in</strong><br />

cui si viene a trovare.<br />

• S<strong>in</strong>cerità: <strong>in</strong>capacità <strong>di</strong> comunicare <strong>in</strong>tenzionalmente false <strong>in</strong>formazioni. Si tratta, cioè, <strong>di</strong><br />

supporre che l’Agente non sia <strong>in</strong> grado scegliere tra menzogna e verità.<br />

• Benevolenza: questo significa che un Agente non può avere obiettivi da raggiungere<br />

<strong>in</strong>tr<strong>in</strong>secamente <strong>in</strong> contrasto con quelli <strong>di</strong> altri Agenti .<br />

• Razionalità: questo concetto si basa sull’assunzione che le azioni compiute da un Agente<br />

siano volte al perseguimento <strong>di</strong> determ<strong>in</strong>ati obiettivi e che, <strong>in</strong> nessun caso, cerch<strong>in</strong>o <strong>di</strong><br />

ostacolarne il raggiungimento.<br />

In un certo senso un agente può esser visto come un oggetto ( OOP ) con un obiettivo, ma ci<br />

sono alcune sostanziali <strong>di</strong>fferenze tra i due elementi:<br />

Oggetto Agente<br />

• Incapsula uno stato e lo controlla • Incapsula uno stato e lo controlla<br />

attraverso i meto<strong>di</strong>. attraverso i meto<strong>di</strong> ed i suoi obiettivi.<br />

• Passivo, non ha controllo sull’esecuzione • Attivo, decide quando e come<br />

dei meto<strong>di</strong>. agire.<br />

• Non autonomo. • Autonomo.<br />

Il term<strong>in</strong>e agente appartiene anche all’<strong>in</strong>telligenza artificiale, il cui compito è quello <strong>di</strong><br />

replicare l’<strong>in</strong>telligenza umana. Tipicamente però lo scopo dei sistemi multi-agente è più<br />

limitato, volendo <strong>in</strong>tendere sistemi capaci <strong>di</strong> fare qualcosa <strong>di</strong> utile <strong>in</strong> un ambiente spesso<br />

circoscritto.<br />

Un Agente non deve necessariamente possedere tutte le proprietà descritte<br />

precedentemente ma ve ne sono alcune, come l’adattamento e l’appren<strong>di</strong>mento, che<br />

risultano strettamente correlate tra loro e pertanto può risultare arduo <strong>di</strong>st<strong>in</strong>guerle. In altri<br />

casi si considerano sistemi composti da più agenti, ognuno caratterizzato da certi attributi, e<br />

si parla <strong>di</strong> Sistema multi-Agente.<br />

7


Ambiente <strong>di</strong> sviluppo<br />

2.2. Sistemi Multi-Agente<br />

Se è <strong>di</strong>fficile dare una def<strong>in</strong>izione universalmente riconosciuta <strong>di</strong> Agente, lo è altrettanto dare<br />

quella <strong>di</strong> Sistema ad Agenti. Questa, <strong>in</strong>fatti, si basa sui concetti <strong>di</strong> Agente e <strong>di</strong> Piattaforma o<br />

Contenitore d’Agenti, per modellare una struttura software complessa costituita da processi<br />

cooperanti per il raggiungimento <strong>di</strong> un obiettivo comune. La piattaforma ad agenti<br />

rappresenta una macch<strong>in</strong>a virtuale per l’esecuzione degli agenti, una sorta <strong>di</strong> contenitore<br />

dove gli agenti possono vivere ed operare.<br />

Nei Sistemi Multi-Agente (MAS) gli agenti possono <strong>in</strong>teragire gli uni con gli altri sia<br />

<strong>in</strong><strong>di</strong>rettamente (mo<strong>di</strong>ficando l’ambiente), sia <strong>di</strong>rettamente (attraverso la comunicazione),<br />

allo scopo <strong>di</strong> sod<strong>di</strong>sfare un certo <strong>in</strong>sieme <strong>di</strong> compiti. Gli obiettivi <strong>di</strong> ogni agente possono<br />

essere con<strong>di</strong>visi o conflittuali, nel primo caso gli agenti cercano <strong>di</strong> collaborare per<br />

raggiungere il beneficio comune mentre nel secondo caso gli agenti competono per<br />

perseguire i propri <strong>in</strong>teressi. Nei Sistemi Multi-Agente si tende spesso a ridurre l’<strong>in</strong>telligenza<br />

del s<strong>in</strong>golo agente <strong>in</strong> favore dell’<strong>in</strong>telligenza collettiva, puntando l’attenzione verso il<br />

coor<strong>di</strong>namento, la capacità/volontà <strong>di</strong> cooperazione, e la negoziazione.<br />

Le caratteristiche pr<strong>in</strong>cipali <strong>di</strong> un MAS sono:<br />

• Ogni agente ha <strong>in</strong>formazione o capacità <strong>in</strong>completa, qu<strong>in</strong><strong>di</strong> un punto <strong>di</strong> vista dell’ambiente<br />

limitato;<br />

• Non c’è un controllo globale del sistema;<br />

• I dati sono decentralizzati;<br />

• L’<strong>in</strong>terazione è as<strong>in</strong>crona, <strong>di</strong>namica e ad alto livello.<br />

La ragione dell’esistenza e della <strong>di</strong>ffusione degli agenti va ricercata nel fatto che l’<strong>in</strong>formatica<br />

si è mossa sempre più verso c<strong>in</strong>que concetti:<br />

1. Ubiquità delle risorse: <strong>in</strong>tesa nel senso <strong>di</strong> elaborazione mobile e <strong>di</strong> pervasive<br />

comput<strong>in</strong>g.<br />

2. Interconnessione: non si pensa più ai computer isolati ma <strong>in</strong>terconnessi <strong>in</strong> sistemi<br />

<strong>di</strong>stribuiti.<br />

8


Ambiente <strong>di</strong> sviluppo<br />

3. Intelligenza: i compiti che ci aspettiamo <strong>di</strong> poter delegare ai computer sono sempre più<br />

complessi.<br />

4. Delega: viene lasciato il controllo ai computer anche <strong>in</strong> situazioni critiche.<br />

5. Human orientation: si tende sempre <strong>di</strong> più a ragionare sulle macch<strong>in</strong>e <strong>in</strong> term<strong>in</strong>i <strong>di</strong><br />

concetti e <strong>di</strong> metafore simili al modo <strong>in</strong> cui noi percepiamo il mondo.<br />

Gli agenti sono qu<strong>in</strong><strong>di</strong> considerati un importante para<strong>di</strong>gma <strong>di</strong> programmazione perché<br />

possono migliorare gli attuali meto<strong>di</strong> <strong>di</strong> concettualizzazione, <strong>di</strong>segno, implementazione dei<br />

sistemi software e costituire una soluzione al problema <strong>di</strong> <strong>in</strong>tegrazione dei sistemi legacy.<br />

2.3. Architetture sistemi Multi-Agente<br />

Ci sono vari tipi <strong>di</strong> architetture per sistemi multi-agente, esse possono essere sud<strong>di</strong>vise <strong>in</strong><br />

quattro gruppi fondamentali:<br />

• Logic Based<br />

• Reattivi<br />

• BDI<br />

• Layered<br />

Nel primo caso l’architettura è <strong>di</strong> tipo knowledge based, cioè l’ambiente è rappresentato <strong>in</strong><br />

modo simbolico, e gli obiettivi, per i quali l’agente è stato progettato, sono raggiunti<br />

attraverso tecniche <strong>di</strong> ragionamento simboliche. Il vantaggio <strong>di</strong> usare questo approccio è che<br />

la conoscenza umana, molte volte è <strong>di</strong> tipo simbolico, e qu<strong>in</strong><strong>di</strong> co<strong>di</strong>ficarla, e trasmetterla ad<br />

un sistema è molto semplice. Inoltre una volta trasmessa all’agente tale conoscenza, ad<br />

esempio dell’ambiente circostante, può essere semplice da comprendere nel caso si voglia<br />

capire che tipo <strong>di</strong> ragionamento fa un agente.<br />

Lo svantaggio è che la conoscenza può essere molto complessa, e la sua manipolazione può<br />

rallentare molto il processo <strong>di</strong> esecuzione, <strong>di</strong> un agente, con tempi <strong>di</strong> risposta troppo lenti<br />

per essere utilizzati. La seconda architettura, basata su agenti <strong>di</strong> tipo reattivo, che prendono<br />

9


Ambiente <strong>di</strong> sviluppo<br />

decisioni sulla base <strong>di</strong> un meccanismo <strong>di</strong> tipo stimulus-response e si basano sul modello <strong>di</strong><br />

Brooks . Diversamente dalle architetture <strong>di</strong> tipo logic based, queste non hanno un modello <strong>di</strong><br />

riferimento simbolico dell’ambiente esterno, e perciò non utilizzano meccanismi complessi <strong>di</strong><br />

ragionamento. Questo modello può essere spiegato attraverso la figura 2.1, dove sono<br />

rappresentati degli strati <strong>di</strong> una macch<strong>in</strong>a a stati f<strong>in</strong>iti, che sono connessi a sensori che<br />

trasmettono <strong>in</strong>formazioni <strong>in</strong> tempo reale:<br />

Figura 2-1 Modello architettura <strong>di</strong> tipo Reattiva<br />

Questi strati formano una gerarchia <strong>di</strong> comportamenti, dei quali, quelli più bassi hanno meno<br />

controllo rispetto a quelli più alti. In base a questo esempio si capisce che gli agenti, che<br />

rispettano questo modello, percepiscono le con<strong>di</strong>zioni ed agiscono ma non fanno una<br />

pianificazione. Il vantaggio <strong>di</strong> questo approccio è che <strong>in</strong> scenari che cambiano rapidamente,<br />

abbiamo tempi <strong>di</strong> risposta più brevi, lo svantaggio è che i dati provenienti dai sensori<br />

possono non essere sufficienti a determ<strong>in</strong>are l’azione da compiere. Il terzo tipo <strong>di</strong><br />

architettura è quella BDI (Belief Desire Intention) che trae orig<strong>in</strong>e dalla filosofia ed offre una<br />

logica per def<strong>in</strong>ire gli stati mentali, <strong>di</strong> conv<strong>in</strong>zione, desiderio, <strong>in</strong>tenzione.<br />

Le conv<strong>in</strong>zioni sono le aspettative dell’agente rispetto all’ambiente esterno, i desideri <strong>di</strong> un<br />

agente sono le preferenze rispetto ai cambiamenti dell’ambiente circostante e la sua l<strong>in</strong>ea<br />

d’azione, le <strong>in</strong>tenzioni sono il set <strong>di</strong> obiettivi per i quali l’agente è stato progettato.<br />

10


Ambiente <strong>di</strong> sviluppo<br />

Un’implementazione del modello BDI è PRS ( Procedural Reason<strong>in</strong>g System ) che si basa su<br />

c<strong>in</strong>que concetti chiave: conv<strong>in</strong>zioni, desideri, <strong>in</strong>tenzioni, pianificazione, ed un <strong>in</strong>terprete.<br />

Rispetto ad un’architettura BDI sono stati aggiunti due elementi.<br />

Il primo, la pianificazione, che rappresenta la l<strong>in</strong>ea d’azione, che un agente deve seguire per<br />

portare a term<strong>in</strong>e i suoi obiettivi ed il secondo, un <strong>in</strong>terprete che seleziona l’azione da<br />

compiere <strong>in</strong> base alle <strong>in</strong>tenzioni correnti dell’agente. Uno schema rappresentativo<br />

dell’architettura PRS è il seguente (figura 2.2):<br />

Figura 2-2 Schema architettura PRS<br />

L’ultima architettura considerata è quella stratificata che permette sia agenti <strong>di</strong> tipo reattivo<br />

che <strong>di</strong> tipo deliberativo. Per ottenere questa flessibilità l’architettura è organizzata <strong>in</strong> strati <strong>di</strong><br />

tipo gerarchico. Ci sono due tipi <strong>di</strong> stratificazioni, quella orizzontale e quella verticale (ve<strong>di</strong><br />

figura 2.3), nella prima tutti gli strati sono <strong>di</strong>rettamente connessi con l’<strong>in</strong>put dato dai sensori<br />

e l’output è l’azione da compiere, nella seconda l’<strong>in</strong>formazione è passata solo ad uno strato<br />

alla volta. Il vantaggio <strong>di</strong> un’architettura <strong>di</strong> tipo orizzontale è che se si necessita <strong>di</strong> n tipi <strong>di</strong><br />

comportamenti c’è bisogno soltanto <strong>di</strong> n strati, il pr<strong>in</strong>cipale svantaggio è che ciascuno strato<br />

rappresenta un agente e le loro azioni possono essere <strong>in</strong>consistenti, dando orig<strong>in</strong>e a conflitti.<br />

Nel caso <strong>di</strong> un’architettura <strong>di</strong> tipo verticale il vantaggio è che l’<strong>in</strong>terazione tra i <strong>di</strong>versi strati è<br />

molto ridotta rispetto al caso orizzontale, lo svantaggio è che se c’è un guasto <strong>in</strong> uno strato<br />

l’<strong>in</strong>tero sistema viene bloccato, qu<strong>in</strong><strong>di</strong> è un’architettura <strong>in</strong>tollerante ai guasti. ([2])<br />

11


Ambiente <strong>di</strong> sviluppo<br />

Figura 2-3 Architettura Layered <strong>di</strong> tipo orizzontale e verticale<br />

2.4. Lo standard FIPA<br />

L’organizzazione <strong>in</strong>ternazionale FIPA ( Foundation for Intelligent Physical Agents), nata nel<br />

1996, è un’associazione no-profit, che ha come scopo quello <strong>di</strong> fornire standards utili per le<br />

<strong>in</strong>dustrie nella realizzazione <strong>di</strong> applicazioni commerciali. In particolare ha stu<strong>di</strong>ato il<br />

problema dell’<strong>in</strong>teroperabilità tra agenti formulando standards per vari livelli: trasporto dei<br />

messaggi, semantica del l<strong>in</strong>guaggio <strong>di</strong> comunicazione fra agenti <strong>in</strong>telligenti e servizi <strong>di</strong><br />

gestione <strong>di</strong> base ( pag<strong>in</strong>e bianche e pag<strong>in</strong>e gialle ) ([3]). FIPA fornisce un modello <strong>di</strong><br />

riferimento ma nessuna implementazione fisica, i dettagli dell’implementazione e le varie<br />

caratteristiche degli agenti <strong>di</strong>pendono dalle scelte progettuali degli sviluppatori. La prima<br />

documentazione rilasciata, denom<strong>in</strong>ata FIPA97 Specifications, risale al 1997 e del<strong>in</strong>ea le<br />

regole <strong>di</strong> base per la gestione <strong>di</strong> una comunità <strong>di</strong> Agenti, sottol<strong>in</strong>eando gli aspetti relativi alla<br />

loro collaborazione. Le specifiche FIPA possono essere raggruppate a seconda dell’oggetto <strong>in</strong><br />

analisi, ovvero del tema trattato all’<strong>in</strong>terno del dom<strong>in</strong>io degli agenti, ve<strong>di</strong> figura 2.4.<br />

12


• Application<br />

• Abstract Architecture<br />

• Agent Communication<br />

• Agent Management<br />

• Agent Message Transport<br />

Application<br />

Ambiente <strong>di</strong> sviluppo<br />

Figura 2-4 Raggruppamenti delle specifiche FIPA<br />

Le specifiche FIPA che fanno parte della sezione Application contengono la descrizione <strong>di</strong><br />

alcune aree applicative <strong>di</strong> esempio, <strong>in</strong> cui gli agenti FIPA possono essere impiegati. Danno<br />

<strong>di</strong>rettive sull’ontologia e sulle descrizioni dei servizi per un particolare dom<strong>in</strong>io. Alcuni<br />

13


Ambiente <strong>di</strong> sviluppo<br />

esempi <strong>di</strong> dom<strong>in</strong>i trattati sono l’assistenza ai viaggi (FIPA Personal Travel Assistance<br />

Specification) e <strong>in</strong> specifiche per la trasmissione <strong>di</strong> contenuti au<strong>di</strong>o/video (FIPA<br />

Au<strong>di</strong>o-Visual Enterta<strong>in</strong>ment Broadcast<strong>in</strong>g Specification).<br />

AbstractArchitecture<br />

Fra gli obiettivi primari della FIPA c’è quello <strong>di</strong> promuovere l’<strong>in</strong>teroperabilità, e, poiché i<br />

sistemi reali fanno uso <strong>di</strong> tecnologie <strong>di</strong>fferenti per raggiungere scopi identici dal punto <strong>di</strong><br />

vista funzionale, si è creduta necessaria l’identificazione delle caratteristiche comuni ai<br />

<strong>di</strong>versi approcci, arrivando ad una astrazione architetturale, applicabile a ciascuno <strong>di</strong> essi.<br />

Descrivere i sistemi <strong>in</strong> maniera astratta permette <strong>di</strong> esplorare le relazioni fra gli elementi<br />

fondamentali, evidenziare gli aspetti chiave ed i meccanismi più critici, fornire le <strong>in</strong><strong>di</strong>cazioni<br />

su come i sistemi ad agenti concreti debbano essere costruiti per essere <strong>in</strong>teroperabili. Alcuni<br />

degli elementi fondamentali specificati dall’Architettura astratta FIPA sono:<br />

• Agent messages - costituiscono la forma fondamentale <strong>di</strong> comunicazione fra agenti;<br />

rappresentano atti l<strong>in</strong>guistici e sono co<strong>di</strong>ficati <strong>in</strong> un l<strong>in</strong>guaggio <strong>di</strong> comunicazione ad agenti<br />

(ACL), mentre Il contenuto è espresso <strong>in</strong> un content language, come FIPA-SL o FIPA-KIF, e le<br />

espressioni del contenuto possono essere basate su ontologie.<br />

• Message transport service - def<strong>in</strong>ito come il mezzo per mandare e ricevere messaggi fra<br />

agenti e considerato un elemento obbligatorio dei sistemi ad agenti FIPA.<br />

• Agent <strong>di</strong>rectory service - def<strong>in</strong>ito come un archivio <strong>di</strong> <strong>in</strong>formazione con<strong>di</strong>visa <strong>in</strong> cui gli<br />

agenti possono pubblicare le loro registrazioni e nel quale possono cercare registrazioni <strong>di</strong><br />

<strong>in</strong>teresse. Anche questo è considerato un elemento obbligatorio.<br />

• Service <strong>di</strong>rectory service - def<strong>in</strong>ito come un archivio con<strong>di</strong>viso nel quale gli agenti possono<br />

trovare servizi. I servizi <strong>in</strong>cludono, ad esempio, servizi <strong>di</strong> trasporto del messaggio, servizi <strong>di</strong><br />

<strong>di</strong>rectory <strong>di</strong> agenti, servizi <strong>di</strong> <strong>in</strong>oltro e buffer<strong>in</strong>g <strong>di</strong> messaggi. Un service <strong>di</strong>rectory service può<br />

anche essere usato per mantenere le descrizioni dei servizi application oriented ed è<br />

considerato un elemento obbligatorio.<br />

14


AgentComunication<br />

Ambiente <strong>di</strong> sviluppo<br />

Le specifiche FIPA riguardanti la Communicazione degli Agenti possono essere<br />

ulteriormente classificate a seconda che tratt<strong>in</strong>o:<br />

• i messaggi ACL (Agent Communication Language),<br />

• i protocolli <strong>di</strong> <strong>in</strong>terazione per lo scambio <strong>di</strong> messaggi,<br />

• gli atti comunicativi basati sulla teoria degli atti l<strong>in</strong>guistici,<br />

• la rappresentazione dei contenuti me<strong>di</strong>ante dei “content languages”.<br />

2.4.1. FIPA Request Interaction Protocol<br />

Specification<br />

Il FIPA Request Interaction Protocol (IP) permette ad un agente, l’<strong>in</strong>iziatore, <strong>di</strong> richiedere ad<br />

un altro, il partecipante, <strong>di</strong> eseguire un’azione. Il partecipante elabora la richiesta e decide se<br />

accettarla o meno.<br />

Se le con<strong>di</strong>zioni <strong>in</strong><strong>di</strong>cano che un accordo esplicito è richiesto, allora il partecipante comunica<br />

un agree. Quest’accordo può essere <strong>di</strong>pendente dalle circostanze (per esempio, se l’azione<br />

richiesta è molto rapida e può accadere prima <strong>di</strong> un certo istante, specificato nel parametro<br />

reply-by). Una volta che si è d’accordo su una richiesta, il partecipante deve comunicare:<br />

• Un failure se fallisce nel suo tentativo <strong>di</strong> sod<strong>di</strong>sfare la richiesta,<br />

• Un <strong>in</strong>form-done se completa con successo la richiesta e desidera solo <strong>in</strong><strong>di</strong>care che il<br />

lavoro è svolto,<br />

• Un <strong>in</strong>form-result se desidera sia <strong>in</strong><strong>di</strong>care che ha f<strong>in</strong>ito, sia comunicare il risultato<br />

all’<strong>in</strong>iziatore.<br />

Qualsiasi <strong>in</strong>terazione che usa questo protocollo è identificata da un parametro conversation-<br />

id globalmente univoco e non nullo, assegnato dall’<strong>in</strong>iziatore e collocato nella struttura del<br />

messaggio ACL. Gli agenti co<strong>in</strong>volti nell’<strong>in</strong>terazione devono etichettare tutti i loro messaggi<br />

15


Ambiente <strong>di</strong> sviluppo<br />

ACL con questo identificatore <strong>di</strong> conversazione. Ciò permette ad ogni agente <strong>di</strong> gestire le<br />

proprie strategie e attività <strong>di</strong> comunicazione (per esempio, permette ad un agente <strong>di</strong><br />

identificare s<strong>in</strong>gole conversazioni e <strong>di</strong> ragionare attraverso gli storici delle conversazioni). In<br />

qualsiasi punto nell’IP, il dest<strong>in</strong>atario <strong>di</strong> una comunicazione può <strong>in</strong>formare il mittente che<br />

non ha compreso quello che è stato comunicato. Ciò viene fatto restituendo un messaggio<br />

not-understood. La comunicazione <strong>di</strong> un not-understood all’<strong>in</strong>terno <strong>di</strong> un protocollo <strong>di</strong><br />

<strong>in</strong>terazione può far term<strong>in</strong>are l’<strong>in</strong>tero IP e la term<strong>in</strong>azione dell’<strong>in</strong>terazione può implicare che<br />

ogni impegno preso durante l’<strong>in</strong>terazione <strong>di</strong>venga nullo e non valido.<br />

Figura 2-5 FIPA Request Protocol<br />

16


Ambiente <strong>di</strong> sviluppo<br />

In ogni punto nell’IP, l’<strong>in</strong>iziatore può annullare l’<strong>in</strong>terazione <strong>in</strong>izializzando il Cancel Meta-<br />

Protocol. Il parametro conversation-id dell’<strong>in</strong>terazione <strong>di</strong> cancellazione è identico al<br />

parametro conversation-id dell’<strong>in</strong>terazione che l’<strong>in</strong>iziatore <strong>in</strong>tende cancellare. Semantica<br />

della cancellazione: l’<strong>in</strong>iziatore non è più <strong>in</strong>teressato nel cont<strong>in</strong>uare l’<strong>in</strong>terazione ed essa<br />

deve essere term<strong>in</strong>ata <strong>in</strong> una maniera accettabile sia per l’<strong>in</strong>iziatore che per il partecipante. Il<br />

partecipante <strong>in</strong>forma l’<strong>in</strong>iziatore che l’<strong>in</strong>terazione è conclusa usando un <strong>in</strong>form-done o <strong>in</strong><strong>di</strong>ca<br />

il fallimento della cancellazione usando un failure. Il protocollo è riassunto <strong>in</strong> figura 2.5.<br />

2.4.2. FIPA Contract Net Interaction Protocol<br />

Specification<br />

La negoziazione è l'<strong>in</strong>sieme <strong>di</strong> attività ed operazioni(processo) che permettono a due o più<br />

soggetti (negoziatori), ognuno con un <strong>in</strong>teresse economico privato da perseguire (funzione <strong>di</strong><br />

utilità), <strong>di</strong> scambiarsi op<strong>in</strong>ioni (offerte e contro-offerte) nel rispetto <strong>di</strong> un <strong>in</strong>sieme <strong>di</strong> regole<br />

con<strong>di</strong>vise (protocollo <strong>di</strong> negoziazione) con lo scopo <strong>di</strong> arrivare ad un accordo f<strong>in</strong>ale. Il<br />

protocollo <strong>di</strong> negoziazione ha il compito <strong>di</strong> coor<strong>di</strong>nare gli agenti e <strong>di</strong> controllare il rispetto<br />

delle regole <strong>di</strong> negoziazione. In particolare rappresenta l’<strong>in</strong>sieme delle regole che governano<br />

l’<strong>in</strong>terazione. Caratteristiche:<br />

• il processo <strong>di</strong> negoziazione è locale<br />

• non vi è un’unità centrale <strong>di</strong> controllo<br />

• esistono due <strong>di</strong>rezioni <strong>di</strong> scambio per le <strong>in</strong>formazioni<br />

• ogni nodo (agente) valuta le <strong>in</strong>formazioni <strong>in</strong> modo soggettivo dalla propria prospettiva<br />

• l’accordo è raggiunto attraverso una mutua selezione.<br />

Due ruoli possibili per i negoziatori:<br />

• Manager<br />

• Contractor<br />

17


Ambiente <strong>di</strong> sviluppo<br />

La specifica FIPA descrive un protocollo <strong>di</strong> <strong>in</strong>terazione leggemente più complesso. Esso si usa<br />

nel caso <strong>in</strong> cui un agente (l’<strong>in</strong>ziatore) desidera che qualche compito sia eseguito da uno o più<br />

altri agenti (i partecipanti) ovvero vuole <strong>in</strong>iziare una qualche forma <strong>di</strong> negoziazione. Si parte<br />

dal presupposto che l’agente operi cercando <strong>di</strong> ottimizzare una qualche funzione che<br />

caratterizza il compito, comunemente espressa come costo, ma che può anche essere il più<br />

breve tempo <strong>di</strong> completamento, un’equa <strong>di</strong>stribuzione dei compiti, etc. Per un dato<br />

compito, qualsiasi numero <strong>di</strong> partecipanti può rispondere con un’offerta; il resto rifiuta. Le<br />

trattative poi cont<strong>in</strong>uano con i partecipanti che presentano una proposta. L’<strong>in</strong>ziatore<br />

sollecita m offerte dagli altri agenti emanando un CA detto call for proposal (cfp) che<br />

specifica il compito e ogni con<strong>di</strong>zione cui l’<strong>in</strong>iziatore sottopone l’esecuzione del lavoro. I<br />

partecipanti ricevendo la chiamata sono considerati come potenziali contraenti e sono capaci<br />

<strong>di</strong> generare n risposte. Di queste, j sono proposte <strong>di</strong> eseguire il compito, specificate come CA<br />

<strong>di</strong> tipo propose. La proposta del partecipante <strong>in</strong>clude le precon<strong>di</strong>zioni che il partecipante ha<br />

stabilito per il lavoro, che possono essere il prezzo, il momento <strong>in</strong> cui il lavoro sarà eseguito,<br />

etc. D’altra parte, i = n – j partecipanti possono rifiutare <strong>di</strong> fare un’offerta. È necessario che<br />

l’<strong>in</strong>iziatore sappia quando ha ricevuto tutte le risposte, altrimenti, nel caso che un<br />

partecipante fallisca nel rispondere con una proposta o con un rifiuto, l’<strong>in</strong>iziatore potrebbe<br />

potenzialmente rimanere <strong>in</strong> un’attesa <strong>in</strong>def<strong>in</strong>ita. Per prevenire ciò, il CA cfp <strong>in</strong>clude un<br />

term<strong>in</strong>e entro il quale le risposte dovrebbero essere ricevute dall’<strong>in</strong>iziatore. Le proposte<br />

ricevute dopo il term<strong>in</strong>e sono automaticamente rifiutate con la motivazione che la risposta è<br />

arrivata <strong>in</strong> ritardo. Il term<strong>in</strong>e è specificato dal parametro reply-by nel mesaggio ACL. Una<br />

volta che si oltrepassa la scadenza, l’<strong>in</strong>iziatore valuta le j proposte ricevute e seleziona gli<br />

agenti che eseguiranno il compito; possono essere scelti uno, <strong>di</strong>versi o nessun agente. Agli<br />

agenti delle proposte selezionate sarà mandato un CA accept-proposal mentre i rimanenti<br />

agenti riceveranno un CA reject-proposal. Una volta che l’<strong>in</strong>iziatore accetta una proposta il<br />

rispettivo partecipante acquisisce l’<strong>in</strong>carico <strong>di</strong> eseguire il compito. Quando il partecipante ha<br />

completato il lavoro, manda un messaggio <strong>di</strong> completamento all’<strong>in</strong>iziatore nella forma <strong>di</strong> un<br />

<strong>in</strong>form-done o nella versione più esplicativa <strong>di</strong> un <strong>in</strong>form-result. In ogni caso, se il<br />

partecipante fallisce nel completare il compito, viene mandato un messaggio <strong>di</strong> fallimento. Il<br />

protocollo è descritto <strong>in</strong> figura 2.6:<br />

18


Ambiente <strong>di</strong> sviluppo<br />

Figura 2-6 FIPA ContractNet Interaction Protocol<br />

2.4.3. FIPA Agent Management Specification<br />

In aggiunta alla comunicazione, il secondo aspetto fondamentale <strong>di</strong> un sistema ad agenti<br />

preso <strong>in</strong> considerazione f<strong>in</strong> dalle prime specifiche FIPA è la gestione dell’agente. Questo<br />

gruppo <strong>di</strong> specifiche mira alla def<strong>in</strong>izione <strong>di</strong> una struttura normativa:<br />

• all’<strong>in</strong>terno della quale gli agenti FIPA-compatibili possono esistere ed operare;<br />

• che stabilisca il modello logico <strong>di</strong> riferimento per la creazione, la registrazione, la<br />

collocazione, la comunicazione, la migrazione e il funzionamento degli agenti.<br />

19


AP - Agent Platform<br />

Ambiente <strong>di</strong> sviluppo<br />

Fornisce l’<strong>in</strong>frastruttura fisica <strong>in</strong> cui gli agenti sono collocati. L’AP è composta dalle<br />

macch<strong>in</strong>e, dai sistemi operativi, dagli altri componenti FIPA <strong>di</strong> gestione degli agenti, dagli<br />

agenti stessi e da ogni software aggiuntivo <strong>di</strong> supporto. Il progetto specifico <strong>in</strong>terno <strong>di</strong> una<br />

AP è lasciato agli sviluppatori dei sistemi ad agenti concreti, e non è soggetto alla<br />

standar<strong>di</strong>zzazione FIPA. Le uniche richieste per la conformità allo standard sono la presenza<br />

dei componenti <strong>in</strong><strong>di</strong>viduati come parti fondamentali dell’astrazione e il rispetto delle relative<br />

competenze. Poiché una s<strong>in</strong>gola AP può essere <strong>di</strong>stribuita attraverso <strong>di</strong>verse macch<strong>in</strong>e,<br />

anche gli agenti non devono essere necessariamente situati sullo stesso host. Una<br />

schematizzazione <strong>di</strong> una piattaforma ad Agenti è illustrata <strong>in</strong> figura 2.7:<br />

Agent<br />

Figura 2-7 Agent Platform<br />

Un agente è un processo computazionale che appartiene ad una AP e tipicamente offre uno<br />

o più servizi che possono essere resi pubblici con una descrizione <strong>di</strong> servizio. Un agente deve<br />

avere almeno un proprietario (gestore) e deve supportare almeno un concetto <strong>di</strong> identità, il<br />

quale può essere descritto usando il FIPA Agent Identifier (AID), che etichetta un agente così<br />

che esso possa essere <strong>di</strong>st<strong>in</strong>to <strong>in</strong>equivocabilmente all’<strong>in</strong>terno del sistema. Un agente può<br />

20


Ambiente <strong>di</strong> sviluppo<br />

essere registrato ad un certo numero <strong>di</strong> <strong>in</strong><strong>di</strong>rizzi <strong>di</strong> trasporto presso i quali può essere<br />

contattato. Un agente può trovarsi <strong>in</strong> vari stati durante la sua esistenza, FIPA formalizza<br />

questo concetto (figura 2.8):<br />

WAITING<br />

Wake up<br />

TRANSIT<br />

Comportamento<br />

caratteristico degli<br />

agenti mobiliTipo <strong>di</strong><br />

Atto Comunicativo<br />

Move<br />

Agent Management System<br />

Wait<br />

Execute<br />

ACTIVE<br />

Resume<br />

Invoke<br />

SUSPENDED<br />

Suspend<br />

INITIATED<br />

Figura 2-8 1.8 Ciclo <strong>di</strong> vita <strong>di</strong> un agente<br />

Destroy<br />

Create<br />

È un componente obbligatorio nell’AP e per ognuna può essercene soltanto uno.<br />

Rappresenta una sorta <strong>di</strong> unità <strong>di</strong> controllo dell’AP e per questo si usa <strong>di</strong>re che fornisce un<br />

servizio <strong>di</strong> “pag<strong>in</strong>e bianche” per gli agenti della piattaforma. É responsabile delle funzioni <strong>di</strong><br />

creazione, registrazione, mo<strong>di</strong>fica, migrazione da un’AP ad un’altra e term<strong>in</strong>azione <strong>di</strong> agenti.<br />

Questo agente mantiene una descrizione della piattaforma stessa e <strong>di</strong> tutti gli agenti <strong>in</strong> essa<br />

contenuti. In particolare mantiene un tabella con una entry per ogni agente nella quale si<br />

trovano <strong>in</strong>formazioni sullo stato del ciclo <strong>di</strong> vita dell’agente e sui <strong>di</strong>versi protocolli <strong>di</strong><br />

trasporto che l’agente che si registra prevede. Ogni agente, per poter risiedere sull’AP, deve<br />

pertanto registrarsi all’AMS <strong>in</strong><strong>di</strong>cando il proprio AID (Agent IDentifier). Solamente dopo la<br />

Quit<br />

Unknown<br />

21


Ambiente <strong>di</strong> sviluppo<br />

registrazione l’agente può utilizzare, previa autorizzazione, l’agente MTS per il trasporto <strong>di</strong><br />

messaggi. Il ciclo <strong>di</strong> vita <strong>di</strong> un agente term<strong>in</strong>a <strong>in</strong>vece quando viene deregistrato dall’AMS.<br />

Directory Facilitator<br />

È un altro componente obbligatorio dell’AP e fornisce un servizio <strong>di</strong> “pag<strong>in</strong>e gialle” agli altri<br />

agenti, restituisce <strong>in</strong>fatti, su richiesta, <strong>in</strong>formazioni sui servizi offerti dagli altri agenti nella<br />

piattaforma. Mantiene una lista aggiornata e completa degli agenti afferenti alla AP e<br />

fornisce <strong>in</strong>formazioni a chi le richiede ed è autorizzato. In una AP possono essere presenti più<br />

DF anche federati. Ogni agente che vuole rendere pubblico un servizio deve registrarlo al DF<br />

più appropriato. L’agente che fornisce il servizio non ha nessun obbligo nei confronti del DF.<br />

È proprio per questo che il DF non può garantire <strong>in</strong> merito alla vali<strong>di</strong>tà dei risultati restituiti<br />

dal servizio. Ogni agente può mo<strong>di</strong>ficare <strong>in</strong> qualsiasi momento le <strong>in</strong>formazioni relative ad un<br />

servizio offerto.<br />

Message Transport Service<br />

É l’agente che si occupa della comunicazione fra agenti, <strong>in</strong> particolare del trasporto dei<br />

messaggi <strong>in</strong>tra/<strong>in</strong>ter-piattaforma. Ha il compito <strong>di</strong> trasportare ogni messaggio da un agente<br />

ad un altro attraverso il protocollo più adatto. Def<strong>in</strong>isce uno standard <strong>di</strong> comunicazione per<br />

<strong>di</strong>verse piattaforme FIPA-compliant. I messaggi scambiati, nella loro forma astratta, sono<br />

composti da una “envelope” e da un “payload”.<br />

• Il payload è rappresentato dal messaggio ACL che l’agente vuole <strong>in</strong>viare e l’MTS non<br />

deve <strong>in</strong> nessun caso alterarlo.<br />

• L’“envelope”, che comprende l’<strong>in</strong>sieme dei parametri necessari al trasporto, è <strong>in</strong>vece la<br />

parte del messaggio utilizzata dagli MTS .<br />

L’<strong>in</strong>sieme <strong>di</strong> specifiche Agent Message Transport tratta il trasporto e la rappresentazione dei<br />

messaggi attraverso reti eterogenee.<br />

22


Presenta delle sottosezioni:<br />

Ambiente <strong>di</strong> sviluppo<br />

• FIPA ACL Message Representation specifications: che trattano le <strong>di</strong>verse forme <strong>di</strong><br />

rappresentazione per i messaggi ACL.<br />

• FIPA Envelope Representation specifications: trattano le <strong>di</strong>verse forme <strong>di</strong><br />

rappresentazione per l’envelope del messaggio ACL.<br />

• FIPA Agent Message Transport Protocol (MTP) specifications: trattano <strong>di</strong>versi protocolli<br />

per il trasporto <strong>di</strong> rete <strong>in</strong> grado <strong>di</strong> trasportare messaggi ACL.<br />

2.5. FIPA-ACL<br />

Il FIPA-ACL (Agent Comunication Language) fornisce le specifiche fondamentali per<br />

implementare un l<strong>in</strong>guaggio <strong>di</strong> comunicazione fra agenti, che si basa sostanzialmente sulla<br />

teoria degli atti l<strong>in</strong>guistici. Tale teoria asserisce che i messaggi rappresentano azioni, o atti<br />

comunicativi (anche conosciuti come atti l<strong>in</strong>guistici o performativi), cioè che un messaggio ha<br />

l’<strong>in</strong>tento <strong>di</strong> trasferire le <strong>in</strong>tenzioni e i desideri del mittente al dest<strong>in</strong>atario. Il FIPA-ACL<br />

presenta le seguenti proprietà:<br />

è capace <strong>di</strong> esprime i <strong>di</strong>versi atti l<strong>in</strong>guistici (<strong>in</strong>formare, richiedere, ...);<br />

è <strong>in</strong><strong>di</strong>pendente dal protocollo <strong>di</strong> comunicazione utilizzato;<br />

è <strong>in</strong><strong>di</strong>fferente al contenuto e al formato dell’<strong>in</strong>formazione;<br />

è comprensibile da tutti gli altri agenti.<br />

Un messaggio FIPA ACL contiene un <strong>in</strong>sieme <strong>di</strong> parametri che varia <strong>in</strong> funzione della<br />

situazione d’uso. L’unico parametro obbligatorio, che deve essere presente <strong>in</strong> tutti i<br />

messaggi, è il performative o atto performativo, che <strong>in</strong><strong>di</strong>ca il tipo <strong>di</strong> comunicazione che si<br />

vuole effettuare. In una tipica comunicazione sono quasi sempre presenti anche il sender<br />

(l’agente che <strong>in</strong>via il messaggio), il receiver (il dest<strong>in</strong>atario del messaggio) ed il content (il<br />

contenuto vero e proprio del messaggio). Non c’è l’obbligo <strong>di</strong> usare un l<strong>in</strong>guaggio particolare<br />

per esprimere il contenuto, all’<strong>in</strong>terno della struttura <strong>di</strong> un messaggio, sebbene esistano<br />

23


Ambiente <strong>di</strong> sviluppo<br />

specifiche per <strong>di</strong>verse rappresentazioni fra cui FIPA-SL, FIPA-KIF e FIPA-RDF (solo quella<br />

relativa a FIPA-SL, fra queste, è stata promossa allo stato <strong>di</strong> standard).<br />

Parametri del messaggio FIPA-ACL<br />

Parametro Descrizione<br />

performative<br />

sender<br />

receiver<br />

reply-to<br />

Content<br />

language<br />

enco<strong>di</strong>ng<br />

ontology<br />

Denotes the type of the communicative act of the ACL<br />

message<br />

Denotes the identity of the sender of the message, that is,<br />

the name of the agent of the communicative act.<br />

Denotes the identity of the <strong>in</strong>tended recipients of the<br />

message.<br />

This parameter <strong>in</strong><strong>di</strong>cates that subsequent messages <strong>in</strong> this<br />

conversation thread are to be <strong>di</strong>rected to the agent named<br />

<strong>in</strong> the reply-to parameter, <strong>in</strong>stead of to the agent named <strong>in</strong><br />

the sender parameter.<br />

Denotes the content of the message; equivalently denotes<br />

the object of the action. The mean<strong>in</strong>g of the content of any<br />

ACL message is <strong>in</strong>tended to be <strong>in</strong>terpreted by the receiver of<br />

the message. This is particularly relevant for <strong>in</strong>stance when<br />

referr<strong>in</strong>g to referential expressions, whose <strong>in</strong>terpretation<br />

might be <strong>di</strong>fferent for the sender and the receiver.<br />

Denotes the language <strong>in</strong> which the content parameter is<br />

expressed.<br />

Denotes the specific enco<strong>di</strong>ng of the content language<br />

expression.<br />

Categorie dei<br />

Parametri<br />

Tipo <strong>di</strong> atto<br />

comunicativo<br />

Participante alla<br />

communicazione<br />

Participante alla<br />

communicazione<br />

Participante alla<br />

communicazione<br />

Contenuto del<br />

messaggio<br />

Descrizione del<br />

contenuto<br />

Descrizione del<br />

contenuto<br />

Denotes the ontology(s) used to give a mean<strong>in</strong>g to the Descrizione del<br />

24


protocol<br />

conversation-id<br />

reply-with<br />

<strong>in</strong>-reply-to<br />

reply-by<br />

Ambiente <strong>di</strong> sviluppo<br />

symbols <strong>in</strong> the content expression. contenuto<br />

Denotes the <strong>in</strong>teraction protocol that the sen<strong>di</strong>ng agent is<br />

employ<strong>in</strong>g with this ACL message.<br />

<strong>in</strong>troduces an expression (a conversation identifier) which is<br />

used to identify the ongo<strong>in</strong>g sequence of communicative<br />

acts that together form a conversation.<br />

Controllo della<br />

conversazione<br />

Controllo della<br />

conversazione<br />

Introduces an expression that will be used by the respon<strong>di</strong>ng Controllo della<br />

agent to identify this message.<br />

Denotes an expression that references an earlier action to<br />

which this message is a reply.<br />

Denotes a time and/or date expression which <strong>in</strong><strong>di</strong>cates the<br />

latest time by which the sen<strong>di</strong>ng agent would like to receive<br />

a reply.<br />

Tabella 2-1 Parametri del messaggio FIPA-ACL<br />

2.5.1. FIPA Comunicative Act Library<br />

Specification<br />

conversazione<br />

Controllo della<br />

conversazione<br />

Controllo della<br />

conversazione<br />

Un agente che vuole <strong>in</strong>viare un messaggio ad un altro deve esprimere la sua <strong>in</strong>tenzione.<br />

Questo viene realizzato <strong>in</strong>iziando ogni messaggio con delle parole chiave che rappresentano<br />

l’<strong>in</strong>tenzione dell’agente che ha <strong>in</strong>viato il messaggio stesso. Tale parola chiave è il tipo <strong>di</strong> atto<br />

comunicativo. Questo standard fornisce una libreria <strong>di</strong> tutti gli atti comunicativi riconosciuti<br />

dalla FIPA, ed utilizzabili nel l<strong>in</strong>guaggio FIPA-ACL. E’ stabilito negli standard che per essere<br />

completamente compatibile un agente deve essere capace <strong>di</strong> ricevere qualsiasi atto<br />

comunicativo FIPA-ACL e almeno rispondere, nel caso che il messaggio ricevuto non possa<br />

25


Ambiente <strong>di</strong> sviluppo<br />

essere processato, con un messaggio not-understood. Alcuni atti comunicativi e loro<br />

significato:<br />

Accept proposal Failure Propose Reject proposal<br />

Agree Inform Proxy Request<br />

Cancel Inform if Query if Request when<br />

Call for proposal Inform ref Query ref Request whenever<br />

Confirm Not-undeerstood Refuse Subscribe<br />

Disconfirm Propagate<br />

Accept proposal In<strong>di</strong>ca che si accetta una proposta precedentemente ricevuta <strong>di</strong> eseguire una certa<br />

azione<br />

Agree In<strong>di</strong>ca che si acconsente ad eseguire qualche azione eventualmente <strong>in</strong> futuro<br />

Call for Proposal In<strong>di</strong>ca che si attendono proposte per l’esecuzione <strong>di</strong> una certa azione<br />

Failure Comunica il fallimento del tentativo <strong>di</strong> eseguire una certa azione<br />

Inform Il mittente <strong>in</strong>forma il dest<strong>in</strong>atario che una data proposizione è vera<br />

Not Understood Il mittente comunica al dest<strong>in</strong>atario che ha percepito l’azione da lui compiuta ma non<br />

è stato <strong>in</strong> grado <strong>di</strong> <strong>in</strong>terpretarla. Il caso più semplice e comune è la non comprensione<br />

<strong>di</strong> un certo messaggio ricevuto.<br />

Propose Comunica una proposta <strong>di</strong> eseguire una certa azione sotto determ<strong>in</strong>ate con<strong>di</strong>zioni<br />

Refuse Comunica il rifiuto ad eseguire un’azione e la motivazione<br />

Reject Proposal In<strong>di</strong>ca il rifiuto <strong>di</strong> una proposta durante un processo <strong>di</strong> negoziazione<br />

Request Il mittente chiede al dest<strong>in</strong>atario <strong>di</strong> compiere una certa azione<br />

Tabella 2-2 Atti comunicativi e significato<br />

26


Ambiente <strong>di</strong> sviluppo<br />

2.5.2. FIPA SL Content Languages Specification<br />

Questa specifica def<strong>in</strong>isce una s<strong>in</strong>tassi concreta per il FIPA Semantic Language (SL) (la quale<br />

può essere considerata una sotto-grammatica <strong>di</strong> una s<strong>in</strong>tassi molto più generale che è quella<br />

s-expression). Tale l<strong>in</strong>guaggio può essere impiegato nell’espressione dei contenuti, <strong>in</strong> quanto<br />

capace <strong>di</strong> def<strong>in</strong>ire la semantica <strong>in</strong>tenzionale per gli atti comunicativi. Questa s<strong>in</strong>tassi e la<br />

semantica associata sono proposte per l’uso congiunto con il FIPA Agent Communication<br />

Language. Un’espressione <strong>di</strong> contenuto, nella forma del FIPA-SL, usata come contenuto <strong>di</strong> un<br />

messaggio ACL, può assumere tre forme:<br />

1. Proposizione, che può avere assegnato un valore <strong>di</strong> verità <strong>in</strong> un dato contesto. Nel<br />

dettaglio essa è una formula ben-formata (fbf) usando le opportune regole <strong>di</strong><br />

produzione. Una proposizione è usata nel CA <strong>in</strong>form e <strong>in</strong> altri CA derivati da esso.<br />

2. Azione, che può essere eseguita. Si può trattare <strong>di</strong> una s<strong>in</strong>gola azione o <strong>di</strong> un’azione<br />

composta, costruita usando operatori <strong>di</strong> sequenzializzazione (sequenc<strong>in</strong>g - ;) e <strong>di</strong> scelta<br />

fra alternative (alternative - |). Un’azione è usata come espressione <strong>di</strong> contenuto quando<br />

l’atto è request e altri CA derivati da esso.<br />

3. Espressione <strong>di</strong> riferimento identificativo (IRE), che identifica un oggetto nel dom<strong>in</strong>io. Si<br />

ottiene con l’uso <strong>di</strong> un operatore referenziale (iota, any, all) ed è usata nel gruppo <strong>di</strong><br />

coman<strong>di</strong> <strong>in</strong>form-ref e negli altri CA derivati da esso.<br />

Altre espressioni <strong>di</strong> contenuto valide si possono ottenere come composizione dei casi<br />

precedenti. Ad esempio:<br />

- Una coppia action-con<strong>di</strong>tion (rappresentata da un’azione seguita da una fbf) è usata<br />

nell’atto comunicativo propose.<br />

- Una terna action-con<strong>di</strong>tion-reason (rappresentata da una azione seguita da due fbf) è<br />

usata nell’atto comunicativo reject-proposal.<br />

L’esempio illustra un’<strong>in</strong>terazione fra due agenti A e B che fanno uso dell’operatore iota, dove<br />

si suppone che l’agente A abbia la seguente base <strong>di</strong> conoscenza<br />

– KB = {P(A), Q(1, A), Q(1, B)}.<br />

27


Ambiente <strong>di</strong> sviluppo<br />

L’espressione (iota x (P x)) può essere letta come “la x tale che P *è vero+ <strong>di</strong> x”.<br />

L’operatore iota def<strong>in</strong>isce uno scope per l’espressione data, nel quale è def<strong>in</strong>ito<br />

l’identificatore che altrimenti sarebbe libero; è un costruttore per term<strong>in</strong>i che denotano<br />

oggetti del dom<strong>in</strong>io del <strong>di</strong>scorso.<br />

L’unico oggetto che sod<strong>di</strong>sfa la proposizione P(x) è a; qu<strong>in</strong><strong>di</strong>, al messaggio query-ref <strong>in</strong>viato<br />

da B viene mandato <strong>in</strong> risposta il messaggio <strong>in</strong>form come mostrato.<br />

2.5.3. FIPA Agent Message Transport Service<br />

Specification<br />

Un FIPA Message Transport Service (MTS) fornisce il meccanismo per il trasferimento dei<br />

messaggi FIPA-ACL fra agenti usando un Protocollo <strong>di</strong> Trasporto dei Messaggi (MTP). Gli<br />

agenti co<strong>in</strong>volti possono essere locali rispetto ad un unico AP o trovarsi su piattaforma<br />

<strong>di</strong>verse. In ogni dato AP, l’MTS è fornito <strong>di</strong> un Agent Communication Channel (ACC) che è<br />

responsabile dell’<strong>in</strong>vio e della ricezione dei messaggi sull’AP: esso deve trasferire i messaggi<br />

che riceve <strong>in</strong> conformità con le istruzioni <strong>di</strong> trasporto contenute nell’<strong>in</strong>volucro del messaggio<br />

e gli viene richiesto soltanto <strong>di</strong> leggere tale “envelope”; non gli è richiesto <strong>di</strong> analizzare il<br />

payload del messaggio. Ogni MTP può usare una rappresentazione <strong>in</strong>terna <strong>di</strong>versa per<br />

28


Ambiente <strong>di</strong> sviluppo<br />

descrivere l’envelope del messaggio, ma deve esprimere gli stessi term<strong>in</strong>i, rappresentare la<br />

stessa semantica ed eseguire le corrispondenti azioni. L’envelope <strong>di</strong> un messaggio<br />

comprende una collezione <strong>di</strong> parametri ognuno dei quali è una coppia nome/valore con i<br />

campi obbligatori to, from, date e acl-representation, ogni ACC che maneggia un messaggio<br />

può aggiungere nuova <strong>in</strong>formazione al “message envelope” stesso, ma non può mai<br />

sovrascrivere l’<strong>in</strong>formazione (payload) esistente. Il comportamento <strong>di</strong> un ACC nell’<strong>in</strong>oltrare i<br />

messaggi è determ<strong>in</strong>ato dalle istruzioni per la consegna del messaggio che sono espresse nel<br />

“message envelope”.<br />

Parameter Description<br />

to<br />

from<br />

The names of the primary recipients of the message. If no <strong>in</strong>tended-receiver<br />

parameter is present, then the <strong>in</strong>formation <strong>in</strong> this parameter is used to<br />

generate <strong>in</strong>tended-receiver field for the messages the ACC subsequently<br />

forwards.<br />

comments Text comments.<br />

acl-representation<br />

payload-length<br />

payload-enco<strong>di</strong>ng<br />

date<br />

<strong>in</strong>tended-receiver<br />

The name of the agent that sent the message. If required, the ACC returns<br />

error and confirmation messages to the agent specified <strong>in</strong> this parameter.<br />

The syntax representation of the message payload. This <strong>in</strong>formation is<br />

<strong>in</strong>tended for the f<strong>in</strong>al recipient of the message.<br />

The length <strong>in</strong> bytes of the message payload. The ACC may use this<br />

<strong>in</strong>formation to improve pars<strong>in</strong>g efficiency.<br />

The language enco<strong>di</strong>ng of the message payload. This <strong>in</strong>formation is <strong>in</strong>tended<br />

for the f<strong>in</strong>al recipient of the message.<br />

The creation date and time of the message envelope. This <strong>in</strong>formation is<br />

<strong>in</strong>tended for the f<strong>in</strong>al recipient of the message.<br />

The name of the agents to whom this <strong>in</strong>stance of a message is to be<br />

delivered. An ACC uses this parameter to determ<strong>in</strong>e where this <strong>in</strong>stance of a<br />

29


eceived<br />

Ambiente <strong>di</strong> sviluppo<br />

message should be sent. If this parameter is not provided, then the first ACC<br />

to receive the message should generate an <strong>in</strong>tended-receiver parameter<br />

us<strong>in</strong>g the to parameter.<br />

A stamp <strong>in</strong><strong>di</strong>cat<strong>in</strong>g receipt of a message by an ACC. A new received<br />

parameter is added to the envelope by each ACC that the message passes<br />

through. Each ACC handl<strong>in</strong>g a message must add a completed received<br />

parameter. If an ACC receives a message it has already stamped, it is free to<br />

<strong>di</strong>scard the message without any need to generate an error message.<br />

transport-behaviour The transport requirements of the message. Reserved for future use.<br />

Tabella 2-3 Parametri messaggio<br />

I dest<strong>in</strong>atari <strong>di</strong> un messaggio sono specificati nel parametro to e prendono la forma <strong>di</strong> AID. A<br />

seconda della presenza del parametro <strong>in</strong>tended-receiver, l’ACC <strong>in</strong>oltra i messaggi <strong>in</strong> uno dei<br />

seguenti mo<strong>di</strong>:<br />

• Se un ACC riceve un envelope <strong>di</strong> messaggio senza il parametro <strong>in</strong>tended-receiver, allora<br />

esso genera un nuovo parametro <strong>in</strong>tended-receiver dal parametro to. Esso può anche<br />

generare più copie del messaggio con <strong>di</strong>versi parametri <strong>in</strong>tended-receiver se sono<br />

specificati più dest<strong>in</strong>atari. In ogni caso, all’ACC è richiesto <strong>di</strong> elaborare tutti gli elementi<br />

nel parametro to e <strong>di</strong> non aggiungere né <strong>di</strong> rimuovere alcun AID che sia contenuto nel<br />

messaggio orig<strong>in</strong>ale. Il parametro <strong>in</strong>tended-receiver forma un percorso <strong>di</strong> consegna che<br />

mostra il camm<strong>in</strong>o che il messaggio ha <strong>in</strong>trapreso.<br />

• Se un ACC riceve un envelope <strong>di</strong> messaggio con un parametro <strong>in</strong>tended-receiver, questo<br />

è usato per la consegna e il parametro to è ignorato.<br />

• Se un ACC riceve un envelope <strong>di</strong> messaggio con più <strong>di</strong> un parametro <strong>in</strong>tended-receiver,<br />

viene usato il più recente.<br />

Prima <strong>di</strong> <strong>in</strong>oltrare il messaggio l’ACC aggiunge un parametro received all’envelope. Una volta<br />

che l’ACC ha <strong>in</strong>oltrato il messaggio non ha più bisogno <strong>di</strong> tenere alcuna traccia della sua<br />

esistenza.<br />

30


Ambiente <strong>di</strong> sviluppo<br />

L’AID presente nel parametro to o <strong>in</strong>tended-receiver del “message envelope” può contenere<br />

più <strong>in</strong><strong>di</strong>rizzi <strong>di</strong> trasporto per un s<strong>in</strong>golo agente dest<strong>in</strong>atario.<br />

L’ACC usa il seguente metodo per cercare <strong>di</strong> consegnare il messaggio:<br />

• Prova a consegnare il messaggio al primo <strong>in</strong><strong>di</strong>rizzo <strong>di</strong> trasporto nel parametro addresses<br />

(per riflettere il fatto che la lista degli <strong>in</strong><strong>di</strong>rizzi <strong>di</strong> trasporto <strong>in</strong> un AID è or<strong>di</strong>nata a seconda<br />

della preferenza).<br />

• Se fallisce (perché l’agente o l’AP non sono <strong>di</strong>sponibili o perché l’ACC non supporta il<br />

protocollo <strong>di</strong> trasporto del messaggio appropriato, etc.), allora l’ACC crea un nuovo<br />

parametro <strong>in</strong>tended-receiver che contiene l’AID senza l’<strong>in</strong><strong>di</strong>rizzo <strong>di</strong> trasporto che ha<br />

portato al fallimento dell’operazione. L’ACC poi tenta <strong>di</strong> mandare il messaggio<br />

all’<strong>in</strong><strong>di</strong>rizzo <strong>di</strong> trasporto successivo nell’AID della lista <strong>in</strong>tended-receiver.<br />

• Se la consegna ancora non ha successo quando sono stati provati tutti gli <strong>in</strong><strong>di</strong>rizzi <strong>di</strong><br />

trasporto (o se l’AID non contiene alcun <strong>in</strong><strong>di</strong>rizzo <strong>di</strong> trasporto), l’ACC può provare a<br />

stabilire l’AID usando i servizi <strong>di</strong> risoluzione dei nomi elencati nel parametro resolvers<br />

dell’AID. Nuovamente, i servizi <strong>di</strong> risoluzione dei nomi devono essere provati nell’or<strong>di</strong>ne<br />

<strong>in</strong> cui compaiono.<br />

• Inf<strong>in</strong>e, se tutti i precedenti tentativi <strong>di</strong> consegna dei messaggi falliscono, viene mandato<br />

<strong>in</strong><strong>di</strong>etro un appropriato messaggio per il fallimento f<strong>in</strong>ale all’agente mittente.<br />

Un ACC usa le seguenti regole nel consegnare i messaggi a dest<strong>in</strong>atari multipli:<br />

• Se un ACC riceve un <strong>in</strong>volucro <strong>di</strong> messaggio senza parametro <strong>in</strong>tended-receiver e con un<br />

parametro to che contiene più <strong>di</strong> un AID, esso può o meno <strong>di</strong>viderli per formare<br />

messaggi separati. Ogni messaggio contiene un sotto<strong>in</strong>sieme degli agenti nom<strong>in</strong>ati nei<br />

parametri to e <strong>in</strong>tended-receiver.<br />

• Se un ACC riceve un <strong>in</strong>volucro <strong>di</strong> messaggio con un parametro <strong>in</strong>tended-receiver<br />

contenente più <strong>di</strong> un AID, esso può o meno <strong>di</strong>viderli per formare messaggi separati.<br />

31


Ambiente <strong>di</strong> sviluppo<br />

2.6. JADE: Java agent development<br />

environment<br />

2.6.1. JADE: caratteristiche generali<br />

JADE (Java Agent DEvelopment Framework) è un ambiente <strong>di</strong> sviluppo <strong>di</strong> software ad agenti<br />

<strong>in</strong>teramente implementato <strong>in</strong> l<strong>in</strong>guaggio Java ([8]). Esso semplifica l’implementazione <strong>di</strong><br />

sistemi multi-agente attraverso un middleware che sod<strong>di</strong>sfa le specifiche FIPA e un set <strong>di</strong><br />

tools per il supporto alle fasi <strong>di</strong> debugg<strong>in</strong>g e sviluppo. È stato sviluppato grazie alla<br />

collaborazione del CSELT (Centro Stu<strong>di</strong> E Laboratori Telecomunicazioni) <strong>di</strong> Tor<strong>in</strong>o e del<br />

<strong>di</strong>partimento <strong>di</strong> Informatica dell’Università <strong>di</strong> Parma. É un software libero <strong>di</strong>stribuito secondo<br />

la licenza GNU LGPL (Lesser General Public Licencse). Tale licenza è meno restrittiva della<br />

licenza GPL. Permette <strong>in</strong>fatti <strong>di</strong> <strong>di</strong>stribuire prodotti commerciali che contengano al loro<br />

<strong>in</strong>terno il co<strong>di</strong>ce <strong>in</strong> esame a patto che sia <strong>di</strong>st<strong>in</strong>guibile dal resto dell’applicazione. Inoltre<br />

qualsiasi mo<strong>di</strong>fica alla libreria soggetta alla licenza LGPL deve essere documentata. Inf<strong>in</strong>e<br />

occorre sottol<strong>in</strong>eare che nel caso le classi della libreria che sottostà alla licenza LGPL ed il<br />

co<strong>di</strong>ce proprietario siano <strong>di</strong>st<strong>in</strong>guibili, allora la licenza LGPL non si estende automaticamente<br />

anche all’applicazione risultante che può essere qu<strong>in</strong><strong>di</strong> <strong>di</strong>stribuita con la licenza desiderata.<br />

JADE richiede come unico presupposto la presenza <strong>di</strong> una Java Virtual Mach<strong>in</strong>e (almeno ver.<br />

1.2) per ogni host su cui viene <strong>in</strong>stallato.<br />

Le caratteristiche pr<strong>in</strong>cipali <strong>di</strong> JADE sono:<br />

- una piattaforma ad agenti conforme alle specifiche FIPA che <strong>in</strong>clude gli agenti obbligatori<br />

quali: AMS (Agent Management System), DF (Directory Facilitator), MTS (Message<br />

Transport System). In base alle specifiche FIPA 2000 l’MTS non è un agente ma è una<br />

componente della piattaforma. Tutti e tre questi elementi vengono avviati<br />

automaticamene all’avvio della piattaforma.<br />

- una piattaforma ad agenti <strong>di</strong>stribuiti su <strong>di</strong>versi host. È possibile anche avviare più <strong>di</strong> una<br />

piattaforma (AP) sullo stesso host ma questa operazione viene sconsigliata dagli stessi<br />

32


Ambiente <strong>di</strong> sviluppo<br />

sviluppatori <strong>in</strong> quanto rallenta notevolmente la CPU che viene sovraccaricata, <strong>in</strong>oltre le<br />

comunicazioni sono più lente e più complesse da realizzare <strong>in</strong> quanto occorre def<strong>in</strong>ire<br />

nel protocollo anche la piattaforma che si vuole <strong>in</strong><strong>di</strong>rizzare.<br />

- agenti implementati come threads Java che vivono all’<strong>in</strong>terno <strong>di</strong> Agent Conta<strong>in</strong>ers (AC) i<br />

quali provvedono all’esecuzione run-time degli agenti. Ogni AP contiene uno o più AC. La<br />

soluzione a threads consente agli agenti <strong>di</strong> eseguire più task concorrentemente e<br />

permette una comunicazione leggera ed efficiente.<br />

- più DFs FIPA-Compliants che possono essere avviati a run-time al f<strong>in</strong>e <strong>di</strong> implementare<br />

applicazioni multidom<strong>in</strong>io, dove un dom<strong>in</strong>io è un set logico <strong>di</strong> agenti i cui servizi sono<br />

<strong>in</strong>seriti <strong>in</strong> un “facilitator” comune. Ogni DF ere<strong>di</strong>ta un’<strong>in</strong>terfaccia GUI e tutte le capacità<br />

standard def<strong>in</strong>ite dalle specifiche FIPA (es. capacità <strong>di</strong> registrare, deregistrare, mo<strong>di</strong>ficare<br />

e cercare agenti; capacità <strong>di</strong> “federat<strong>in</strong>g” <strong>in</strong> una rete <strong>di</strong> DFs). È da notare, <strong>in</strong>oltre, che<br />

ogni agente della piattaforma può registrarsi a più DF della piattaforma <strong>in</strong> modo da<br />

fornire il proprio servizio ad una comunità <strong>di</strong> agenti più vasta.<br />

- una comunicazione basata sul trasporto <strong>di</strong> messaggi ACL che sono essi stessi oggetti<br />

Java. Tale soluzione facilita il programmatore nella creazione <strong>di</strong> messaggi.<br />

- un meccanismo <strong>di</strong> trasporto efficiente che utilizza i protocolli JAVA RMI, la notifica <strong>di</strong><br />

eventi ed il protocollo IIOP (Internet Inter-Orb Protocol). Il meccanismo è <strong>in</strong>telligente e<br />

per ogni messaggio utilizza automaticamente il protocollo più appropriato.<br />

- una libreria <strong>di</strong> protocolli <strong>di</strong> <strong>in</strong>terazione per la comunicazione fra agenti conformi agli<br />

standard def<strong>in</strong>iti da FIPA.<br />

- un servizio <strong>di</strong> nomi FIPA-compliant per cui all’atto della registrazione degli agenti presso<br />

l’AMS, questi ottengono il loro AID dalla piattaforma.<br />

- un supporto all’esecuzione <strong>di</strong> attività multiple, parallele o concorrenti degli agenti,<br />

attraverso modelli <strong>di</strong> comportamento <strong>di</strong> quest’utlimi già pre<strong>di</strong>sposti <strong>di</strong> tipo: run once,<br />

ciclico, sequenziale, parallelo, FSM (F<strong>in</strong>ite State Mach<strong>in</strong>e). JADE provvede allo schedul<strong>in</strong>g<br />

degli agenti <strong>in</strong> modo non-preemptive.<br />

33


Ambiente <strong>di</strong> sviluppo<br />

- tools <strong>di</strong> debug per favorire lo sviluppo <strong>di</strong> applicazioni multiagente basate su JADE:<br />

Remote Management Agent (RMA), Dummy Agent, Sniffer, DF GUI, Introspector Agent.<br />

- il supporto a l<strong>in</strong>guaggi ed ontologie che possono essere implementati, registrati con gli<br />

agenti ed automaticamente utilizzati nel framework. A riguardo esiste il software<br />

Protegè per la def<strong>in</strong>izione <strong>di</strong> ontologie dotato <strong>di</strong> un plug-<strong>in</strong> chiamato BeanGenerator che<br />

genera classi Java <strong>di</strong>rettamente utilizzabili da JADE.<br />

- un supporto alla mobilità <strong>in</strong>tra-platform <strong>di</strong> agenti <strong>in</strong>cludendo stato, co<strong>di</strong>ce ed ontologie<br />

dell’agente.<br />

- un’<strong>in</strong>terfaccia GUI per monitorare gli agenti della piattaforma e le comunicazioni fra <strong>di</strong><br />

essi da un host remoto.<br />

2.6.2. Architettura JADE<br />

La piattaforma è composta da conta<strong>in</strong>er, ogni istanza del JADE run time è un conta<strong>in</strong>er, che<br />

fornisce il JADE run time e tutti i servizi per ospitare ed eseguire gli agenti. C’è un conta<strong>in</strong>er<br />

speciale, il ma<strong>in</strong>-conta<strong>in</strong>er, che fa da bootstrap per la piattaforma, <strong>in</strong>fatti è il primo conta<strong>in</strong>er<br />

ad esser lanciato e tutti gli altri conta<strong>in</strong>er devono unirsi e registrarsi ad esso. Le pr<strong>in</strong>cipali<br />

funzioni del ma<strong>in</strong>-conta<strong>in</strong>er sono:<br />

1. Management del Conta<strong>in</strong>er Table ( CT ), cioè il registro degli object reference e degli<br />

<strong>in</strong><strong>di</strong>rizzi <strong>di</strong> livello trasporto <strong>di</strong> tutti i conta<strong>in</strong>er che compongono la piattaforma.<br />

2. Management del Global Agent Description Table ( GADT ), il registro <strong>di</strong> tutti gli agenti<br />

presenti nella piattaforma che contiene il loro stato e la loro locazione.<br />

3. Ospitare l’AMS e il DF, che sono gli agenti che provvedono al servizio <strong>di</strong> pag<strong>in</strong>e bianche e<br />

pag<strong>in</strong>e gialle rispettivamente. La figura 2.9 illustra l’architettura JADE:<br />

34


Ambiente <strong>di</strong> sviluppo<br />

Figura 2-9 Architettura JADE<br />

2.6.3. Message Transport Service<br />

Questo servizio gestisce lo scambio messaggi all’<strong>in</strong>terno della piattaforma e tra le<br />

piattaforme. Per ottenere l’<strong>in</strong>teroperabilità tra i vari tipi <strong>di</strong> piattaforme ( non JADE ) JADE<br />

supporta tutti gli MTP def<strong>in</strong>iti dallo standard FIPA, dove ognuno <strong>di</strong> questi <strong>in</strong>clude la<br />

def<strong>in</strong>izione <strong>di</strong> un protocollo <strong>di</strong> livello trasporto e <strong>di</strong> una co<strong>di</strong>fica standard dei messaggi. Di<br />

default JADE quando viene avviato utilizza il protocollo http che crea una server socket<br />

sull’host del ma<strong>in</strong>-conta<strong>in</strong>er. Dalla l<strong>in</strong>ea <strong>di</strong> comando tramite opzioni è possibile utilizzare più<br />

MTP sullo stesso conta<strong>in</strong>er. Tale opzione può essere attivata anche dalla GUI creata<br />

dall’agente RMA. Grazie a questa opzione, si possono <strong>in</strong><strong>di</strong>viduare agenti, che hanno<br />

connessioni aperte verso reti esterne, aumentando il livello <strong>di</strong> sicurezza della rete. Quando su<br />

35


Ambiente <strong>di</strong> sviluppo<br />

un conta<strong>in</strong>er, viene attivata una nuova MTP, l’<strong>in</strong>tera piattaforma ottiene un nuovo <strong>in</strong><strong>di</strong>rizzo<br />

<strong>di</strong> livello trasporto, che è un nuovo end-po<strong>in</strong>t dove i messaggi possono essere ricevuti.<br />

Infatti questo <strong>in</strong><strong>di</strong>rizzo viene aggiunto alle seguenti strutture dati:<br />

• Platform profile, ottenibile dall’AMS grazie all’azione get-description.<br />

• Al local AID, che ogni agente su ogni conta<strong>in</strong>er può ottenere grazie al metodo getAID();<br />

• All’oggetto ams-agent-description, contenuto nell’AMS repository, ottenibile grazie ad una<br />

operazione <strong>di</strong> ricerca. Con la <strong>di</strong>stribuzione pr<strong>in</strong>cipale <strong>di</strong> JADE, sono <strong>di</strong>spobili i protocolli IIOP<br />

ed HTTP, tutti gli altri protocolli possono essere scaricati dal sito come add-on. Grazie alla<br />

console JADE RMA è possibile attivare e <strong>di</strong>sattivare gli MTP <strong>in</strong>stallati, mentre la piattaforma è<br />

<strong>in</strong> esecuzione, tramite le opzioni della GUI <strong>in</strong>stall a new MTP e un<strong>in</strong>stall a new MTP. Tramire<br />

un’altra opzione a l<strong>in</strong>ea <strong>di</strong> comando, è possibile <strong>di</strong>sattivare l’MTP che <strong>di</strong> default è attivo sul<br />

ma<strong>in</strong>-conta<strong>in</strong>er; questo isola la piattaforma dalle comunicazioni con piattaforme remote. I<br />

conta<strong>in</strong>er della stessa piattaforma comunicano, <strong>in</strong>vece, grazie ad un altro protocollo<br />

chiamato IMTP ( Internal Message Transport Protocol ).<br />

2.6.4. IMTP ( Internal Message Transport<br />

Protocol )<br />

IMTP è il protocollo <strong>di</strong> tipo proprietario, usato per lo scambio dei messaggi tra gli agenti che<br />

vivono <strong>in</strong> conta<strong>in</strong>er <strong>di</strong>fferenti della stessa piattaforma. E’ <strong>di</strong> tipo proprietario perché<br />

operando all’<strong>in</strong>terno della stessa piattaforma, può anche non essere compatibile con gli altri<br />

standar<strong>di</strong>zzati dalla FIPA, non è usato soltanto per lo scambio dei messaggi ma anche per<br />

trasferire coman<strong>di</strong>, come ad esempio lo shut-down <strong>di</strong> un conta<strong>in</strong>er. Esistono due tipi <strong>di</strong> IMTP<br />

uno, attivo <strong>di</strong> default, che si basa su JAVA RMI [21] ed un altro utilizzato per i <strong>di</strong>spositivi<br />

mobili, data l’assenza <strong>di</strong> supporto per JAVA RMI, che può esser aggiunto come add-on. Per<br />

entrambi i protocolli ci sono opzioni che permettono un f<strong>in</strong>e-tun<strong>in</strong>g, per particolari reti e<br />

particolari <strong>di</strong>spositivi. Il protocollo RMI-IMTP è implementato dal package jade.imtp.rmi e<br />

stabilisce che quando il ma<strong>in</strong>conta<strong>in</strong>er viene avviato cerca l’RMI registry, se non lo trova ne<br />

36


Ambiente <strong>di</strong> sviluppo<br />

crea uno nuovo. Invece quando un conta<strong>in</strong>er viene avviato cerca l’RMI registry e richiede<br />

l’object reference del ma<strong>in</strong>-conta<strong>in</strong>er, dopo<strong>di</strong>chè <strong>in</strong>voca il metodo addnode(), dello stesso<br />

ma<strong>in</strong>-conta<strong>in</strong>er, e registra il suo object reference.<br />

RMA agent<br />

2.6.5. Special agents<br />

L’RMA implementa l’<strong>in</strong>terfaccia del sistema per il management della piattaforma.<br />

Fornisce un’<strong>in</strong>terfaccia grafica per amm<strong>in</strong>istrare una piattaforma composta da più conta<strong>in</strong>er<br />

e da più agenti; <strong>di</strong>versi RMA possono esser lanciati purchè abbiano nomi <strong>di</strong>versi. In fase <strong>di</strong><br />

start-up questo agente si sottoscrive all’AMS per esser notificato su tutti gli eventi della<br />

piattaforma. La figura 2.10 illustra l’<strong>in</strong>terfaccia grafica dell’ RMA. ([13])<br />

Dummy agent<br />

Figura 2-10 GUI dell'Agente RMA<br />

Questo agente permette <strong>di</strong> <strong>in</strong>viare stimoli ad un agente sottoforma <strong>di</strong> messaggi ACL e<br />

valutare il suo comportamento <strong>in</strong> base alle risposte che vengono ricevute. E’ possibile<br />

37


Ambiente <strong>di</strong> sviluppo<br />

tramite <strong>in</strong>terfaccia caricare e salvare messaggi standard. Più istanze <strong>di</strong> questo agente<br />

possono essere lanciate.<br />

Introspector agent<br />

Questo agente è usato per fare il debug del comportamento <strong>di</strong> un s<strong>in</strong>golo agente.<br />

Infatti osserva la coda dei messaggi <strong>in</strong>viati e ricevuti, i comportamenti eseguiti e quelli<br />

mandati <strong>in</strong> sleep<strong>in</strong>g.<br />

Sniffer agent<br />

Questo tool permette <strong>di</strong> fare il debug e <strong>di</strong> documentare, le conversazioni tra gli agenti <strong>di</strong> una<br />

piattaforma. Lo sniffer si sottoscrive all’AMS, per esser notificato <strong>di</strong> tutti i messaggi scambiati<br />

da un certo numero <strong>di</strong> agenti.<br />

Log manager agent<br />

Permette la creazione e la gestione dei file <strong>di</strong> Log. Grazie all’<strong>in</strong>terfaccia grafica può esser<br />

scelto il livello <strong>di</strong> log e del log handler che si vuole utilizzare, per ciascun componente della<br />

piattaforma, tale valori possono anche esser cambiati a run-time.<br />

Uno schema riassuntivo è ilustrato <strong>in</strong> figura 2.11:<br />

38


Ambiente <strong>di</strong> sviluppo<br />

Figura 2-11 Diagramma delle classi <strong>di</strong> JADE tools<br />

39


Ambiente <strong>di</strong> sviluppo<br />

2.6.6. JADE Packages<br />

la piattaforma Jade è organizzata a livelli gerarchici <strong>di</strong> pacchetti java e sottopacchetti, dove<br />

ogni packages contiene un set <strong>di</strong> clssi e <strong>in</strong>terface che implementano specifiche e funzionalità.<br />

I Package pr<strong>in</strong>cipali sono:<br />

Jade.core : rappresenta i cuore dell’<strong>in</strong>tero package. Include un set <strong>di</strong> sotto packages dove<br />

ognuno implementa uno specifico servizio<br />

Jade.core.event : implementa il servizio <strong>di</strong> notifica degli eventi <strong>di</strong>stribuiti nel sistema<br />

Jade.core.management : implementa il ciclo <strong>di</strong> vita degli agenti<br />

Jade.core.messag<strong>in</strong>g : implementa il servizio <strong>di</strong> <strong>di</strong>stribuzione dei messaggi<br />

Jade.core.mobility : implementa il servizio <strong>di</strong> mobilità dell’agente, <strong>in</strong>cludendo il<br />

trasferimento sia dello stato che del co<strong>di</strong>ce dell’agente.<br />

Jade.core.behaviours : Contiene una gerarchia <strong>di</strong> comportamenti degli agenti<br />

Jade.lang : contiene le classi riguardanti i l<strong>in</strong>guaggi <strong>di</strong> comunicazione utilizzati tra cui ACL<br />

Jade.doma<strong>in</strong> : implementa le specifiche FIPA riguardanti i modelli, l<strong>in</strong>guaggi, ontologie.<br />

Contiene anche le implementazioni degli agenti ANS e DF, piu la loro estenzione <strong>in</strong> Jade.<br />

Jade.proto : contiene le classi che implementano i protocolli FIPA per l’<strong>in</strong>terazione tra<br />

agenti (FIPA-REQUEST, FIPA-QUERY)<br />

Jade.gui : set <strong>di</strong> classi generiche utili alla realizzazione <strong>di</strong> <strong>in</strong>terfacce grafiche GUI<br />

Jade.mtp : queste classi sono de<strong>di</strong>cate a tutti i meto<strong>di</strong> per il trasporto dei messaggi<br />

(Message Transport Protocol)<br />

Jade.tools : contiene una serie <strong>di</strong> tools utili alla gestione e al controllo della piattaforma<br />

e/o degli agenti.<br />

40


2.6.7. Classe Agent<br />

Ambiente <strong>di</strong> sviluppo<br />

La classe Agent rappresenta la classe base comune per la specifica <strong>di</strong> agenti def<strong>in</strong>iti<br />

dall’utente. Un agente JADE è dunque un’istanza <strong>di</strong> una classe che estende la classe base<br />

Agent. Questo implica l’ere<strong>di</strong>tà dei meto<strong>di</strong> base <strong>di</strong> registrazione, configurazione, gestione<br />

remota e dei meto<strong>di</strong> utilizzati per def<strong>in</strong>ire il comportamento dell’agente (es. send, receive <strong>di</strong><br />

messaggi o utilizzo <strong>di</strong> protocolli <strong>di</strong> <strong>in</strong>terazione standard).<br />

Il modello computazionale <strong>di</strong> un agente è multitask dove ogni task, detto anche<br />

comportamento (behaviour), viene eseguito concorrentemente. Ogni servizio previsto<br />

dell’agente dovrebbe essere implementato attraverso uno o più behaviours. All’<strong>in</strong>terno<br />

dell’agente base vi è uno scheduler nascosto al programmatore che esegue<br />

automaticamente lo schedul<strong>in</strong>g dei behaviours. Per creare un agente si estende la classe<br />

jade.core.agent e si implementa il metodo setup(). Esempio:<br />

import jade.core.Agent;<br />

public class HelloWorldAgent extends Agent {<br />

protected void setup() {<br />

System.out.pr<strong>in</strong>tln("Hello World! My name is "+getLocalName());<br />

doDelete();} }<br />

Il metodo setup <strong>in</strong>clude l’<strong>in</strong>izializzazione dell’agente, tipiche operazioni come: mostrare gui,<br />

aprire connessione a database, registrare dei servizi che l’agente fornisce al DF e far partire i<br />

comportamenti <strong>in</strong>iziali. È buona pratica non def<strong>in</strong>ire alcun costruttore nella classe agente e <strong>di</strong><br />

fare tutte le <strong>in</strong>izializzazioni nel setup().Ogni istanza <strong>di</strong> un agente è identificato da un Agent<br />

Identifier che applica le specifiche FIPA. In Jade un Agent Identifier è rappresentato come una<br />

istanza <strong>di</strong> jade.core.AID. getAID() ritorna il suo AID, un oggetto AID <strong>in</strong>clude un nome<br />

globalmente unico (GUID) piu un numero <strong>di</strong> <strong>in</strong><strong>di</strong>rizzo. Il nome <strong>in</strong> Jade ha la forma @. Per esempio se ho un agente chiamato Peter che vive su una<br />

piattaforma chiamata foo-platform ha Peter@foo-platform come suo nome globale unico. Gli<br />

<strong>in</strong><strong>di</strong>rizzi <strong>in</strong>clusi nell’AID sono gli <strong>in</strong><strong>di</strong>rizzi della piattaforma dove lui non abita, questi <strong>in</strong><strong>di</strong>rizzi<br />

sono utilizzati solo quando l’agente vuole comunicare con un altro agente <strong>in</strong> una piattaforma<br />

41


Ambiente <strong>di</strong> sviluppo<br />

<strong>di</strong>fferente. L’AID classe fornisce meto<strong>di</strong> per ricevere il nome locale, il GUID e gli <strong>in</strong><strong>di</strong>rizzi,<br />

rispettivamente con i meto<strong>di</strong> getLocalName() , getName() , getAllAddresses(). Esempio:<br />

Protected void setup(){<br />

}<br />

System.out.pr<strong>in</strong>tln(“Hello World”);<br />

System.out.pr<strong>in</strong>tln(“My local name is ”+ getAID().getLocalName());<br />

System.out.pr<strong>in</strong>tln(“My GUID is ”+getAID().getName());<br />

System.out.pr<strong>in</strong>tln(“My addresses are:”);<br />

Iterator it = getAID().getAllAddresses();<br />

While (it.hasNext()){<br />

System.out.pr<strong>in</strong>tln(“_”+it.next());<br />

}<br />

Il nome locale <strong>di</strong> un agente è assegnato dal creatore ed è unico nella piattaforma.<br />

Conoscendo il nome locale <strong>di</strong> un agente puoi ottenere l’AID con<br />

Str<strong>in</strong>g localname=”Peter”;<br />

AID id= new AID(localname,AID.ISLOCALNAME);<br />

Altrettanto conoscendo il GUID <strong>di</strong> un agente puoi ottenere l’AID con :<br />

str<strong>in</strong>g guid=”Peter@foo-platform”;<br />

AID id= new AID(guid,AID.ISGUID);<br />

2.6.8. Comportamenti degli agenti<br />

Un agente deve essere <strong>in</strong> grado <strong>di</strong> eseguire task concorrenti <strong>di</strong>versi <strong>in</strong> risposta ad eventi<br />

esterni <strong>di</strong>versi. Per una gestione efficace dell’agente, ogni agente JADE è composto da un<br />

s<strong>in</strong>golo thread <strong>di</strong> esecuzione e tutti i suoi tasks sono modellati ed implementati come oggetti<br />

Behaviour ([2]). Lo sviluppatore che vuole implementare un task <strong>di</strong> uno specifico agente<br />

dovrebbe def<strong>in</strong>ire una o più sottoclassi <strong>di</strong> Behaviour, istanziarle ed aggiungere gli oggetti<br />

42


Ambiente <strong>di</strong> sviluppo<br />

behaviours alla lista dei tasks dell’agente. É possibile <strong>in</strong>serire o rimuovere behaviours dalla<br />

lista dei tasks dell’agente, non solo all’<strong>in</strong>terno del metodo setup(), ma <strong>in</strong> qualsiasi metodo del<br />

co<strong>di</strong>ce dell’agente attraverso addBehaviour(behaviour) e removeBehaviour(behaviour). Uno<br />

scheduler implementato dalla classe base Agent, nascosto al programmatore, si occupa dello<br />

schedul<strong>in</strong>g dei behaviours <strong>di</strong>sponibili nella coda dei tasks, utilizzando un algoritmo <strong>di</strong> tipo<br />

round-rob<strong>in</strong> non-preemptive. Lo scheduler agisce <strong>in</strong>vocando il metodo action() <strong>di</strong> ogni<br />

Behaviour presente nella coda dei behaviours. Quando il metodo action() term<strong>in</strong>a viene<br />

controllato il metodo done() per verificare se il behaviour ha completato il task oppure no, e<br />

<strong>in</strong> caso affermativo viene tolto dalla coda. Occorre sottol<strong>in</strong>eare che quando il metodo<br />

action() <strong>di</strong> un Behaviour <strong>di</strong> un agente è <strong>in</strong> esecuzione, nessun altro Behaviour della lista dei<br />

comportamenti dell’agente può eseguire f<strong>in</strong>o alla f<strong>in</strong>e del metodo. Ciò vale <strong>in</strong> relazione ai<br />

behaviours <strong>di</strong> uno stesso agente, mentre due comportamenti <strong>di</strong> due agenti <strong>di</strong>versi possono<br />

eseguire il metodo action() concorrentemente. Ogni Behaviour può entrare <strong>in</strong> uno stato<br />

bloccato; <strong>in</strong> particolare, il metodo block() lo pone <strong>in</strong> una lista <strong>di</strong> behaviours bloccati. Ogni<br />

Behaviour viene poi rischedulato ogni qualvolta arriva un nuovo messaggio ACL, se term<strong>in</strong>a<br />

un timeout associato allo stato <strong>di</strong> bloccato oppure se viene <strong>in</strong>vocato esplicitamente il metodo<br />

restart(). JADE fornisce una <strong>di</strong>screta quantità <strong>di</strong> behaviours standard elencati <strong>di</strong> seguito.<br />

- Behaviour: è una classe astratta per modellare i task degli agenti e pone le basi per lo<br />

schedul<strong>in</strong>g dei behaviours. Il metodo block() pone il Behaviour nella lista dei<br />

comportamenti bloccati, tipicamente al f<strong>in</strong>e <strong>di</strong> attendere un determ<strong>in</strong>ato messaggio<br />

ACL <strong>in</strong> arrivo. Vi sono <strong>in</strong>oltre due meto<strong>di</strong> onStart() ed onEnd() attivati rispettivamente<br />

prima e dopo l’esecuzione del behaviour. Il metodo onEnd() è chiamato dopo che il<br />

behaviour è completato e rimosso dalla coda <strong>di</strong> comportamenti attivi.<br />

- SimpleBehaviour: è una classe astratta che modella un comportamento semplice e<br />

atomico. Il suo metodo reset() non fa niente ma può essere ridef<strong>in</strong>ito dalle sottoclassi<br />

def<strong>in</strong>ite dall’utente.<br />

43


Ambiente <strong>di</strong> sviluppo<br />

• OneShotBehaviour: è una sottoclasse astratta <strong>di</strong> SimpleBehaviour che modella un<br />

comportamento atomico che deve essere eseguito solo una volta e non può<br />

essere bloccato. Il suo metodo done() restituisce, qu<strong>in</strong><strong>di</strong>, sempre true.<br />

• CyclicBehaviour: è una sottoclasse astratta <strong>di</strong> SimpleBehaviour che modella un<br />

comportamento atomico che deve essere eseguito per sempre. Il suo metodo<br />

done() restituisce, qu<strong>in</strong><strong>di</strong>, sempre false.<br />

• TickerBehaviour: è una sottoclasse astratta <strong>di</strong> SimpleBehaviour che modella un<br />

comportamento atomico che deve essere eseguito perio<strong>di</strong>camente. Per fare ciò<br />

occorre ridef<strong>in</strong>ire il metodo onTick(). Il periodo viene impostato attraverso un<br />

parametro passato nel costruttore.<br />

- CompositeBehaviour: è una classe astratta che modella un comportamento composto<br />

da un certo numero <strong>di</strong> altri behaviours (figli). Le operazioni eseguite non sono def<strong>in</strong>ite<br />

all’<strong>in</strong>terno <strong>di</strong> questa classe, ma dentro i figli che compongono il CompositeBehaviour<br />

che ha la sola responsabilità <strong>di</strong> schedularli. In realtà la classe CompositeBehaviour non<br />

def<strong>in</strong>isce nessuna regola <strong>di</strong> schedul<strong>in</strong>g; risulta qu<strong>in</strong><strong>di</strong> conveniente per il programmatore<br />

utilizzare una delle sue sottoclassi: SequentialBehaviour, ParallelBehaviour o<br />

FSMBehaviour.<br />

• SequentialBehaviour: è una sottoclasse <strong>di</strong> CompositeBehaviour che esegue i suoi<br />

sub-behaviours <strong>in</strong> modo sequenziale e term<strong>in</strong>a quando tutti i sub-behaviours<br />

sono term<strong>in</strong>ati.<br />

• ParallelBehaviour: è una sottoclasse <strong>di</strong> CompositeBehaviour che esegue i suoi sub-<br />

behaviours <strong>in</strong> modo concorrente e term<strong>in</strong>a quando una particolare con<strong>di</strong>zione<br />

dei suoi sub-behaviours è verificata. Sono <strong>in</strong>oltre previste delle costanti da<br />

passare al costruttore <strong>di</strong> ParallelBehaviour per term<strong>in</strong>are quando tutti i suoi figli<br />

sono term<strong>in</strong>ati, o quando uno particolare fra i suoi figli term<strong>in</strong>a, o quando un<br />

numero N - def<strong>in</strong>ito dall’utente - <strong>di</strong> suoi figli term<strong>in</strong>a.<br />

• FSMBehaviour: è una sottoclasse <strong>di</strong> CompositeBehaviour che esegue i suoi sub-<br />

behaviours <strong>in</strong> accordo ad una macch<strong>in</strong>a a stati f<strong>in</strong>iti (F<strong>in</strong>ite State Mach<strong>in</strong>e, FSM)<br />

def<strong>in</strong>ita dall’utente. Ogni sub-behaviour rappresenta un’attività dentro uno<br />

44


Ambiente <strong>di</strong> sviluppo<br />

stato della FSM e l’utente può def<strong>in</strong>ire le transizioni fra gli stati della FSM.<br />

Quando il figlio corrispondente allo stato Si term<strong>in</strong>a, il suo valore <strong>di</strong> ritorno<br />

(restituito dal metodo onEnd() ) viene utilizzato per determ<strong>in</strong>are la transizione<br />

ed un nuovo stato Sj viene raggiunto. Alcuni dei figli <strong>di</strong> un FSMBehaviour<br />

possono essere registrati come possibili stati f<strong>in</strong>ali. Un FSMBehaviour term<strong>in</strong>a<br />

dopo la term<strong>in</strong>azione <strong>di</strong> uno <strong>di</strong> questi figli.<br />

- SenderBehaviour: è una sottoclasse <strong>di</strong> OneShotBehaviour che realizza l’azione atomica<br />

<strong>di</strong> send <strong>di</strong> un messaggio ACL passato nel costruttore e pertanto viene eseguita solo una<br />

volta.<br />

- ReceiverBehaviour: è una sottoclasse <strong>di</strong> Behaviour che realizza l’azione atomica <strong>di</strong><br />

receive <strong>di</strong> un messaggio ACL che viene copiato <strong>in</strong> uno specifico ACLMessage passato nel<br />

costruttore. La sua action() term<strong>in</strong>a non appena un messaggio viene ricevuto. Nel caso<br />

la coda dei messaggi ricevuti sia vuota o nessun messaggio fa match<strong>in</strong>g, il metodo<br />

action() blocca il behaviour. Esistono anche due versioni del costruttore con cui è<br />

possibile impostare un timeout entro il quale l’agente rimane <strong>in</strong> attesa del messaggio<br />

da ricevere.<br />

- WakerBehaviour: è una sottoclasse astratta <strong>di</strong> SimpleBehaviour che implementa un<br />

task <strong>di</strong> tipo OneShot che deve essere eseguito solo una volta dopo che un certo<br />

timeout è trascorso.<br />

2.6.9. Protocolli <strong>di</strong> <strong>in</strong>terazione<br />

FIPA specifica un <strong>in</strong>sieme <strong>di</strong> protocolli <strong>di</strong> <strong>in</strong>terazione standard per costruire le conversazioni<br />

fra gli agenti. Per ogni tipo <strong>di</strong> conversazione JADE <strong>di</strong>st<strong>in</strong>gue i ruoli <strong>di</strong> Initiator - l’agente che<br />

<strong>in</strong>izia la conversazione - e <strong>di</strong> Responder - l’agente che risponde ad una conversazione dopo<br />

essere stato contattato - . JADE prevede behaviours pronti all’uso per entrambi i ruoli della<br />

maggior parte dei protocolli <strong>di</strong> <strong>in</strong>terazione def<strong>in</strong>iti da FIPA (package jade.proto). Tutti i<br />

45


Ambiente <strong>di</strong> sviluppo<br />

behaviours <strong>di</strong> tipo Initiator term<strong>in</strong>ano e sono rimossi dalla coda dei tasks appena<br />

raggiungono lo stato f<strong>in</strong>ale del protocollo <strong>di</strong> <strong>in</strong>terazione. I Responders <strong>in</strong>vece sono ciclici e<br />

vengono rischedulati non appena giungono <strong>in</strong> uno stato f<strong>in</strong>ale dell’<strong>in</strong>terazione. Questa<br />

caratteristica consente <strong>di</strong> stabilire il numero massimo <strong>di</strong> conversazioni simultanee <strong>di</strong> un<br />

Responder. FIPA ha def<strong>in</strong>ito un certo numero <strong>di</strong> protocolli <strong>di</strong> <strong>in</strong>terazione con l’obiettivo <strong>di</strong><br />

effettuare una conversazione, permettendo il controllo - da parte del sender - che il receiver<br />

abbia eseguito l’operazione richiesta. Le classi <strong>di</strong> JADE AchieveREInitiator e<br />

AchieveREResponder servono a questo scopo e vanno bene per una serie <strong>di</strong> protocolli con la<br />

medesima struttura: FIPA-request, FIPA-query, FIPA-propose, FIPA-Request-When, FIPA-<br />

recruit<strong>in</strong>g, FIPA-broker<strong>in</strong>g. JADE provvede <strong>in</strong>oltre ad implementare il protocollo FIPA-<br />

Contract-Net attraverso le classi Contract-Net-Initiator e ContractNetResponder.<br />

AchieveREInitiator:<br />

Questa classe è una sottoclasse <strong>di</strong> FSMBehaviour e rappresenta il ruolo dell’Initiator.<br />

Un’istanza <strong>di</strong> questa classe può essere creata passando come argomento il messaggio da<br />

<strong>in</strong>viare per <strong>in</strong>iziare il protocollo. Può essere facilmente estesa ridef<strong>in</strong>endo uno o più dei suoi<br />

meto<strong>di</strong> handleXXX che provvedono a gestire tutti gli stati del protocollo. Per esempio, il<br />

metodo handleRefuse viene chiamato quando un messaggio refuse viene ricevuto. Questa<br />

implementazione gestisce la scadenza del timeout, come espresso nel campo reply-by del<br />

messaggio ACL <strong>in</strong>viato.<br />

AchieveReResponder:<br />

Questa classe implementa il ruolo del Responder. Per il corretto funzionamento è molto<br />

importante passare al costruttore l’esatto MessageTemplate per selezionare quale<br />

messaggio deve essere servito. Può essere facilmente estesa ridef<strong>in</strong>endo uno o più dei suoi<br />

meto<strong>di</strong> prepareXXX che provvedono a gestire gli stati del protocollo. Per esempio, il metodo<br />

prepareResponse viene chiamato quando un messaggio dell’Initiator viene ricevuto e deve<br />

essere preparata la prima risposta da spe<strong>di</strong>re (es. Agree).<br />

46


ContractNetInitiator:<br />

Ambiente <strong>di</strong> sviluppo<br />

Implementa il ruolo dell’Initiator nel protocollo cfp (call for proposal) tenendo conto anche<br />

della gestione dei timeout <strong>di</strong> attesa delle risposte e fornendo, <strong>in</strong>oltre, la possibilità <strong>di</strong><br />

aspettare per un tempo <strong>in</strong>def<strong>in</strong>ito. Vengono forniti un set <strong>di</strong> meto<strong>di</strong> callback per gestire ogni<br />

stato del protocollo, i quali sono chiamati quando un certo tipo <strong>di</strong> messaggio viene ricevuto.<br />

ContractNetResponder:<br />

Implementa il ruolo del Responder nel protocollo cfp (call for proposal). Come nel caso<br />

dell’AchieveReResponder, per il corretto funzionamento, è molto importante passare al<br />

costruttore l’esatto MessageTemplate <strong>in</strong> modo da selezionare quale messaggio deve essere<br />

servito. Può essere facilmente estesa ridef<strong>in</strong>endo uno o più dei suoi meto<strong>di</strong> prepareXXX che<br />

provvedono a gestire gli stati del protocollo. Per esempio, il metodo prepareResponse viene<br />

chiamato quando un messaggio dell’Initiator viene ricevuto e deve essere preparata la prima<br />

risposta da spe<strong>di</strong>re (es. Propose).<br />

2.6.10. Supporto alle ontologie<br />

Le ontologie specifiche delle applicazioni descrivono gli elementi che gli agenti utilizzano per<br />

creare il contenuto dei messaggi (es. pre<strong>di</strong>cati ed azioni della specifica applicazione) ([2]).<br />

JADE provvede alla specifica <strong>di</strong> ontology def<strong>in</strong>ite dall’utente attraverso il package<br />

jade.content ed i suoi subpackages. Il co<strong>di</strong>ce che implementa le ontologie ed il co<strong>di</strong>ce che<br />

<strong>in</strong>via/riceve i messaggi non <strong>di</strong>pende dal l<strong>in</strong>guaggio dei contenuti utilizzato. Quando un agente<br />

A comunica con un altro agente B, una certa <strong>in</strong>formazione I viene trasferita da A a B<br />

attraverso un messaggio ACL, <strong>in</strong> particolare, l’<strong>in</strong>formazione I è trasferita sottoforma <strong>di</strong><br />

attributo content del messaggio, espressa <strong>in</strong> un certo l<strong>in</strong>guaggio <strong>di</strong> contenuti (es. Semantic<br />

Language) e co<strong>di</strong>ficato <strong>in</strong> un proprio formato (es. Str<strong>in</strong>g). Entrambi gli agenti possono avere<br />

una propria rappresentazione <strong>in</strong>terna dell’<strong>in</strong>formazione I che può essere <strong>di</strong>versa l’una<br />

dall’altra. Occorre considerare poi che tipicamente le <strong>in</strong>formazioni vengono rappresentate<br />

<strong>in</strong>ternamente all’agente <strong>in</strong> modo <strong>di</strong>verso da come vengono trasferite nei messaggi ACL.<br />

Internamente abbiamo solitamente delle istanze <strong>di</strong> oggetti Java che rappresentano<br />

47


Ambiente <strong>di</strong> sviluppo<br />

l’<strong>in</strong>formazione; a livello <strong>di</strong> messaggi ACL, <strong>in</strong>vece, abbiamo tipicamente una str<strong>in</strong>ga che<br />

sicuramente non sarebbe maneggevole da utilizzare come rappresentazione <strong>in</strong>terna.<br />

Per un corretto funzionamento del sistema qu<strong>in</strong><strong>di</strong> occorrono due passi:<br />

1) l’agente A converte la sua rappresentazione <strong>in</strong>terna <strong>di</strong> I nella corrispondente<br />

rappresentazione dell’ACL content. Dalla parte opposta l’agente B, alla ricezione del<br />

messaggio, deve effettuare la conversione <strong>in</strong>versa, dal content language alla sua<br />

rappresentazione <strong>in</strong>terna.<br />

2) B deve provvedere ad una serie <strong>di</strong> controlli semantici per verificare che l’<strong>in</strong>formazione I sia<br />

un’<strong>in</strong>formazione significativa, ossia sia conforme alle regole (es. età deve essere un <strong>in</strong>tero)<br />

dell’ontologia.<br />

JADE fornisce un supporto alle ontologie ed ai l<strong>in</strong>guaggi <strong>di</strong> contenuti, effettuando tutte le<br />

conversioni e le operazioni <strong>di</strong> verifica della semantica <strong>in</strong> modo automatico. Questo permette<br />

agli sviluppatori <strong>di</strong> manipolare le <strong>in</strong>formazioni all’<strong>in</strong>terno degli agenti attraverso oggetti Java.<br />

Figura 2-12 Contenuto comunicazione fra Agenti<br />

Le operazioni <strong>di</strong> conversione e <strong>di</strong> check semantici sono effettuate da un content manager.<br />

Ogni agente JADE <strong>in</strong>clude al suo <strong>in</strong>terno un content manager accessibile con il metodo<br />

getContentManager() della classe Agent. La classe ContentManager contiene tutti i meto<strong>di</strong><br />

48


Ambiente <strong>di</strong> sviluppo<br />

per trasformare oggetti Java <strong>in</strong> str<strong>in</strong>ghe ed <strong>in</strong>serirli nell’attributo content dell’ACLMessage e<br />

viceversa. In realtà le operazioni <strong>di</strong> conversione e <strong>di</strong> check vengono delegate all’ontology<br />

(semantic check) ed ad un content language codec (conversione). Al f<strong>in</strong>e <strong>di</strong> eseguire gli<br />

adeguati check semantici <strong>di</strong> una data content expression, è necessario classificare tutti gli<br />

elementi del dom<strong>in</strong>io del <strong>di</strong>scorso <strong>in</strong> accordo alle loro caratteristiche semantiche generiche.<br />

Ad un primo livello <strong>di</strong> classificazione occorre <strong>di</strong>st<strong>in</strong>guere fra pre<strong>di</strong>cati (pre<strong>di</strong>cates) e term<strong>in</strong>i<br />

(terms).<br />

Pre<strong>di</strong>cates: sono espressioni che riferiscono qualcosa a proposito dello stato del<br />

dom<strong>in</strong>io e possono essere true o false.<br />

Terms: sono espressioni che identificano entità che “esistono” nel dom<strong>in</strong>io e su cui<br />

l’agente deve ragionare. Sono ulteriormente classificati <strong>in</strong> concepts, agent actions,<br />

primitives, aggregates, identify<strong>in</strong>g referential expressions (IRE), variables:<br />

Concepts: sono espressioni che rappresentano entità con una struttura complessa<br />

che può essere def<strong>in</strong>ita <strong>in</strong> term<strong>in</strong>i <strong>di</strong> slot .<br />

Agent Actions: sono concetti speciali che <strong>in</strong><strong>di</strong>cano azioni che possono essere eseguite<br />

da un agente.<br />

Primitives: sono espressioni che identificano entità atomiche come str<strong>in</strong>ghe o <strong>in</strong>teri.<br />

Aggregates: sono espressioni che rappresentano entità che raggruppano altre entità.<br />

Identify<strong>in</strong>g Referential Expressions (IRE): rappresentano una o più entità per cui un<br />

certo pre<strong>di</strong>cato è true. Sono tipicamente utilizzate per effettuare queries.<br />

Variables: <strong>in</strong><strong>di</strong>cano un generico elemento non conosciuto a priori. Sono utilizzate <strong>di</strong><br />

solito all’<strong>in</strong>terno <strong>di</strong> queries.<br />

Ogni classe che implementa il concetto <strong>di</strong> fipa-agent-management ontology è una semplice<br />

collezione <strong>di</strong> attributi con meto<strong>di</strong> pubblici per leggerli e scriverli <strong>in</strong> accordo al modello basato<br />

sulla rappresentazione specificata da FIPA. Per ogni attributo della classe chiamato attrName<br />

del tipo attrType, sono possibili due casi:<br />

- Il tipo è un valore s<strong>in</strong>golo: può, qu<strong>in</strong><strong>di</strong>, essere letto con getAttrName() e scritto con<br />

setAttrName(attrType a).<br />

49


Ambiente <strong>di</strong> sviluppo<br />

- Il tipo è un set o una sequenza <strong>di</strong> valori: ci sono, allora, i meto<strong>di</strong> addAttrName(attrType a)<br />

per <strong>in</strong>serire un nuovo valore, clearAllAttrName() per rimuovere tutti i valori. Per la lettura<br />

è possibile acquisire un Iterator me<strong>di</strong>ante getAllAttrName(), attraverso il quale il<br />

programmatore può scorrere la List effettuando il cast<strong>in</strong>g opportuno.<br />

Figura 2-13 Modello <strong>di</strong> riferimento per i Content<br />

50


2.7. Android<br />

Ambiente <strong>di</strong> sviluppo<br />

La rapida <strong>di</strong>ffusione del sistema operativo Android, e il crescente <strong>in</strong>teresse verso tale<br />

tecnologia open-source, ha favorito lo sviluppo <strong>di</strong> un numero sempre maggiore <strong>di</strong><br />

applicazioni che implementano ed estendono le funzionalità <strong>di</strong> base <strong>di</strong> questo sistema.<br />

Inoltre, l’elevato numero <strong>di</strong> funzionalità proprie dei <strong>di</strong>spositivi embedded Android, quali<br />

smartphone e tablet, forniscono agli sviluppatori una piattaforma hardware molto<br />

conveniente per l’implementazione e il test <strong>di</strong> nuove idee e soluzioni. Nel sistema <strong>di</strong><br />

videosorveglianza <strong>di</strong>scusso <strong>in</strong> questa tesi, le telecamere che vogliono partecipare alla<br />

videosorveglianza sono smartphone Android dotati <strong>di</strong> un agente <strong>in</strong> grado <strong>di</strong> comunicare con<br />

l’agente manager gestore delle telecamere.<br />

Android è un sistema operativo basato sul kernel L<strong>in</strong>ux 2.6, appositamente realizzato per<br />

<strong>di</strong>spositivi portatili ([4]). L’architettura è sud<strong>di</strong>visa <strong>in</strong> 5 componenti, come mostrato <strong>in</strong> Fig.<br />

2.14; al <strong>di</strong> sopra del kernel L<strong>in</strong>ux ci sono le librerie C/C++ utilizzabili dalle applicazioni; ad un<br />

livello superiore si trova l’Application Framework, che fornisce le API e i servizi che possono<br />

essere utilizzati dalle applicazioni (chiamate anche App); queste ultime si trovano <strong>in</strong> cima<br />

all’architettura, nel livello Application e sono sviluppate usando il l<strong>in</strong>guaggio <strong>di</strong><br />

programmazione Java.<br />

51


Ambiente <strong>di</strong> sviluppo<br />

Figura 2-14 Architettura Android<br />

Il componente chiave del framework Android è l’Android Runtime, che contiene le librerie <strong>di</strong><br />

sistema e la Virtual Mach<strong>in</strong>e Dalvik, una macch<strong>in</strong>a virtuale appositamente progettata e<br />

ottimizzata da Google secondo le caratteristiche hardware dei <strong>di</strong>spositivi mobile.<br />

La Virtual Mach<strong>in</strong>e Dalvik usa un proprio formato <strong>di</strong> byte-code (Dalvik executable, .dex),<br />

verso il quale viene convertito il byte-code Java dopo la compilazione, grazie ad un apposito<br />

tool. Una delle caratteristiche pr<strong>in</strong>cipali del formato .dex è quella <strong>di</strong> elim<strong>in</strong>are le <strong>in</strong>formazioni<br />

ridondanti nei file <strong>di</strong> classe del Java, riducendo così le <strong>di</strong>mensioni f<strong>in</strong>ali del byte-code; la VM<br />

Dalvik può avere istanze multiple eseguite <strong>in</strong> uno stesso <strong>di</strong>spositivo, ed ognuna viene<br />

eseguita <strong>in</strong> un processo separato <strong>di</strong> L<strong>in</strong>ux; ogni applicazione Android viene eseguita <strong>in</strong> una<br />

istanza della VM Dalvik.<br />

Lo sviluppo delle applicazioni Android avviene utilizzando l’IDE Eclipse per Java ([9]), con<br />

<strong>in</strong>stallato il plug<strong>in</strong> Android Develoment Tools (ADT) ([11]); <strong>in</strong> aggiunta, è necessario il<br />

pacchetto Android SDK che contiene i vari strumenti <strong>di</strong> sviluppo e le librerie per le <strong>di</strong>fferenti<br />

52


Ambiente <strong>di</strong> sviluppo<br />

versioni <strong>di</strong> Android, necessari per compilare l’applicazione realizzata nel formato .apk<br />

(Android Package file). L’Android ADT <strong>in</strong>clude anche un emulatore che può essere utilizzato<br />

per testare sul PC l’applicazione sviluppata, me<strong>di</strong>ante un <strong>di</strong>spositivo virtuale<br />

opportunamente configurato per replicare alcune delle caratteristiche del <strong>di</strong>spositivo fisico<br />

dove verrà eseguita l’applicazione. Tuttavia esistono delle limitazioni <strong>di</strong> questo strumento, ad<br />

esempio non è possibile emulare la videocamera.<br />

La configurazione tipica per lo sviluppo <strong>di</strong> applicazioni Android prevede la pre- senza del<br />

<strong>di</strong>spositivo hardware fisicamente collegato via USB al PC <strong>di</strong> sviluppo, e attraverso un apposito<br />

strumento <strong>di</strong> debug <strong>in</strong>cluso nell’ADT, il Dalvik Debug Monitor Server (DDMS) si seguono le<br />

opzioni <strong>di</strong> debug, utilizzando dei punti <strong>di</strong> controllo <strong>in</strong>seriti nel co<strong>di</strong>ce dell’applicazione tramite<br />

apposite istruzioni.<br />

2.7.1. Basi della programmazione Android<br />

Android richiede che i progetti siano organizzati <strong>in</strong> una certa maniera. La corretta gestione<br />

delle risorse <strong>in</strong> questa piattaforma, è importante tanto quanto la stesura del co<strong>di</strong>ce. Creando<br />

un nuovo progetto Android, Eclipse ha pre<strong>di</strong>sposto un albero <strong>di</strong> cartelle, all’<strong>in</strong>terno del quale<br />

sono stati generati automaticamente <strong>di</strong>versi file. Tra i file generati automaticamente c’è<br />

AndroidManifest.xml e il file default.properties. Ci sono poi delle <strong>di</strong>rectory: src, assets, res e<br />

gen <strong>di</strong> cui la prima, src, è quella dove dobbiamo andare a realizzare i package e le classi della<br />

nostra applicazione. Le cartelle res e assets servono per ospitare le risorse esterne necessarie<br />

all’applicazione, come le immag<strong>in</strong>i, i file au<strong>di</strong>o e altro ancora ([5]) ([14]).<br />

53


Ambiente <strong>di</strong> sviluppo<br />

Figura 2-15 Struttura applicazione Android<br />

Il file AndroidManifest.xml è un descrittore dell’applicazione. Al suo <strong>in</strong>terno potete e dovete<br />

<strong>di</strong>chiarare i componenti del vostro software.<br />

Figura 2-16 Lettura file Manifest da Eclipse<br />

54


Ambiente <strong>di</strong> sviluppo<br />

Oltre a src, assets e res c’è <strong>in</strong>f<strong>in</strong>e la cartella gen, che contiene la speciale classe chiamata R,<br />

probabile abbreviazione <strong>di</strong> Resources. Invocando questa classe, <strong>in</strong>fatti, è possibile richiamare<br />

via co<strong>di</strong>ce le risorse memorizzate sotto la <strong>di</strong>rectory res. il file str<strong>in</strong>gs.xml, pensato per<br />

raccogliere le str<strong>in</strong>ghe usate dall’applicazione che sarà sviluppata.<br />

<br />

<br />

<br />

<br />

All’<strong>in</strong>terno del tag ... è possibile <strong>di</strong>chiarare <strong>di</strong>fferenti tipi <strong>di</strong> valori.<br />

Ci sono numerosi tipi <strong>di</strong> dati supportati. Ecco un elenco completo:<br />

• Str<strong>in</strong>ghe, con il tag .<br />

• Colori, con il tag <br />

• Misure e <strong>di</strong>mensioni, con il tag <br />

• Stili e temi, con il tag <br />

• Rettangoli <strong>di</strong> colore, con il tag <br />

• Array <strong>di</strong> <strong>in</strong>teri, con il tag <br />

• Array <strong>di</strong> str<strong>in</strong>ghe, con il tag <br />

Le applicazioni Android si compongono <strong>di</strong> quattro mattoni fondamentali: le attività (activity),<br />

i servizi (service), i broadcast receiver e i content provider. Ogni applicazione è formata da<br />

uno o più <strong>di</strong> questi mattoni. Non è detto che li contenga tutti: ad esempio potrebbe essere<br />

costituita da due attività e da un servizio, senza avere broadcast receiver né content<br />

provider. Nella stragrande maggioranza dei casi, comunque, le applicazioni comprendono<br />

almeno un’attività. Le attività, <strong>di</strong> conseguenza, sono il più fondamentale dei componenti <strong>di</strong><br />

base delle applicazioni Android.<br />

• Attività: Le attività sono quei blocchi <strong>di</strong> un’applicazione che <strong>in</strong>teragiscono con l’utente<br />

utilizzando lo schermo e i <strong>di</strong>spositivi <strong>di</strong> <strong>in</strong>put messi a <strong>di</strong>sposizione dallo smartphone.<br />

Comunemente fanno uso <strong>di</strong> componenti UI già pronti, come quelli presenti nel pacchetto<br />

android.widget, ma questa non è necessariamente la regola. Le attività sono probabilmente il<br />

modello più <strong>di</strong>ffuso <strong>in</strong> Android, e si realizzano estendendo la classe base android.app.Activity.<br />

55


Ambiente <strong>di</strong> sviluppo<br />

• Servizio: Un servizio gira <strong>in</strong> sottofondo e non <strong>in</strong>teragisce <strong>di</strong>rettamente con l’utente. Ad<br />

esempio può riprodurre un brano MP3, mentre l’utente utilizza delle attività per fare altro.<br />

Un servizio si realizza estendendo la classe android.app.Service.<br />

• Broadcast Receiver: Un Broadcast Receiver viene utilizzato quando si <strong>in</strong>tende<br />

<strong>in</strong>tercettare un particolare evento, attraverso tutto il sistema. Ad esempio lo si può utilizzare<br />

se si desidera compiere un’azione quando si scatta una foto o quando parte la segnalazione<br />

<strong>di</strong> batteria scarica. La classe da estendere è android. content.BroadcastReceiver.<br />

• Content Provider: I Content Provider sono utilizzati per esporre dati e <strong>in</strong>formazioni.<br />

Costituiscono un canale <strong>di</strong> comunicazione tra le <strong>di</strong>fferenti applicazioni <strong>in</strong>stallate nel sistema.<br />

Si può creare un Content Provider estendendo la classe astratta<br />

android.content.ContentProvider.<br />

È possibile mandare <strong>in</strong> esecuzione più attività simultaneamente, ma soltanto un’attività alla<br />

volta può occupare il <strong>di</strong>splay. L’attività che occupa il <strong>di</strong>splay è <strong>in</strong> esecuzione e <strong>in</strong>teragisce<br />

<strong>di</strong>rettamente con l’utente. Le altre, <strong>in</strong>vece, sono ibernate e tenute nascoste <strong>in</strong> sottofondo, <strong>in</strong><br />

modo da ridurre al m<strong>in</strong>imo il consumo delle risorse <strong>di</strong> calcolo. L’utente, naturalmente, può<br />

riprist<strong>in</strong>are un’attività ibernata e riprenderla da dove l’aveva <strong>in</strong>terrotta, riportandola <strong>in</strong> primo<br />

piano. I casi <strong>in</strong> cui un’attività può term<strong>in</strong>are sono due:<br />

• L’attività è ibernata e il sistema, arbitrariamente, decide che non è più utile e perciò la<br />

<strong>di</strong>strugge.<br />

• Il sistema è a corto <strong>di</strong> memoria, e per recuperare spazio <strong>in</strong>izia a “uccidere” bruscamente le<br />

attività <strong>in</strong> sottofondo.<br />

56


Ambiente <strong>di</strong> sviluppo<br />

Figura 2-17 Ciclo <strong>di</strong> vita <strong>di</strong> una attività<br />

La Fig.2.17 illustra la sequenza <strong>di</strong> chiamate ai meto<strong>di</strong> <strong>di</strong> Activity eseguite durante i passaggi <strong>di</strong><br />

stato dell’attività. Nel dettaglio:<br />

• protected void onCreate() Richiamato non appena l’attività viene creata. L’argomento<br />

savedInstanceState serve per riportare un eventuale stato dell’attività salvato <strong>in</strong> precedenza<br />

da un’altra istanza che è stata term<strong>in</strong>ata. L’argomento è null nel caso <strong>in</strong> cui l’attività non<br />

abbia uno stato salvato.<br />

57


Ambiente <strong>di</strong> sviluppo<br />

• protected void onRestart() Richiamato per segnalare che l’attività sta venendo riavviata<br />

dopo essere stata precedentemente arrestata.<br />

• protected void onStart() Richiamato per segnalare che l’attività sta per <strong>di</strong>ventare visibile<br />

sullo schermo.<br />

• protectedvoidonResume() Richiamato per segnalare che l’attività sta per <strong>in</strong>iziare<br />

l’<strong>in</strong>terazione con l’utente.<br />

• protected void onPause() Richiamato per segnalare che l’attività non sta più <strong>in</strong>teragendo<br />

con l’utente.<br />

• protected void onStop() Richiamato per segnalare che l’attività non è più visibile sullo<br />

schermo.<br />

• protectedvoidonDestroy() Richiamato per segnalare che l’applicazione sta per essere<br />

term<strong>in</strong>ata.<br />

Dopo che si è creata un’attività, la si deve registrare all’<strong>in</strong>terno del descrittore<br />

dell’applicazione (il file AndroidManifest.xml), questo aff<strong>in</strong>ché il sistema sappia della sua<br />

esistenza. Per farlo si usa un tag all’<strong>in</strong>terno del tag . Con l’attributo<br />

android:name si specifica il nome della classe registrata come attività. Si può esprimere sia il<br />

suo percorso completo (ad esempio mypackage.mysubpackage.MyActivity) sia il nome<br />

relativo rispetto al package <strong>di</strong>chiarato nel tag sovrastante (ad esempio<br />

.MyActivity). All’<strong>in</strong>terno della coppia <strong>di</strong> tag ... , <strong>in</strong>vece, possono essere<br />

allacciate delle relazioni particolari fra l’attività e l’applicazione e fra l’attività ed il sistema.<br />

Come spiegato <strong>in</strong> apertura, un’applicazione Android può contenere più <strong>di</strong> un’attività. In<br />

questo caso una soltanto sarà marcata come attività pr<strong>in</strong>cipale <strong>di</strong> lancio. Le altre saranno,<br />

<strong>in</strong>vece, delle sotto-attività, che l’attività pr<strong>in</strong>cipale potrà<br />

lanciare quando ce n’è bisogno. Realizzare una sotto-attività è semplice tanto quanto<br />

realizzare l’attività pr<strong>in</strong>cipale: ancora una volta è sufficiente estendere android.app.Activity.<br />

Le attività secondarie vanno poi registrate nel file AndroidManifest.xml, senza però applicare<br />

l’<strong>in</strong>tent-filter con l’azione e la categoria usate <strong>in</strong>vece dall’attività pr<strong>in</strong>cipale. L’attività<br />

pr<strong>in</strong>cipale può lanciare delle sotto-attività ricorrendo al metodo startActivity(). Questo<br />

accetta come argomento un oggetto <strong>di</strong> tipo android.content.Intenet che, come è facile<br />

58


Ambiente <strong>di</strong> sviluppo<br />

<strong>in</strong>tuire, rappresenta un <strong>in</strong>tent. Con questo <strong>in</strong>tento bisogna esprimere quale sotto-attività<br />

deve essere avviata.<br />

Per quanto riguarda l’<strong>in</strong>terfaccia grafica i primi due concetti che dobbiamo assorbire si<br />

chiamano View e ViewGroup, e corrispondono alla maniera <strong>di</strong> Android <strong>di</strong> classificare ed<br />

organizzare ciò che è sullo schermo. I bottoni, i campi <strong>di</strong> testo, le icone e tutti gli altri<br />

congegni <strong>di</strong> un’<strong>in</strong>terfaccia grafica sono oggetti View. I ViewGroup, <strong>in</strong>vece, sono dei<br />

contenitori che possono mettere <strong>in</strong>sieme più oggetti View. I ViewGroup, <strong>in</strong>oltre, sono a loro<br />

volta degli oggetti View, e <strong>di</strong> conseguenza possono contenere altri ViewGroup. Grazie a<br />

questa <strong>in</strong>tuizione è possibile organizzare i componenti sullo schermo secondo uno schema ad<br />

albero, come quello <strong>di</strong> Fig.2.18.<br />

Figura 2-18 Componenti schermo Android<br />

I componenti View estendono tutti la classe base android.view.View. Nella libreria standard<br />

<strong>di</strong> Android ci sono già molti componenti <strong>di</strong> questo tipo, soprattutto nel pacchetto<br />

android.widget.<br />

Una volta che, comb<strong>in</strong>ando oggetti View e ViewGroup, si è ottenuta l’<strong>in</strong>terfaccia utente che<br />

si desidera, è necessario che questa venga mostrata sullo schermo. Le attività (cioè gli oggetti<br />

android.app.Activity) mettono a <strong>di</strong>sposizione un metodo setContentView(), <strong>di</strong>sponibile nelle<br />

seguenti forme:<br />

• public void setContentView(View view): Mostra sullo schermo l’oggetto View specificato.<br />

• public void setContentView(View view, ViewGroup.LayoutParams params):<br />

59


Ambiente <strong>di</strong> sviluppo<br />

Mostra sullo schermo l’oggetto View specificato, applicando una serie <strong>di</strong> parametri <strong>di</strong><br />

visualizzazione ed organizzazione del componente (params).<br />

2.8. JADE-LEAP<br />

Nel progetto <strong>di</strong> videosorveglianza <strong>di</strong>scusso nella presente tesi, è stato necessario utilizzare un<br />

particolare add-on del framework JADE per lo sviluppo dell’agente residente nello<br />

smartphone Android. Nei seguenti paragrafi verrà spiegato il pacchetto Jade-Leap.<br />

2.8.1. Jade-Leap runtime environment<br />

Come conseguenza all'<strong>in</strong>troduzione <strong>di</strong> <strong>di</strong>spositivi sempre collegati a reti wireless (GPRS,<br />

UMTS, WLAN) e della cont<strong>in</strong>ua crescita del potere e delle risorse <strong>di</strong> <strong>di</strong>spositivi portatili quali<br />

PDA e telefoni cellulari, il wireless e wire-l<strong>in</strong>e si stanno progressivamente <strong>in</strong>tegrando <strong>in</strong>sieme.<br />

In questo scenario il bisogno <strong>di</strong> applicazioni <strong>di</strong>stribuite <strong>in</strong> parte nella rete fissa e <strong>in</strong> parte su<br />

<strong>di</strong>spositivi portatili sta <strong>di</strong>ventando sempre più importante ([2]). JADE, purtroppo, non può<br />

essere eseguito, come è, su piccoli <strong>di</strong>spositivi per le seguenti ragioni:<br />

1. L'ambiente <strong>di</strong> runtime <strong>di</strong> JADE completa ha un <strong>in</strong>gombro <strong>di</strong> memoria <strong>di</strong> qualche Mbyte che<br />

non possono rientrare nelle limitazioni dei <strong>di</strong>spositivi portatili.<br />

2. JADE richiede Java 5 (o versione successiva), mentre la maggior parte dei <strong>di</strong>spositivi<br />

portatili possono solo sostenere CDC, PersonalJava, o più tipicamente MIDP.<br />

3. Collegamenti wireless hanno caratteristiche <strong>di</strong>verse rispetto a rete fissa, come alta latenza,<br />

larghezza <strong>di</strong> banda bassa, connettività <strong>in</strong>termittente e l'assegnazione <strong>di</strong>namica dell'<strong>in</strong><strong>di</strong>rizzo<br />

IP che deve essere preso <strong>in</strong> considerazione correttamente.<br />

Il LEAP add-on è stato creato per risolvere questi problemi e permette la <strong>di</strong>stribuzione <strong>di</strong><br />

agenti JADE su <strong>di</strong>spositivi palmari ([6]).<br />

60


Ambiente <strong>di</strong> sviluppo<br />

Il LEAP add-on, quando comb<strong>in</strong>ato con JADE, sostituisce alcune parti del kernel JADE<br />

formando un ambiente <strong>di</strong> runtime mo<strong>di</strong>ficato che noi identifichiamo come JADE-LEAP e che<br />

può essere <strong>di</strong>stribuito su una vasta gamma <strong>di</strong> piccoli <strong>di</strong>spositivi. Al f<strong>in</strong>e <strong>di</strong> raggiungere questo<br />

obiettivo, JADE-LEAP può essere configurato <strong>in</strong> <strong>di</strong>versi mo<strong>di</strong> corrispondenti alle due<br />

configurazioni (CDC e CLDC) del Java Micro E<strong>di</strong>tion e Android Dalvik Java Virtual Mach<strong>in</strong>e. Più<br />

<strong>in</strong> dettaglio<br />

pjava: per eseguire JADE-LEAP su <strong>di</strong>spositivi palmari che supportano J2ME CDC o<br />

PersonalJava come la maggior parte dei PDA oggi. Si noti che nel 2003 la specifica<br />

Personal Java è stata <strong>di</strong>chiarata obsoleta ed è stato sostituita dalla configurazione<br />

CDC dell'e<strong>di</strong>zione J2ME. Dal punto <strong>di</strong> vista dell’ esecuzione con JADE-LEAP tuttavia<br />

non esistono <strong>di</strong>fferenze. Qu<strong>in</strong><strong>di</strong> con il term<strong>in</strong>e "PersonalJava" si <strong>in</strong>tende sia l'attuale<br />

obsoleta specifica Personal Java e J2ME configurazione CDC.<br />

MIDP: per eseguire JADE-LEAP su <strong>di</strong>spositivi palmari che supportano MIDP1.0 (o<br />

successiva), come la maggior parte dei telefoni cellulari abilitati Java.<br />

android: per eseguire JADE-LEAP su <strong>di</strong>spositivi che supportano Android 2.1 (o versioni<br />

successive).<br />

Inoltre, una versione dotnet <strong>di</strong> JADE-LEAP esiste per eseguire JADE-LEAP su PC e server della<br />

rete fissa che esegue Microsoft. NET Framework versione 1.1 o successiva. Però <strong>di</strong>versa<br />

<strong>in</strong>ternamente, le tre versioni <strong>di</strong> JADE-LEAP forniscono lo stesso <strong>in</strong>sieme <strong>di</strong> API per<br />

sviluppatori offrendo così uno strato omogeneo su una varietà <strong>di</strong> <strong>di</strong>spositivi e tipi <strong>di</strong> rete<br />

come illustrato <strong>in</strong> Figura 2.19.<br />

61


Ambiente <strong>di</strong> sviluppo<br />

Figura 2-19 Architettura JADE Leap<br />

2.8.2. Split execution<br />

L'ambiente <strong>di</strong> runtime <strong>di</strong> JADE può essere eseguito <strong>in</strong> due mo<strong>di</strong> <strong>di</strong>versi. La normale modalità<br />

"stand-alone" <strong>in</strong> cui viene eseguito un conta<strong>in</strong>er completo sul <strong>di</strong>spositivo / host <strong>in</strong> cui si attiva<br />

il runtime JADE. La modalità "Split" <strong>in</strong> cui il conta<strong>in</strong>er viene <strong>di</strong>viso <strong>in</strong> un FrontEnd<br />

(effettivamente <strong>in</strong> esecuzione sul <strong>di</strong>spositivo / host <strong>in</strong> cui il runtime JADE è attivato) e un<br />

back-end (<strong>in</strong> esecuzione su un server remoto), collegati tra loro per mezzo <strong>di</strong> una<br />

connessione permanente. La seguente tabella riassume come le 2 modalità <strong>di</strong> esecuzione<br />

sono supportate nei <strong>di</strong>versi ambienti dest<strong>in</strong>atari JADE-LEAP.<br />

Tabella 2-4 Modalità esecuzione nei vari ambienti<br />

62


Ambiente <strong>di</strong> sviluppo<br />

Si noti che la modalità <strong>di</strong> esecuzione split è obbligatoria <strong>in</strong> MIDP e fortemente suggerito<br />

pjava. La modalità <strong>di</strong> esecuzione split è particolarmente adatto per <strong>di</strong>spositivi con risorse<br />

limitate e wireless dato che è decisamente più leggero <strong>di</strong> un conta<strong>in</strong>er completo.<br />

- La fase <strong>di</strong> bootstrap è molto più veloce <strong>in</strong> quanto tutte le comunicazioni con il Ma<strong>in</strong><br />

conta<strong>in</strong>er sono eseguite dal back-end e qu<strong>in</strong><strong>di</strong> non vengono effettuate tramite il<br />

collegamento wireless.<br />

- L'uso del collegamento wireless è ottimizzato.<br />

E' importante sottol<strong>in</strong>eare che gli sviluppatori degli agenti, <strong>in</strong> genere, non hanno bisogno <strong>di</strong><br />

prendersi cura <strong>in</strong> alcun modo per il fatto che l’agente sia eseguito su un stand-alone<br />

conta<strong>in</strong>er o sul FrontEnd <strong>di</strong> un conta<strong>in</strong>er <strong>di</strong>viso.<br />

Figura 2-20 Stand alone e Split execution mode<br />

63


Ambiente <strong>di</strong> sviluppo<br />

I seguenti problemi devono essere presi <strong>in</strong> considerazione:<br />

- Quando si lancia uno split conta<strong>in</strong>er, un conta<strong>in</strong>er JADE (eventualmente, ma non<br />

necessariamente il Ma<strong>in</strong> conta<strong>in</strong>er) deve già essere attivo sull'host su cui il backend deve<br />

essere creato. In seguito si farà riferimento a questo conta<strong>in</strong>er come Me<strong>di</strong>atore.<br />

- Un Ma<strong>in</strong> conta<strong>in</strong>er non può essere <strong>di</strong>viso.<br />

- Mobilità Agente e clonazione non è supportato su uno split conta<strong>in</strong>er.<br />

2.9. JADE-based Android application<br />

In l<strong>in</strong>ea con l'architettura <strong>di</strong> Android, il runtime JADE è avvolto da un Android service. Più<br />

specificamente, la libreria jadeAndroid.jar comprende due classi<br />

jade.android.RuntimeService e jade.android.MicroRuntimeService che avvolge un full<br />

conta<strong>in</strong>er e uno split conta<strong>in</strong>er, rispettivamente. Il MicroRuntimeService è <strong>di</strong>chiarato nel<br />

manifest Android come <strong>di</strong> seguito.<br />

...<br />

<br />

La prima operazione per attivare il runtime JADE da un'attività Android è <strong>di</strong> associarsi al<br />

MicroRuntimeService. ([7]) Come risultato un oggetto<br />

jade.android.MicroRuntimeServiceB<strong>in</strong>der viene recuperato <strong>in</strong> modo tale che sia possibile<br />

effettuare tutte le operazioni <strong>di</strong> gestione <strong>di</strong> JADE. Il co<strong>di</strong>ce qui sotto mostra come fare.<br />

serviceConnection = new ServiceConnection() { public void<br />

onServiceConnected(ComponentName className, IB<strong>in</strong>der service) {<br />

};<br />

// B<strong>in</strong>d successful<br />

microRuntimeServiceB<strong>in</strong>der = (MicroRuntimeServiceB<strong>in</strong>der) service; ...<br />

public void onServiceDisconnected(ComponentName className) { // B<strong>in</strong>d<br />

unsuccessful<br />

microRuntimeServiceB<strong>in</strong>der = null;<br />

}<br />

64


Ambiente <strong>di</strong> sviluppo<br />

b<strong>in</strong>dService(new Intent(getApplicationContext(), MicroRuntimeService.class),<br />

serviceConnection,<br />

Context.BIND_AUTO_CREATE);<br />

Dopo aver recuperato l'oggetto MicroRuntimeServiceB<strong>in</strong>der è ora possibile avviare un<br />

conta<strong>in</strong>er JADE split, come illustrato nel co<strong>di</strong>ce sotto:<br />

Properties pp = new Properties(); pp.setProperty(Profile.MAIN_HOST, host);<br />

pp.setProperty(Profile.MAIN_PORT, port); pp.setProperty(Profile.JVM,<br />

Profile.ANDROID); ... microRuntimeServiceB<strong>in</strong>der.startAgentConta<strong>in</strong>er(pp,<br />

new RuntimeCallback() { @Override<br />

public void onSuccess(Void thisIsNull) { // Split conta<strong>in</strong>er startup<br />

successful<br />

...<br />

}<br />

@Override<br />

public void onFailure(Throwable throwable) {<br />

// Split conta<strong>in</strong>er startup error<br />

}<br />

} );<br />

Come al solito l'host e la porta <strong>in</strong> cui il conta<strong>in</strong>er pr<strong>in</strong>cipale è <strong>in</strong> funzione (così come altre<br />

opzioni <strong>di</strong> configurazione) deve essere specificato <strong>in</strong> un oggetto Properties.<br />

Secondo la filosofia <strong>di</strong> Android tutte le operazioni sono as<strong>in</strong>crone e il risultato è reso<br />

<strong>di</strong>sponibile per mezzo <strong>di</strong> un oggetto jade.android.RuntimeCallback. Una volta che il runtime<br />

JADE è <strong>in</strong>stallato e funzionante, è possibile avviare l'agente su <strong>di</strong> esso, come illustrato nel<br />

frammento <strong>di</strong> co<strong>di</strong>ce qui sotto:<br />

microRuntimeServiceB<strong>in</strong>der.startAgent(nickname,<br />

ChatClientAgent.class.getName(), new Object[] { getApplicationContext() },<br />

new RuntimeCallback() {<br />

@Override<br />

public void onSuccess(Void thisIsNull) { // Agent successfully started ...<br />

}<br />

@Override<br />

public void onFailure(Throwable throwable) { // Agent startup error<br />

...<br />

}} );<br />

Il modo più pulito per implementare le <strong>in</strong>terazioni tra i componenti GUI (soprattutto Attività<br />

Android) e l'agente è quello <strong>di</strong> sfruttare l'object-to-Agent (O2A <strong>in</strong> breve), un meccanismo <strong>di</strong><br />

65


Ambiente <strong>di</strong> sviluppo<br />

<strong>in</strong>terfaccia <strong>in</strong>trodotta nella versione 4.1.1 <strong>di</strong> JADE. Ciò consente a un agente <strong>di</strong> esporre una o<br />

più <strong>in</strong>terfacce che possono essere recuperate da componenti esterni. I componenti esterni<br />

possono <strong>in</strong>nescare i compiti dell’agente <strong>in</strong>vocando i meto<strong>di</strong> <strong>di</strong> queste <strong>in</strong>terfacce e qu<strong>in</strong><strong>di</strong><br />

recuperare <strong>in</strong>formazioni dall’agente e così via a seconda delle esigenze dell'applicazione.<br />

Esempio:<br />

public <strong>in</strong>terface ChatClientInterface {<br />

public void handleSpoken(Str<strong>in</strong>g s);<br />

public Str<strong>in</strong>g[] getParticipantNames();<br />

}<br />

Nell’esempio i meto<strong>di</strong> citati dovranno essere implementati dall’agente.<br />

La riga seguente, mostra come l'agente espone l'<strong>in</strong>terfaccia O2A sopra descritta.<br />

registerO2AInterface(ChatClientInterface.class, this);<br />

Quando si lavora con JADE, è spesso il caso che un agente deve mostrare alcune <strong>in</strong>formazioni<br />

<strong>in</strong> modo proattivo nella GUI. Il metodo suggerito per attuare questo tipo <strong>di</strong> <strong>in</strong>terazione è<br />

quello <strong>di</strong> sfruttare il meccanismo che Android offre per consentire <strong>di</strong>versi componenti <strong>di</strong><br />

<strong>in</strong>teragire. Questo si basa sulla trasmissione <strong>di</strong> Intent che possono essere ricevuti dai<br />

componenti <strong>in</strong>teressati. Il frammento <strong>di</strong> co<strong>di</strong>ce seguente mostra come un agente crea e<br />

trasmette l'<strong>in</strong>tento <strong>di</strong> comunicare ad una <strong>in</strong>terfaccia grafica.<br />

Intent broadcast = new Intent();<br />

broadcast.setAction("jade.demo.chat.REFRESH_CHAT");<br />

broadcast.putExtra("sentence", speaker + ": " + sentence + "\n");<br />

logger.<strong>in</strong>fo("Sen<strong>di</strong>ng broadcast " + broadcast.getAction());<br />

context.sendBroadcast(broadcast);<br />

I frammenti <strong>di</strong> co<strong>di</strong>ce riportati <strong>di</strong> seguito mostrano come una activity si registra un ricevitore<br />

per <strong>in</strong>tercettare Intenti:<br />

myReceiver = new (); IntentFilter refreshChatFilter = new IntentFilter();<br />

refreshChatFilter.addAction("jade.demo.chat.REFRESH_CHAT");<br />

registerReceiver(myReceiver, refreshChatFilter);<br />

...<br />

private class extends BroadcastReceiver {<br />

MyReceiver<br />

@Override<br />

public void onReceive(Context context, Intent <strong>in</strong>tent) {<br />

Str<strong>in</strong>g action = <strong>in</strong>tent.getAction();<br />

if (action.equalsIgnoreCase("jade.demo.chat.REFRESH_CHAT")) {<br />

66


Ambiente <strong>di</strong> sviluppo<br />

TextView chatField = (TextView) f<strong>in</strong>dViewById(R.id.chatTextView);<br />

chatField.append(<strong>in</strong>tent.getExtras().getStr<strong>in</strong>g("sentence")); scrollDown();<br />

}<br />

}<br />

}<br />

2.10. Integrazione <strong>di</strong> JADE e Android <strong>in</strong> Eclipse<br />

Per l’implementazione degli applicativi ad agenti è stato usato Eclipse In<strong>di</strong>go ([9]),i seguenti<br />

passi mostrano come <strong>in</strong>tegrare Jade <strong>in</strong> Eclipse.<br />

- Scompattare l'archivio contenente i b<strong>in</strong>ari <strong>di</strong> Jade ([8])<br />

- Aprire Eclipse e creare un nuovo Progetto Java:<br />

- Inserire un nome e proseguire.<br />

- Alla scermata successiva aprire la f<strong>in</strong>estra Libraries e cliccare su Add External JARs:<br />

67


Ambiente <strong>di</strong> sviluppo<br />

- Selezionate dall'explorer l'archivio delle classi Jade (jade.jar), localizzato <strong>in</strong> “Jade-Dir”/lib/.<br />

Ripetere l'operazione per il file commons-codec-1.3.jar ubicato <strong>in</strong> “Jade-<br />

Dir”/lib/commons-codec/.<br />

- F<strong>in</strong>ish per creare il progetto.<br />

- Creare un package per contenere le classi che def<strong>in</strong>iscono gli agenti (il <br />

dà problemi con Jade, meglio rimuoverlo)<br />

- Cliccare con il tasto destro sulla cartella del progetto ed aprire la f<strong>in</strong>estra Run<br />

Configurations:<br />

68


Ambiente <strong>di</strong> sviluppo<br />

- Creare una nuova configurazione per una Java Application.<br />

- Assegnare un nome alla configurazione, legare questa al progetto appena creato ed<br />

<strong>in</strong>serire Jade.Boot come ma<strong>in</strong> class. ([10])<br />

L’SDK Android su Eclipse:<br />

Il prerequisito per l’<strong>in</strong>stallazione dell’Android SDK su Eclipse è l’avere sul proprio PC il JDK<br />

(Java Developer Kit). Successivamente si passa all’<strong>in</strong>stallazione dell’Android SDK tramite<br />

l’<strong>in</strong>staller che però non contiene l’ambiente <strong>di</strong> sviluppo completo ma solo il nucleo dei tools<br />

utili a scaricare il resto del package dell’SDK. ([11]) Nel momento <strong>in</strong> cui si <strong>in</strong>stalla il software è<br />

utile prendere nota della <strong>di</strong>rectory <strong>di</strong> <strong>in</strong>stallazione che verrà richiesta durante l’<strong>in</strong>stallazione<br />

dell’ADT, il plug<strong>in</strong> per Eclipse.<br />

Figura 2-21 Android SDK manager<br />

Una volta ottenuti tali file è possibile passare all’<strong>in</strong>stallazione dell’ADT per Eclipse che viene<br />

<strong>in</strong>stallato tramite il menù Help > Install New Software <strong>di</strong> Eclipse e <strong>di</strong>gitando nel campo “Work<br />

69


Ambiente <strong>di</strong> sviluppo<br />

with” l’URL https//dl-ssl.google.com/android/eclipse/. Dare <strong>in</strong>vio dopo aver selezionato tutti<br />

i plug<strong>in</strong> che compariranno nel repository.<br />

La fase successiva è la configurazione dell’ADT tramite il menù W<strong>in</strong>dows > Preferences e<br />

selezionando Android dal pannello a s<strong>in</strong>istra. Inserire la locazione nel file system dell’Android<br />

SDK precedentemente <strong>in</strong>stallato attraverso il tasto Browse e successivamente confermare le<br />

mo<strong>di</strong>fiche<br />

70


3. Progettazione del sistema<br />

Il sistema <strong>di</strong> videosorveglianza da realizzare prevede la creazione <strong>di</strong> due applicativi ad agenti,<br />

un applicativo “centrale” <strong>di</strong> gestione dei <strong>di</strong>spositivi mobili e un applicativo per ogni<br />

<strong>di</strong>spositivo. In questo capitolo, per prima cosa vengono riportate delle <strong>in</strong>formazioni<br />

riguardanti l’applicativo Android per l’<strong>in</strong>seguimento dei volti fornitomi dal Dipartimento <strong>di</strong><br />

<strong>Ingegneria</strong> dell’Informazione da agentificare, <strong>in</strong> modo da rendere comprensibili le successive<br />

scelte <strong>di</strong> progettazione. Viene poi riportata l’analisi dei requisiti, l’architettura del software<br />

ad agenti e la comunicazione realizzata fra gli applicativi sviluppati.<br />

3.1. Software <strong>di</strong> partenza<br />

L’applicazione che mi è stata fornita per l’<strong>in</strong><strong>di</strong>viduazione e <strong>in</strong>seguimento dei volti su<br />

smartphone Android è stata sviluppata da Simone Saraceni ([12]) ed è composta<br />

pr<strong>in</strong>cipalmente dai seguenti componenti: la classe FdActivity, che estende una Activity<br />

Android, rappresenta il punto <strong>di</strong> accesso all’applicazione e dove vengono <strong>in</strong>izializzati i vari<br />

componenti; la classe CvBaseView che si occupa della visualizzazione dell’<strong>in</strong>terfaccia grafica;<br />

ER1Direction che determ<strong>in</strong>a il comando <strong>di</strong> movimento che deve eseguire il robot collegato<br />

allo smartphone; FpsMeter è una classe <strong>di</strong> utilità che calcola i FPS (frame per secondo);<br />

FdView è la classe che contiene la logica del sistema <strong>di</strong> visione per l’<strong>in</strong><strong>di</strong>viduazione e<br />

selezione dei volti. La parte <strong>di</strong>rettamente <strong>in</strong>teressata dal mio lavoro <strong>di</strong> tesi riguarda la logica<br />

del sistema <strong>di</strong> visione per l’<strong>in</strong><strong>di</strong>viduazione e selezione dei volti contenuta prevalentemente <strong>in</strong><br />

FdView e CvBaseView, riporto qu<strong>in</strong><strong>di</strong> <strong>di</strong> seguito un riassunto del loro funzionamento:<br />

L’applicazione <strong>in</strong><strong>di</strong>vidua i volti presenti <strong>in</strong> un flusso video ricevuto <strong>in</strong> <strong>in</strong>gresso:<br />

analizzandolo <strong>in</strong><strong>di</strong>vidua la posizione <strong>di</strong> tutti i volti presenti nel frame corrente.<br />

71


Progettazione del sistema<br />

Il sistema sceglie un volto dom<strong>in</strong>ante, tra quelli <strong>in</strong><strong>di</strong>viduati.<br />

Una funzione riceve <strong>in</strong> <strong>in</strong>gresso l’elenco dei volti <strong>in</strong><strong>di</strong>viduati nella scena e tra questi<br />

ne sceglie opportunamente uno, secondo il criterio del tempo <strong>di</strong> permanenza<br />

nell’<strong>in</strong>quadratura.<br />

Utilizzando come <strong>in</strong>gresso la posizione del volto dom<strong>in</strong>ante nella scena, il sistema<br />

determ<strong>in</strong>a la <strong>di</strong>rezione <strong>di</strong> movimento del robot al f<strong>in</strong>e <strong>di</strong> mantenere il volto<br />

dom<strong>in</strong>ante al centro della scena.<br />

Il sistema elabora l’immag<strong>in</strong>e del volto dom<strong>in</strong>ante, utilizzata come <strong>in</strong>put, e restituisce<br />

un valore <strong>di</strong> tipo booleano. Tale elaborazione verrà eseguita da un software <strong>di</strong> terze<br />

parti, che restituisce il valore vero se il soggetto è stato riconosciuto <strong>in</strong> un database <strong>di</strong><br />

soggetti noti, altrimenti restituisce il valore falso.<br />

Utilizzando l’output generato dalla funzione <strong>di</strong> elaborazione del volto dom<strong>in</strong>ante, il<br />

sistema opportunamente mo<strong>di</strong>fica il proprio comportamento. Qualora venga ricevuto<br />

il valore booleano vero, il sistema deve cont<strong>in</strong>uare a seguire il volto dom<strong>in</strong>ante,<br />

altrimenti <strong>in</strong>izia a seguire un altro soggetto, se presente nella scena. Se non viene<br />

ricevuto alcun risultato dell’elaborazione, il robot cont<strong>in</strong>uerà a seguire il volto<br />

dom<strong>in</strong>ante f<strong>in</strong>ché questo non esce dalla scena.<br />

In particolare <strong>di</strong> seguito è riportato il co<strong>di</strong>ce riguardante il metodo run() della classe<br />

CvBaseView:<br />

public void run() {<br />

Bitmap bmp=null;<br />

Canvas canvas=null;<br />

Log.i(TAG, "Start<strong>in</strong>g process<strong>in</strong>g thread run t="+System.currentTimeMillis());<br />

//<strong>in</strong>itialize FPS and ER1 image<br />

mFps.<strong>in</strong>it();<br />

mER1.<strong>in</strong>it(mFrameWidth,mFrameHeight);<br />

while (true) {<br />

bmp = null;<br />

synchronized (this) {<br />

if (mCamera == null)<br />

break;<br />

if (!mCamera.grab()) {<br />

Log.e(TAG, "mCamera.grab() failed");<br />

break;<br />

}<br />

//elaborate video, calculate FPS and ER1 <strong>di</strong>rection<br />

72


}<br />

Progettazione del sistema<br />

Log.i(TAG, "Start<strong>in</strong>g processFrame t="+System.currentTimeMillis());<br />

bmp = processFrame(mCamera);<br />

mFps.measure();<br />

//mER1.calc(getResults());<br />

}<br />

//draws elaborated images to surface holder<br />

if (bmp != null) {<br />

canvas = mHolder.lockCanvas();<br />

if (canvas != null) {<br />

appW=(canvas.getWidth() - bmp.getWidth()) / 2.0f;<br />

appH=(canvas.getHeight() - bmp.getHeight()) / 2.0f;<br />

canvas.drawBitmap(bmp, appW, appH, null);<br />

mFps.draw(canvas, appW, 0);<br />

mER1.calc(getResults(),appW,appH);<br />

mER1.draw(canvas, appW, appH);<br />

mHolder.unlockCanvasAndPost(canvas);<br />

}<br />

bmp.recycle();<br />

}<br />

}<br />

Log.i(TAG, "F<strong>in</strong>ish<strong>in</strong>g process<strong>in</strong>g thread");<br />

Listato 3-1 Metodo run() <strong>di</strong> CvBaseView<br />

Dal frammento riportato è possibile notare che tramite il ciclo while(true) sia ripetutamente<br />

chiamato il metodo processFrame che elabora il video e restituisce una immag<strong>in</strong>e bmp, <strong>di</strong><br />

seguito è riportato il co<strong>di</strong>ce relativo al metodo processFrame implementato dalla classe<br />

FdView:<br />

protected Bitmap processFrame(VideoCapture capture) {<br />

capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);<br />

capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);<br />

if (mCascade != null) {<br />

//clear previous detected faces array<br />

faces.clear();<br />

//equalize gray image histogram<br />

Imgproc.equalizeHist(mGray, mGray);<br />

//<strong>in</strong>voke face detection algorithm, from a start face <strong>di</strong>mension of 90x90<br />

mCascade.detectMultiScale(mGray, faces, 1.3, 3, 0, DEFSIZE);<br />

//search each face on history face detected array<br />

for (Rect r : faces){<br />

add=true;<br />

for (CFace a : hFaces){<br />

if (a.updatePos(r)) {<br />

add=false;<br />

break;<br />

}<br />

}<br />

if (add) hFaces.add(new CFace(r)); //face not found <strong>in</strong>to history array, new face<br />

if (develop) Core.rectangle(mRgba, r.tl(), r.br(), new Scalar(0, 0, 0, 127), 1); //pr<strong>in</strong>t a green<br />

rectangle around each face<br />

}<br />

73


Progettazione del sistema<br />

//<strong>in</strong>itialize array variables<br />

newFace=null;<br />

maxT=0;<br />

hcopy.clear();<br />

//for each faces <strong>in</strong>to history faces array, removes old face (not yet detected) and search<br />

dom<strong>in</strong>ant face (most time present)<br />

for (CFace a:hFaces){<br />

if (a.ag<strong>in</strong>g()){<br />

hcopy.add(a);<br />

} else if (a.f<strong>in</strong>dBest()) {<br />

newFace=a;<br />

}<br />

}<br />

hFaces.removeAll(hcopy);<br />

//if a face was detected<br />

if (newFace!=null){<br />

if (develop) Core.rectangle(mRgba, newFace.pos.tl(), newFace.pos.br(), new<br />

Scalar(255,0,0,255),2); //draws a red rectangle around face<br />

//draw a blue l<strong>in</strong>e next to the left angle of the dom<strong>in</strong>ant face to visualize the set po<strong>in</strong>t on Z<br />

(=140 px)<br />

CFace temp = new CFace(newFace.pos);<br />

Po<strong>in</strong>t bo=temp.pos.tl();<br />

bo.y+=130;<br />

if (develop) Core.l<strong>in</strong>e(mRgba, newFace.pos.tl(),bo, new Scalar(0,0,255,255), 4); //draws a red<br />

rectangle around face<br />

if (dom<strong>in</strong>antFace==null || newFace.id!=dom<strong>in</strong>antFace.id || repeat>REPEAT_LIMIT){<br />

//send face to server when first one detected or new face or need to re-send<br />

dom<strong>in</strong>antFace=newFace;<br />

repeat=0;<br />

try{<br />

//<strong>in</strong>terrupt server response wait thread<br />

waitResp=false;<br />

//create bitmap image to send<br />

dom<strong>in</strong>ant=Bitmap.createBitmap(mRgba.cols(),mRgba.rows(),Bitmap.Config.ARGB_8888);<br />

Utils.matToBitmap(mRgba, dom<strong>in</strong>ant);<br />

dom<strong>in</strong>ant=Bitmap.createBitmap(dom<strong>in</strong>ant, newFace.pos.x, newFace.pos.y,<br />

newFace.pos.width, newFace.pos.height);<br />

//if (count++>120) count=0;<br />

//dom<strong>in</strong>antFace.id=count; //update face ID<br />

faceCheck="";<br />

sendImg=true;<br />

//Log.i(TAG, "BMP ok");<br />

}catch (Exception e) {Log.e(TAG,"bitmap error "+e.toStr<strong>in</strong>g());}<br />

Log.i(TAG, "new Face ");<br />

}else if (newFace.id==dom<strong>in</strong>antFace.id && repeat


Progettazione del sistema<br />

}<br />

}<br />

if (develop){<br />

//create image to send back to caller<br />

bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);<br />

if (Utils.matToBitmap(mRgba, bmp))<br />

return bmp;<br />

bmp.recycle();<br />

}<br />

return null;<br />

}<br />

Listato 3-2 Metodo processFrame() <strong>di</strong> FdView<br />

Il metodo processFrame si occupa <strong>di</strong> <strong>in</strong><strong>di</strong>viduare i volti, selezionare il volto dom<strong>in</strong>ante e<br />

preparare l’immag<strong>in</strong>e da <strong>in</strong>viare al PC. Il video catturato viene elaborato equalizzandone<br />

l’istogramma, qu<strong>in</strong><strong>di</strong> viene eseguito l’algoritmo <strong>di</strong> <strong>in</strong><strong>di</strong>viduazione dei volti. La scansione<br />

ricerca i volti con una <strong>di</strong>mensione m<strong>in</strong>ima <strong>di</strong> 90x90 pixel, ad ogni iterazione la <strong>di</strong>mensione<br />

viene <strong>in</strong>crementata <strong>di</strong> un fattore 1,3 ([12]). La variabile faces contiene la lista delle posizioni<br />

<strong>di</strong> tutti i volti <strong>in</strong><strong>di</strong>viduati nel frame corrente; il passo successivo è quello <strong>di</strong> cercare ogni volto<br />

<strong>in</strong><strong>di</strong>viduato nei frame precedenti, aggiornandone le <strong>in</strong>formazioni per mezzo del metodo<br />

updatePos; il vettore hFaces contiene le <strong>in</strong>formazioni relative ai volti <strong>in</strong><strong>di</strong>viduati nel frame<br />

attuale e <strong>in</strong> quelli precedenti. Il tipo <strong>di</strong> dati CFace è stato creato per memorizzare le<br />

<strong>in</strong>formazioni relative ai volti <strong>in</strong><strong>di</strong>viduati, ovvero la posizione e il tempo <strong>di</strong> permanenza sulla<br />

scena. Ogni volta che viene <strong>in</strong><strong>di</strong>viduato un volto dom<strong>in</strong>ante <strong>di</strong>verso dal precedente, oppure è<br />

trascorso un certo <strong>in</strong>tervallo <strong>di</strong> tempo dall’ultimo <strong>in</strong>vio al PC, viene creata l’immag<strong>in</strong>e bitmap<br />

del volto dom<strong>in</strong>ante, pronta per essere trasferita al PC. L’operazione <strong>di</strong> ricerca del volto<br />

dom<strong>in</strong>ante si basa sul tempo <strong>di</strong> permanenza nella scena; ogni volto <strong>in</strong><strong>di</strong>viduato viene<br />

ricercato nello storico: se la posizione attuale del vertice superiore s<strong>in</strong>istro è <strong>in</strong> un <strong>in</strong>torno<br />

della posizione precedente, i due volti confrontati sono marcati come identici. E’ presente<br />

una funzione updatePos della classe CFace che si occupa <strong>di</strong> confrontare le posizioni dei due<br />

volti, restituendo il valore false se non sono compatibili, altri- menti provvede ad aggiornare<br />

la posizione corrente e il tempo <strong>di</strong> permanenza. La variabile noFace viene utilizzata per<br />

elim<strong>in</strong>are, con il metodo ag<strong>in</strong>g, i volti non più presenti nella scena per un certo numero <strong>di</strong><br />

frame consecutivi. Nella selezione del volto dom<strong>in</strong>ante, con il metodo f<strong>in</strong>dBest si cerca il<br />

volto con il valore massimo della variabile time.<br />

75


Progettazione del sistema<br />

L’applicativo Android per sapere se il volto selezionato sia conosciuto o no, comunica con un<br />

altro applicativo realizzato a tale scopo, tramite WiFi. Il modulo responsabile della<br />

comunicazione WiFi con il PC avente l’applicativo <strong>di</strong> riconoscimento del volto è implementato<br />

attraverso l’utilizzo <strong>di</strong> tre thread contenuti <strong>in</strong> FdView. Il thread CommThread viene creato<br />

all’avvio dell’applicazione, si occupa <strong>di</strong> <strong>in</strong>iziare la comunicazione con il PC e <strong>di</strong> avviare altri<br />

due thread: uno per l’<strong>in</strong>vio delle immag<strong>in</strong>i e l’altro per la ricezione delle risposte.<br />

Il SendThread per l’<strong>in</strong>vio dell’immag<strong>in</strong>e al PC, controlla perio<strong>di</strong>camente lo stato della variabile<br />

sendImg, quando questa assume il valore vero, l’immag<strong>in</strong>e del volto dom<strong>in</strong>ante viene <strong>in</strong>viata<br />

al PC; impostando il flag waitResp al valore true, l’applicazione si mette <strong>in</strong> ascolto della<br />

risposta.<br />

Il RecvThread, deve elaborare la risposta <strong>in</strong>viata dal PC, il messaggio ricevuto è composto da<br />

un solo byte, che può assumere il valore 1 nel caso <strong>in</strong> cui il volto precedentemente <strong>in</strong>viato è<br />

stato riconosciuto, 0 altrimenti. L’utilizzo dei thread consente <strong>di</strong> gestire <strong>in</strong> modo<br />

<strong>in</strong><strong>di</strong>pendente la comunicazione con il PC. ([12])<br />

Per agentificare tale applicativo e ottenere un sistema <strong>di</strong> videosorveglianza ad agenti è qu<strong>in</strong><strong>di</strong><br />

necessario sostituire a la comunicazione esistente fra l’applicativo Andoid e l’applicativo <strong>di</strong><br />

riconoscimento del volto con una comunicazione fra agenti.<br />

76


Progettazione del sistema<br />

3.2. Analisi dei requisiti<br />

Vi sono due <strong>di</strong>versi tipi <strong>di</strong> requisiti sul sistema, quelli funzionali e i requisiti aggiuntivi o non<br />

funzionali, che forniscono v<strong>in</strong>coli ad<strong>di</strong>zionali, permettendo un ulteriore sviluppo del progetto<br />

nel tempo.<br />

I requisiti sono schematizzati qui <strong>di</strong> seguito.<br />

Requisiti funzionali:<br />

Elaborazione immag<strong>in</strong>e del volto<br />

Il sistema deve essere <strong>in</strong> grado <strong>di</strong> elaborare l’immag<strong>in</strong>e del volto dom<strong>in</strong>ante, utilizzata<br />

come <strong>in</strong>put, e restituire un valore <strong>di</strong> tipo booleano. Tale elaborazione verrà eseguita<br />

da un software <strong>di</strong> terze parti, che restituisce all’agente richiedente il valore vero se il<br />

soggetto è stato riconosciuto <strong>in</strong> un database <strong>di</strong> soggetti noti, altrimenti restituisce il<br />

valore falso.<br />

Gestione output elaborazione del volto<br />

Utilizzando l’output generato dalla funzione <strong>di</strong> elaborazione del volto dom<strong>in</strong>ante, il<br />

sistema deve opportunamente mo<strong>di</strong>ficare il proprio comportamento. Qualora venga<br />

ricevuto dall’agente Android il valore booleano vero, il sistema deve cont<strong>in</strong>uare a<br />

seguire il volto dom<strong>in</strong>ante, altrimenti <strong>in</strong>izia a seguire un altro soggetto, se presente<br />

nella scena.<br />

Def<strong>in</strong>izione <strong>di</strong> una ontologia<br />

Def<strong>in</strong>izione <strong>di</strong> una ontologia per lo scambio dei messaggi fra agenti <strong>in</strong> uno scenario <strong>di</strong><br />

videosorveglianza, per esempio per richieste e risposte:" identifica questo<br />

soggetto...", "il soggetto identificato è...",...<br />

Gestione <strong>di</strong>spositivi mobili<br />

Il sistema deve conoscere e tenersi aggiornato sugli attuali <strong>di</strong>spositivi mobili<br />

partecipanti alla videosorveglianza e funzionanti correttamente.<br />

77


Requisiti non funzionali:<br />

Uso del framework Jade<br />

Progettazione del sistema<br />

Il sistema <strong>di</strong> videosorveglianza deve basarsi su tecnlogia ad agenti, <strong>in</strong> particolare<br />

utilizzando il framework Jade ed il suo add-on Jade-Leap per lo sviluppo <strong>di</strong> agenti su<br />

<strong>di</strong>spositivi mobili.<br />

Il sistema deve essere tollerante ai guasti<br />

Il sistema <strong>di</strong> videosorveglianza deve resistere ad un guasto della macch<strong>in</strong>a avente la<br />

piattaforma ad agenti che offre il servizio <strong>di</strong> videosorveglianza, gli agenti presenti nei<br />

<strong>di</strong>spositivi mobili dovranno riprist<strong>in</strong>are il servizio utilizzando una piattaforma <strong>di</strong><br />

videosorveglianza <strong>di</strong> recovery.<br />

Il sistema deve essere scalabile<br />

Il sistema non deve porre limiti al numero <strong>di</strong> <strong>di</strong>spositivi mobili che vogliono<br />

partecipare alla videosorveglianza, tenendo conto che per motivi <strong>di</strong> potenza <strong>di</strong> calcolo<br />

<strong>di</strong>sponibile, ad un numero maggiore <strong>di</strong> telecamere potrebbe essere necessario un<br />

numero maggiore <strong>di</strong> macch<strong>in</strong>e che offrono il servizio <strong>di</strong> videosorveglianza attraverso<br />

più piattaforme federate fra loro.<br />

3.3. Architettura del sistema<br />

Il sistema <strong>di</strong> videosorveglianza ad agenti prevede la presenza <strong>di</strong> un applicativo centrale <strong>in</strong><br />

grado <strong>di</strong> gestire le richieste <strong>di</strong> identificazione dei volti provenienti dai <strong>di</strong>spositivi mobili e <strong>di</strong><br />

un applicativo ad agenti presente <strong>in</strong> ogni <strong>di</strong>spositivo. L’applicativo centrale <strong>di</strong><br />

videosorveglianza ha il compito <strong>di</strong> lanciare una piattaforma ad agenti Jade, al cui <strong>in</strong>terno sia<br />

presente un agente <strong>in</strong> grado <strong>di</strong> comunicare con gli agenti mobili e con l’applicazione per il<br />

riconoscimento dei volti. L’applicativo ad agenti Android crea uno split conta<strong>in</strong>er nella<br />

piattaforma Jade creata dall’applicativo centrale ed un agente <strong>in</strong> grado <strong>di</strong> comunicare con<br />

l’agente manager per fornire il servizio <strong>di</strong> videosorveglianza. E’ possibile collegare n<br />

<strong>di</strong>spositivi Android alla piattaforma (stando ai limiti delle potenzialità <strong>di</strong> calcolo a <strong>di</strong>sposizione<br />

78


Progettazione del sistema<br />

dell’applicativo centrale), come è possibile creare n piattaforme fra <strong>di</strong> loro federate e<br />

<strong>di</strong>stribuire i <strong>di</strong>spositivi mobili fra <strong>di</strong> esse per <strong>di</strong>stribuire il carico. Una piattaforma Jade con il<br />

servizio <strong>di</strong> videosorveglianza <strong>di</strong> recovery è presente <strong>in</strong> caso <strong>di</strong> <strong>di</strong>struzione della piattaforma<br />

<strong>in</strong>iziale, la figura 3-1 mostra l’architettura realizzata:<br />

Figura 3-1 Architettura del sistema <strong>di</strong> videosorveglianza<br />

79


Progettazione del sistema<br />

La figura 3.2 mostra l’architettura del sistema <strong>di</strong> videosorveglianza <strong>in</strong> presenza <strong>di</strong> una<br />

piattaforma <strong>di</strong> recovery:<br />

Figura 3-2 Architettura sistema <strong>di</strong> videosorveglianza con piattaforma recovery<br />

Nel caso la piattaforma pr<strong>in</strong>cipale smetta <strong>di</strong> funzionare o venga <strong>di</strong>strutta, l’applicativo<br />

Android riprist<strong>in</strong>a il servizio <strong>di</strong> videosorveglianza ricreando il suo agente <strong>in</strong> un’altra<br />

piattaforma <strong>di</strong> videosorveglianza (cioè con agente manager) <strong>di</strong>sponibile.<br />

80


Progettazione del sistema<br />

3.3.1. Agente Android<br />

L’agente Android è caratterizzato dai seguenti punti:<br />

Recupero <strong>di</strong> un agente manager<br />

L’agente Android viene creato al caricamento dell’Activity pr<strong>in</strong>cipale lanciata<br />

dall’applicazione <strong>di</strong> videosorveglianza del <strong>di</strong>spositivo Android. Per prima cosa l’agente<br />

Android deve conoscere l’AID dell’agente manager con cui comunicare e svolgere il<br />

servizio <strong>di</strong> videosorveglianza, qu<strong>in</strong><strong>di</strong> chiede al DF della piattaforma le <strong>in</strong>formazioni<br />

riguardanti la presenza <strong>di</strong> un agente che offre il servizio <strong>di</strong> manager.<br />

Interfaccia agente Android<br />

L’agente Android, per <strong>in</strong>teragire con l’applicazione che elabora il flusso video della<br />

telecamera, offre una <strong>in</strong>terfaccia con cui gestire 3 importanti elementi appartenenti<br />

all’agente Android: l’immag<strong>in</strong>e del volto <strong>in</strong> byte, una str<strong>in</strong>ga rappresentante<br />

l’identificativo del volto e una variabile booleana che <strong>in</strong><strong>di</strong>ca l’arrivo <strong>di</strong> una risposta <strong>di</strong><br />

identificazione del volto da parte del manager agent. L’immag<strong>in</strong>e del volto,<br />

l’identificativo del volto e la variabile booleana sono elementi che <strong>in</strong>teragiscono con<br />

la logica <strong>di</strong> elaborazione video, qu<strong>in</strong><strong>di</strong> l’agente offre una <strong>in</strong>terfaccia che consente <strong>di</strong>:<br />

o Inviare la richiesta <strong>di</strong> identificazione <strong>di</strong> una immag<strong>in</strong>e <strong>di</strong> un volto.<br />

o Ricevere l’immag<strong>in</strong>e del volto che ha attualmente memorizzato l’agente.<br />

o Leggere l’identificativo del volto attualmente memorizzato nell’agente.<br />

o Settare l’identificativo del volto attualmente memorizzato nell’agente.<br />

o Leggere la variabile booleana <strong>di</strong> arrivo risposta <strong>di</strong> identificazione.<br />

o Settare la variabile booleana <strong>di</strong> arrivo risposta <strong>di</strong> identificazione.<br />

81


Progettazione del sistema<br />

Figura 3-3 Interfaccia agente Android<br />

Registrazione agente Andorid al DF della piattaforma<br />

Per sod<strong>di</strong>sfare il requisito funzionale richiesto al sistema <strong>di</strong> conoscere i <strong>di</strong>spositivi<br />

collegati al servizio <strong>di</strong> videosorveglianza, ogni agente Android che si aggiunge ad una<br />

Jade Platform si registra al DF della piattaforma con il servizio <strong>di</strong> “telecamera”. Per<br />

realizzare questo, l’agente Android dopo la sua creazione attiva un suo behaviour <strong>di</strong><br />

tipo OneShotBehaviour che implementa la registrazione dell’agente Android al DF<br />

della piattaforma.<br />

Subscribe all’agente manager<br />

Per rispondere al requisito <strong>di</strong> tenere aggiornata la lista dei <strong>di</strong>spositivi mobili che<br />

partecipano alla videosorveglianza, l’agente Android tramite un secondo behaviuour<br />

<strong>di</strong> tipo OneShotBehaviour, manda un messaggio ACL <strong>di</strong> tipo SUBSCRIBE all’agente<br />

manager della piattaforma trovato precedentemente.<br />

82


Progettazione del sistema<br />

Gestione acknowledge da parte dell’agente Android<br />

Per sod<strong>di</strong>sfare il requisito richiesto al sistema <strong>di</strong> conoscere i <strong>di</strong>spositivi funzionanti<br />

tramite un perio<strong>di</strong>co acknowledge, l’agente Android implementa un behaviour <strong>di</strong> tipo<br />

ContractNetResponder, ovvero implementa la parte <strong>di</strong> responder del protocollo FIPA<br />

Contract-Net, il quale all’arrivo <strong>di</strong> un messaggio ACL <strong>di</strong> tipo CallForProposal, risponde<br />

al sender <strong>di</strong> tale messaggio con un acknowledge, tramite l’ontologia usata dagli<br />

agenti.<br />

Richiesta identificazione volto<br />

Altro behaviour implementato dall’agente Android, è il behaviour de<strong>di</strong>cato all’<strong>in</strong>vio<br />

della richiesta <strong>di</strong> identificazione del volto. Questo behaviour è <strong>di</strong> tipo<br />

AchieveReInitiator, ovvero rispetta la parte <strong>di</strong> <strong>in</strong>iziator del protocollo FIPA Request.<br />

Tale behaviour ha il compito <strong>di</strong> spe<strong>di</strong>re all’agente manager un messagio contenente<br />

l’immag<strong>in</strong>e <strong>in</strong> byte del volto da identificare (volto che ha attualmente memorizzato<br />

l’agente) e la richiesta <strong>di</strong> identificazione. All’eventuale arrivo della risposta <strong>di</strong><br />

identificazione da parte dell’agente manager, l’agente Android memorizza l’id del<br />

volto che ha ricevuto nel caso il volto sia stato riconosciuto o un id equivalente al<br />

concetto <strong>di</strong> volto sconosciuto. A questo punto l’agente Android mo<strong>di</strong>fica la sua<br />

variabile booleana <strong>in</strong>terna per far sapere alla logica <strong>di</strong> elaborazione video che è<br />

arrivata una risposta <strong>di</strong> identificazione.<br />

Il meccanismo <strong>di</strong> richiedere l’identificazione del volto tramite l’agente e memorizzare la<br />

risposta <strong>in</strong> variabili dell’agente accessibili tramite la sua <strong>in</strong>terfaccia, permette <strong>di</strong><br />

<strong>di</strong>saccoppiare l’<strong>in</strong>vio <strong>di</strong> richieste <strong>di</strong> identificazione <strong>di</strong> volti effettuate dalla logica <strong>di</strong><br />

elaborazione del flusso <strong>di</strong> camera, dall’attesa della risposta a tali richieste. Questo perchè il<br />

controllo delle risposte alle richieste <strong>di</strong> identificazione è rimandato ad un apposito Thread, il<br />

quale controlla la variabile booleana <strong>di</strong> arrivo risposta tramite l’<strong>in</strong>terfaccia dell’agente, e nel<br />

caso sia arrivata una risposta, effettua le opportune operazioni per la logica <strong>di</strong> elaborazione<br />

video.<br />

83


Progettazione del sistema<br />

La figura seguente mostra le operazioni svolte dall’agente Android:<br />

Figura 3-4 Operazioni agente Andorid<br />

Le operazioni citate precedentemente saranno implementate dalle seguenti classi:<br />

84


Progettazione del sistema<br />

Figura 3-5 Componenti software dell'agente Android<br />

85


Progettazione del sistema<br />

La classe ClientAgent estende la classe Agent implementando l’agente Android. Al suo avvio<br />

si registra all’<strong>in</strong>terfaccia ClientGUIInt e lancia i suoi behaviour:<br />

- DFRegistraTelecamera, estende OneShotbehaviour ed è la classe implementata<br />

per registrare l’agente al DF della piattaforma.<br />

- ParticipantsManager, estende OneShotBehaviour per iscriversi alla lista dei<br />

<strong>di</strong>spositivi attivi conosciuti dall’agente manager.<br />

- Rispon<strong>di</strong>Ack, estende ContractNetResponder per rispondere alle richieste <strong>di</strong><br />

acknowledgement dell’agente manager.<br />

Per la gestione degli acknowledge si è scelto il protocollo FIPA Contract-Net perché<br />

l’implementazione gestisce automaticamente l’<strong>in</strong>vio <strong>di</strong> n messaggi e la ricezione delle<br />

risposte, mentre per richiedere una identificazione del volto si è scelto il protocollo FIPA<br />

Request dato che si ratta della richiesta <strong>di</strong> un servizio.<br />

3.3.2. Agente Manager<br />

L’agente manager è l’agente che gestisce le richieste <strong>di</strong> identificazione dei volti da parte dei<br />

<strong>di</strong>spositivi mobili e che tiene l’<strong>in</strong>formazione relativa agli attuali <strong>di</strong>spositivi che partecipano<br />

alla videosorveglianza.<br />

L’agente manager è caratterizzato dai seguenti punti:<br />

Conoscenza degli agenti mobili attualmente connessi al servizio <strong>di</strong><br />

videosorveglianza<br />

Per avere l’<strong>in</strong><strong>di</strong>rizzo (AID degli agenti mobili) dei <strong>di</strong>spositivi attualmente connessi e<br />

funzionanti sempre aggiornata, l’agente manager attiva il behaviour<br />

SubscriptionResponder, il quale risponde ai messaggi ACL <strong>di</strong> tipo Subscription<br />

provenienti dagli agenti Android. Inoltre per sapere automaticamente quando un<br />

agente <strong>di</strong> un <strong>di</strong>spositivo Android si è scollegato dal servizio <strong>di</strong> videosorveglianza, il<br />

manager agent implementa SubscriptionManager, il quale prevede l’implementazione<br />

dei meto<strong>di</strong> register() e deregister() rispettivamente quando un nuovo agente si<br />

86


Progettazione del sistema<br />

aggiunge alla piattaforma o si elim<strong>in</strong>a, questi eventi sono percepiti dal manager agent<br />

grazie all’agente AMS della piattaforma.<br />

Regisrazione al DF della piattaforma<br />

Per sod<strong>di</strong>sfare le richieste da parte degli agenti Android, il manager agent deve prima<br />

registrarsi al DF della piattaforma col servizio <strong>di</strong> “manager”.<br />

Controllo funzionamento <strong>di</strong>spositivi mobili<br />

Per sod<strong>di</strong>sfare il requisito <strong>di</strong> controllo dei <strong>di</strong>spositivi collegati alla videosorveglianza<br />

tramite acknowledge, l’agente manager lancia un behaviour ControllaAckCyclic che<br />

estende Tickerbehaviour. Tale behaviour ogni 10 secon<strong>di</strong> crea un behaviour<br />

ControllaAck che estende ContractNetInitiator, il quale manda un messaggio ACL <strong>di</strong><br />

tipo CallForProposal a tutti gli agenti che l’agente manager ha <strong>in</strong> lista connessi e<br />

funzionanti. Attraverso il metodo handleAllResponses() si gestisce automaticamente il<br />

controllo delle risposte ed è sufficiente prendere nota <strong>di</strong> chi ha confermato l’ack e chi<br />

no per aggiornare la lista degli agenti connessi.<br />

Identificazione dei volti<br />

Per rispondere alle richieste <strong>di</strong> identificazione dei volti da parte dei <strong>di</strong>spositivi<br />

Android, il manager agent implementa il behaviour RespondImage che estende la<br />

classe AchieveReResponder, ovvero <strong>in</strong>terpreta la parte del responder del protocollo<br />

FIPA Request. Tale behaviour risponde a messaggi ACL <strong>di</strong> tipo Request. Per rispondere<br />

alle richieste <strong>di</strong> identificazione dei volti, l’immag<strong>in</strong>e ricevuta <strong>in</strong> byte dai messaggi <strong>in</strong><br />

arrivo viene memorizzata <strong>in</strong> una locazione <strong>di</strong> memoria prestabilita <strong>in</strong> formato bmp,<br />

dopo<strong>di</strong>ché effettua una richiesta ad una applicazione sviluppata da Gianluca Dolc<strong>in</strong>i<br />

([15]) per il riconoscimento del volto, la quale risponde con un valore booleano <strong>di</strong> tipo<br />

true se il volto è stato riconosciuto o false <strong>in</strong> caso contrario. Una volta ottenuto il<br />

risultato, viene spe<strong>di</strong>to il messaggio <strong>di</strong> risposta al <strong>di</strong>spositivo mobile richiedente.<br />

Interfaccia agente manager<br />

Anche l’agente manager implementa una <strong>in</strong>terfaccia per permettere ai suoi behaviour<br />

<strong>di</strong> leggere e scrivere la lista degli agenti mobili.<br />

87


Progettazione del sistema<br />

In figura 3.6 sono riassunte le operazioni svolte dall’agente manager:<br />

Figura 3-6 Operazioni agente manager<br />

Le operazioni citate precedentemente saranno implementate dalle seguenti classi:<br />

88


Progettazione del sistema<br />

Figura 3-7 Componenti software agente manager<br />

89


Progettazione del sistema<br />

La classe ManagerAgent implementa l’agente manager della piattaforma <strong>di</strong><br />

videosorveglianza e si registra all’<strong>in</strong>terfaccia ManagerGUIImpl da cui è possibile leggere e<br />

scrivere la lista degli agenti conosciuti dall’agente manager. I behaviour che appartengono<br />

all’agente manager sono:<br />

- DFRegistraManager, per registrare l’agente manager al df della piattaforma.<br />

- ControllaAckCyclic, estende TickerBehaviour per richiedere perio<strong>di</strong>camente l’ack agli<br />

agenti Android, lanciando perio<strong>di</strong>camente un behaviour <strong>di</strong> tipo OneShotBehaviour<br />

chiamato ControllaAck, il quale <strong>in</strong>terpreta la parte <strong>di</strong> <strong>in</strong>itiator del protocollo Contract-<br />

Net.<br />

- Il behaviour RespondImage per rispondere alle richieste <strong>di</strong> riconoscimento del volto<br />

estendendo la classe RequestResponder.<br />

3.4. L’ontologia per il servizio <strong>di</strong><br />

videosorveglianza<br />

I messaggi scambiati dagli agenti presenti nel sistema <strong>di</strong> videosorveglianza si <strong>di</strong>st<strong>in</strong>guono per<br />

due scopi:<br />

Per richiedere/rispondere all’acknowledge<br />

Per richiedere/rispondere ad un riconoscimento <strong>di</strong> identità<br />

L’ontologia si compone qu<strong>in</strong><strong>di</strong> dei seguenti due schemi:<br />

Ontologia per l’acknowledge<br />

La richiesta <strong>di</strong> un acknowledge sarà rappresentata nell’ontologia da una AgentAction <strong>di</strong> nome<br />

ConfermaFunzionamento contenente un oggetto Concept chiamato <strong>di</strong> tipo Acknowledge<br />

appositamente def<strong>in</strong>ito. Il tipo <strong>di</strong> Concept Acknowledge ha al suo <strong>in</strong>terno una variabile<br />

booleana e la posibilità <strong>di</strong> leggerla e settarla.<br />

Ontologia per il riconoscimento <strong>di</strong> identità<br />

90


Progettazione del sistema<br />

La richiesta <strong>di</strong> un riconoscimento <strong>di</strong> identità sarà rappresentata nell’ontologia da una<br />

AgentAction <strong>di</strong> nome Identifica contenente un oggetto Concept <strong>di</strong> tipo Identita e un oggetto<br />

Concept <strong>di</strong> tipo Immag<strong>in</strong>e appositamente def<strong>in</strong>iti. Il tipo Concept Identità è un Concept con<br />

all’<strong>in</strong>terno una str<strong>in</strong>ga che rappresenterà l’id del volto se riconosciuto e la possibilità <strong>di</strong><br />

leggerla e mo<strong>di</strong>ficarla. L’oggetto Immag<strong>in</strong>e <strong>di</strong> tipo Concept ha <strong>in</strong>vece al suo <strong>in</strong>terno un array<br />

<strong>di</strong> byte che rappresenta l’immag<strong>in</strong>e del volto e i meto<strong>di</strong> per leggerlo e mo<strong>di</strong>ficarlo.<br />

Figura 3-8 Ontologia del sistema <strong>di</strong> videosorveglianza<br />

91


4. Implementazione<br />

Il capitolo riguardante l’implementazione è sud<strong>di</strong>viso nel seguente modo:<br />

Implementazione ontologia<br />

Implementazione applicazione centrale<br />

Implementazione applicazione Android<br />

Viene mostrata per prima l’implementazione dell’ontologia usata dagli agenti che<br />

partecipano alla videosorveglianza, dato che è necessaria per comprendere i messaggi che<br />

vengono scambiati da entrambi gli applicativi. Successivamente è presentata l’applicazione<br />

centrale che si occupa dell’avvio <strong>di</strong> una piattaforma ad agenti contenente il manager agent <strong>in</strong><br />

grado <strong>di</strong> gestire i <strong>di</strong>spositivi mobili. Inf<strong>in</strong>e è presentato il funzionamento dell’applicazione<br />

Android per il servizio <strong>di</strong> videosorveglianza ad agenti su smartphone Android.<br />

4.1. Implementazione ontologia<br />

L’ontologia usata dagli agenti manager e Android per scambiarsi i messaggi è implementata<br />

per sod<strong>di</strong>sfare i due tipi <strong>di</strong> <strong>in</strong>terazione che avviene fra gli agenti:<br />

Per richiedere/rispondere all’acknowledge<br />

Per richiedere/rispondere ad un riconoscimento <strong>di</strong> identità<br />

Implementazione ontologia per l’acknowledge:<br />

Come detto <strong>in</strong> precedenza, la richiesta <strong>di</strong> un acknowledge avviene da parte dell’agente<br />

manager a tutti gli agenti Android da lui conosciuti, i quali ricevendo il messaggio <strong>di</strong> richiesta<br />

<strong>di</strong> acknowledge, rispondono con un ack positivo se funziona tutto correttamente o non<br />

rispondono.<br />

92


Implementazione<br />

Per implementare tramite una ontologia la richiesta <strong>di</strong> un acknowledge si è implementata<br />

una AgentAction <strong>di</strong> nome ConfermaFunzionamento contenente all’<strong>in</strong>terno un oggetto<br />

Concept <strong>di</strong> tipo Acknowledge def<strong>in</strong>ito nel seguente modo:<br />

public class Acknowledge implements Concept {<br />

}<br />

private boolean ack;<br />

public boolean getAck()<br />

{<br />

return ack;<br />

}<br />

public void setAck(boolean ack)<br />

{<br />

this.ack = ack;<br />

}<br />

Listato 4-1 Concept Acknowledge<br />

L’oggetto Acknowledge ha una variabile booleana e i meto<strong>di</strong> per settarla e leggerla. Il<br />

messaggio spe<strong>di</strong>to dall’agente manager avrà qu<strong>in</strong><strong>di</strong> come contenuto un AgentAction <strong>di</strong><br />

questo tipo:<br />

public class ConfermaFunzionamento implements AgentAction {<br />

}<br />

private Acknowledge acknowledge;<br />

public Acknowledge getAcknowledge()<br />

{<br />

return acknowledge;<br />

}<br />

public void setAcknowledge(Acknowledge acknowledge)<br />

{<br />

this.acknowledge = acknowledge;<br />

}<br />

Listato 4-2 AgentAction ConfermaFunzionamento<br />

All’agente Android che riceve il messaggio da parte dell’agente manager sarà sufficiente<br />

estrarre l’oggetto Acknowledge dall’oggetto ConfermaFunzionamento e settare la variabile<br />

booleana a true prima <strong>di</strong> rispe<strong>di</strong>rglielo.<br />

93


Implementazione<br />

Implementazione ontologia per il riconoscimento <strong>di</strong> identità<br />

Per effetturare richieste <strong>di</strong> riconoscimento <strong>di</strong> identità l’agente Android spe<strong>di</strong>sce un<br />

messaggio <strong>di</strong> richiesta all’agente manager. Tale messaggio deve contenere l’immag<strong>in</strong>e del<br />

volto da identificare e una variabile che l’agente manager mo<strong>di</strong>ficherà <strong>in</strong> base ad un<br />

riconoscimento avvenuto o no. In term<strong>in</strong>i <strong>di</strong> ontologia fra agenti, è necessario implementare<br />

due Concept rappresentanti l’immag<strong>in</strong>e del volto da riconoscere e un Concept per l’id del<br />

relativo volto (identità della persona). Questi Concept sono implementati dagli oggetti<br />

Immag<strong>in</strong>e e Identità seguente:<br />

public class Immag<strong>in</strong>e implements Concept{<br />

private byte[] img;<br />

}<br />

public byte[] getImg()<br />

{<br />

return img;<br />

}<br />

public void setImg(byte[] img)<br />

{<br />

this.img = img;<br />

}<br />

Listato 4-3 Concept Immag<strong>in</strong>e<br />

public class Identita implements Concept {<br />

private Str<strong>in</strong>g id;<br />

}<br />

public Str<strong>in</strong>g getId()<br />

{<br />

return id;<br />

}<br />

public void setId(Str<strong>in</strong>g id)<br />

{<br />

this.id = id;<br />

}<br />

Listato 4-4 Concept Identita<br />

L’immag<strong>in</strong>e per essere serializzata e spe<strong>di</strong>ta nel contenuto <strong>di</strong> un messaggio ACL deve essere<br />

trasformata <strong>in</strong> un array <strong>di</strong> byte, <strong>in</strong> seguito sarà mostrato come.<br />

La richiesta <strong>di</strong> riconoscimento del volto è qu<strong>in</strong><strong>di</strong> formalizzata tramite l’ontologia <strong>in</strong> un<br />

oggetto AgentAction <strong>di</strong> nome Identifica, contenente i due oggetti Immag<strong>in</strong>e e Identita<br />

appena mostrati:<br />

94


Implementazione<br />

public class Identifica implements AgentAction{<br />

}<br />

private Identita identita;<br />

private Immag<strong>in</strong>e immag<strong>in</strong>e;<br />

public Identita getIdentita()<br />

{<br />

return identita;<br />

}<br />

public void setIdentita(Identita identita)<br />

{<br />

this.identita = identita;<br />

}<br />

public Immag<strong>in</strong>e getImmag<strong>in</strong>e()<br />

{<br />

return immag<strong>in</strong>e;<br />

}<br />

public void setImmag<strong>in</strong>e(Immag<strong>in</strong>e immag<strong>in</strong>e)<br />

{<br />

this.immag<strong>in</strong>e = immag<strong>in</strong>e;<br />

}<br />

Listato 4-5 AgentAction Identifica<br />

Qu<strong>in</strong><strong>di</strong> tramite questa ontologia, l’agente manager che riceve una richiesta <strong>di</strong> identificazione<br />

dovrà semplicemente estrarre dal contenuto del messaggio l’oggetto Immag<strong>in</strong>e da elaborare<br />

e mo<strong>di</strong>ficare l’oggetto Identità per spe<strong>di</strong>re il messaggio <strong>di</strong> risposta all’agente Android.<br />

L’ontologia usata dal sistema <strong>di</strong> videosorveglianza è <strong>in</strong>f<strong>in</strong>e rappresentata dalla seguente<br />

classe Videosorveglianza:<br />

public class Videosorveglianza extends Ontology{<br />

public static f<strong>in</strong>al Str<strong>in</strong>g NOME_ONTOLOGIA = "videosorveglianza";<br />

private static Ontology istanza = new Videosorveglianza();<br />

//Action Acknowledge<br />

public static f<strong>in</strong>al Str<strong>in</strong>g CONFERMA_FUNZIONAMENTO =<br />

"ConfermaFunzionamento";<br />

public static f<strong>in</strong>al Str<strong>in</strong>g CONFERMA_FUNZIONAMENTO_ACK =<br />

"Acknowledge";<br />

public static f<strong>in</strong>al Str<strong>in</strong>g ACKNOWLEDGE = "Acknowledge";<br />

public static f<strong>in</strong>al Str<strong>in</strong>g VALORE_ACKNOWLEDGE = "ack";<br />

//Action Identifica<br />

public static f<strong>in</strong>al Str<strong>in</strong>g IDENTIFICA = "Identifica";<br />

public static f<strong>in</strong>al Str<strong>in</strong>g IDENTIFICA_IDENTITA = "identita";<br />

95


Implementazione<br />

public static f<strong>in</strong>al Str<strong>in</strong>g IDENTIFICA_IMMAGINE = "immag<strong>in</strong>e";<br />

public static f<strong>in</strong>al Str<strong>in</strong>g IDENTITA = "identita";<br />

public static f<strong>in</strong>al Str<strong>in</strong>g ID_IDENTITA = "id";<br />

public static f<strong>in</strong>al Str<strong>in</strong>g IMMAGINE = "immag<strong>in</strong>e";<br />

public static f<strong>in</strong>al Str<strong>in</strong>g IMG_IDENTITA = "img";<br />

private Videosorveglianza()<br />

{<br />

super(NOME_ONTOLOGIA,BasicOntology.getInstance());<br />

//def<strong>in</strong>isce la s<strong>in</strong>tassi e la semantica degli elementi<br />

dell'ontologia<br />

try<br />

{<br />

add(new AgentActionSchema(CONFERMA_FUNZIONAMENTO),<br />

ConfermaFunzionamento.class);<br />

add(new ConceptSchema(ACKNOWLEDGE), Acknowledge.class);<br />

AgentActionSchema as_actack = (AgentActionSchema)<br />

getSchema(CONFERMA_FUNZIONAMENTO);<br />

as_actack.add(CONFERMA_FUNZIONAMENTO_ACK, (ConceptSchema)<br />

getSchema(ACKNOWLEDGE), ObjectSchema.OPTIONAL);<br />

ConceptSchema cs_ack = (ConceptSchema)<br />

getSchema(ACKNOWLEDGE);<br />

cs_ack.add(VALORE_ACKNOWLEDGE, (PrimitiveSchema)<br />

getSchema(BasicOntology.BOOLEAN));<br />

add(new AgentActionSchema(IDENTIFICA), Identifica.class);<br />

add(new ConceptSchema(IDENTITA), Identita.class);<br />

add(new ConceptSchema(IMMAGINE), Immag<strong>in</strong>e.class);<br />

AgentActionSchema as_identifica = (AgentActionSchema)<br />

getSchema(IDENTIFICA);<br />

as_identifica.add(IDENTIFICA_IDENTITA, (ConceptSchema)<br />

getSchema(IDENTITA), ObjectSchema.OPTIONAL);<br />

as_identifica.add(IDENTIFICA_IMMAGINE, (ConceptSchema)<br />

getSchema(IMMAGINE), ObjectSchema.OPTIONAL);<br />

ConceptSchema cs_identita = (ConceptSchema)<br />

getSchema(IDENTITA);<br />

cs_identita.add(ID_IDENTITA, (PrimitiveSchema)<br />

getSchema(BasicOntology.STRING));<br />

ConceptSchema cs_immag<strong>in</strong>e = (ConceptSchema)<br />

getSchema(IMMAGINE);<br />

cs_immag<strong>in</strong>e.add(IMG_IDENTITA, (PrimitiveSchema)<br />

getSchema(BasicOntology.BYTE_SEQUENCE));<br />

}<br />

catch (OntologyException e)<br />

{<br />

e.pr<strong>in</strong>tStackTrace();<br />

96


}<br />

}<br />

}<br />

Implementazione<br />

//s<strong>in</strong>gleton<br />

public static Ontology getInstance()<br />

{<br />

return istanza;<br />

}<br />

Listato 4-6 Ontologia Videosorveglianza<br />

4.2. Implementazione applicazione centrale<br />

L’applicazione centrale è chiamata “videosorveglianza” ed ha il compito <strong>di</strong> creare una Jade<br />

platform <strong>in</strong> cui è presente l’agente manager. L’agente manager come si è precedentemente<br />

detto, ha il compito <strong>di</strong> conoscere i <strong>di</strong>spositivi collegati al servizio <strong>di</strong> videosorveglianza, sapere<br />

quali sono i <strong>di</strong>spositivi funzionanti <strong>in</strong> maniera aggiornata e rispondere alle richieste <strong>di</strong><br />

riconoscimento del volto da parte dei <strong>di</strong>spositivi Android. L’agente manager però non è <strong>in</strong><br />

grado <strong>di</strong> risolvere i riconoscimenti del volto <strong>in</strong> modo <strong>in</strong><strong>di</strong>pendente, questo perché non<br />

<strong>di</strong>spone della logica <strong>di</strong> riconoscimento del volto, qu<strong>in</strong><strong>di</strong> per sod<strong>di</strong>sfare queste richieste<br />

l’agente manager deve chiedere a sua volta l’identità del volto ad una applicazione <strong>in</strong> grado<br />

<strong>di</strong> farlo.<br />

4.2.1. Struttura applicazione videosorveglianza<br />

L’applicazione videosorveglianza è sud<strong>di</strong>visa nei seguenti 4 package:<br />

Comportamenti<br />

Manager<br />

Ontology<br />

Startapp<br />

97


Implementazione<br />

Nel package comportamenti sono presenti le classi che implementano i comportamenti<br />

dell’agente manager, nel package manager è presente la classe che implementa l’agente<br />

manager e le classi per la sua <strong>in</strong>terfaccia (la classe ParticipantsFrame è stata utilizzata<br />

solamente <strong>in</strong> fase <strong>di</strong> sviluppo). Nel package ontology sono presenti le classi che<br />

implementano l’ontologia usata dagli agenti della videosorveglianza, nel package startapp è<br />

presente la classe che lancia la piattaforma Jade con l’agente manager.<br />

Figura 4-1 Struttura applicazione Videosorveglianza<br />

Ovviamente sono state importate fra le librerie dell’applicazione “videosorveglianza” i file .jar<br />

<strong>di</strong> jade, ovvero jade.jar e commons-codec-1.3.jar.<br />

98


Implementazione<br />

4.2.2. Avvio applicazione “videosorveglianza”<br />

L’avvio dell’applicazione “videosorveglianza” è implementata dalla classe Start, la quale<br />

lancia una Jade platform contenente un agente manager;<br />

public class Start{<br />

public static void ma<strong>in</strong>(Str<strong>in</strong>g args[]) throws StaleProxyException {<br />

Str<strong>in</strong>g[] IdVideo={"-gui",<br />

"manager:videosorveglianza.manager.ManagerAgent" }; // Attivazione<br />

Piattaforma:<br />

Boot.ma<strong>in</strong>(IdVideo);<br />

}<br />

}<br />

Listato 4-7 Avvio applicazione videosorveglianza<br />

Eseguendo questa applicazione come Java Application si ottiene questo risultato:<br />

Figura 4-2 Avvio applicazione videosorveglianza visto dalla GUI dell'RMA<br />

99


Implementazione<br />

4.2.3. Implementazione agente manager<br />

L’agente manager per sod<strong>di</strong>sfare il requisito <strong>di</strong> conoscenza degli agenti mobili attualmente<br />

connessi al servizio <strong>di</strong> videosorveglianza, implementa l’<strong>in</strong>terfaccia <strong>di</strong> SubscriptionManager. In<br />

questo modo quando un agente Android entra a far parte della videosorveglianza, spe<strong>di</strong>sce<br />

all’agente manager un messaggio <strong>di</strong> Subscription per aggiungersi alla lista degli agenti<br />

presenti. L’agente manager per sapere <strong>in</strong> modo automatico quando un agente collegato al<br />

servizio <strong>di</strong> videosorveglianza muore, attiva un behaviour <strong>di</strong> tipo AMSSubriber. Tramite<br />

l’implementazione dell’<strong>in</strong>terfaccia SubscriptionManager e l’aggiunta del behaviour<br />

AMSSubscriber, l’agente manager aggiorna la sua lista <strong>di</strong> <strong>di</strong>spositivi attualmente connessi <strong>in</strong><br />

modo tempestivo e <strong>in</strong>crementale, evitando un perio<strong>di</strong>co messaggio <strong>di</strong> richiesta al DF <strong>di</strong><br />

richiesta <strong>di</strong> tutti i <strong>di</strong>spositivi attualmente connessi che aggiornerebbe perio<strong>di</strong>camente l’<strong>in</strong>tera<br />

lista, la quale <strong>in</strong>oltre non sarebbe sempre aggiornata, dato che l’aggiornamento sarebbe<br />

pilotato perio<strong>di</strong>camente. Queste operazioni sono implementate nel metodo setup() della<br />

classe dell’agente manager e nella def<strong>in</strong>izione dei meto<strong>di</strong> dell’<strong>in</strong>terfaccia<br />

SubscriptionManager. La lista dei <strong>di</strong>spositivi collegati alla piattaforma <strong>di</strong> videosorveglianza<br />

sono contenuti <strong>in</strong> un array <strong>di</strong> tipo AID. Prima <strong>di</strong> spiegare ulteriormente il funzionamento<br />

dell’agente manager verrà mostrato il co<strong>di</strong>ce relativo al metodo setup() della classe<br />

ManagerAgent e l’implementazione dei meto<strong>di</strong> register() e deregister() relativi all’<strong>in</strong>terfaccia<br />

SubscriptionManager:<br />

protected void setup() {<br />

myGui=new ManagerGUIImpl(this);<br />

registerO2AInterface(ManagerGUIInt.class, myGui);<br />

// Prepare to accept subscriptions from participants<br />

getContentManager().registerLanguage(codec);<br />

getContentManager().registerOntology(ontologia);<br />

MessageTemplate sTemplate = MessageTemplate.and(<br />

MessageTemplate.MatchPerformative(ACLMessage.SUBSCRIBE),<br />

MessageTemplate.MatchLanguage(codec.getName()));<br />

//aggiunge il behaviour <strong>di</strong> subscription responder con template<br />

subscribe<br />

//serve per sapere quando si iscrivono, non dall'ams ma dal<br />

messaggio che gli <strong>in</strong>viano gli agenti Android<br />

addBehaviour(new SubscriptionResponder(this, sTemplate, this));<br />

// Register to the AMS to detect when participants suddenly <strong>di</strong>e<br />

myAMSSubscriber = new AMSSubscriber() {<br />

@SuppressWarn<strong>in</strong>gs("unchecked")<br />

100


Implementazione<br />

protected void<br />

<strong>in</strong>stallHandlers(@SuppressWarn<strong>in</strong>gs("rawtypes") Map handlersTable) {<br />

// Fill the event handler table. We are only<br />

<strong>in</strong>terested <strong>in</strong> the<br />

// DEADAGENT event<br />

handlersTable.put(IntrospectionOntology.DEADAGENT,<br />

new EventHandler() {<br />

public void handle(Event ev) {<br />

DeadAgent da = (DeadAgent)ev;<br />

AID id = da.getAgent();<br />

if (participants.conta<strong>in</strong>sKey(id)) {<br />

try {<br />

deregister((Subscription)<br />

participants.get(id));<br />

}<br />

catch (Exception e) {<br />

//Should never happen<br />

e.pr<strong>in</strong>tStackTrace();<br />

}<br />

}<br />

}<br />

});<br />

}<br />

};<br />

addBehaviour(new DFRegistraManager(this));<br />

//serve per sapere dall'ams quando gli agenti muoiono<br />

addBehaviour(myAMSSubscriber);<br />

addBehaviour(new ControllaAckCyclic(this, 10000));//<br />

TickerBehaviuor che fà ContractNetIniziator<br />

MessageTemplate template =<br />

MessageTemplate.MatchPerformative(ACLMessage.REQUEST);<br />

addBehaviour(new RespondImage(this, template));<br />

}// FINE SETUP<br />

Listato 4-8 Metodo setup() dell'agente manager<br />

public boolean register(Subscription s) throws RefuseException,<br />

NotUnderstoodException {<br />

try {<br />

AID newId = s.getMessage().getSender();<br />

participants.put(newId, s);<br />

keys = new AID[participants.size()];<br />

nomi = new Str<strong>in</strong>g[participants.size()];<br />

// Add the new subscription<br />

Object[] prova= participants.keySet().toArray();<br />

for (<strong>in</strong>t <strong>in</strong>dex=0;<strong>in</strong>dex


}<br />

}<br />

Implementazione<br />

Listato 4-9 Metodo register() dell'agente manager<br />

public boolean deregister(Subscription s) throws FailureException {<br />

AID oldId = s.getMessage().getSender();<br />

// Remove the subscription<br />

participants.remove(oldId);<br />

keys = new AID[participants.size()];<br />

nomi = new Str<strong>in</strong>g[participants.size()];<br />

// Add the new subscription<br />

Object[] prova= participants.keySet().toArray();<br />

for (<strong>in</strong>t <strong>in</strong>dex=0;<strong>in</strong>dex


}<br />

}<br />

Implementazione<br />

La classe ManagerAgent implementa qu<strong>in</strong><strong>di</strong> i meto<strong>di</strong> setKeys e getKeys che scrive e legge il<br />

vettore <strong>di</strong> AID <strong>di</strong> nome keys che contiene l’<strong>in</strong>formazione relativa ai <strong>di</strong>spositivi attualmente<br />

connessi.<br />

public void setKeys(AID[] keys){<br />

this.keys=keys;<br />

nomi=new Str<strong>in</strong>g[keys.length];<br />

for (<strong>in</strong>t <strong>in</strong>dex=0;<strong>in</strong>dex


}<br />

Implementazione<br />

@Override<br />

public void onStart()<br />

{<br />

System.out.pr<strong>in</strong>tln(myAgent.getLocalName()+">> Mi sto<br />

registrando per partecipare alla videosorveglianza");<br />

}<br />

@Override<br />

public void action()<br />

{<br />

//def<strong>in</strong>isce un servizio...<br />

ServiceDescription sd = new ServiceDescription();<br />

sd.setType("manager");<br />

sd.setName(myAgent.getLocalName()+"-manager");<br />

//...e lo aggiunge all'<strong>in</strong>sieme dei servizi offerti da un agente<br />

DFAgentDescription dfd = new DFAgentDescription();<br />

dfd.addServices(sd);<br />

dfd.setName(myAgent.getAID());<br />

//l'agente si registra alle "pag<strong>in</strong>e gialle"<br />

try<br />

{<br />

DFService.register(myAgent, dfd);<br />

}<br />

catch (FIPAException e)<br />

{<br />

e.pr<strong>in</strong>tStackTrace();<br />

}<br />

}<br />

@Override<br />

public <strong>in</strong>t onEnd()<br />

{<br />

System.out.pr<strong>in</strong>tln(myAgent.getLocalName()+">> Partecipo alla<br />

videosorveglianza");<br />

return 0;<br />

}<br />

}<br />

ControllaAckCyclic<br />

Listato 4-12 Behaviour DFRegistraManager<br />

Il behaviour ControllaAckCyclic è il behaviour responsabile del controllo dei <strong>di</strong>spositivi<br />

funzionanti collegati al servizio <strong>di</strong> videosorveglianza. Nel caso vi sia un agente software<br />

collegato alla piattaforma <strong>di</strong> videosorveglianza che per qualche malfunzionamento non<br />

risponde alla richiesta <strong>di</strong> acknowledge, questo agente verrà ritenuto mal funzionante ed<br />

elim<strong>in</strong>ato dalla lista degli agenti presenti nella piattaforma dell’agente manager. Compito <strong>di</strong><br />

tale behaviour è qu<strong>in</strong><strong>di</strong> spe<strong>di</strong>re un messaggio avente l’opportuno contenuto def<strong>in</strong>ito<br />

104


Implementazione<br />

dall’ontologia della videosorveglianza per richiedere un acknowledge, a tutti gli agenti<br />

presenti nella lista degli agenti presenti e funzionanti ( l’array <strong>di</strong> nome “keys” <strong>di</strong> tipo AID<br />

detto precedentemente) e controllare le risposte. Soltanto gli agenti che avranno risposto<br />

all’acknowledge <strong>in</strong> maniera positiva faranno ancora parte della lista dell’agente manager. Per<br />

implementare tale comportamento il behaviour ControllaAckCyclic è un behaviour che<br />

estende la classe TickerBehaviour <strong>in</strong> modo tale che perio<strong>di</strong>camente, ogni 10 secon<strong>di</strong>, venga<br />

aggiunto all’agente manager un behaviour chiamato ControllaAck, il quale estende la classe<br />

ContractNetInitiator. Il behaviour ControllaAckCyclic ad ogni periodo prepara un messaggio<br />

ACL <strong>di</strong> tipo CallForProposal con dest<strong>in</strong>atari tutti gli agenti conosciuti dal manager agent e con<br />

contenuto la richiesta <strong>di</strong> acknowledge def<strong>in</strong>ita tramite l’ontologia. Tale messaggio viene<br />

passato come argomento al behaviour ControllaAck che spe<strong>di</strong>sce il messaggio e tramite il<br />

metodo handleAllResponces è sufficiente scorrere i messaggi <strong>di</strong> risposta corretti per<br />

aggiornare la lista degli agenti funzionanti. Una volta controllate tutte le risposte <strong>di</strong><br />

acknowledge, si aggiorna il vettore degli agenti conosciuti dall’agente manager utilizzando<br />

l’<strong>in</strong>terfaccia e il metodo setKeys. Di seguito è mostrato il co<strong>di</strong>ce relativo al behaviour<br />

ControllaAckCyclic def<strong>in</strong>ito all’<strong>in</strong>terno della classe ManagerAgent:<br />

class ControllaAckCyclic extends TickerBehaviour{<br />

public ControllaAckCyclic(Agent a, long period) {<br />

super(a, period);<br />

// TODO Auto-generated constructor stub<br />

}<br />

@Override<br />

protected void onTick() {<br />

// TODO Auto-generated method stub<br />

ACLMessage reply = new ACLMessage(ACLMessage.CFP);<br />

if (keys!=null)<br />

{<br />

for(<strong>in</strong>t i=0; i


}<br />

}<br />

}<br />

Implementazione<br />

cel.add(act);<br />

ContentManager cm = myAgent.getContentManager();<br />

reply.setLanguage(cm.getLanguageNames()[0]);<br />

reply.setOntology(cm.getOntologyNames()[0]);<br />

try {<br />

cm.fillContent(reply, cel);<br />

} catch (Exception e) {<br />

e.pr<strong>in</strong>tStackTrace();<br />

}<br />

addBehaviour(new ControllaAck(myAgent, reply));<br />

Listato 4-13 behaviour ControllaAckcyclic<br />

E questo il co<strong>di</strong>ce relativo al behaviour ControllaAck:<br />

public class ControllaAck extends ContractNetInitiator{<br />

ManagerGUIInt myGui; //<strong>in</strong>terfaccia agente manager<br />

//aggiunge alla lista gli AID <strong>di</strong> chi risponde all'ack<br />

ArrayList lista=new ArrayList();<br />

//CFP passato come argomento al costruttore<br />

public ControllaAck(Agent a, ACLMessage cfp) {<br />

super(a, cfp);<br />

myGui=myAgent.getO2AInterface(ManagerGUIInt.class);<br />

}<br />

//Si attiva quando riceve tutte le risposte al CFP<br />

@SuppressWarn<strong>in</strong>gs({ "rawtypes", "unchecked" })<br />

@Override<br />

protected void handleAllResponses(Vector responses, Vector<br />

acceptances)<br />

{<br />

ContentManager cm = myAgent.getContentManager();<br />

System.out.pr<strong>in</strong>tln(responses.size());<br />

if (responses!=null)<br />

{<br />

for(<strong>in</strong>t i=0; i


Implementazione<br />

if(ack.getAck()==true)<br />

{<br />

lista.add(((ACLMessage)responses.get(i)).getSender());<br />

}<br />

}<br />

catch (Exception e)<br />

{<br />

e.pr<strong>in</strong>tStackTrace();<br />

}<br />

}<br />

for(<strong>in</strong>t i=0; i


Implementazione<br />

che implementa la parte <strong>di</strong> Responder per il protocollo FIPA Resquest. Tale behaviour riceve<br />

un messaggio ACL <strong>di</strong> tipo Request, il cui contenuto è formalizzato attraverso l’ontologia della<br />

videosorveglianza, qu<strong>in</strong><strong>di</strong> contiene l’immag<strong>in</strong>e <strong>in</strong> byte dell’ipotetico volto da riconoscere e<br />

una str<strong>in</strong>ga da riempire con la risposta. E’ stato annunciato che l’agente manager non ha la<br />

logica <strong>di</strong> riconoscimento del volto al suo <strong>in</strong>terno, qu<strong>in</strong><strong>di</strong> deve salvare l’immag<strong>in</strong>e <strong>in</strong> byte<br />

contenuta nel messaggio <strong>in</strong> una locazione <strong>di</strong> memoria prestabilita e <strong>in</strong> formato bitmap per<br />

poter effettuare la richiesta <strong>di</strong> riconoscimento del volto ad una applicazione <strong>in</strong> grado <strong>di</strong> farlo.<br />

Nel caso stu<strong>di</strong>ato l’applicazione <strong>di</strong> riconoscimento del volto è stata sviluppata da Gianluca<br />

Dolc<strong>in</strong>i ([15]). Dopo aver salvato l’immag<strong>in</strong>e <strong>in</strong> una locazione prestabilita e con un nome<br />

identificativo della richiesta, viene effettuata la richiesta tramite messaggio UDP.<br />

L’applicazione riceve la richiesta <strong>di</strong> elaborazione dell’immag<strong>in</strong>e e risponde con un<br />

riconosciuto o non riconosciuto, qu<strong>in</strong><strong>di</strong> l’agente manager risponderà all’agente Android che<br />

aveva richiesto l’identità del volto. Questo è il co<strong>di</strong>ce relativo al behaviour RespondImage :<br />

public class RespondImage extends AchieveREResponder{<br />

//nome immag<strong>in</strong>e da salvare<br />

<strong>in</strong>t c=0;<br />

/** Save <strong>di</strong>rectory for face images*/<br />

static Str<strong>in</strong>g saveDir = "/Users/andreabal<strong>di</strong>ni/Desktop/con<strong>di</strong>visa/";<br />

/** Message byte to/from application*/<br />

private byte msg[]=new byte[]{0};<br />

private boolean riconosciuto=false;<br />

public RespondImage(Agent a, MessageTemplate mt) {<br />

super(a, mt);<br />

// TODO Auto-generated constructor stub<br />

}<br />

protected ACLMessage prepareResponse(ACLMessage request){<br />

System.out.pr<strong>in</strong>tln("Responder has received the follow<strong>in</strong>g message: " +<br />

request + "<strong>in</strong> t= "+System.currentTimeMillis() + " da agente:<br />

"+request.getSender().getName());<br />

ACLMessage <strong>in</strong>formDone = request.createReply();<br />

ContentManager cm = myAgent.getContentManager();<br />

riconosciuto=false;<br />

Action act;<br />

try {<br />

act = (Action) cm.extractContent(request);<br />

Identifica azione = (Identifica) act.getAction();<br />

Immag<strong>in</strong>e imgconc = azione.getImmag<strong>in</strong>e();<br />

Identita id=azione.getIdentita();<br />

byte[] imgbyte=imgconc.getImg();<br />

//id.setId("Andrea");<br />

BufferedImage img = ImageIO.read(new<br />

ByteArrayInputStream(imgbyte));<br />

108


Implementazione<br />

//CHIAMA FUNZIONE CHE RISPONDE CON CHI E ALLIMMAGINE QUINDI<br />

SALVA SU IDENTITA<br />

if (img!=null && img.getHeight()>0){<br />

if (c++>100) c=0; //progressive counter to store more<br />

images on <strong>di</strong>sk<br />

//mask alpha<br />

BufferedImage imgsend=new BufferedImage(img.getWidth(),<br />

img.getHeight(),BufferedImage.TYPE_BYTE_GRAY);<br />

ColorConvertOp conv = new ColorConvertOp(null);<br />

conv.filter(img, imgsend);<br />

//save gray scale 8-bit image<br />

ImageIO.write(imgsend, "bmp", new<br />

File(saveDir+c+".bmp"));<br />

try<br />

{<br />

msg[0]=(byte)c;<br />

//ask face elaboration to other software<br />

DatagramPacket p=new DatagramPacket(msg, 1,new<br />

InetSocketAddress("10.211.55.4", Integer.parseInt("5000")));<br />

DatagramSocket ds=new DatagramSocket();<br />

ds.send(p); //send image ID message to other<br />

application on port 5000<br />

ds.close();<br />

System.out.pr<strong>in</strong>tln("DOPO IL SEND");<br />

//send ok<br />

//receive socket<br />

ds=new DatagramSocket(Integer.parseInt("5001"));<br />

//wait response from application on port 5001<br />

ds.setSoTimeout(20); //wait on receive for only<br />

20ms<br />

while (true){<br />

try{<br />

//Thread.sleep(10); //necessary for<br />

<strong>in</strong>terrupt thread when it's wait<strong>in</strong>g response<br />

ds.receive(p);<br />

//Thread.sleep(2); //last <strong>in</strong>terrupt<br />

before send response<br />

p.getData();<br />

System.out.pr<strong>in</strong>tln("DOPO IL RECEIVE");<br />

if((<strong>in</strong>t)p.getData()[0]==1){<br />

riconosciuto=true;<br />

}<br />

else{<br />

riconosciuto=false;<br />

}<br />

System.out.pr<strong>in</strong>tln("received:<br />

"+(<strong>in</strong>t)p.getData()[0]+ " on ms: "+(System.currentTimeMillis()));<br />

ds.close();<br />

ds=null;<br />

break; //receive ok, so rend response to<br />

smartphone<br />

}catch (SocketTimeoutException se){<br />

//System.out.pr<strong>in</strong>tln("socket timeout<br />

"+se.toStr<strong>in</strong>g());<br />

109


"+ee.toStr<strong>in</strong>g());<br />

}<br />

}<br />

Implementazione<br />

//cont<strong>in</strong>ue wait response<br />

}catch (Exception ee){<br />

System.out.pr<strong>in</strong>tln("error:<br />

}<br />

ee.pr<strong>in</strong>tStackTrace();<br />

ds.close();<br />

ds=null;<br />

//return; //generic error on receive<br />

}<br />

}catch (Exception e){<br />

System.out.pr<strong>in</strong>tln("End Elaborate: "+e.toStr<strong>in</strong>g());<br />

e.pr<strong>in</strong>tStackTrace();<br />

}<br />

}<br />

if(riconosciuto==true){<br />

id.setId("Andrea");<br />

<strong>in</strong>formDone.setPerformative(ACLMessage.INFORM);<br />

<strong>in</strong>formDone.setLanguage(cm.getLanguageNames()[0]);<br />

<strong>in</strong>formDone.setOntology(cm.getOntologyNames()[0]);<br />

ContentElementList cel = new ContentElementList();<br />

cel.add(act);<br />

cm.fillContent(<strong>in</strong>formDone, cel);<br />

}<br />

else{<br />

id.setId("sconosciuto");<br />

<strong>in</strong>formDone.setPerformative(ACLMessage.INFORM);<br />

<strong>in</strong>formDone.setLanguage(cm.getLanguageNames()[0]);<br />

<strong>in</strong>formDone.setOntology(cm.getOntologyNames()[0]);<br />

ContentElementList cel = new ContentElementList();<br />

cel.add(act);<br />

cm.fillContent(<strong>in</strong>formDone, cel);<br />

}<br />

} catch (UngroundedException e) {<br />

// TODO Auto-generated catch block<br />

e.pr<strong>in</strong>tStackTrace();<br />

} catch (CodecException e) {<br />

// TODO Auto-generated catch block<br />

e.pr<strong>in</strong>tStackTrace();<br />

} catch (OntologyException e) {<br />

// TODO Auto-generated catch block<br />

e.pr<strong>in</strong>tStackTrace();<br />

//} catch (IOException e) {<br />

// TODO Auto-generated catch block<br />

//e.pr<strong>in</strong>tStackTrace();<br />

} catch (IOException e) {<br />

// TODO Auto-generated catch block<br />

e.pr<strong>in</strong>tStackTrace();<br />

}<br />

return <strong>in</strong>formDone;<br />

Listato 4-15 Behaviour RespondImage<br />

110


Implementazione<br />

4.3. Implementazione applicazione Android<br />

L’applicazione Android per l’<strong>in</strong>seguimento del volto mi è stata fornita dal Dipartimento <strong>di</strong><br />

<strong>Ingegneria</strong> dell’Informazione, <strong>di</strong> seguito un brevissimo riassunto del suo funzionamento<br />

prima dell’agentificazione: L’Activity pr<strong>in</strong>cipale dell’applicazione è implementata dalla classe<br />

FdActivity e rappresenta il punto <strong>di</strong> accesso all’applicazione, dove vengono <strong>in</strong>izializzati i vari<br />

componenti; la CvBaseView si occupa della visualizzazione dell’<strong>in</strong>terfaccia grafica; FpsMeter è<br />

una classe <strong>di</strong> utilità che calcola i FPS; FdView contiene la logica del sistema <strong>di</strong> visione per<br />

l’<strong>in</strong><strong>di</strong>viduazione e selezione dei volti. A partire dall’applicazione data, per fornire il servizio <strong>di</strong><br />

videosorveglianza ad agenti è stato necessario mo<strong>di</strong>ficare il modo <strong>in</strong> cui l’applicazione<br />

effettua le richieste <strong>di</strong> identificazione dei volti, sostituendo la precedente comunicazione con<br />

una comunicazione ad agenti che sia <strong>in</strong>serita nella logica del sistema <strong>di</strong> visione e<br />

<strong>in</strong><strong>di</strong>viduazione dei volti senza comprometterne la logica stessa o il funzionamento.<br />

4.3.1. File AndroidManifest.xml e struttura<br />

applicazione<br />

L’applicazione Android ad agenti creata ha il seguente file AndroidManifest.xml e struttura:<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

111


Implementazione<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

<br />

Listato 4-16 File AndoridManifest.xml<br />

E’ possibile notare la <strong>di</strong>chiarazione del jade.android.MicroRuntimeService per l’utilizzo <strong>di</strong> uno<br />

split conta<strong>in</strong>er nel tag service del tag application.<br />

La struttura dell’applicazione:<br />

112


Implementazione<br />

Figura 4-3 Struttura applicazione Android<br />

Per il funzionamento dell’applicazione è necessario importare la libreria jadeAndroid.jar per il<br />

framework ad agenti e la libreria OpenCV-2.3.1.jar per la logica <strong>di</strong> elaborazione video.<br />

113


Implementazione<br />

4.3.2. Creazione agente Android<br />

La creazione dell’agente Android è effettuata nella classe FdActivity, <strong>in</strong> particolare nel<br />

metodo onCreate dove viene chiamato il metodo startSorveglianza. Tale metodo riceve <strong>in</strong><br />

<strong>in</strong>gresso l’<strong>in</strong><strong>di</strong>rizzo IP della piattaforma Jade <strong>in</strong> cui creare lo split conta<strong>in</strong>er per l’agente della<br />

classe ClientAgent, il numero <strong>di</strong> porta e un oggetto AgentController:<br />

public boolean startSorveglianza(f<strong>in</strong>al Str<strong>in</strong>g host,<br />

f<strong>in</strong>al Str<strong>in</strong>g port, f<strong>in</strong>al RuntimeCallback<br />

agentStartupCallback) {<br />

f<strong>in</strong>al Properties profile = new Properties();<br />

profile.setProperty(Profile.MAIN_HOST, host);<br />

profile.setProperty(Profile.MAIN_PORT,port);<br />

profile.setProperty(Profile.MAIN, Boolean.FALSE.toStr<strong>in</strong>g());<br />

profile.setProperty(Profile.JVM, Profile.ANDROID);<br />

if (AndroidHelper.isEmulator()) {<br />

// Emulator: this is needed to work with emulated devices<br />

profile.setProperty(Profile.LOCAL_HOST,<br />

AndroidHelper.LOOPBACK);<br />

} else {<br />

profile.setProperty(Profile.LOCAL_HOST,<br />

AndroidHelper.getLocalIPAddress());<br />

}<br />

// Emulator: this is not really needed on a real device<br />

profile.setProperty(Profile.LOCAL_PORT, "1099");<br />

microRuntimeServiceB<strong>in</strong>der=null;<br />

serviceConnection=null;<br />

if (microRuntimeServiceB<strong>in</strong>der == null) {<br />

serviceConnection = new ServiceConnection() {<br />

public void onServiceConnected(ComponentName<br />

className,<br />

IB<strong>in</strong>der service) {<br />

microRuntimeServiceB<strong>in</strong>der =<br />

(MicroRuntimeServiceB<strong>in</strong>der) service;<br />

logger.log(Level.INFO, "Gateway successfully<br />

bound to MicroRuntimeService");<br />

startConta<strong>in</strong>er(profile, agentStartupCallback);<br />

};<br />

public void onServiceDisconnected(ComponentName<br />

className) {<br />

logger.log(Level.INFO, "Gateway unbound from<br />

MicroRuntimeService");<br />

microRuntimeServiceB<strong>in</strong>der = null;<br />

}<br />

};<br />

logger.log(Level.INFO, "B<strong>in</strong><strong>di</strong>ng Gateway to<br />

MicroRuntimeService...");<br />

b<strong>in</strong>dService(new Intent(getApplicationContext(),<br />

114


Implementazione<br />

MicroRuntimeService.class), serviceConnection,<br />

Context.BIND_AUTO_CREATE);<br />

//ritorno=true;<br />

} else {<br />

logger.log(Level.INFO, "MicroRumtimeGateway already<br />

b<strong>in</strong>ded to service");<br />

startConta<strong>in</strong>er(profile, agentStartupCallback);<br />

}<br />

return true;<br />

}<br />

//"XXX%CYYY"<br />

private boolean startConta<strong>in</strong>er(Properties profile, f<strong>in</strong>al<br />

RuntimeCallback agentStartupCallback) {<br />

//if (!MicroRuntime.isRunn<strong>in</strong>g()) {<br />

microRuntimeServiceB<strong>in</strong>der.startAgentConta<strong>in</strong>er(profile,<br />

new RuntimeCallback() {<br />

@Override<br />

public void onSuccess(Void thisIsNull) {<br />

startAgent(agentStartupCallback);<br />

}<br />

@Override<br />

public void onFailure(Throwable<br />

throwable) {<br />

}<br />

});<br />

//} else {<br />

// startAgent(agentStartupCallback);<br />

//}<br />

return true;<br />

}<br />

private boolean startAgent(f<strong>in</strong>al RuntimeCallback<br />

agentStartupCallback) {<br />

microRuntimeServiceB<strong>in</strong>der.startAgent(nick,<br />

it.univpm.<strong>di</strong>i.agent.ClientAgent.class.getName(),<br />

new Object[] { getApplicationContext() }, new<br />

RuntimeCallback() {<br />

@Override<br />

public void onSuccess(Void thisIsNull) {<br />

logger.log(Level.INFO, "Successfully start of the "<br />

+<br />

it.univpm.<strong>di</strong>i.agent.ClientAgent.class.getName() + "...");<br />

try {<br />

agentStartupCallback.onSuccess(MicroRuntime<br />

.getAgent(nick));<br />

} catch (ControllerException e) {<br />

// Should never happen<br />

agentStartupCallback.onFailure(e);<br />

}<br />

}<br />

@Override<br />

public void onFailure(Throwable throwable) {<br />

logger.log(Level.SEVERE, "Failed to start the "<br />

+<br />

it.univpm.<strong>di</strong>i.agent.ClientAgent.class.getName() + "...");<br />

agentStartupCallback.onFailure(throwable);<br />

115


}<br />

}<br />

});<br />

return true;<br />

Implementazione<br />

Listato 4-17 Creazione agente Android<br />

Qu<strong>in</strong><strong>di</strong> il metodo onCreate() della classe FdActivity è il seguente:<br />

public void onCreate(Bundle savedInstanceState) {<br />

super.onCreate(savedInstanceState);<br />

requestW<strong>in</strong>dowFeature(W<strong>in</strong>dow.FEATURE_NO_TITLE);<br />

try {<br />

mServer = new Server(4568); // Use ADK port<br />

mServer.start();<br />

} catch (IOException e) {<br />

Log.e(TAG, "Unable to start TCP server", e);<br />

System.exit(-1);<br />

}<br />

// Restore preferences<br />

SharedPreferences sett<strong>in</strong>gs = getSharedPreferences(PREFS_NAME,<br />

MODE_PRIVATE);<br />

serverIP = sett<strong>in</strong>gs.getStr<strong>in</strong>g("IP","192.168.1.92");<br />

startSorveglianza("192.168.1.92","1099",agentStartupCallback );<br />

try{<br />

view=new FdView(this, nick);<br />

setContentView(view);<br />

Log.i("FdActivity", "F<strong>in</strong>ish create Jade Agent<br />

t="+System.currentTimeMillis());<br />

}<br />

catch(Exception e){<br />

System.out.pr<strong>in</strong>tln("errore");<br />

}<br />

Listato 4-18 Metodo oncreate() <strong>di</strong> FdActivity<br />

Nel metodo onCreate() viene creata l’istanza della classe FdView contenente la logica <strong>di</strong><br />

elaborazione video per l’<strong>in</strong><strong>di</strong>viduazione dei volti e aggiunta alla FdActivity.<br />

4.3.3. Implementazione agente Android<br />

L’agente Android per partecipare alla videosorveglianza ha bisogno della conoscenza<br />

dell’<strong>in</strong><strong>di</strong>rizzo <strong>di</strong> un agente manager con cui comunicare. Dopo aver trovato la presenza <strong>di</strong> un<br />

agente manager, l’agente Android spe<strong>di</strong>sce un messaggio <strong>di</strong> subscription per aggiungersi alla<br />

lista degli agenti partecipanti alla videosorveglianza dell’agente manager e successivamente<br />

116


Implementazione<br />

si registra al DF della piattaforma per pubblicare il suo servizio <strong>di</strong> “telecamera”. L’agente<br />

Android implementa poi i behaviour per rispondere alle richieste <strong>di</strong> acknowledge provenienti<br />

dall’agente manager e il comportamento per effettuare richieste <strong>di</strong> identificazione dei volti. Il<br />

metodo setup() dell’agente Adroid è il seguente:<br />

protected void setup() {<br />

Object[] args = getArguments();<br />

if (args != null && args.length > 0) {<br />

if (args[0] <strong>in</strong>stanceof Context) {<br />

context = (Context) args[0];<br />

}<br />

}<br />

// Register language and ontology<br />

ContentManager cm = getContentManager();<br />

cm.registerLanguage(codec);<br />

cm.registerOntology(onto);<br />

cm.setValidationMode(false);<br />

//prendo AID manager<br />

DFAgentDescription dfd = new DFAgentDescription();<br />

ServiceDescription sd = new ServiceDescription();<br />

sd.setType( "manager" );<br />

dfd.addServices(sd);<br />

DFAgentDescription[] result;<br />

try {<br />

result = DFService.search(this, dfd);<br />

if (result.length>0)<br />

manager=result[0].getName();<br />

} catch (FIPAException e) {<br />

// TODO Auto-generated catch block<br />

e.pr<strong>in</strong>tStackTrace();<br />

}<br />

//registro <strong>in</strong>terfaccia<br />

myGui=new ClientGUIImpl(this);<br />

registerO2AInterface(ClientGUIInt.class, myGui);<br />

// Add <strong>in</strong>itial behaviours<br />

addBehaviour(new DFRegistraCamera(this));<br />

addBehaviour(new ParticipantsManager(this));<br />

addBehaviour(new Rispon<strong>di</strong>Ack(this,<br />

MessageTemplate.MatchPerformative(ACLMessage.CFP)));<br />

}<br />

Listato 4-19 Metodo setup() dell'agente Android<br />

117


Implementazione<br />

Nel setup l’agente Android recupera l’AID dell’agente manager della piattaforma, registra la<br />

sua <strong>in</strong>terfaccia e aggiunge i seguenti behaviour:<br />

DFRegistraCamera per registrarsi al DF,<br />

ParticipantsManager per aggiungersi alla lista degli agenti presenti alla<br />

videosorveglianza del manager,<br />

Rispon<strong>di</strong>Ack per rispondere alle richieste <strong>di</strong> acknowledge.<br />

L’<strong>in</strong>terfaccia dell’agente Android è necessaria per poter effettuare richieste <strong>di</strong> identificazioni<br />

<strong>di</strong> volti attraverso la logica <strong>di</strong> elaborazione del video da parte della classe FdView. L’agente<br />

Android possiede tre variabili, una per memorizzare l’attuale immag<strong>in</strong>e del volto da<br />

elaborare <strong>in</strong> un array <strong>di</strong> byte, una str<strong>in</strong>ga per l’identità del volto dell’immag<strong>in</strong>e e una variabile<br />

booleana che userà la FdView per conoscere quando una risposta <strong>di</strong> identificazione è<br />

arrivata. L’FdView per effettuare una richiesta <strong>di</strong> identificazione <strong>di</strong> un volto usa queste tre<br />

variabili, a cui ha accesso grazie all’<strong>in</strong>terfaccia dell’agente Android che gli permette <strong>di</strong><br />

leggerle e mo<strong>di</strong>ficarle:<br />

public class ClientGUIImpl implements ClientGUIInt{<br />

private ClientAgent myAgent;<br />

public ClientGUIImpl(ClientAgent a) {<br />

myAgent = a;<br />

}<br />

public void sendImg(byte[] img) {<br />

// TODO Auto-generated method stub<br />

myAgent.sendImg(img);<br />

}<br />

public byte[] getImg() {<br />

// TODO Auto-generated method stub<br />

return myAgent.getImg();<br />

}<br />

public Str<strong>in</strong>g getId() {<br />

// TODO Auto-generated method stub<br />

return myAgent.getId();<br />

}<br />

public void setId(Str<strong>in</strong>g id) {<br />

// TODO Auto-generated method stub<br />

myAgent.setId(id);<br />

}<br />

118


}<br />

Implementazione<br />

public void setArrivata(boolean arrivata) {<br />

// TODO Auto-generated method stub<br />

myAgent.setArrivata(arrivata);<br />

}<br />

public boolean getArrivata() {<br />

// TODO Auto-generated method stub<br />

return myAgent.getArrivata();<br />

}<br />

Behaviour DFRegistraCamera<br />

Listato 4-20 Interfaccia agente Android<br />

Il behaviour DFRegistraCamera estende la classe oneShotBehaviour per registrare l’agente<br />

Android al DF con il servizio <strong>di</strong> “telecamera”:<br />

public class DFRegistraCamera extends OneShotBehaviour{<br />

public DFRegistraCamera(Agent a) {<br />

super(a);<br />

}<br />

@Override<br />

public void onStart()<br />

{<br />

System.out.pr<strong>in</strong>tln(myAgent.getLocalName()+">> Mi sto<br />

registrando per partecipare alla videosorveglianza");<br />

}<br />

@Override<br />

public void action()<br />

{<br />

//def<strong>in</strong>isce un servizio...<br />

ServiceDescription sd = new ServiceDescription();<br />

sd.setType("telecamera");<br />

sd.setName(myAgent.getLocalName()+"-telecamera");<br />

//...e lo aggiunge all'<strong>in</strong>sieme dei servizi offerti da un agente<br />

DFAgentDescription dfd = new DFAgentDescription();<br />

dfd.addServices(sd);<br />

dfd.setName(myAgent.getAID());<br />

//l'agente si registra alle "pag<strong>in</strong>e gialle"<br />

try<br />

{<br />

DFService.register(myAgent, dfd);<br />

}<br />

119


}<br />

Implementazione<br />

catch (FIPAException e)<br />

{<br />

e.pr<strong>in</strong>tStackTrace();<br />

}<br />

@Override<br />

public <strong>in</strong>t onEnd()<br />

{<br />

System.out.pr<strong>in</strong>tln(myAgent.getLocalName()+">> Partecipo alla<br />

videosorveglianza");<br />

return 0;<br />

}<br />

}<br />

Listato 4-21 Behaviour DFRegistraCamera<br />

Behaviour Rispon<strong>di</strong>Ack<br />

Il behaviour Rispon<strong>di</strong>Ack permette all’agente Android <strong>di</strong> rispondere alle richieste <strong>di</strong><br />

acknowledge provenienti dall’agente manager. Il protocollo usato dall’agente manager per<br />

richiedere l’ack è il FIPA Contract-Net qu<strong>in</strong><strong>di</strong> tale behaviour estende la classe<br />

ContractNetResponder. Tale comportamento se riceve un messaggio <strong>di</strong> tipo Call-for-<br />

Proposal, estrae dal contenuto del messaggio l’acknowledge formalizzato dall’ontologia, lo<br />

mo<strong>di</strong>fica a vero per confemare l’ack e rispe<strong>di</strong>sce il messaggio ACL <strong>di</strong> tipo Propose con<br />

contenuto l’appropriato ack <strong>in</strong> modo da rispettare il protocollo e rispondere all’acknowledge.<br />

Questa è l’implementazione:<br />

public class Rispon<strong>di</strong>Ack extends ContractNetResponder{<br />

public Rispon<strong>di</strong>Ack(Agent a, MessageTemplate mt) {<br />

super(a, mt);<br />

}<br />

//si attiva quando viene ricevuto un CFP<br />

@Override<br />

protected ACLMessage handleCfp(ACLMessage msg)<br />

{<br />

ContentManager cm = myAgent.getContentManager();<br />

ACLMessage reply = msg.createReply();<br />

reply.setPerformative(ACLMessage.PROPOSE);<br />

reply.setLanguage(cm.getLanguageNames()[0]);<br />

reply.setOntology(cm.getOntologyNames()[0]);<br />

//estrae il contenuto del CFP e prepara una proposta<br />

try<br />

{<br />

Action act = (Action) cm.extractContent(msg);<br />

120


Implementazione<br />

ConfermaFunzionamento proponi =<br />

(ConfermaFunzionamento) act.getAction();<br />

Acknowledge ack = proponi.getAcknowledge();<br />

ack.setAck(true);<br />

}<br />

ContentElementList cel = new ContentElementList();<br />

cel.add(act);<br />

cm.fillContent(reply, cel);<br />

}<br />

catch (Exception e)<br />

{<br />

e.pr<strong>in</strong>tStackTrace();<br />

}<br />

return reply;<br />

//si attiva quando viene accettata una proposta<br />

@Override<br />

protected ACLMessage handleAcceptProposal(ACLMessage cfp,<br />

ACLMessage proposal, ACLMessage accept)<br />

{<br />

//<strong>in</strong>forma l'"Initiator" circa l'esito della<br />

contrattazione<br />

proposal.setPerformative(ACLMessage.INFORM);<br />

return proposal;<br />

}<br />

@Override<br />

protected void handleRejectProposal(ACLMessage cfp, ACLMessage<br />

proposal, ACLMessage accept)<br />

{<br />

System.out.pr<strong>in</strong>tln("Ha rifiutato");<br />

}<br />

}<br />

Behaviour SendImage<br />

Listato 4-22 Behaviour Rispon<strong>di</strong>Ack<br />

Il behaviour SendImage è il behaviour responsabile dell’<strong>in</strong>vio delle richieste <strong>di</strong> identificazione<br />

<strong>di</strong> volti da parte dell’agente Andoroid. Tale behaviour usa il protocollo FIPA Request per<br />

comunicare la richiesta all’agente manager, qu<strong>in</strong><strong>di</strong> estende la classe AchieveReInitiator, il<br />

quale manda un messaggio all’agente manager contenente l’immag<strong>in</strong>e del volto da<br />

identificare tramite l’opportuna ontologia usata dalla videosorveglianza.<br />

Questo è il co<strong>di</strong>ce relativo al metodo sendImg della classe ClientAgent e richiamabile<br />

dall’<strong>in</strong>terfaccia dell’agente Android, il cui obiettivo è <strong>di</strong> creare il messaggio con l’oppurtuno<br />

121


Implementazione<br />

contenuto (l’immag<strong>in</strong>e del volto) per richiedere l’identità del volto e l’<strong>in</strong>vio della richiesta<br />

tramite il behaviour SendImage<br />

public void sendImg(byte[] byteimg){<br />

this.byteimg=byteimg;<br />

//prepara messaggio con immag<strong>in</strong>e e lancia il fipa request<br />

protocol<br />

ACLMessage msg = new ACLMessage(ACLMessage.REQUEST);<br />

msg.addReceiver(manager);<br />

Action act = new Action();<br />

Identifica identifica = new Identifica();<br />

Identita id = new Identita();<br />

Immag<strong>in</strong>e img = new Immag<strong>in</strong>e();<br />

img.setImg(byteimg);<br />

id.setId("sconosciuto");<br />

identifica.setIdentita(id);<br />

identifica.setImmag<strong>in</strong>e(img);<br />

act.setAction(identifica);<br />

act.setActor(this.getAID());<br />

ContentElementList cel = new ContentElementList();<br />

cel.add(act);<br />

ContentManager cm = this.getContentManager();<br />

msg.setLanguage(cm.getLanguageNames()[0]);<br />

msg.setOntology(cm.getOntologyNames()[0]);<br />

try {<br />

cm.fillContent(msg, cel);<br />

} catch (Exception e) {<br />

e.pr<strong>in</strong>tStackTrace();<br />

}<br />

Log.i("ClientAgent sendImg", "Immag<strong>in</strong>e effettivamente <strong>in</strong>viata<br />

t="+System.currentTimeMillis());<br />

addBehaviour(new SendImage(this, msg));<br />

}<br />

Il co<strong>di</strong>ce del behaviour SendImage è il seguente:<br />

public class SendImage extends AchieveREInitiator{<br />

ClientAgent myAgent;<br />

public SendImage(Agent a, ACLMessage msg) {<br />

super(a, msg);<br />

myAgent=(ClientAgent) a;<br />

// TODO Auto-generated constructor stub<br />

}<br />

protected void handleInform(ACLMessage <strong>in</strong>form) {<br />

System.out.pr<strong>in</strong>tln("Agent "+<strong>in</strong>form.getSender().getName()+"<br />

successfully performed the requested action");<br />

122


Implementazione<br />

Log.i("SendImage", "Risposta effettivamente arrivata<br />

t="+System.currentTimeMillis());<br />

//leggo la risposta<br />

ContentManager cm = myAgent.getContentManager();<br />

Action act;<br />

try {<br />

act = (Action) cm.extractContent(<strong>in</strong>form);<br />

Identifica identifica = (Identifica) act.getAction();<br />

Identita id = identifica.getIdentita();<br />

//<strong>in</strong>serisce la risposta nella variabile id e setta a true<br />

il boolean arrivata<br />

myAgent.setId(id.getId());//mette nella variabile id<br />

dell'agente, l'id appena ricevuto<br />

myAgent.setArrivata(true);<br />

} catch (UngroundedException e) {<br />

// TODO Auto-generated catch block<br />

e.pr<strong>in</strong>tStackTrace();<br />

} catch (CodecException e) {<br />

// TODO Auto-generated catch block<br />

e.pr<strong>in</strong>tStackTrace();<br />

} catch (OntologyException e) {<br />

// TODO Auto-generated catch block<br />

e.pr<strong>in</strong>tStackTrace();<br />

}<br />

}<br />

protected void handleRefuse(ACLMessage refuse) {<br />

System.out.pr<strong>in</strong>tln("Agent "+refuse.getSender().getName()+"<br />

refused to perform the requested action");<br />

}<br />

protected void handleFailure(ACLMessage failure) {<br />

if (failure.getSender().equals(myAgent.getAMS())) {<br />

// FAILURE notification from the JADE runtime: the<br />

receiver<br />

// does not exist<br />

System.out.pr<strong>in</strong>tln("Responder does not exist");<br />

}<br />

else {<br />

System.out.pr<strong>in</strong>tln("Agent<br />

"+failure.getSender().getName()+" failed to perform the requested action");<br />

}<br />

}<br />

protected void handleAllResultNotifications(Vector notifications) {<br />

// Some responder <strong>di</strong>dn't reply with<strong>in</strong> the specified<br />

timeout<br />

System.out.pr<strong>in</strong>tln("Timeout expired: miss<strong>in</strong>g responses");<br />

}<br />

}<br />

Listato 4-23 Behaviour SendImage<br />

Tale behaviour attraverso il metodo handleInform gestisce il messaggio <strong>di</strong> risposta<br />

dell’agente manager, estraendo dal contenuto l’identità del volto. Successivamente setta la<br />

123


Implementazione<br />

variabile booleana dell’agente Android a true <strong>in</strong> modo da far sapere alla logica <strong>di</strong><br />

elaborazione del video che è arrivata una risposta <strong>di</strong> identificazione.<br />

4.3.4. Interazione agente e logica <strong>di</strong><br />

elaborazione del video<br />

La logica <strong>di</strong> elaborazione video per l’<strong>in</strong><strong>di</strong>viduazione dei volti è contenuta nella classe FdView,<br />

la quale estende la classe CvBaseView. CvBaseView è una classe astratta che estende<br />

SurfaceView e tramite il metodo run() effettua iterativamente l’analisi del video tramite il<br />

metodo processFrame(). Qu<strong>in</strong><strong>di</strong> iterativamente viene elaborato il video, calcolati i frame per<br />

secondo e altre <strong>in</strong>formazioni. L’elaborazione del video è contenuta nel metodo<br />

processFrame() implementato da FdView, che contiene gli algoritmi e le strutture dati<br />

necessarie per elaborare il video e determ<strong>in</strong>are il volto dom<strong>in</strong>ante da seguire. Le funzionalità<br />

del sistema <strong>di</strong> visione sono rese <strong>di</strong>sponibili dalla libreria OpenCV appositamente compilata<br />

per il sistema operativo Android. La classe viene creata all’avvio dell’applicazione, si carica <strong>in</strong><br />

memoria il file <strong>di</strong> appren<strong>di</strong>mento per l’algoritmo <strong>di</strong> <strong>in</strong><strong>di</strong>viduazione dei volti e viene avviato un<br />

thread per la ricezione delle risposte <strong>di</strong> riconoscimento dei volti che arrivano all’agente. Il<br />

metodo processFrame si occupa <strong>di</strong> <strong>in</strong><strong>di</strong>viduare i volti, selezionare il volto dom<strong>in</strong>ante e<br />

preparare l’immag<strong>in</strong>e da <strong>in</strong>viare all’agente manager tramite l’agente Android. Prima <strong>di</strong><br />

analizzare l’<strong>in</strong>terazione con l’agente Android, segue un riassunto del funzionamento<br />

dell’elaborazione <strong>di</strong> <strong>in</strong><strong>di</strong>viduazione dei volti e scelta del volto dom<strong>in</strong>ante implementata da<br />

Simone Saraceni ([12]). Il video catturato, viene elaborato equalizzandone l’istogramma,<br />

qu<strong>in</strong><strong>di</strong> viene eseguito l’algoritmo <strong>di</strong> <strong>in</strong><strong>di</strong>viduazione dei volti. La scansione ricerca i volti con<br />

una <strong>di</strong>mensione m<strong>in</strong>ima <strong>di</strong> 90x90 pixel, ad ogni iterazione la <strong>di</strong>mensione viene <strong>in</strong>crementata<br />

<strong>di</strong> un fattore 1,3. La variabile faces contiene la lista delle posizioni <strong>di</strong> tutti i volti <strong>in</strong><strong>di</strong>viduati<br />

nel frame corrente; il passo successivo è quello <strong>di</strong> cercare ogni volto <strong>in</strong><strong>di</strong>viduato nei frame<br />

precedenti, aggiornandone le <strong>in</strong>formazioni per mezzo del metodo updatePos; il vettore<br />

hFaces contiene le <strong>in</strong>formazioni relative ai volti <strong>in</strong><strong>di</strong>viduati nel frame attuale e <strong>in</strong> quelli<br />

precedenti. Il tipo <strong>di</strong> dati CFace è stato creato per memorizzare le <strong>in</strong>formazioni relative ai<br />

124


Implementazione<br />

volti <strong>in</strong><strong>di</strong>viduati, ovvero la posizione e il tempo <strong>di</strong> permanenza sulla scena. Dopo aver<br />

aggiornato lo storico con i nuovi volti <strong>in</strong><strong>di</strong>viduati, questo viene scansionato alla ricerca del<br />

volto dom<strong>in</strong>ante, elim<strong>in</strong>ando i volti non più presenti nella scena. Ogni volta che viene<br />

<strong>in</strong><strong>di</strong>viduato un volto dom<strong>in</strong>ante <strong>di</strong>verso dal precedente, oppure è trascorso un certo<br />

<strong>in</strong>tervallo <strong>di</strong> tempo dall’ultimo <strong>in</strong>vio <strong>di</strong> una richiesta, viene creata l’immag<strong>in</strong>e bitmap del<br />

volto dom<strong>in</strong>ante, pronta per una richiesta. L’operazione <strong>di</strong> ricerca del volto dom<strong>in</strong>ante si<br />

basa sul tempo <strong>di</strong> permanenza nella scena; ogni volto <strong>in</strong><strong>di</strong>viduato viene ricercato nello<br />

storico: se la posizione attuale del vertice superiore s<strong>in</strong>istro è <strong>in</strong> un <strong>in</strong>torno della posizione<br />

precedente, i due volti confrontati sono marcati come identici.<br />

s);<br />

protected Bitmap processFrame(VideoCapture capture) {<br />

try {<br />

TENTATIVI<br />

myAgent=MicroRuntime.getAgent(nick).getO2AInterface(ClientGUIInt.clas<br />

} catch (StaleProxyException e) {<br />

// TODO Auto-generated catch block<br />

e.pr<strong>in</strong>tStackTrace();<br />

} catch (ControllerException e) {<br />

//RECOVERY NEL CASO NON TROVA IL SUO AGENTE PER TROPPI<br />

// TODO Auto-generated catch block<br />

e.pr<strong>in</strong>tStackTrace();<br />

//imposta piattaforma dove effettuare il recovery<br />

if(platform==0){<br />

platform=1;<br />

}<br />

else{<br />

platform=0;<br />

}<br />

Log.i("FdView", "Exception Platform Crash<br />

t="+System.currentTimeMillis());<br />

//caso platform 0<br />

if (platform==0){<br />

if(counterr++==4){<br />

counterr=0;<br />

RuntimeCallback<br />

agentStartupCallback = new RuntimeCallback() {<br />

@Override<br />

public void onSuccess(AgentController<br />

agent) {<br />

}<br />

throwable) {<br />

}<br />

};<br />

@Override<br />

public void onFailure(Throwable<br />

125


Implementazione<br />

//Piattaforma <strong>di</strong> recovery<br />

((FdActivity)(getContext())).startSorveglianza("192.168.1.52","1099",<br />

agentStartupCallback );<br />

}<br />

}<br />

//caso platform 1<br />

else{<br />

if(counterr++==4){<br />

counterr=0;<br />

RuntimeCallback<br />

agentStartupCallback = new RuntimeCallback() {<br />

@Override<br />

public void onSuccess(AgentController<br />

agent) {<br />

}<br />

throwable) {<br />

@Override<br />

public void onFailure(Throwable<br />

}<br />

};<br />

//Piattaforma <strong>di</strong> recovery<br />

((FdActivity)(getContext())).startSorveglianza("192.168.1.192","1099"<br />

,agentStartupCallback );<br />

}<br />

}<br />

}//chiusa exception<br />

capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);<br />

capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);<br />

if (mCascade != null) {<br />

//clear previous detected faces array<br />

faces.clear();<br />

//equalize gray image histogram<br />

Imgproc.equalizeHist(mGray, mGray);<br />

//<strong>in</strong>voke face detection algorithm, from a start face <strong>di</strong>mension<br />

of 90x90<br />

mCascade.detectMultiScale(mGray, faces, 1.3, 3, 0, DEFSIZE);<br />

//search each face on history face detected array<br />

for (Rect r : faces){<br />

add=true;<br />

for (CFace a : hFaces){<br />

if (a.updatePos(r)) {<br />

add=false;<br />

break;<br />

}<br />

}<br />

if (add) hFaces.add(new CFace(r)); //face not found <strong>in</strong>to<br />

history array, new face<br />

if (develop) Core.rectangle(mRgba, r.tl(), r.br(), new<br />

Scalar(0, 0, 0, 127), 1); //pr<strong>in</strong>t a green rectangle around each face<br />

}<br />

//<strong>in</strong>itialize array variables<br />

newFace=null;<br />

maxT=0;<br />

126


Implementazione<br />

hcopy.clear();<br />

//for each faces <strong>in</strong>to history faces array, removes old face<br />

(not yet detected) and search dom<strong>in</strong>ant face (most time present)<br />

for (CFace a:hFaces){<br />

if (a.ag<strong>in</strong>g()){<br />

hcopy.add(a);<br />

} else if (a.f<strong>in</strong>dBest()) {<br />

newFace=a;<br />

}<br />

}<br />

hFaces.removeAll(hcopy);<br />

//if a face was detected<br />

if (newFace!=null){<br />

if (develop) Core.rectangle(mRgba, newFace.pos.tl(),<br />

newFace.pos.br(), new Scalar(255,0,0,255),2); //draws a red rectangle<br />

around face<br />

//draw a blue l<strong>in</strong>e next to the left angle of the dom<strong>in</strong>ant<br />

face to visualize the set po<strong>in</strong>t on Z (=140 px)<br />

CFace temp = new CFace(newFace.pos);<br />

Po<strong>in</strong>t bo=temp.pos.tl();<br />

bo.y+=130;<br />

if (develop) Core.l<strong>in</strong>e(mRgba, newFace.pos.tl(),bo, new<br />

Scalar(0,0,255,255), 4); //draws a red rectangle around face<br />

if (dom<strong>in</strong>antFace==null || newFace.id!=dom<strong>in</strong>antFace.id ||<br />

repeat>REPEAT_LIMIT){<br />

//send face to server when first one detected or<br />

new face or need to re-send<br />

dom<strong>in</strong>antFace=newFace;<br />

repeat=0;<br />

try{<br />

waitResp=false;<br />

//create bitmap image to send<br />

dom<strong>in</strong>ant=Bitmap.createBitmap(mRgba.cols(),mRgba.rows(),Bitmap.Config.<br />

ARGB_8888);<br />

Utils.matToBitmap(mRgba, dom<strong>in</strong>ant);<br />

dom<strong>in</strong>ant=Bitmap.createBitmap(dom<strong>in</strong>ant,<br />

newFace.pos.x, newFace.pos.y, newFace.pos.width, newFace.pos.height);<br />

//if (count++>120) count=0;<br />

//dom<strong>in</strong>antFace.id=count; //update face ID<br />

ByteArrayOutputStream();<br />

100, stream);<br />

//trasforma immag<strong>in</strong>e <strong>in</strong> byte<br />

ByteArrayOutputStream stream = new<br />

dom<strong>in</strong>ant.compress(Bitmap.CompressFormat.PNG,<br />

byte[] bytes = stream.toByteArray();<br />

//metto a false la variabile booleana<br />

dell'agente e <strong>in</strong>vio la richiesta<br />

if(myAgent!=null){<br />

myAgent.setArrivata(false);<br />

//<strong>in</strong>via immag<strong>in</strong>e<br />

Log.i("FdView", "Call<strong>in</strong>g agent method<br />

Send Image t="+System.currentTimeMillis());<br />

myAgent.sendImg(bytes);<br />

127


Implementazione<br />

}<br />

sendImg=false;<br />

REPEAT_LIMIT++;<br />

waitResp=true;<br />

faceCheck="";<br />

}catch (Exception e) {Log.e(TAG,"bitmap error<br />

"+e.toStr<strong>in</strong>g());}<br />

Log.i(TAG, "new Face ");<br />

}else if (newFace.id==dom<strong>in</strong>antFace.id &&<br />

repeat


Implementazione<br />

che la logica <strong>di</strong> analisi del video ha bisogno <strong>di</strong> <strong>in</strong>viare una richiesta, un nuovo behaviour<br />

apposito per l’<strong>in</strong>vio della richiesta viene creato <strong>in</strong> modo da non dover aspettare la risposta <strong>di</strong><br />

ogni richiesta e sv<strong>in</strong>colare la logica <strong>di</strong> analisi dalle risposte alle richieste. Per il recupero delle<br />

risposte che arrivano all’agente Android da parte della logica <strong>di</strong> elaborazione del video<br />

necessarie alla FdView, è stato implementato un thread il cui compito è <strong>di</strong> controllare lo stato<br />

della variabile booleana dell’agente Android che <strong>in</strong><strong>di</strong>ca l’arrivo <strong>di</strong> una risposta <strong>di</strong><br />

identificazione e, tramite l’<strong>in</strong>terfaccia dell’agente Adroid, recuperare la risposta:<br />

class RecvThread extends Thread{<br />

public void run(){<br />

while (true){<br />

try{<br />

Thread.sleep(1);<br />

if(myAgent!=null){<br />

//caso è arrivata risposta <strong>di</strong> identificazione<br />

if(myAgent.getArrivata()==true){<br />

Thread.sleep(1);<br />

Log.i("FdViewRecThread", "Risposta <strong>di</strong><br />

identificazione arrivata all'agente andorid e al receive thread<br />

t="+System.currentTimeMillis());<br />

Str<strong>in</strong>g id=myAgent.getId();//recupero id<br />

persona della risposta nell'agente<br />

myAgent.setArrivata(false);//setto a false la<br />

variabile arrivata dell'agente<br />

if (REPEAT_LIMIT>15) REPEAT_LIMIT-=2;<br />

if (id.equals("Andrea")){ //recognized<br />

(wanted) face -> update current dom<strong>in</strong>ant face and show message<br />

Log.i("FdViewRecThread", "Riconosciuto<br />

t="+System.currentTimeMillis());<br />

if (dom<strong>in</strong>antFace!=null){<br />

Log.i("FdViewRecThread",<br />

"Riconosciuto dom<strong>in</strong>antFace!=null t="+System.currentTimeMillis());<br />

dom<strong>in</strong>antFace.wanted();<br />

faceCheck="WANTED";<br />

}<br />

}else{ //unknown face -> update current<br />

dom<strong>in</strong>ant face<br />

if (dom<strong>in</strong>antFace!=null){<br />

dom<strong>in</strong>antFace.unknown();<br />

faceCheck="";<br />

Log.i("FdViewRecThread",<br />

"Sconosciuto t="+System.currentTimeMillis());<br />

}<br />

}<br />

}<br />

}<br />

}catch(Exception e){<br />

//recovery nel caso sia <strong>di</strong>strutta la piattaforma<br />

if(!MicroRuntime.isRunn<strong>in</strong>g()){<br />

//System.out.pr<strong>in</strong>tln("Exception nel thread");<br />

//prova a far ripartire l'agente nella<br />

129


Implementazione<br />

piattaforma <strong>di</strong> recovery<br />

RuntimeCallback<br />

agentStartupCallback = new RuntimeCallback() {<br />

@Override<br />

public void onSuccess(AgentController<br />

agent) {<br />

}<br />

throwable) {<br />

};<br />

@Override<br />

public void onFailure(Throwable<br />

}<br />

((FdActivity)(getContext())).startSorveglianza("192.168.1.92","1099",<br />

agentStartupCallback );<br />

}<br />

else{<br />

//System.out.pr<strong>in</strong>tln("Microruntime ancora<br />

attivo");<br />

}<br />

}<br />

}<br />

Listato 4-25 Thread <strong>di</strong> controllo risposta <strong>di</strong> identificazione volti<br />

Anche <strong>in</strong> questo caso, se il tentativo <strong>di</strong> recuperare l’<strong>in</strong>formazione contenuta nell’agente<br />

tramite l’<strong>in</strong>terfaccia fallisce, la Jade Platform a cui era collegato l’agente viene ritenuta<br />

guasta, qu<strong>in</strong><strong>di</strong> l’applicazione tenterà <strong>di</strong> riprist<strong>in</strong>are il servizio ricreando l’agente <strong>in</strong> un’altra<br />

piattaforma <strong>di</strong> recovery.<br />

130


5. Test e risultati<br />

Per testare il sistema <strong>di</strong> videosorveglianza realizzato, sono stati effettuati due tipi <strong>di</strong> test, il<br />

primo per misurare la variazione delle prestazioni <strong>di</strong> analisi del video rispetto l’applicazione<br />

non agentificata, il secondo per misurare il tempo <strong>di</strong> latenza che l’applicativo Android<br />

impiega per riprist<strong>in</strong>are il servizio <strong>in</strong> caso la piattaforma ad agenti smetta <strong>di</strong> funzionare.<br />

5.1. Test sulle prestazioni <strong>di</strong> analisi del video<br />

Per confrontare le prestazioni <strong>di</strong> analisi del video da parte dell’applicativo <strong>di</strong><br />

videosorveglianza agentificato con quelle dell’applicativo <strong>di</strong> <strong>in</strong>seguimento <strong>di</strong> volti fornitomi<br />

dal Laboratorio <strong>di</strong> Intelligenza Artificiale e Sistemi <strong>in</strong> Tempo Reale non ad agenti, si è preso <strong>in</strong><br />

considerazione i frame per secondo (FPS) del flusso video analizzati dai due applicativi. I test<br />

sono stati effettuati <strong>in</strong> simili con<strong>di</strong>zioni <strong>di</strong> ambiente e stesso meccanismo <strong>di</strong> calcolo delle<br />

prestazioni, ovvero:<br />

public void measure() {<br />

framesC++;<br />

if (framesC % step == 0) {<br />

time = Core.getTickCount();<br />

fps = step * freq / (time - prevFrameTime);<br />

prevFrameTime = time;<br />

strfps = df.format(fps) + " FPS";<br />

Log.i(TAG, strfps);<br />

}<br />

exTime=Core.getTickCount();<br />

Log.i("ExecutionTime", ((exTime-prevExTime)/freq*1000)+ " ms");<br />

prevExTime=exTime;<br />

}<br />

Listato 5-1 Log dell'execution time<br />

Dall’analisi dei log è qu<strong>in</strong><strong>di</strong> possibile leggere il tempo <strong>di</strong> elaborazione dei frame e i FPS<br />

elaborati, <strong>di</strong> seguito un estratto <strong>di</strong> 12 secon<strong>di</strong> dei risultati ottenuti:<br />

131


11-06 11:36:42.065: I/ExecutionTime(6724):<br />

152.86254799999998 ms<br />

11-06 11:36:42.215: I/ExecutionTime(6724): 140.441896 ms<br />

11-06 11:36:42.345: I/ExecutionTime(6724): 131.56128 ms<br />

11-06 11:36:42.545: I/ExecutionTime(6724): 204.132078 ms<br />

11-06 11:36:42.735: I/ExecutionTime(6724):<br />

189.63623199999998 ms<br />

11-06 11:36:42.835: I/ExecutionTime(6724): 95.550538 ms<br />

11-06 11:36:42.905: I/ExecutionTime(6724): 74.310302 ms<br />

11-06 11:36:43.025: I/ExecutionTime(6724): 121.490477 ms<br />

11-06 11:36:43.126: I/ExecutionTime(6724): 98.846437 ms<br />

11-06 11:36:43.216: I/ExecutionTime(6724):<br />

89.96582000000001 ms<br />

11-06 11:36:43.356: I/ExecutionTime(6724):<br />

143.09692299999998 ms<br />

11-06 11:36:43.466: I/ExecutionTime(6724): 103.790285 ms<br />

11-06 11:36:43.566: I/ExecutionTime(6724):<br />

105.95702999999999 ms<br />

11-06 11:36:43.656: I/ExecutionTime(6724):<br />

83.37402300000001 ms<br />

11-06 11:36:44.006: I/ExecutionTime(6724): 350.433351 ms<br />

11-06 11:36:44.077: I/ExecutionTime(6724):<br />

75.04272300000001 ms<br />

11-06 11:36:44.157: I/ExecutionTime(6724): 76.99585 ms<br />

11-06 11:36:44.267: I/ExecutionTime(6724): 114.105226 ms<br />

11-06 11:36:44.427: I/ExecutionTime(6724): 159.790039 ms<br />

11-06 11:36:44.587: I/ExecutionTime(6724): 148.162839 ms<br />

11-06 11:36:44.697: I/ExecutionTime(6724): 129.394532 ms<br />

11-06 11:36:44.827: I/ExecutionTime(6724): 130.828858 ms<br />

11-06 11:36:44.957: I/ExecutionTime(6724):<br />

121.52099600000001 ms<br />

11-06 11:36:45.017: I/ExecutionTime(6724): 69.610595 ms<br />

11-06 11:36:45.118: I/ExecutionTime(6724): 93.048098 ms<br />

11-06 11:36:45.198: I/ExecutionTime(6724):<br />

80.81054499999999 ms<br />

11-06 11:36:45.278: I/ExecutionTime(6724): 82.794189 ms<br />

11-06 11:36:45.358: I/ExecutionTime(6724):<br />

75.74463100000001 ms<br />

11-06 11:36:45.458: I/ExecutionTime(6724): 91.735839 ms<br />

11-06 11:36:45.538: I/ExecutionTime(6724):<br />

90.91186499999999 ms<br />

11-06 11:36:45.908: I/ExecutionTime(6724):<br />

373.04687600000005 ms<br />

11-06 11:36:46.048: I/ExecutionTime(6724): 129.913329 ms<br />

11-06 11:36:46.209: I/ExecutionTime(6724): 164.337159 ms<br />

11-06 11:36:46.309: I/ExecutionTime(6724): 95.306397 ms<br />

11-06 11:36:46.449: I/ExecutionTime(6724):<br />

138.73290899999998 ms<br />

11-06 11:36:46.559: I/ExecutionTime(6724): 114.074708 ms<br />

11-06 11:36:46.689: I/ExecutionTime(6724): 131.164551 ms<br />

11-06 11:36:46.799: I/ExecutionTime(6724): 111.999511 ms<br />

11-06 11:36:46.859: I/ExecutionTime(6724): 66.497802 ms<br />

11-06 11:36:46.979: I/ExecutionTime(6724): 114.562988 ms<br />

11-06 11:36:47.109: I/ExecutionTime(6724): 132.720947 ms<br />

11-06 11:36:47.200: I/ExecutionTime(6724): 85.357668 ms<br />

11-06 11:36:47.280: I/ExecutionTime(6724):<br />

81.54296799999999 ms<br />

11-06 11:36:47.360: I/ExecutionTime(6724): 85.29663 ms<br />

11-06 11:36:47.440: I/ExecutionTime(6724):<br />

76.20239199999999 ms<br />

Test e risultati<br />

11-06 11:36:47.530: I/ExecutionTime(6724):<br />

97.07641699999999 ms<br />

11-06 11:36:47.610: I/ExecutionTime(6724):<br />

76.26342799999999 ms<br />

11-06 11:36:48.010: I/ExecutionTime(6724):<br />

399.78027199999997 ms<br />

11-06 11:36:48.160: I/ExecutionTime(6724): 149.475099 ms<br />

11-06 11:36:48.231: I/ExecutionTime(6724):<br />

65.91796799999999 ms<br />

11-06 11:36:48.341: I/ExecutionTime(6724): 107.940674 ms<br />

11-06 11:36:48.501: I/ExecutionTime(6724): 164.947511 ms<br />

11-06 11:36:48.601: I/ExecutionTime(6724): 95.642091 ms<br />

11-06 11:36:48.751: I/ExecutionTime(6724): 151.275634 ms<br />

11-06 11:36:48.841: I/ExecutionTime(6724): 94.726562 ms<br />

11-06 11:36:48.991: I/ExecutionTime(6724):<br />

151.70288100000002 ms<br />

11-06 11:36:49.111: I/ExecutionTime(6724): 112.396239 ms<br />

11-06 11:36:49.222: I/ExecutionTime(6724): 113.952638 ms<br />

11-06 11:36:49.332: I/ExecutionTime(6724): 115.844726 ms<br />

11-06 11:36:49.502: I/ExecutionTime(6724): 162.475586 ms<br />

11-06 11:36:49.602: I/ExecutionTime(6724): 98.937988 ms<br />

11-06 11:36:49.722: I/ExecutionTime(6724): 124.328614 ms<br />

11-06 11:36:49.812: I/ExecutionTime(6724): 94.421386 ms<br />

11-06 11:36:50.142: I/ExecutionTime(6724): 327.819824 ms<br />

11-06 11:36:50.243: I/ExecutionTime(6724): 100.280761 ms<br />

11-06 11:36:50.333: I/ExecutionTime(6724): 83.801271 ms<br />

11-06 11:36:50.503: I/ExecutionTime(6724):<br />

168.79272500000002 ms<br />

11-06 11:36:50.693: I/ExecutionTime(6724): 195.159912 ms<br />

11-06 11:36:50.953: I/ExecutionTime(6724):<br />

257.69042800000005 ms<br />

11-06 11:36:51.023: I/ExecutionTime(6724): 68.695069 ms<br />

11-06 11:36:51.103: I/ExecutionTime(6724): 88.043213 ms<br />

11-06 11:36:51.193: I/ExecutionTime(6724): 87.219238 ms<br />

11-06 11:36:51.284: I/ExecutionTime(6724): 83.709717 ms<br />

11-06 11:36:51.374: I/ExecutionTime(6724):<br />

90.91186599999999 ms<br />

11-06 11:36:51.454: I/ExecutionTime(6724):<br />

87.34130800000001 ms<br />

11-06 11:36:51.524: I/ExecutionTime(6724):<br />

65.91796900000001 ms<br />

11-06 11:36:51.664: I/ExecutionTime(6724):<br />

138.27514599999998 ms<br />

11-06 11:36:51.754: I/ExecutionTime(6724): 92.041015 ms<br />

11-06 11:36:51.864: I/ExecutionTime(6724): 110.687257 ms<br />

11-06 11:36:51.944: I/ExecutionTime(6724):<br />

81.02417000000001 ms<br />

11-06 11:36:52.254: I/ExecutionTime(6724): 301.971436 ms<br />

11-06 11:36:52.325: I/ExecutionTime(6724):<br />

78.03344600000001 ms<br />

11-06 11:36:52.405: I/ExecutionTime(6724): 78.643799 ms<br />

11-06 11:36:52.525: I/ExecutionTime(6724): 120.4834 ms<br />

11-06 11:36:52.815: I/ExecutionTime(6724): 289.459227 ms<br />

11-06 11:36:53.055: I/ExecutionTime(6724): 235.870362 ms<br />

11-06 11:36:53.306: I/ExecutionTime(6724):<br />

255.98144499999998 ms<br />

11-06 11:36:53.426: I/ExecutionTime(6724):<br />

116.24145499999999 ms<br />

11-06 11:36:53.556: I/ExecutionTime(6724): 135.894776 ms<br />

11-06 11:36:53.686: I/ExecutionTime(6724): 127.166747 ms<br />

11-06 11:36:53.786: I/ExecutionTime(6724): 94.116212 ms<br />

11-06 11:36:53.866: I/ExecutionTime(6724):<br />

77.78930700000001 ms<br />

11-06 11:36:53.996: I/ExecutionTime(6724):<br />

134.82665899999998 ms<br />

Tabella 5-1Risultati prestazioni analisi video<br />

132


12<br />

10<br />

8<br />

6<br />

4<br />

2<br />

0<br />

Test e risultati<br />

1 2 3 4 5 6 7 8 9 10 11 12<br />

Figura 5-1 Diagramma dei FPS ottenuto dall'estratto <strong>di</strong> 12 secon<strong>di</strong> dei test<br />

Per chiarezza sono riportati solamente 12 secon<strong>di</strong> del test effettuato e <strong>in</strong> base ai risultati<br />

ottenuti l’applicativo ad agenti <strong>di</strong> videosorveglianza effettua una analisi del video con una<br />

me<strong>di</strong>a <strong>di</strong> 7,75 FPS. L’applicativo senza agenti ha un frame rate me<strong>di</strong>o <strong>di</strong> 12 FPS, qu<strong>in</strong><strong>di</strong><br />

l’aggiunta del sistema ad agenti ha portato ad un rallentamento me<strong>di</strong>o <strong>di</strong> 4,25 FPS all’analisi<br />

del video. Un rallentamento dell’analisi video dovuta all’aggiunta del sistema ad agenti era<br />

preve<strong>di</strong>bile, dato che l’applicativo è appesantito dal livello ad agenti aggiuntivo gestito dal<br />

framework JADE, tuttavia un frame rate me<strong>di</strong>o <strong>di</strong> 7,75 FPS è considerabile sufficiente per il<br />

funzionamento dell’applicativo <strong>di</strong> videosorveglianza.<br />

5.2. Test recovery del sistema <strong>di</strong><br />

videosorveglianza<br />

Frame/s<br />

Il vantaggio pr<strong>in</strong>cipale ottenuto dalla realizzazione del sistema <strong>di</strong> videosorveglianza<br />

utilizzando la tecnologia ad agenti è il sistema <strong>di</strong> recovery. Tale sistema permette<br />

all’applicativo Android <strong>di</strong> riprist<strong>in</strong>are il servizio <strong>di</strong> videosorveglianza nel caso <strong>di</strong> un<br />

133


Test e risultati<br />

malfunzionamento della macch<strong>in</strong>a su cui è <strong>in</strong> esecuzione la piattaforma <strong>di</strong> videosorveglianza<br />

ad agenti. Tale sistema prevede la presenza <strong>di</strong> più macch<strong>in</strong>e <strong>in</strong> cui è <strong>in</strong> esecuzione<br />

l’applicativo ad agenti <strong>di</strong> videosorveglianza, ma non prevede una gerarchia fra le piattaforme<br />

ad agenti, dato che l’applicativo Android tenta <strong>di</strong> riprist<strong>in</strong>are il servizio <strong>di</strong> videosorveglianza<br />

cercando <strong>di</strong> ricrearlo tramite una piattaforma fra quelle conosciute. Il dato che ci <strong>in</strong>teressa<br />

conoscere è il tempo che impiega l’applicativo Android a riprist<strong>in</strong>are il servizio <strong>in</strong> una seconda<br />

piattaforma <strong>di</strong> videosorveglianza dopo che si è <strong>di</strong>sattivata la piattaforma a cui era collegato.<br />

Per ottenere questo dato è stato aggiunto un log nel catch dell’eccezione riguardante il<br />

mancato recupero dell’agente Android ed effettuato spegnimenti delle piattaforme (anche<br />

consecutive) contenenti gli agenti Android. Come risultato si ottiene una serie <strong>di</strong> catch delle<br />

eccezioni che vengono lanciate nel frattempo che il servizio <strong>di</strong> videosorveglianza è sospeso,<br />

qu<strong>in</strong><strong>di</strong> prendendo nota dell’istante <strong>in</strong> cui viene lanciata la prima e l’ultima eccezione si<br />

ottiene il tempo <strong>di</strong> riprist<strong>in</strong>o. Il risultato dei test è il seguente:<br />

Riprist<strong>in</strong>o1:<br />

Istante del primo catch: 11-06 12:51:33.455<br />

Istante ultimo catch: 11-06 12:51:33.716<br />

Il primo riprist<strong>in</strong>o è stato effettuato con successo <strong>in</strong> 261 ms.<br />

Risprist<strong>in</strong>o2:<br />

Istante del primo catch: 11-06 13:13:40.200<br />

Istante ultimo catch: 11-06 13:13:40.460<br />

Il secondo riprist<strong>in</strong>o è stato effettuato con successo <strong>in</strong> 260 ms.<br />

Risprist<strong>in</strong>o3:<br />

Istante del primo catch: 11-06 13:28:23.482<br />

Istante ultimo catch: 11-06 13:28:23.890<br />

Il terzo riprist<strong>in</strong>o è stato effettuato con successo <strong>in</strong> 408 ms.<br />

Risprist<strong>in</strong>o4:<br />

134


Istante del primo catch: 11-06 13:30:46.081<br />

Istante ultimo catch: 11-06 13:30:46.451<br />

Test e risultati<br />

Il quarto riprist<strong>in</strong>o è stato effettuato con successo <strong>in</strong> 370 ms.<br />

Risprist<strong>in</strong>o5:<br />

Istante del primo catch: 11-06 13:31:14.869<br />

Istante ultimo catch: 11-06 13:31:15.199<br />

Il qu<strong>in</strong>to riprist<strong>in</strong>o è stato effettuato con successo <strong>in</strong> 330 ms.<br />

Risprist<strong>in</strong>o6:<br />

Istante del primo catch: 11-06 13:31:47.160<br />

Istante ultimo catch: 11-06 13:31:47.531<br />

Il sesto riprist<strong>in</strong>o è stato effettuato con successo <strong>in</strong> 371 ms.<br />

Qu<strong>in</strong><strong>di</strong> <strong>in</strong> me<strong>di</strong>a si è rilevata una sospensione dell’attività <strong>di</strong> videosorveglianza <strong>di</strong> soli 333 ms,<br />

dopo<strong>di</strong>ché il servizio è stato riprist<strong>in</strong>ato nella prima piattaforma ad agenti <strong>di</strong><br />

videosorveglianza trovata <strong>di</strong>sponibile.<br />

135


6. Conclusioni e sviluppi futuri<br />

Il sistema <strong>di</strong> videosorveglianza ad agenti che è stato sviluppato sod<strong>di</strong>sfa i requisiti richiesti. L’<br />

uso del framework JADE e dell’add-on JADE-LEAP si sono <strong>di</strong>mostrati un’ottima scelta per lo<br />

sviluppo dell’architettura ad agenti, <strong>in</strong> quanto offre tutti gli strumenti <strong>di</strong> cui il sistema <strong>di</strong><br />

videosorveglianza ha bisogno ed è ben documentato. Anche l’uso dello smartphone Android<br />

come simulazione <strong>di</strong> una più realistica telecamera <strong>di</strong> un sistema <strong>di</strong> videosorveglianza si è<br />

<strong>di</strong>mostrato un ottimo strumento per testare idee <strong>in</strong>novative, dato che le proprietà raggiunte<br />

dal sistema <strong>di</strong> videosorveglianza ad agenti che è stato sviluppato utilizzando uno smartphone<br />

Android possono essere replicate <strong>in</strong> hardware più consoni all’obiettivo <strong>di</strong> videosorveglianza. I<br />

risultati dei test suggeriscono un degrado delle prestazioni <strong>di</strong> analisi del video rispetto<br />

all’applicazione non agentificata, degrado preve<strong>di</strong>bile dato dalla presenza <strong>di</strong> un livello<br />

aggiuntivo rappresentato dall’architettura ad agenti e aggravato dal fatto che l’applicativo<br />

Android <strong>di</strong> <strong>in</strong><strong>di</strong>viduazione ed <strong>in</strong>seguimento dei volti non nasce con l’<strong>in</strong>tento <strong>di</strong> utilizzare la<br />

tecnologia ad agenti, qu<strong>in</strong><strong>di</strong> per il funzionamento del sistema <strong>di</strong> videosorveglianza ad agenti è<br />

stato necessario accettare un compromesso fra l’applicativo Android e l’<strong>in</strong>serimento<br />

dell’agente nel funzionamento. Molto buoni <strong>in</strong>vece i risultati ottenuti dai test sul recovery del<br />

sistema, l’architettura ad agenti e <strong>in</strong> particolare il framework JADE rende il sistema robusto a<br />

guasti della macch<strong>in</strong>a <strong>in</strong> cui è <strong>in</strong> esecuzione l’applicativo centrale, <strong>in</strong>fatti l’applicativo Android<br />

impiega poco più <strong>di</strong> 3 decimi <strong>di</strong> secondo per ricreare il suo agente <strong>in</strong> un’altra piattaforma <strong>di</strong><br />

videosorveglianza <strong>di</strong>sponibile. Inoltre non vi è la necessità <strong>di</strong> imporre un ruolo <strong>di</strong> recovery a<br />

nessuna piattaforma <strong>di</strong> videosorveglianza, l’applicativo Android nel caso rilevi<br />

malfunzionamenti del suo agente, cerca <strong>di</strong> ricreare l’agente <strong>in</strong> una piattaforma <strong>di</strong><br />

videosorveglianza da lui conosciuta. Teoricamente nel caso <strong>in</strong> cui la piattaforma<br />

precedentemente non funzionante riprendesse il corretto funzionamento, il servizio<br />

potrebbe tornare operativo su tale piattaforma. Buona anche la scalabilità del sistema, dato<br />

che aggiungere o rimuovere telecamere è imme<strong>di</strong>ato e non comporta alcuna mo<strong>di</strong>fica del<br />

co<strong>di</strong>ce. Nel caso ci fossero molte telecamere da gestire e qu<strong>in</strong><strong>di</strong> maggiore capacità <strong>di</strong> calcolo<br />

136


Conclusioni e sviluppi futuri<br />

richiesta alla macch<strong>in</strong>a su cui è <strong>in</strong> esecuzione l’applicativo, è sufficiente aggiungere<br />

l’esecuzione dell’applicativo centrale su un’altra macch<strong>in</strong>a e federare le piattaforme presenti,<br />

<strong>in</strong> modo da poter permettere una comunicazione fra tutti gli agenti della videosorveglianza.<br />

In conclusione, considerando una per<strong>di</strong>ta accettabile del frame rate dell’applicativo Android<br />

ad agenti, la quale è senza dubbio migliorabile programmando l’<strong>in</strong>tera applicazione ad<br />

agenti, si hanno gran<strong>di</strong> vantaggi dall’uso degli agenti software nell’ambito della<br />

videosorveglianza, quali la robustezza, la scalabilità e una grande facilità nel gestire aggiunte<br />

o elim<strong>in</strong>azioni <strong>di</strong> telecamere. Molto <strong>in</strong>teressanti gli sviluppi che si possono effettuare <strong>in</strong><br />

futuro, <strong>in</strong> primo piano una riprogrammazione completamente ad agenti dell’applicativo<br />

Android, il quale favorirà sicuramente sulle prestazioni del sistema. Inoltre si potrebbe<br />

implementare un sistema <strong>in</strong>telligente <strong>di</strong> bilancio del carico <strong>di</strong> lavoro fra le macch<strong>in</strong>e <strong>in</strong> cui è<br />

<strong>in</strong> esecuzione l’applicativo centrale. Nel caso un agente Android rilevi un tempo <strong>di</strong> risposta<br />

alto alle richieste <strong>di</strong> identificazione del volto, potrebbe decidere <strong>di</strong> effettuare le richieste ad<br />

un’altro agente manager, decidendo quale sia il prossimo agente manager a cui <strong>in</strong>viare le<br />

richieste attraverso il protocollo FIPA Contract-Net. Gli agenti manager presenti <strong>in</strong>vieranno<br />

come proposta il dato relativo al loro carico <strong>di</strong> lavoro, <strong>in</strong> modo tale che l’agente Android<br />

possa poi decidere quale sia il migliore a cui <strong>in</strong>viare le richieste. Per stimare il carico <strong>di</strong> lavoro<br />

attuale <strong>di</strong> un agente manager, si potrebbe utilizzare la <strong>di</strong>fferenza <strong>di</strong> tempo me<strong>di</strong>a fra le<br />

ultime richieste <strong>di</strong> identificazione volti e il numero <strong>di</strong> telecamere gestite dall’agente<br />

attualmente. Si potrebbe migliorare l’attuale applicativo <strong>di</strong> videosorveglianza<br />

implementando una <strong>in</strong>terfaccia grafica all’applicazione centrale, che permetta la visione <strong>di</strong><br />

ciò che le telecamere stanno al momento riprendendo e lo storico delle persone riconosciute<br />

da una determ<strong>in</strong>ata telecamera, qu<strong>in</strong><strong>di</strong> la possibilità <strong>di</strong> ricercare una persona all’<strong>in</strong>terno delle<br />

<strong>in</strong>formazioni registrate. Inoltre se ogni telecamera avesse l’<strong>in</strong>formazione relativa al luogo <strong>in</strong><br />

cui è posizionata, possono essere possibili ricostruzioni sugli spostamenti delle persone<br />

<strong>in</strong><strong>di</strong>viduate. Inf<strong>in</strong>e, un’altra <strong>in</strong>teressante idea per il futuro, sarebbe quella <strong>di</strong> utilizzare gli<br />

agenti software per analisi del video più <strong>in</strong>telligente, ovvero <strong>in</strong> grado <strong>di</strong> comprendere cosa<br />

succede nelle <strong>in</strong>quadrature delle videocamere <strong>di</strong> videosorveglianza e rilevare <strong>in</strong> autonomia<br />

comportamenti sospetti. Per poter effettuare questa analisi non sarà più sufficiente spe<strong>di</strong>re<br />

l’immag<strong>in</strong>e del volto all’applicazione centrale, ma bisognerà riconoscere ed <strong>in</strong>viare<br />

137


Conclusioni e sviluppi futuri<br />

l’immag<strong>in</strong>e relativa all’<strong>in</strong>tero corpo della persona, dopo<strong>di</strong>ché l’applicativo centrale la dovrà<br />

analizzare con un sistema <strong>di</strong> <strong>in</strong>telligenza artificiale <strong>in</strong> grado <strong>di</strong> dedurre un significato alle<br />

azioni delle persone identificate.<br />

138


Appen<strong>di</strong>ceA Software<br />

In questa Appen<strong>di</strong>ce vengono riportate le versioni dei software e librerie del framework JADE<br />

utilizzati nello sviluppo del sistema <strong>di</strong> videosorveglianza ad agenti.<br />

Programmazione dell’applicazione Android<br />

• Eclipse IDE for Java Developers, INDIGO (v. 3.7.1)<br />

• Android SDK r16;<br />

• ADT Plug<strong>in</strong> per Eclipse;<br />

• Android 2.3.3 (API 10) SDK Platform e Google APIs by Google Inc. (API 10), <strong>in</strong>stallati tramite<br />

l’Android SDK Manager.<br />

•JadeAndroid.jar<br />

Programmazione del software per PC<br />

• Eclipse IDE for Java Developers, INDIGO (v. 3.7.1); lo stesso usato per Android;<br />

• Java JDK 1.6.0_27.<br />

• jade.jar<br />

• commons-codec-1.3.jar<br />

139


R<strong>in</strong>graziamenti<br />

Ricordo come se fosse ieri il giorno <strong>in</strong> cui passai il mio primo esame, Fondamenti <strong>di</strong><br />

<strong>in</strong>formatica. Quel giorno rappresentava un bivio, se non passavo l’esame <strong>di</strong> <strong>in</strong>formatica non<br />

mi sarei ritenuto all’altezza dell’università e non l’avrei mai fatta, se lo passavo sapevo che<br />

sarebbe stato l’<strong>in</strong>izio <strong>di</strong> uno dei perio<strong>di</strong> più importanti della mia vita. Passai l’esame, uscii<br />

dalla <strong>Facoltà</strong> e guardai la torre, le ban<strong>di</strong>ere, l’emozione <strong>di</strong> quel momento me la ricorderò<br />

sempre. Ora che è term<strong>in</strong>ato questo periodo della mia vita, posso <strong>di</strong>re che sono fiero del<br />

percorso <strong>di</strong> crescita personale che ho fatto durante questi anni, percorso che per me<br />

rappresenta l’esame più <strong>di</strong>fficile e bello che l’università mi ha offerto. Ho toccato punte <strong>di</strong><br />

felicità e tristezza <strong>in</strong><strong>di</strong>menticabili, degno <strong>di</strong> un periodo che è stato vissuto. Com<strong>in</strong>ciano qu<strong>in</strong><strong>di</strong><br />

i r<strong>in</strong>graziamenti verso le persone che hanno con<strong>di</strong>viso con me questi momenti. Per primo, un<br />

r<strong>in</strong>graziamento speciale a me stesso, visto che non me lo <strong>di</strong>co mai. R<strong>in</strong>grazio i miei genitori e<br />

né approfitto per <strong>di</strong>re loro che gli voglio bene, visto che non glielo <strong>di</strong>co mai. R<strong>in</strong>grazio mia<br />

sorella Aurora, una delle persone che mi capisce più <strong>di</strong> tutte e a cui voglio bene <strong>in</strong> modo<br />

particolare, anche se non glielo <strong>di</strong>co mai. R<strong>in</strong>grazio Refo, voglio <strong>di</strong>rti che sono proprio<br />

fortunato ad avere un amico come te, che poi per me ormai sei più <strong>di</strong> un amico, dal 1991 sei<br />

Refo. R<strong>in</strong>grazio Silvia, nel bene e nel male, sei stata sicuramente la persona più importante <strong>di</strong><br />

questo periodo. R<strong>in</strong>grazio tutti i miei amici con cui ho trascorso questi anni <strong>di</strong> Università, <strong>in</strong><br />

modo particolare Rama e Marco, spero <strong>di</strong> non perdere mai il contatto con voi. Le giornate<br />

all’università non sarebbero state le stesse senza Filippo, Gior<strong>di</strong>, Favo e Gigli, siete uno<br />

spasso. R<strong>in</strong>grazio Andrea, perché mi hai fatto passare una splen<strong>di</strong>da estate, un’estate per me<br />

fondamentale che non scorderò mai. R<strong>in</strong>grazio tutti i miei amici storici, <strong>di</strong> sempre, che anche<br />

se da tempo vedo molto poco, per me sono sempre importanti. R<strong>in</strong>grazio Carla, perché ha<br />

con<strong>di</strong>viso con me Frank e mi ha aiutato ad entrare <strong>in</strong> un mondo che non conoscevo. R<strong>in</strong>grazio<br />

il viol<strong>in</strong>o, la cosa che amo <strong>di</strong> più e con più certezza, che ultimamente mi ha anche permesso<br />

<strong>di</strong> ritrovare belle persone come Maddalena e Giulia. R<strong>in</strong>grazio ancora tutte le persone che<br />

hanno con<strong>di</strong>viso con me questo bel periodo e che non ho specificato. Un pensiero particolare<br />

và al Prof. Aldo Franco Dragoni, relatore <strong>di</strong> questa tesi, della tesi che feci alla triennale e<br />

140


professore degli esami più belli che ho sostenuto <strong>in</strong> questa Università. Un pensiero anche ai<br />

suoi assistenti Luca e Gianluca che mi hanno aiutato durante la realizzazione <strong>di</strong> questo lavoro<br />

<strong>di</strong> tesi. Ora si apre un altro capitolo, ho bisogno <strong>di</strong> riprovare quell’emozione sentita quando<br />

ho passato il primo esame, cercandola nel mondo del lavoro, cercandola accompagnato dalla<br />

s<strong>in</strong>fonia “Dal Nuovo Mondo” <strong>di</strong> Dvořák.<br />

141


Bibliografia<br />

[1]. Tratto da http://www.videosorveglianza.eu.com/<br />

[2]. Develop<strong>in</strong>g Multi-Agent Systems with JADE, Fabio Bellifem<strong>in</strong>e, Telecom Italia, Italy<br />

Giovanni Caire, Telecom Italia, Italy Dom<strong>in</strong>ic Greenwood, Whiteste<strong>in</strong> Technologies AG,<br />

Switzerland.<br />

[3]. Tratto da FIPA, Foundation For Intelligent Physical Agents, “Specifications and<br />

Documentation”: http://www.fipa.org/<br />

[4]. Tratto da Il sistema operativo Android: http://www.android.com<br />

[5]. Android Programm<strong>in</strong>g, PuntoInformatico E<strong>di</strong>zioniMaster.<br />

[6]. LEAP USER GUIDE, Authors: Giovanni Caire (TILAB ex CSELT).<br />

[7]. JADE TUTORIAL JADE PROGRAMMING FOR ANDROID, Authors: Giovanni Caire (Telecom<br />

Italia S.p.A.) Giovanni Iavarone (Telecom Italia S.p.A.).<br />

[8]. Tratto da Papers & resources : http://jade.tilab.com/<br />

[9]. Tratto da The Eclipse Foundation open source community website.:<br />

http://www.eclipse.org/<br />

[10]. Integrazione <strong>di</strong> Jade <strong>in</strong> Eclipse, Luca Palazzo.<br />

[11]. Tratto da ADT Plug<strong>in</strong> per Eclipse: http://developer.android.com/tools/sdk/eclipseadt.html<br />

[12]. Progettazione e realizzazione <strong>di</strong> un sistema real-time per l’<strong>in</strong>seguimento <strong>di</strong> volti<br />

me<strong>di</strong>ante robot e smartphone Android, Simone Saraceni.<br />

[13]. JADE ADMINISTRATOR’S GUIDE, Fabio Bellifem<strong>in</strong>e, Giovanni Caire, Tiziana Trucco (TILAB<br />

S.p.A., formerly CSELT) Giovanni Rimassa (FRAMeTech s.r.l.), Roland Mungenast (PROFACTOR<br />

GmbH) .<br />

[14]. Tratto da http://developer.android.com/tra<strong>in</strong><strong>in</strong>g/basics/firstapp/creat<strong>in</strong>g-project.html<br />

[15]. ESTRAZIONE E RICONOSCIMENTO DI VOLTI DA FILMATI, Gianluca Dolc<strong>in</strong>i.<br />

142

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!