INS microNEWS: progettazione e sviluppo di una
Transcript
INS microNEWS: progettazione e sviluppo di una
INS microNEWS: progettazione e sviluppo di una applicazione multicanale basata su tecnologie J2EE e J2ME Tesi di Laurea di primo livello in Ingegneria Informatica Anno Accademico 2003/2004 Maurizio Frigerio (653618) Francesco Ostini (653672) Aldo Puglisi (655671) Relatore: Prof. Piero Fraternali 5 Ottobre 2004 INDICE CAPITOLO PRIMO : Tecnologie 1.1 1.2 1.3 1.4 1.5 1.6 1.7 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Java 2 Micro Edition . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Differenze tra J2ME e J2EE . . . . . . . . . . . . . . . . . . . . . . . 8 Mobile Information Device Profile . . . . . . . . . . . . . . . . . . . 10 Download di una MIDlet . . . . . . . . . . . . . . . . . . . . . . . . . 14 I vantaggi di J2ME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Elenco dispositivi mobili compatibili . . . . . . . . . . . . . . . . . 16 CAPITOLO SECONDO: Progettazione 2.1 Raccolta dei requisiti . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Requisiti di business . . . . . . . . . . . . . . . . . . . . . . 2.1.2 Individuazione utenti . . . . . . . . . . . . . . . . . . . . . . 2.1.3 Requisiti Funzionali . . . . . . . . . . . . . . . . . . . . . . . 2.1.4 Requisiti non funzionali . . . . . . . . . . . . . . . . . . . . 28 28 29 29 30 2.2 Analisi dei requisiti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 2.2.1 Gruppi di utenti . . . . . . . . . . . . . . . . . . . . . . . . . . 31 2.2.2 Requisiti funzionali . . . . . . . . . . . . . . . . . . . . . . . 32 2.3 Casi d’uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 2.3.1 Diagramma del caso d’uso per i docenti . . . . . . . . . 34 2.3.2 Fogli di specifica casi d’uso . . . . . . . . . . . . . . . . . . 34 2.4 Dizionario dei dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 CAPITOLO TERZO: Implementazione 3.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 3.2 INS Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 Interfaccia Web . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.2 Mobile Interaction . . . . . . . . . . . . . . . . . . . . . . . . 3.2.3 Application Core . . . . . . . . . . . . . . . . . . . . . . . . . 43 43 47 50 3.3 microNEWS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 3.3.1 Mobile Core . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 3.3.2 Interfaccia Grafica . . . . . . . . . . . . . . . . . . . . . . . . 62 1 CAPITOLO QUARTO: Appendice 4.1 Ambiente di Sviluppo . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 4.2 Testing e Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 4.3 Conclusioni e sviluppi futuri . . . . . . . . . . . . . . . . . . . . . . . 71 CAPITOLO QUINTO: Bibliografia 5.1 Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 2 PREFAZIONE In questa frenetica società mobilità e necessità di scambiare informazioni sono in costante aumento ed è ormai indispensabile per ogni individuo poter comunicare ovunque e in ogni momento della giornata. Conseguentemente a questa tendenza stanno evolvendosi dispositivi, infrastrutture ed apparati il cui fine è permettere all’individuo di affacciarsi alla rete internet, di comunicare con il sistema informativo dell’azienda ovunque egli si trovi. Nascono proprio in questi anni i primi progetti di cablaggio totale wireless di intere città, un esempio su tutte Amsterdam, già parzialmente coperta, ma anche Barcellona, Bruxelles e molte alte. Abbiamo sviluppato l’applicazione INS al fine di ottenere confidenza con l’universo mobile e di acquisire esperienza nello sviluppo di un’applicazione sia multicanale che multipiattaforma. Inoltre ci è sembrato opportuno sviluppare uno strumento che potesse giovare alla vita dell’ateneo, consentendo ai docenti di comunicare direttamente con i propri studenti e a quest’ultimi di essere avvertiti tempestivamente di ritardi, rinvii e ogni quant’alto riguardi lezioni, esercitazioni, scadenze ed esami. 3 CAPITOLO 1 TECNOLOGIE 1.1 Introduzione Lo scopo del capitolo è quello di introdurre ed illustrare lo scenario tecnologico all’interno del quale è sviluppata l’applicazione. Prima di iniziare il progetto vero e proprio è stata effettuata un’ampia ricerca sulle tecnologie utilizzate nel mondo mobile per sviluppare applicazioni. Sin da subito, escludendo l’obsoleto WAP con le sue vetuste GUI e tralasciando Symbian che, oltre ad essere riservato a poche devices, esulava dal nostro momentaneo interesse, le alternative si sono ristrette a due possibilità: Microsoft .Net CF e J2ME. La scelta è subito caduta su J2ME, dettata non solo da affetti e sentimenti rivoluzionari contratti durante il periodo Linux (Slackware per gli uni e ArchLinux per gli altri) ma soprattutto da concreti motivi commerciali: è evidente (e ben pubblicizzato) l’esponenziale interesse dei costruttori di device mobili nel supportare e sviluppare applicazioni e giochi J2ME, tanto che un colosso come nokia ha dichiarato che in futuro tutti i telefonini che commercializzerà avranno supporto j2me. In aggiunta, nel corso dei nostri studi, ci è sempre stata mostrata SUN come la via migliore per i “developers” e per quelli che “le cose le fanno bene”. A supporto della nostra scelta è stata allegata la seguente tabella che colloca chiaramente il target delle nostre alternative: .Net Compact Framework J2ME Connected Device Configuration J2ME Connected Limited Device Configuration Device requirement Powerful, expensive Powerful, expensive Cheap, pervasive Cost High High Medium Market focus Enterprise Enterprise Consumer and enterprise Language support C#, VB.Net Java Java Platforms Pocket PC, Windows CE Major mobile platforms All mobile platforms except Palm OS Byte code compatibility Standard .Net CLR Standard Java 2 Not compatible with J2SE or CDC Subset of .Net Subset of J2SE plus standard optional packages Partial compatibility with CDC with additional standard optional packages API compatibility 4 Native APIs P/Invoke; consistent across JNI; device- and OSsupported specific devices Development tools VS.Net 2003 Command line, vendor SDKs, CodeWarrior, and WebSphere Command line, vendor SDKs, all major Java IDEs Specification process Single company Community Community Service gateway N/A Run gateways as OSGi servlets; run gateway clients via vendorspecific SDKs Run gateway clients via vendor-specific SDKs Security model Simplified .Net model Full Java security manager Limited Java 2 model supplemented by OTA specification Client installation ActiveSync, Internet Explorer Sync, download download Life cycle management N/A OSGi for gateway apps, J2EE Client Provisioning Specification for generic clients N/A Formal OTA specification Included in OTA spec, works with J2EE Client Provisioning Specification Per tutta questa serie di motivi quindi Java 2 Micro Edition è la nostra scelta. Lo scopo del seguente capitolo, è quello di introdurre e mostrare la tecnologia SUN Java 2 Micro Edition (J2ME) utilizzata per lo sviluppo dell’applicazione. J2ME è un set di librerie Java, ottimizzato e alleggerito per i dispositivi mobili, come PDA, telefoni cellulari di ultima generazione e TV decoders. Si affianca quindi a Java 2 Enterprise Edition (J2EE), dedicato alle applicazioni server. 1.2 Java 2 Micro Edition I livelli più bassi delle APIs J2ME sono la Java Virtual Machine (JVM) e la Kilobyte Virtual Machine (KVM), ovvero il Java Runtime Environment (JRE) di dimensioni piccolissime, realizzate appositamente per dispositivi con memoria e potenza di calcolo limitate. J2ME deve adattarsi anche a display particolarmente ridotti, ad esempio un piccolo telefono cellulare può disporre di 12.288 pixel (96 ×128), un PDA di 20.000, anche se ultimamente l’evoluzione tecnologica tende ad abbattere queste barriere con display sempre più ampi e con sempre più colori. 5 L’architettura Java 2 ME si rivolge ad una moltitudine di apparecchi anche profondamente eterogenei tra loro (Internet ScreenPhone, cerca persone, telefonini, decoder, PDA, elettrodomestici, ...), per questo SUN ha introdotto due concetti fondamentali, quello di Configurazione e Profilo. • La configurazione definisce i requisiti minimi di memoria, dello schermo e la connettività che il dispositivo deve possedere per essere dichiarato conforme alla data configurazione. J2ME comprende due Configurazioni (CDC e CLDC). Connected Device Configuration (CDC) specifica l’ambiente Java per dispositivi “always on” e ad alta banda, ad es. decoder satellitari e palmari. Le caratteristiche principali di questa configurazione sono: 512 KB minimo di memoria per applicazioni Java (codice) 256 kB minimo di memoria "runtime", allocata dall'applicazione 6 Connected Limited Device Configuration (CLDC) specifica l’ambiente Java per i dispositivi con connettività wireless, ridotta banda e accesso discontinuo. Le caratteristiche di questa configurazione sono: 128 kB di memoria per Java 32 kB di memoria "runtime" Interfaccia utente ridotta Bassi consumi, alimentazione a batteria “L’idea principale è quella di partire da una base comune per tutti i dispositivi, con un set di APIs limitato a fornire le funzionalità principali per una qualunque device a limitata configurazione. Saranno poi i produttori di particolari categorie di dispositivi ad aggiungere nuove funzionalità al CLDC, generando il profilo”. Sun Microsystem • Il profilo può essere considerato come un’estensione alla configurazione in quanto fornisce librerie aggiuntive, che devono essere necessariamente implementate dai costruttori (che intendono fregiare il proprio prodotto della conformità a tal profilo). Il primo profilo proposto è MIDP (Mobile Information Device Profile), che riguarda principalmente terminali wireless, in grado di instaurare connessioni basate sul protocollo HTTP. Il profilo MIDP, definisce le API per componenti di interfaccia utente, per gli input, la gestione degli eventi, la memoria persistente RMS, le funzioni di rete i timer… 7 Un dispositivo MIDP deve garantire un set di requisiti minimi sia hardware che software. In particolare un dispositivo che aderisca a questo standard deve avere: Uno schermo almeno 96x54 pixel Dispositivi input per utente (tastiera, penna, ...) 128 K per eseguire i componenti MIDP 8 K per memorizzare dati persistenti (attraverso la libreria RMS) 32 K per eseguire Java Connettività di rete wireless Nel paragrafo 1.4 analizzeremo in dettaglio il profilo MIDP, evidenziando le caratteristiche delle librerie comprese in esso. L’architettura base di Java 2 Micro Edition può essere riassunta dal seguente schema: Mobile Information Device Profile Connected Limited Device Configuration Kilobyte Virtual Machine Sistema Operativo (es: Symbian OS) 1.3 Differenze tra J2ME e J2EE Analizzando in dettaglio le caratteristiche della Micro Edition di Java, possiamo notare delle differenze rispetto alla J2EE. Queste differenze risiedono tanto nel linguaggio quanto nella Java Virtual Machine. Per quanto riguarda le differenze di linguaggio è doveroso citare: 1. Calcoli in virgola mobile. I calcoli in virgola mobile fanno un uso intenso del processore e, a causa delle limitate risorse del processore e dell'assenza di un co-processore matematico, si è deciso (nell'implmentazione del CLDC) di non supportare la virgola mobile. Questo si traduce nell'assenza (nel linguaggio Java per J2ME) dei tipi primitivi float e double. 2. Finalizzazione. In una classe J2SE si può dichiarare un metodo con il nome finalize() che venga chiamato dal garbage collector prima di rimuovere l'oggetto. Il CLDC non supporta questo metodo dato che l'overload necessario, in termini di tempo, per la deallocazione delle risorse sarebbe troppo onerosa per il processore. 3. Gestione delle eccezioni. La JVM supporta un numero limitato di eccezioni. Il motivo principale è da ricercare nel fatto che la gestione delle eccezioni in J2SE è molto complessa e tutti questi compiti sono pesanti da far svolgere ad un processore limitato, inoltre i sistemi embedded forniscono loro stessi una gestione degli errori interna, quindi, 8 al presentarsi di un errore non si avrebbe il tempo di "catturare" l'eccezione in quanto il sistema avrebbe già reagito per noi. Una Java Virtual Machine per J2ME possiede le seguenti limitazioni: 1. Gruppi di thread. Per questa implementazione JVM i thread sono trattati ordinatamente, oggetto per oggetto. La JVM non supporta la classe ThreadGroup quindi non si possono lanciare (o fermare) più thread contemporaneamente ma devono essere avviati uno alla volta. 2. Finalizzazione. Non supportando il linguaggio Java di J2ME l'uso del metodo finalize() nemmeno la JVM ne supporta l'implementazione. 3. Calcoli a virgola mobile. Dato che il linguaggio Java non supporta i dati in virgola mobile le implementazioni Java per J2ME mancano di tale supporto. 4. Interfaccia Nativa Java. Per ridurre il livello di danneggiamento di informazioni a livello del sistema, sono state eliminate le APIs per l’invocazione di metodi nativi, quindi non è possibile chimare funzioni native del sistema operativo ospite per effettuare operazioni (come accedere alla rubrica) 5. Caricatore di classi personalizzate. CLDC richiede che la JVM implementi un class-loader. Il caricatore di classi subisce severi controlli e non può essere sostituito, ignorato o modificato. 6. Reflection. In J2SE si possono usare le classi Reflection per ottenere informazioni sulla JVM in esecuzione. Queste API (causa consumo di risorse) non sono disponibili in CLDC Un lato molto importante da analizzare nella tecnologia J2ME è la sicurezza. E’ utile sottolineare che ogni dispositivo su cui viene eseguita un’applicazione Java, necessita di una protezione da un eventuale codice “maligno” che possa accedere alle informazioni private o a risorse “vitali” del sistema. Ad esempio, non è possibile accedere alla rubrica del telefono, oppure ai messaggi ricevuti. Per ovviare al problema della sicurezza la configurazione CLDC utilizza il modello conosciuto come “sandbox” che vieta l’accesso a tutto ciò che è fuori dalla “scatola”, ovvero non è possibile utilizzare solo un numero ristretto di risorse del dispositivo. La configurazione CLDC utilizza un modello a “sndbox” per proteggere le risorse critiche del dispositivo e i dati personali del proprietario: come in ogni modello di questo tipo il software può quindi accedere solo ad un numero ristretto di risorse. Ultimo aspetto dell'architettura è la verifica dell’integrità dei file di classe. Il codice, prima di essere eseguito, viene processato dalla J2SE per verificare che tutte le sue operazioni siano lecite. Questa operazione di verifica richiede da sola un minimo di 50 KB di memoria ed un tempo di calcolo relativamente elevato. Inutile dire che, date le risorse limitate del dispositivo, queste operazioni non possono essere eseguite a run-time. Per cercare di rendere meno oneroso il processo di verifica a run-time, vengono introdotti due nuovi concetti: 9 1. Pre-verifica: Durante il processo di programmazione, o prima di caricare una classe su di un apparecchio mobile, si esegue un programma per l’inserimento di attributi addizionali nel file di classe. Queste informazioni riducono l’ammontare di tempo e di memoria necessari alla JVM per seguire la verifica. 2. Verifica: Una volta che il dispositivo carica una classe pre-verificata, il verificatore interno dell’apparecchio ne percorre tutte le istruzioni. In un qualsiasi momento di questa fase il caricatore può rilevare un errore e scartare il file di classe. Grazie a questa funzione il dispositivo è in grado di rifiutare codice potenzialmente "difettoso". 1.4 Mobile Information Device Profile (MIDP) E’ possibile immaginare una configurazione come un’astrazione dell’hardware, mentre il profilo l’insieme delle librerie (API) necessarie per poter sviluppare applicazioni. La libreria MIDP è formata da sette package: Classi che fornisce sistemi di input ed output attraverso strema java.lang Classi di sistema derivate dalla J2SE java.util Classi di utilità derivate da J2SE javax.micoredition.io Supporto per le connessioni wireless javax.microedition.lcdui Supporto per l'interfaccia utente wireless javax.microedition.midlet Classi di base per le MIDlet javax.microedition.rms Supporto per il sistema di persistenza dei dati java.io Come esposto nella tabella soprastante, i primi tre package rappresentano la compatibilità con il J2SE, mentre gli atri quattro rappresentano la libreria MIDP e tutte le classi necessarie per sviluppare applicazioni wireless. Il package più importante tra tutti i è sicuramente javax.microedition.midlet che contiene una classe javax.microedition.midlet.MIDlet ed una eccezione javax.microedition.midlet.MIDletStateChangeException. Una MIDlet è una applicazione definita nel profilo MIDP. Ogni MIDlet deve estendere la classe javax.microedition.midlet.MIDlet, per permettere al software di controllo delle applicazioni (implementato a livello di 10 CLDC) di recuperare le proprietà definite nell'application descriptor e di notificare le richieste di stato. I metodi di questa classe consentono al software di gestione delle applicazioni di creare, avviare, mettere in pausa e distruggere una MIDlet. Una volta terminato lo sviluppo di un'applicazione, per poterla distribuire è necessario creare un file che contenga tutte le classi e le risorse (immagini, dati), compresso come JAR. Nella cartella META-INF è contenuto il file manifest.mf, si trovano attributi fondamentali per la definizione della MIDlet, riportati nella tabella sottostante: Nome Attributo MIDlet-Name MIDlet-Version MIDlet-Vendor MIDletMicroEdition-Profile MicroEditionConfiguration MIDlet-Icon MIDlet-Info-URL Utilizzo Nome della MIDlet Numero di versione del MIDlet Autore della MIDlet Riferimento ad un MIDlet specifico all'interno della Suite Richiesto Si Si Si Si Si (MIDP1.0) Si (CLDCQuale configurazione viene richiesta 1.0) Icona usata dal gestore dell'applicazione No URL per le info supplementari No Quale profilo J2ME viene richiesto Parte del contenuto del file manifest è sottoposto a vincoli che saranno analizzati in seguito. Ulteriore componente del file JAR è l’application descriptor (JAD) il cui ruolo è quello di fornire informazioni aggiuntive sulla MIDlet suite in cui è contenuto. Il file JAD fornisce informazioni al gestore dell'applicazione sul contenuto di un JAR e fornisce uno strumento di passaggio dei parametri tra MIDlet. Così come il file manifest.mf, anche il file JAD definisce attributi, obbligatori e non, alcuni dei quali devono necessariamente essere conformi ai parametri del file manifest.mf: pena l'impossibilità di installare il file JAR. Nome Attributo MIDlet-Name MIDlet-Version MIDlet-Vendor MIDletMIDlet-Jar-URL MIDlet-Jar-Size MIDlet-Data-Size Scopo Nome della MIDlet Numero di versione del MIDlet Autore della MIDlet Riferimento ad un MIDlet specifico all'interno della Suite URL del file JAR Dimensione del file JAR in byte Numero minimi di byte richiesti per i recordStore Richiesto Si * Si * Si * Si Si Si No 11 MIDlet-EditionTesto che descrive il MIDlet No Description * Questi attributi devono essere identici a quelli definiti del file manifest.mf Come precedentemente citato, una MIDlet deve estendere la classe javax.microedition.midlet.MIDlet e implementare alcuni metodi astratti di questa per fornire alcuni servizi. Questi metodi sono: abstract protected void destroyApp(boolean unconditional) Segnala alla MIDlet di terminare e di entrare nello stato Destroy String getAppProperty(String key) Fornisce alla MIDlet il meccanismo per recuperare alcune proprietà definite all'interno del file JAD void notifyDestroyed() Usato dal una MIDlet per richiedere al sistema di essere terminata e di passare allo stato Destroy void notifyPaused() Notifica al sistema che la MIDlet non vuole essere attiva e di entrare nello stato di Pause protected abstract void pauseApp() Segnala alla MIDlet di fermarsi e di entrare nello stato Pause void resumeRequest() Segnala alla MIDlet che è intenzionata a tornare ad uno stato Active protected abstract void startApp() Segnala alla MIDlet che è entrata nello stato Active Quindi una semplice applicazione MIDP può essere cosi implementata: import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class MyMIDlet extends MIDlet { // Costruttore della classe public MyMIDlet() { super(); } // Metodo invocato dal sistema all’avvio della MIDlet protected void startApp() throws MIDletStateChangeException { } // Metodo invocato dal sistema per mettere in pausa la MIDlet protected void pauseApp() { } // Metodo invocato dal sistema per chiudere la connessione protected void destroyApp(boolean arg0) throws MIDletStateChangeException } } { Ad una prima lettura del codice può sembrare che alcuni metodi svolgano la medesima funzione. E’ importante sottolineare questo fatto per mettere in 12 evidenza che una MIDlet ha una comunicazione bidirezionale con il gestore delle applicazioni, infatti, così come il gestore può mettere in pausa una MIDlet, la MIDlet stessa può richiedere al gestore di essere messa in pausa o distrutta. Per capire meglio quanto accade è bene spiegare il ciclo di vita di una MIDlet. Una suite MIDlet è un insieme di classi “disegnate” per essere eseguite e controllate dal sistema MIDP attraverso un meccanismo a stati. Gli stati consentono al gestore delle applicazioni di monitorare una MIDlet e di invocare i metodi opportuni ogni volta che questa cambia stato. Supponiamo che si riceva una telefonata mentre è in esecuzione un’applicazione: il sistema di gestione (CLDC) intercetta l'evento e, cambiando stato, chiama il metodo della MIDlet che mette in pausa l’applicazione; terminata la chiamata, chiede se continuare o meno con l'utilizzo dell'applicazione. Una MIDlet passa attraverso fasi differenti nel suo ciclo di vita si può trovare in uno dei seguenti stati: • • • Paused: La MIDlet viene messa in stato di pausa dopo la chiamata del costruttore ma prima di essere avviato dal gestore di applicazioni. Una volta che la MIDlet è stata avviato, può passare alternativamente tra gli stati di Pausa e di Attivo. Active: La MIDlet è in esecuzione Destroyed: La MIDlet ha rilasciato tutte le risorse che aveva acquisito ed è stato terminato dal gestore di applicazioni Non appena la MIDlet viene creata (attraverso il suo costruttore) per default entra nello stato di Pause anche se il suo metodo pauseApp() non viene invocato. La differenza tra i metodi destroyApp, pauseApp, startApp ed i metodi notifyDestroyed, notifyPaused, notifyRequest è che i primi vengono invocati 13 dalla MIDlet per indicare un tipo di comportamento (la MIDlet comunica che ha intenzione di mettersi in pausa o di chiudersi) mentre i secondi sono delle richieste effettuate al gestore dell'applicazione da parte della MIDlet. Supponendo ad esempio di voler implementare un pulsante di “exit”. L'applicazione chiama il metodo della MIDlet destroyApp(). L'esito di questo comando deve essere interpretato come una comunicazione che la MIDlet fa a tutti i suoi componenti dell'intenzione di chiudersi. La semplice invocazione di questo metodo non chiude la MIDlet. Lo scopo di questo metodo è quello di chiudere tutte le risorse che la MIDlet ha allocato (database, thread, ecc). La vera chiusura dell'applicazione si ottiene con la chiamata al metodo notifyDestroyed(). Con questo metodo la MIDlet chiede al gestore di poter essere terminata incondizionatamente dato che avrà già provveduto a chiudere tutte le risorse allocate. Un esempio di metodo per poter chiudere correttamente un'applicazione potrebbe essere il seguente: public void exitApplication() { try { destroyApp(false); notifyDestroyed(); } catch (MIDletStateChangeException e) { } } Un altro metodo importante della classe MIDlet è il metodo getAppProperty() che serve a leggere gli attributi definiti nel file manifest.mf. Un'osservazione va fatta anche sul metodo startApp(). Quando una MIDlet sta per essere posto in stato di attività, il gestore di applicazioni chiama il metodo startApp(). Questo metodo può essere chiamato più volte nel corso del ciclo di vita di un MIDlet dato che può passare più volte tra gli stati di Pause e di Active. Il codice che crea strutture dati che devono esistere durante tutto il ciclo di vita di un MIDlet deve essere allocato una volta sola, nel costruttore e non nel metodo startApp() altrimenti si avrebbe la loro inizializzione ad ogni riavvio della MIDlet. 1.5 Download di una MIDlet Un dispositivo J2ME consente di scaricare un’applicazione nei seguenti modi: • Standard Over The Air (OTA) tramite WAP: o Sul server WAP vengono collocati i due file JAR/JAD, e viene creato un link al file JAD. Selezionando il suddetto link, se la rete supporta il trasferimento di file con dimensioni maggiori di 15-25 Kb (dimensione media di una MIDlet) l’applicazione viene installata e resa disponibile in maniera persistente. 14 • Connessione con personal computer o La connessione con un pc può essere effettuata via cavo seriale/usb, porta infrarossi, bluetooth. Utilizzando il software di sincronizzazione fornito dal produttore è possibile inviare al telefonino l’installer dell’applicazione. 1.6 I vantaggi di J2ME I vantaggi offerti dalle MIDlet sono molteplici, quali la portabilità multipiattaforma, la programmazione Object Oriented, il Garbage Collector, e molti altri vantaggi ereditati da Java. Questi vantaggi sono direttamente traducibili in una riduzione di tempi, e quindi costi, dovuti alle fasi di sviluppo e mantenimento del software, in particolar modo se esso è sviluppato per più hardware e sistemi operativi. Interfacciare una MIDlet con piattaforme web che lavorano con JAVA (Servlet o JSP) è pressoché immediato. La possibilità di interagire con applicazioni web J2EE permette di sviluppare applicazioni client/server per quella categoria di utenti denominati mobile-worker, ovvero che devono avere la possibilità di interagire col sistema informativo aziendale o della infrastruttura a cui appartengono, benché distanti dall’ufficio o più in generale da un PC. Probabilmente è in questo settore che si apriranno più possibilità di business, piuttosto che su applicazioni residenti unicamente su dispositivo mobile. Analisti affermati del wireless sostengono che, entro la fine del 2004, J2ME diventerà la piattaforma di sviluppo dominante per dispositivi mobili. Oggi, un gran numero di produttori di dispositivi mobili tra i quali Motorola, Nokia, Panasonic (vedi tabella) e le maggiori società operanti nel mondo delle reti wireless come Nextel, SprintPCS e BT Cellnet, stanno investendo nella tecnologia J2ME. Con le prospettive sopra elencate lo standard proposto dalla SUN si sta “allargando”, infatti la frequenza con cui gli stessi produttori di telefonini definiscono librerie proprietarie è molto elevata. Siemens ad esempio ha definito una serie di librerie proprietarie che risiedono solo sui propri terminali e che permettono di controllare alcune funzionalità del telefono come ad esempio la vibrazione e la lettura di file. 15 1.7 Lista dei dispositivi mobili compatibili con tecnologia Java 2 Micro Edition (aggiornato 2004) Manufact. Model Wireless Technology Frequenc y (MHz) Alcatel One Touch 735i E-GSM, GSM Alcatel Software Screen Avail. 900, 1800 MIDP 2.0, WMA 1.0, CLDC 1.0 128x1 Yes 28/12 bits One Touch 756 E-GSM, GSM 900, 1800, 1900 JTWI 1.0, 128x1 Yes MIDP 2.0, 60/18 MMAPI 1.1, bits MIDP 1.0, CLDC 1.0, WMA 1.1 Casio C452CA CDMA 800 MIDP 1.0, CLDC 1.0 120x1 Yes 33/8 bits Fujitsu F503i PDC 800 CLDC 1.0 120x1 Yes 30/8 bits Fujitsu F503iS PDC 800 CLDC 1.0 120x1 Yes 30/10 bits Fujitsu F504i PDC 800 CLDC 1.0 16 bits Yes Hitachi C3001H CDMA 800 MIDP 1.0, CLDC 1.0 120x1 Yes 62/12 bits Kyocera C3002K CDMA 800 MIDP 1.0, CLDC 1.0 120x1 Yes 60/16 bits LG Electronics C-nain 2000 CDMA2000 1X 800 MIDP 1.0, CLDC 1.0 120x1 Yes 33/8 bits LG Electronics C-nain 2100 CDMA2000 1X 800 MIDP 1.0, CLDC 1.0 8 bits LG Electronics Cyber-ez-X1 CDMA 1900 CLDC 1.0 128x1 Yes 28/2 bits LG Electronics I-Book CDMA 1900 CLDC 1.0 128x1 Yes 28/2 Yes 16 bits LG InfoComm LX5350 AMPS, CDMA2000 1X 800, 1900 MIDP 1.0, CLDC 1.0 120x1 Yes 98/16 bits LG InfoComm VX1 AMPS, CDMA2000 1X 800, 1900 MIDP 1.0, CLDC 1.0 128x1 Yes 04 Mitsubishi D2101V W-CDMA CLDC 1.0 132x1 Yes 62/18 bits Mitsubishi D503i PDC 800 CLDC 1.0 132x1 Yes 42/10 bits Mitsubishi D503iS PDC 800 CLDC 1.0 132x1 Yes 42/10 bits Mitsubishi D504i PDC 800 CLDC 1.0 18 bits Yes Mitsubishi J-D05 PDC 1500 MIDP 1.0, CLDC 1.0 12 bits Yes Motorola A388 GSM/GPRS 900, 1800, 1900 MIDP 1.0, CLDC 1.0 240x3 Yes 20/2 bits Motorola A388c GSM/GPRS 900, 1800, 1900 MIDP 1.0, CLDC 1.0 240x3 Not 20/16 yet bits Motorola A760 MIDP 2.0, CLDC 1.0 320x2 Yes 40/16 bits Motorola A820 Motorola A830 MIDP 1.0, CLDC 1.0 176x2 Yes 20/12 bits Motorola A835 MIDP 1.0, CLDC 1.0 176x2 Yes 20/16 bits Motorola Accompli 008/6288 GSM/GPRS 900, 1800 MIDP 1.0, CLDC 1.0 240x3 Yes 20/2 bits Motorola Accompli 009 GSM/GPRS 900, 1800, MIDP 1.0, CLDC 1.0 240x1 Yes 60/8 GSM/GPRS, 900, W-CDMA 1800, 1900 176x2 Not 20/12 yet bits 17 1900 bits Motorola E380 GSM/GPRS 900, 1800 MIDP 1.0, CLDC 1.0 96x65 Yes /12 bits Motorola i50sx iDEN 800 MIDP 1.0, CLDC 1.0 111x1 Yes 00/2 bits Motorola i55sr iDEN 800 MIDP 1.0, CLDC 1.0 111x1 Yes 00/2 bits Motorola i58sr MIDP 1.0, CLDC 1.0 111x1 Yes 00/2 bits Motorola i80s iDEN 800 MIDP 1.0, CLDC 1.0 119x6 Yes 4/1 bit Motorola i85s iDEN 800 MIDP 1.0, CLDC 1.0 111x1 Yes 00/2 bits Motorola i90c iDEN 800 MIDP 1.0, CLDC 1.0 111x1 Yes 10/2 bits Motorola i95cl iDEN 800 MIDP 1.0, CLDC 1.0 120x1 Yes 60/8 bits Motorola T280i GSM/GPRS 900, 1800, 1900 MIDP 1.0, CLDC 1.0 128x1 Yes 00/2 bits Motorola T720 GSM/GPRS 900, 1800, 1900 MIDP 1.0, CLDC 1.0 120x1 Yes 60/12 bits Motorola T720 AMPS, CDMA2000 1X 800, 1900 MIDP 1.0, CLDC 1.0 120x1 Yes 60/12 bits Motorola V60i GSM/GPRS 900, 1800, 1900 MIDP 1.0, CLDC 1.0 96x64 Yes Motorola V60i AMPS, CDMA 800, 1900 MIDP 1.0, CLDC 1.0 96x64 Yes Motorola V60i AMPS, TDMA 800, 1900 MIDP 1.0, CLDC 1.0 96x64 Yes Motorola V66i GSM/GPRS 900, 1800, MIDP 1.0, CLDC 1.0 96x64 Not yet 18 1900 Motorola T720i GSM/GPRS NEC N2002 W-CDMA NEC N503i PDC NEC N503iS NEC 1900 MIDP 1.0, CLDC 1.0 120x1 Yes 60/12 bits CLDC 1.0 16 bits Yes 800 CLDC 1.0 120x1 Yes 30/10 bits PDC 800 CLDC 1.0 120x1 Yes 30/10 bits N504i PDC 800 CLDC 1.0 16 bits Yes Nokia 3100 GSM/GPRS 900, 1800, 1900 WMA 1.0, MIDP 1.0, CLDC 1.0 128x1 Yes 28/12 bits Nokia 3105 CDMA2000 1X 800 WMA 1.0, MIDP 1.0, CLDC 1.0 128x1 Not 28/12 yet bits Nokia 3108 GSM 900, 1800, 1900 MIDP 1.0, CLDC 1.0 128x1 Yes 28/12 bits Nokia 3120 GSM 900, 1800, 1900 MIDP 1.0, CLDC 1.0 128x1 Yes 28/12 bits Nokia 3200 GSM/GPRS/ 900, EDGE 1800, 1900 WMA 1.0, MIDP 1.0, CLDC 1.0 128x1 Yes 28/12 bits Nokia 3300 GSM/GPRS 900, 1800 WMA 1.0, 128x1 Yes MMAPI 1.0, 28/12 MIDP 1.0, bits CLDC 1.0 Nokia 3300 GSM/GPRS 850, 1900 WMA 1.0, 128x1 Yes MMAPI 1.0, 28/12 MIDP 1.0, bits CLDC 1.0 Nokia 3410 GSM 900, 1800 MIDP 1.0, CLDC 1.0 96x65 Yes /1 bit Nokia 3510i GSM/GPRS 900, 1800 MIDP 1.0, CLDC 1.0 96x65 Yes /12 bits Nokia 3520 AMPS, TDMA 800 MIDP 1.0, CLDC 1.0 96x65 Not /12 yet 19 ++bits Nokia 3530 GSM/GPRS 900, 1800 MIDP 1.0, CLDC 1.0 96x65 Yes /12 bits Nokia 3560 AMPS, TDMA 800, 1900 MIDP 1.0, CLDC 1.0 96x65 Yes /12 bits Nokia 3570 CDMA2000 1X 1900 MIDP 1.0, CLDC 1.0 96x65 Yes /2 bits Nokia 3585 AMPS, CDMA2000 1X 800, 1900 MIDP 1.0, CLDC 1.0 96x65 Yes /2 bits Nokia 3585i AMPS, CDMA2000 1X 800, 1900 MIDP 1.0, CLDC 1.0 96x65 Yes /2 bits Nokia 3586i AMPS, CDMA2000 1X 800, 1900 MIDP 1.0, CLDC 1.0 96x65 Yes /12 bits Nokia 3590 GSM/GPRS 850, 1900 MIDP 1.0, CLDC 1.0 96x65 Yes /1 bit Nokia 3595 GSM/GPRS 850, 1900 WMA 1.0, MIDP 1.0, CLDC 1.0 96x65 Yes /12 bits Nokia 3600 GSM/GPRS 850, 1900 WMA 1.0, 176x2 Yes MMAPI 1.0, 08/12 MIDP 1.0, bits CLDC 1.0 Nokia 3650 GSM/GPRS 900, 1800, 1900 WMA 1.0, 176x2 Yes MMAPI 1.0, 08/12 MIDP 1.0, bits CLDC 1.0 Nokia 5100 GSM/GPRS 900, 1800, 1900 MIDP 1.0, CLDC 1.0 128x1 Yes 28/12 bits Nokia 5140 GSM 900, 1800, 1900 MIDP 2.0, CLDC 1.1 128x1 Yes 28/12 bits Nokia 6010 GSM 850, 1900 MIDP 2.0, CLDC 1.1, MIDP 1.0, CLDC 1.0 96x65 Yes /12 bits Nokia 6100 GSM/GPRS 900, MIDP 1.0, 128x1 Yes 20 1800, 1900 CLDC 1.0 28/12 bits Nokia 6200 GSM/GPRS/ 850, EDGE 1800, 1900 MIDP 1.0, CLDC 1.0 128x1 Yes 28/12 bits Nokia 6220 GSM/GPRS/ 900, EDGE 1800, 1900 WMA 1.0, MIDP 1.0, CLDC 1.0 128x1 Not 28/12 yet bits Nokia 6225 AMPS, CDMA2000 1X 800, 1900 WMA 1.0, MIDP 1.0, CLDC 1.0 128x1 Not 28/12 yet bits Nokia 6230 E-GSM, GSM 900, 1800, 1900 MIDP 2.0, CLDC 1.1 128x1 Yes 28/16 bits Nokia 6310i GSM/GPRS 900, 1800, 1900 MIDP 1.0, CLDC 1.0 95x65 Yes /1 bit Nokia 6585 AMPS, GSM 800, 850, MIDP 2.0, 1800, CLDC 1.0 1900 128x1 Yes 28/12 bits Nokia 6600 GSM/GPRS 900, 1800, 1900 JABWT 1.0, 176x2 Yes MIDP 2.0, 08/16 WMA 1.0, bits MMAPI 1.0, CLDC 1.0 Nokia 6610 GSM/GPRS 900, 1800, 1900 MIDP 1.0, CLDC 1.0 128x1 Yes 28/12 bits Nokia 6610i GSM 900, 1800, 1900 MIDP 1.0, CLDC 1.0 128x1 Yes 28/12 bits Nokia 6620 GSM 850, 900, MIDP 2.0, 1800, MIDP 1.0, 1900 CLDC 1.0 176x2 Not 08/16 yet bits Nokia 6650 GSM/GPRS, 900, W-CDMA 1800 MIDP 1.0, CLDC 1.0 128x1 Yes 60/12 bits Nokia 6800 GSM/GPRS 900, 1800 MIDP 1.0, CLDC 1.0 128x1 Yes 28/12 bits Nokia 6800 GSM/GPRS 850, 1900 WMA 1.0, MIDP 1.0, 128x1 Yes 28/12 21 CLDC 1.0 bits Nokia 6810 GSM 900, 1800, 1900 MIDP 1.0, CLDC 1.0 128x1 Yes 28/12 bits Nokia 6820 E-GSM, GSM 900, 1800, 1900 MIDP 1.0, CLDC 1.0 128x1 Yes 28/12 bits Nokia 7200 GSM 900, 1800 MIDP 1.0, CLDC 1.0 128x1 Yes 28/16 bits Nokia 7210 GSM/GPRS 900, 1800, 1900 MIDP 1.0, CLDC 1.0 128x1 Yes 28/12 bits Nokia 7250 GSM/GPRS 900, 1800, 1900 MIDP 1.0, CLDC 1.0 128x1 Yes 28/12 bits Nokia 7250i GSM/GPRS 900, 1800, 1900 WMA 1.0, MIDP 1.0, CLDC 1.0 128x1 Yes 28/12 bits Nokia 7600 GSM/GPRS, 900, W-CDMA 1800 Nokia 7610 GSM 850, 900, MIDP 2.0, 1800, CLDC 1.1, 1900 CLDC 1.0 176x2 Yes 08/16 bits Nokia 7650 GSM/GPRS 900, 1800 MIDP 1.0, CLDC 1.0 176x2 Yes 08/12 bits Nokia 7700 GSM 850, 900, MIDP 2.0, 1800, CLDC 1.1 1900 640x3 Not 20/16 yet bits Nokia 8910i GSM/GPRS 900, 1800 MIDP 1.0, CLDC 1.0 96x65 Yes /12 bits Nokia 9210 GSM Communicator 900, 1800 MIDP 1.0, 640x2 Yes CLDC 1.0, 00/12 JavaPhone bits 1.0, PersonalJav a 1.1.1 Nokia 9210i 900, MIDP 1.0, GSM WMA 1.0, 128x1 Not MMAPI 1.0, 60/16 yet MIDP 1.0, bits CLDC 1.0 640x2 Yes 22 Communicator 1800 CLDC 1.0, 00/12 JavaPhone bits 1.0, PersonalJav a 1.1.1 Nokia 9290 GSM Communicator 1900 MIDP 1.0, 640x2 Yes CLDC 1.0, 00/12 JavaPhone bits 1.0, PersonalJav a 1.1.1 Nokia 9500 GSM, GSM/GPRS 850, 900, JTWI 1.0, 640x2 Not 1800, MIDP 2.0, 00/16 yet 1900 M3DAPI bits 1.0, LAPI 1.0, CLDC 1.1, MMAPI 1.1, WMA 1.1 Nokia Nokia N-Gage Game Deck GSM/GPRS 900, 1800, 1900 WMA 1.0, 176x2 Yes MMAPI 1.0, 08/12 MIDP 1.0, bits CLDC 1.0 Nokia 3120 GSM 900, 1800, 1900 MIDP 1.0, CLDC 1.0 128x1 Yes 28/12 bits Nokia 7610 GSM 850, 900, MIDP 2.0, 1800, MIDP 1.0, 1900 CLDC 1.0 176x2 Yes 08/16 bits Panasonic C3003P CDMA 800 MIDP 1.0, CLDC 1.0 132x1 Yes 76/16 bits Panasonic P2101V W-CDMA CLDC 1.0 176x2 Yes 20/18 bits Panasonic P503i PDC 800 CLDC 1.0 120x1 Yes 30/8 bits Panasonic P503iS PDC 800 CLDC 1.0 120x1 Yes 30/8 bits Panasonic P504i PDC 800 CLDC 1.0 16 bits Yes GSM/GPRS 1900 MIDP 1.0, 160x1 Yes Research In BlackBerry 23 Motion Sharp 5810 J-SH51 PDC 1500 MIDP 1.0, CLDC 1.0 CLDC 1.0 122x1 Yes 60/1 bit 62 Siemens In C(T)56 Research BlackBerry Motion 5820 GSM, GSM/GPRS GSM/GPRS 850, 900, 1800 1900 MIDP 1.0, CLDC 1.0 Yes Siemens Samsung C55 SCH-X130 900, 800 1800 Siemens C60 GSM/GPRS CDMA2000 1X GSM/GPRS Samsung SCH-X230 Siemens C61 Samsung SCH-X250 Siemens C65 Samsung SCH-X350 CDMA2000 1X Samsung Siemens SGH-S100 C66 GSM/GPRS GSM Samsung SPH-A500 AMPS, CDMA Samsung Siemens SPH-N400 CF62 AMPS, GSM/GPRS CDMA Samsung Siemens SPH-X4209 CX65 CDMA2000 GSM 1X Sanyo A3011SA CDMA2000 1X Sanyo Siemens SCP-4900 M46 AMPS, CDMA2000 GSM/GPRS 1X 800, 1900 Sanyo Siemens SCP-5300 M50 800, 900, 1900 1800 MIDP 1.0, CLDC 1.0 Siemens Sharp M65 J-SH07 AMPS, GSM/GPRS CDMA2000 1X GSM PDC 900, 1500 1800, 1900 Sharp J-SH08 PDC 1500 JTWI 1.0, MIDP 1.0, 2.0, CLDC1.0, 1.0 LAPI CLDC 1.1, MMAPI 1.1, 122x1 Yes MIDP 1.0, WMA 1.1 CLDC 1.0 62 CDMA2000 1X GSM/GPRS CDMA2000 1X GSM 900, 1800, 800 1900 850, 1900 800 900, 1800, 800 1900 900, 1800, 850, 1900 1800, 1900 800, 1900 800, 900, 1900 1800, 1900 800 900, 1800, 800 1900 101x6 160x1 60/1bit 4/1 bit MIDP 1.0, 101x6 MIDP 1.0, CLDC 1.0 128x1 4/1 bit CLDC 1.0 28/2 MIDP 1.0, 101x8 bits CLDC 1.0 0/12 MIDP 1.0, 120x1 bits CLDC 1.0 60/8 MIDP 1.0, 101x8 bits CLDC 1.0 0/12 MIDP 1.0, 120x1 bits CLDC 1.0 60/8 JTWI 1.0, 130x1 bits MIDP 2.0, 30 MIDP1.0, LAPI 1.0, 128x1 CLDC 1.0 1.1, 28/2 MMAPI 1.1, bits WMA 1.1 MIDP 1.0, 128x1 CLDC 1.0, JTWI 1.0 60/16 130x1 MIDP 2.0, bits 30 LAPI 1.0, 128x1 CLDC 1.1, 28/12 MMAPI 1.1, bits WMA 1.1 MIDP 1.0, 128x9 MIDP 1.0, 130x1 CLDC 1.0 6/16 CLDC 1.0 30/16 bits bits MIDP 1.0, 128x1 JTWI 1.0, 132x1 CLDC 1.0 60 MIDP 2.0, 76 MIDP1.0, 1.0, 132x1 LAPI CLDC 1.0 1.1, 76/16 MMAPI 1.1, bits WMA MIDP 1.1 1.0, 120x9 CLDC 1.0, 1.0 MIDP CLDC 1.0 Yes Yes Yes Yes Yes Yes Yes Yes Yes Not yet Yes Yes Yes Yes Yes Not yet Yes 6/12 101x6 Yes bits bit 4/1 128x1 Yes 101x6 32/16 4/1 bit bits 132x1 Yes 120x1 Yes 76 60/16 bits 24 Siemens S55 SL42 GSM 900, 1800, 1800 1900 900, 850, 900 1800 Siemens Siemens SL45i/6688i S56 GSM GSM/GPRS Siemens SL55 GSM Siemens S57 Siemens SL65 GSM/GPRS Siemens S65 GSM/GPRS Siemens SX1 GSM Siemens S66 GSM/GPRS Sony Ericsson A3014S CDMA2000 1X Sony Ericsson A5402S CDMA2000 1X 800 Sony Ericsson Siemens F500i S6C GSM/GPRS GSM/GPRS 900, 1800, 900, 1900 1800, 1900 Sony Ericsson Siemens K500c GSM/GPRS S6V GSM/GPRS 900, 1800, 1900 900, 1800, 1900 Sony Ericsson K500i GSM/GPRS 900, 1800, 1900 900, 1800, 900, 1900 1800, 1900 900, 1800, 1900 850, 1800, 800 1900 900, 1800, 1900 MIDP 1.0, CLDC 1.0 101x8 0/8 bit 0/1 bits MIDP 1.0, 101x8 MIDP 1.0, CLDC 1.0 101x8 0/1 bit CLDC 1.0 0/8 MIDP 1.0, 101x8 bits CLDC 1.0 0/12 MIDP 1.0, 101x8 bits CLDC 1.0 0/8 JTWI 1.0, 130x1 bits MIDP 2.0, 30/12 JTWI 1.0, M3DAPI 132x1 bits MIDPLAPI 1.0, 2.0, 76/16 JABWT 1.0, CLDC 1.4, bits M3DAPI 1.1, MMAPI 1.0, WMA 1.1, LAPI 1.0, CLDC 1.1 1.1, MMAPI WMA 1.0, 176x2 1.1, WMA MMAPI 1.0, 20/16 1.1 MIDP 1.0, bits JTWI 1.0, CLDC 1.0 132x1 MIDP 2.0, 76/16 MIDP 1.0, 120x1 JABWT 1.4, bits CLDC 1.0 20/16 M3DAPI bits 1.0, LAPI MIDP 1.0, 240x3 1.0, CLDC CLDC 1.0 1.1, MMAPI 20/18 bits 1.1, WMA 1.1 JTWI 1.0, 128x1 Yes Yes Yes Yes Not yet Yes Yes Yes Not yet Yes Yes Yes MIDP 2.0, 60/16 JTWI 1.0, 132x1 Yes M3DAPI bits MIDP 2.0, 76/16 1.0, CLDC JABWT 1.4, bits 1.1, MMAPI M3DAPI 1.1, MIDP 1.0, LAPI 1.0, WMA CLDC 1.1 1.1, MMAPI 1.1, JTWIWMA 1.0, 128x1 Not 1.1 MIDP 2.0, 60/16 yet M3DAPI JTWI 1.0, 1.0, MIDPCLDC 2.0, 1.1, MMAPI JABWT 1.4, 1.1, MIDP M3DAPI 1.0, WMA LAPI 1.1 1.0, CLDC 1.1, JTWIMMAPI 1.0, 1.1, MIDPWMA 2.0, 1.1 M3DAPI bits 132x1 Yes 76/16 bits 128x1 Yes 60/16 bits 25 Sony Ericsson P800 GSM/GPRS 900, 1800, 1900 Sony Sony Ericsson Ericsson P802 K506c GSM/GPRS GSM/GPRS 900, 900, 1800, 1800, 1900 1900 Sony Ericsson P900 GSM/GPRS 900, 1800, 1900 Sony Ericsson Sony Ericsson K508c GSM/GPRS P908 GSM/GPRS 900, 1800, 900, 1900 1800, 1900 Sony Sony Ericsson Ericsson P910a K508i GSM/GPRS GSM/GPRS 900, 900, 1800, 1800, 1900 1900 Sony Ericsson Sony Ericsson P910c GSM/GPRS K700c GSM/GPRS 900, 1800, 900, 1900 1800, 1900 Sony Ericsson P910i GSM/GPRS Sony Ericsson K700i GSM/GPRS Sony Ericsson S700c GSM/GPRS 900, 1800, 1900 900, 1800, 1900 900, 1800, 1900 MIDPCLDC 1.0, 1.0, 1.1, MMAPI CLDC 1.0, 1.1, MIDP PersonalJav 1.0, a 1.1.1 WMA 1.1 MIDP 1.0, JTWI 1.0, CLDC 1.0, MIDP 2.0, PersonalJav M3DAPI a 1.1.1 1.0, CLDC JABWT 1.0, 1.1, MMAPI MIDP 2.0, 1.1, MIDP CLDC 1.0, 1.0, WMA PersonalJav 1.1 a 1.1.1, JTWI 1.0, WMA 1.1 MIDP 2.0, JABWT 1.0, M3DAPI MIDP 2.0, 1.0, CLDC CLDC 1.0, 1.1, MMAPI PersonalJav 1.1, MIDP a 1.1.1, 1.0, WMA WMA 1.1 1.1 JABWT 1.0, JTWI 1.0, JTWI 1.0, MIDP 2.0, MIDP 2.0, M3DAPI CLDC 1.0, 1.0, CLDC PersonalJav 1.1, MMAPI a 1.1.1, 1.1, MIDP WMA 1.1 1.0, WMA JABWT 1.0, 1.1 JTWI 1.0, JTWI 1.0, MIDP 2.0, MIDP 2.0, CLDC 1.0, M3DAPI PersonalJav 1.0, CLDC a 1.1.1, 1.1, MMAPI WMA 1.1 1.1, MIDP JABWT 1.0, 1.0, WMA JTWI 1.1 1.0, MIDP 2.0, JTWI 1.0, CLDC 1.0, MIDP 2.0, PersonalJav M3DAPI a 1.1.1, 1.0, CLDC WMA 1.1 1.1, MMAPI JTWI 1.0, 1.1, MIDP MIDP 2.0, 1.0, WMA M3DAPI 1.1 1.0, CLDC 208x3 Yes 20/12 bits 208x3 Yes 128x1 Not 20/12 60/16 yet bits bits 208x3 Yes 20/16 bits 128x1 Not 60/16 yet 208x3 Yes bits 20/16 bits 208x3 128x1 20/18 60/16 bits bits Not Not yet yet 208x3 Not 20/18 yet 176x2 Yes bits 20/16 bits 208x3 Not 20/18 yet bits 176x2 Yes 20/16 bits 240x3 Not 20/18 yet bits 26 1.1, MMAPI 1.1, MIDP 1.0, WMA 1.1 Sony Ericsson S700i GSM/GPRS 900, 1800, 1900 JTWI 1.0, 240x3 Not MIDP 2.0, 20/18 yet M3DAPI bits 1.0, CLDC 1.1, MMAPI 1.1, MIDP 1.0, WMA 1.1 Sony Ericsson S710a GSM/GPRS/ 800, 850, JTWI 1.0, 240x3 Not EDGE, PDC 1800, MIDP 2.0, 20/18 yet 1900 M3DAPI bits 1.0, CLDC 1.1, MMAPI 1.1, MIDP 1.0, WMA 1.1 Sony Ericsson SO503i PDC 800 CLDC 1.0 128x1 Yes 28/16 bits Sony Ericsson SO503iS PDC 800 CLDC 1.0 128x1 Yes 28/16 bits Sony Ericsson SO504i PDC 800 CLDC 1.0 128x1 Yes 28/16 bits Sony Ericsson SO505i PDC 800, 1500 CLDC 1.0 256x3 Yes 20/18 bits Sony Ericsson SO506iC PDC 800, 1500 CLDC 1.0 240x3 Yes 20/18 bits Sony Ericsson T610 GSM/GPRS 900, 1800, 1900 MMAPI 1.0, 128x1 Yes MIDP 1.0, 60/16 CLDC 1.0 bits Sony Ericsson T616 GSM/GPRS 850, 1800, 1900 WMA 1.0, 128x1 Yes MMAPI 1.0, 60/16 MIDP 1.0, bits CLDC 1.0 Sony Ericsson T618 GSM/GPRS 900, 1800, MMAPI 1.0, 128x1 Yes MIDP 1.0, 60/16 27 TTPcom B'Ngo GSM/GPRS 900, 1900 1800, 900, 1900 1800, 1900 MIDP 1.0, CLDC 1.0 CLDC 1.0 MMAPI 1.0, MIDP 1.0, CLDC 1.0 Sony Ericsson T628 GSM/GPRS Sony Ericsson T630 Sony Ericsson 220x1 Not bits 76/16 yet 128x1 Yes bits 60/16 bits GSM/GPRS 900, 1800, 1900 MMAPI 1.0, 128x1 Yes MIDP 1.0, 60/16 CLDC 1.0 bits T637 GSM/GPRS 900, 1800, 1900 WMA 1.0, 128x1 Yes MMAPI 1.0, 60/16 MIDP 1.0, bits CLDC 1.0 Sony Ericsson Z1010 GSM/GPRS, 900, W-CDMA 1800, 1900 JTWI 1.0, 176x2 Yes MIDP 2.0, 20/16 CLDC 1.1, bits MMAPI 1.1, MIDP 1.0, WMA 1.1 Sony Ericsson Z500a GSM/GPRS 900, 1800, 1900 JTWI 1.0, 128x1 Not MIDP 2.0, 60/16 yet M3DAPI bits 1.0, CLDC 1.1, MMAPI 1.1, MIDP 1.0, WMA 1.1 Sony Ericsson Z500i GSM/GPRS 900, 1800, 1900 JTWI 1.0, 128x1 Not MIDP 2.0, 60/16 yet M3DAPI bits 1.0, CLDC 1.1, MMAPI 1.1, MIDP 1.0, WMA 1.1 Sony Ericsson Z600 GSM/GPRS 900, 1800, 1900 MMAPI 1.0, 128x1 Yes MIDP 1.0, 60/16 CLDC 1.0 bits Sony Ericsson Z608 GSM/GPRS 900, 1800, 1900 MMAPI 1.0, 128x1 Yes MIDP 1.0, 60/16 CLDC 1.0 bits Toshiba C5001T CDMA 800 MIDP 1.0, CLDC 1.0 144x1 Yes 76/12 bits Toshiba J-T06 PDC 1500 MIDP 1.0, CLDC 1.0 16 bits Yes 28 CAPITOLO 2 PROGETTAZIONE 2.1 Raccolta dei requisiti 2.1.1 Requisiti di business Il Politecnico di Milano è una nota università Italiana affermata per essere sempre all’avanguardia nei settori di ricerca e sviluppo di applicazioni ad alto contenuto tecnologico e informatico. Per migliorare l’attuale sistema di comunicazione tra docenti e studenti, sta sviluppando un’applicazione che permetta ai docenti la pubblicazione di avvisi e notifiche da terminali mobili puntando sull’immediatezza d’uso dell’applicazione e sui vantaggi offerti dalle ultimissime tecnologie in termini di multicanalità. La missione primaria del progetto “Instant News System” è quella di facilitare ai docenti la pubblicazione di notizie nella bacheca elettronica e l’invio di Email a gruppi di studenti, integrandole con un sistema di notifica via sms. Gli utenti primari dell’applicazione sono quindi i docenti, i quali avranno a disposizione due canali di accesso all’applicazione: • Accesso da dispositivo mobile, che consente l’invio di messaggi attraverso i canali di comunicazione desiderati (mail, web, sms), la personalizzazione e l’utilizzo di template di messaggi, la selezione dei gruppi destinatari di tali messaggi • Accesso tramite web tradizionale, che permette la personalizzazione delle funzioni dell’applicazione, quali la modifica di template di messaggi e la definizione dei corsi destinatari, oltre alle stesse funzioni offerte dall’accesso mobile. Altro Gruppo di utenti è quello degli studenti, che potranno consultare le comunicazioni su dispositivi mobili (tramite sms) o da personal computer (tramite bacheca elettronica e mail). L’applicazione opererà direttamente sulla base di dati del Politecnico, di modo da ottenere maggiore consistenza e integrità dei dati. Questo progetto mira anche all’apprendimento di ulteriori conoscenze riguardo alla programmazione Java, più precisamente nell’ambito dello sviluppo di applicazioni per dispositivi mobili (Java2MicroEdition). 29 2.1.2 Individuazione utenti - Gruppo Professori (Utenti Interni) Gruppo Studenti (Utenti Esterni) 2.1.3 Requisiti funzionali - - Gruppo Docenti: o Accesso Web: Definizione/Organizzazione di gruppi destinatari (Collaboratori, Studenti, ..) o Accesso Mobile: Inserimento/modifica notizie in bacheca Interazione multicanale (SMS, Mail, ..) con gruppi destinatari Gruppo Studenti: o Accesso Web: Consultazione notizie Requisiti dei dati - Entità coinvolte: o Utenti (Docenti, studenti) o Corsi o Notizie o Destinatari o Riferimenti template Requisiti personalizzazione - Gruppo Docenti: o Definizione template messaggi o Definizione gruppi destinatari Requisiti dei dispositivi di accesso - Dispositivi Mobile: o Compatibilità J2ME (MIDP, CLDC) Web Browser 30 2.1.4 Requisiti non funzionali - - - - Usabilità: o Alta personalizzazione o Velocità di interazione ( pochi click necessari ) Prestazioni: o Ottimizzazione utilizzo risorse dispositivo mobile (cpu, ram, batteria, ...) o Minimizzazione del traffico wireless (UMTS, GPRS, …) Disponibilità: o Non Critica (?) Scalabilità: o Numero finito di utenti (Docenti e Collaboratori) Sicurezza: o Autenticazione utente o Integrità dei dati: Garantita dalla servlet con cui interagisce l’applicazione (unico punto di accesso) o Integrità dispositivo: Garantita dalla midlet sandbox (privatezza SMS, rubrica, …) Manutenibilità: o Java Advantage 31 2.2 Analisi dei requisiti: 2.2.1 Gruppi di utenti Nome Gruppo Docenti Descrizione Utente principale dell’applicazione, i cui ruoli sono inserire, modificare, eliminare news, contattare studenti, mailing list, ed altri contatti. Dati profilo Nome, cognome, indirizzo di posta elettronica, ateneo di appartenenza. I dati sono inseriti esplicitamente dall’utente. Super-Gruppo Nessuno. Sotto-Gruppi Nessuno. Casi d’uso “Login”, “Crea Notizia”, “Modifica Notizia”, “Rimuovi Notizia”, “Invia Messaggio a mailing list o contatto”, “Modifica dati profilo”. Ogg. Access. in lettura Notizie. Ogg. Access. in scrittura Dispositivi di accesso Nome Notizie. Dispositivo mobile compatibile con la tecnologia Sun Java 2 Micro Edition e web browser Gruppo Studenti Descrizione Studenti di un corso universitario. Dati profilo Nome, cognome, indirizzo di posta elettronica, recapito telefonico. Super-Gruppo Nessuno. Sotto-Gruppo Nessuno. 32 Ogg. Access. in lettura Ogg. Access. in scrittura Dispositivi di accesso Nessuno. Notizie. Web browser 2.2.2 Requisiti funzionali Requisiti funzionali per gli studenti Gli studenti possono accedere all’applicazione tramite web. Le operazioni compiute da questa categoria di utenti sono limitate alla lettura di informazioni riguardanti i corsi frequentati, annunci da parte dei docenti. 33 Gli studenti vengono informati dell’inserimento di un nuovo messaggio ricevendo un sms sul proprio dispositivo mobile. Ovviamente ogni studente deve specificare il proprio numero di cellulare all’atto di immatricolazione, tramite il PoliSelf oppure WebPoliSelf e consentire al sistema l’invio di news sul proprio telefonino. Requisiti funzionali per i docenti I docenti hanno il ruolo di inserire e modificare contenuti relativi ai corsi, quali variazioni d’orario di lezioni o esami, l’avvicinarsi scadenze, la pubblicazione di risultati, e molte altre informazioni utili. Le operazioni sono ad accesso ristretto, quindi i docenti possono utilizzare l’applicazione solo dopo l’autenticazione. Come mostrato nel seguente diagramma il docente ha a disposizione due tipologie di accesso all’applicazione, una mobile (il proprio telefonino) e una fissa (computer ufficio, casalingo). Ad ogni tipo d’accesso corrispondono varie e differenti operazioni. 34 2.3 Casi d’uso Di seguito sono riportati i casi d’uso, espressi tramite diagramma UML e da Fogli di specifica testuali, riguardanti gli attori principali dell’applicazione: il gruppo docenti. 2.3.1 Diagramma del caso d’uso per i docenti: 2.3.2 Fogli di specifica casi d’uso Analisi dettagliata delle operazioni dell’applicazione. Foglio di specifica per il caso d’uso “Login” Titolo Login Descrizione Autenticare l’utente che sta accedendo all’applicazione, sia per motivi di sicurezza che di personalizzazione del servizio. Pre-Condizione L’utente non ha ancora effettuato la procdura di Login nella sessione corrente. 35 Post-Condizione L’utente è riconosciuto e sono impostati i permessi sulle operazioni. Workflow Il caso d’uso prevede i seguenti passi: 1. L’utente compila la form di Login ed invia i dati al server. 2. Si eseguono verifiche sulla validità dei dati ricevuti 3. Se i dati non sono corretti l’utente riceve un messaggio di errore e viene rimandato alla schermata contenente la form di inserimento credenziali. 4. Se le credenziali sono corrette l’utente viene autenticato e viene visualizzata la schermata principale dell’applicazione Foglio di specifica per il caso d’uso “Sincronizza DB” Titolo Sincronizza DB Descrizione Mantenere sincronizzato il contenuto della base di dati del dispositivo mobile con quello del DB sul Server. Pre-Condizione L’utente deve aver effettuato la procedura di Login all’interno della sessione corrente. Post-Condizione Il contenuto della base di dati mobile è aggiornato. Workflow Il caso d’uso prevede i seguenti passi: 1. L’utente riceve i dati aggiornati direttamente dalla base di dati. 2. Si eseguono verifiche sulla validità dei dati ricevuti 3. Se i dati non sono corretti l’utente riceve un messaggio di errore e l’operazione viene annullata. 4. Se i dati sono corretti il contenuto della base di dati mobile viene aggiornato. 36 Foglio di specifica per il caso d’uso “Edit Oggetto” Titolo Edit Oggetto Descrizione Inserire o modificare l’oggetto della comunicazione in questione. Pre-Condizione L’utente deve aver effettuato la procedura di Login all’interno della sessione. Post-Condizione Il contenuto del campo “Oggetto” della comunicazione è aggiornato. Workflow Il caso d’uso prevede i seguenti passi: 1 L’utente seleziona il Template o il Messaggio di cui desidera editare l’oggetto. 2 Appare la schermata di modifica, in cui è possibile modificare il valore dell’ “Oggetto”. 3 Il campo “Oggetto” dell’oggetto selezionato è aggiornato Foglio di specifica per il caso d’uso “Edit Testo” Titolo Edit Testo Descrizione Inserire o modificare il testo della comunicazione in esame. Pre-Condizione L’utente deve aver effettuato la procedura di Login all’interno della sessione corrente e deve aver selezionato la comunicazione di cui desidera modificare il testo. Post-Condizione Il contenuto del campo “Testo” della comunicazione è modificato. Workflow Il caso d’uso prevede i seguenti passi: 1. L’utente seleziona il Template o il Messaggio di cui desidera editare il testo. 2. Appare la schermata di modifica, in cui è possibile modificare il valore del “testo”. 37 3. Il campo “testo” dell’oggetto selezionato è aggiornato Foglio di specifica per il caso d’uso “Associa Corso” Titolo Associa Corso Descrizione Associare gli studenti a cui è destinata la comunicazione. Pre-Condizione L’utente deve aver effettuato l’operazione di Edit Messaggio e deve aver ciccato sul bottone “invia” Post-Condizione destinatari. Alla comunicazione corrente sono associati i corsi Workflow Il caso d’uso prevede i seguenti passi: 1. Viene visualizzata la lista dei corsi in cui è coinvolto l’utente. 2. L’utente seleziona i corsi a cui è destinato il messaggio. 3. Vengono effettuati controlli (almeno un corso destinatario). 4. Viene visualizzata la schermata di editing del testo del Messagigo Foglio di specifica per il caso d’uso “Definisci Visibilità” Titolo Definisci visibilità Descrizione Definisce la visibilità della comunicazione, in accordo con la priorità della stessa: esposta nella bacheca elettronica, inviata tramite mail o sms agli studenti dei corsi destinatari. Pre-Condizione L’utente deve aver effettuato la procedura di Login all’interno della sessione corrente e deve aver selezionato la comunicazione di cui desidera impostare la visibilità. Post-Condizione La visibilità della comunicazione è impostata. 38 Workflow Il caso d’uso prevede i seguenti passi: 1. L’utente decide dove inserire la comunicazione corrente. 2. Si eseguono controlli sui permessi dell’utente. 3. Gli attributi di visibilità sono impostati. Foglio di specifica per il caso d’uso “Invia Notizia” Titolo Invia Notizia Descrizione Inviare la comunicazione selezionata. Pre-Condizione L’utente deve aver effettuato la procedura di Login all’interno della sessione corrente e deve aver effettuato (anche in sessioni distinte) le operazioni “Edit Template”, “Associa Corso” e “Definisci Visibilità” sulla comunicazione da inviare. Post-Condizione La comunicazione è inviata ai destinatari selezionati. Workflow Il caso d’uso prevede i seguenti passi: 1. 2. 3. 4. 5. Entrare nella schermata di Invio Notizia. Editare Oggetto e Testo della comunicazione. Effettuare l’operazione “Associa Corso”. Effettuare l’operazione “Definisci visibilità”. Ciccare sul pulsante “Invia notizia”. Foglio di specifica per il caso d’uso “Edit Template” Titolo Edit Template Descrizione Creare o modificare template di messaggi personali; consta sostanzialmente delle operazioni “Edit Testo”, “Edit Oggetto”. Pre-Condizione L’utente deve aver effettuato la procedura di Login all’interno della sessione. Per modificare un messaggio 39 si presuppone, ovviamente, l’esistenza del messaggio stesso. Post-Condizione Viene inserito un nuovo template di messaggio, o ne viene modificato uno esistente. Workflow Il caso d’uso prevede i seguenti passi: 1. 2. 3. 4. Raggiungere la schermata “Modifica Template”. Selezionare il Template da modificare. Effettuare le operazioni di “Edit Testo” ed “Edit Oggetto”. Ciccare sul pulsante “Modifica”. 2.4 Dizionario dei dati Necessario ai fini della specifica dei requisiti di un’applicazione è la definizione di un dizionario dei dati il cui compito è quello di eliminare ogni possibile malinteso o confusione riguardante i dati utilizzati dall’applicazione. Fornisce inoltre il primo passo verso la creazione del diagramma ER e quindi verso la realizzazione della Base di Dati dell’applicazione. Nome Notizia Sinonimi Nessuno Descrizione Comunicazione inviata dal docente Istanze Campione Progetto di Basi di Dati Prof. Brambilla L'appello, durante il quale avverrà la consegna degli elaborati, è fissato per il giorno venerdì 10/09 alle ore 14.30 in aula 3.7 Chi desidera consegnare il progetto in questa data è pregato di contattare il docente, per fissare un ordine di consegna. Proprietà Oggetto Testo Bacheca Email Sms Titolo della notizia Corpo della notizia Valore booleano che indica l’inserimento in bacheca Valore booleano che indica la notifica via mail Valore booleano che indica la notifica via sms 40 Relazioni Notizia_Docente Notizia_Corso Nome Associa una notizia al docente che l’ha pubblicata Associa una notizia al corso a cui si Template Sinonimi Nessuno Descrizione Identifica un template di messaggio precompilato, contenente dei caratteri di escape che permettono la rapida pubblicazione di notizie attraverso il terminale mobile (es: %L per luogo, %C per corso) Istanze Campione Rinvio Esercitazione Rinviata esercitazione di %C al giorno %G, ore %H, in aula %A Proprietà Oggetto Testo Titolo sintetico del template Testo del template, comprensivo di caratteri di escaping Relazioni Template_Docente Associa un template al docente che lo ha creato Nome Docente Sinonimi Nessuno Descrizione Identifica il docente correntemente loggato nell’applicazione Istanze Campione Giovanni Toffetti Carughi Dottorando di ricerca Proprietà Nome Cognome Ruolo Nome anagrafico del docente Cognome anagrafico del docente Posizione ricoperta dal docente all’interno dell’università Relazioni Docente_Notizia Docente_Corso Associa un docente alle notize da lui pubblicate Associa un docente ai corsi da lui tenuti 41 Nome Corso Sinonimi Nessuno Descrizione Identifica un insegnamento Istanze Campione Tecnologie Informatiche per il Web (5 CFU) Obiettivo del corso è l'introduzione delle metodologie, tecniche e architetture per l'analisi, progettazione e realizzazione di sistemi informativi fruibili via Web. Il corso affronta lo sviluppo delle applicazioni web da tre punti di vista: architetture, processo di sviluppo e tecniche di realizzazione..... Proprietà Nome Crediti Programma Relazioni Corso_Docente Corso_Notizia esso Corso_Studente Nome Nome del corso Valore espresso in Crediti Formativi del corso Programma del corso Associa un corso al docente da cui è tenuto Associa un corso alle notizie pubblicate relative ad Associa un corso agli studenti che lo frequentano Studente Sinonimi Nessuno Descrizione Identifica uno studente iscritto al servizio Istanze Campione 653672 Francesco Ostini +393281776xxx [email protected] Proprietà Matricola Nome Cognome Cell Mail Matricola dello studente Nome anagrafico dello studente Cognome anagrafico dello studente Numero telefonico dello studente (per notifica via sms) Indirizzo email dello studente (per notifica via mail) Relazioni Corso_Docente Corso_Notizia Associa un corso al docente da cui è tenuto Associa un corso alle notizie pubblicate relative ad esso 42 Corso_Studente Associa un corso agli studenti che lo frequentano 2.5 Diagramma Entità Relazione Diretta conseguenza di un dettagliato dizionario dei dati è il diagramma ER, fondamentale nell’implementazione del DataBase applicativo. Il precedente diagramma ER riassume la struttura della base di dati, implementata “lato server”. Sono facilmente individuabili le entità principali, Docenti, Corsi, Notizie e Site View, e le relazioni che le collegano a quelle secondarie, Studenti e Template. Una volta definita la base di dati su cui si opererà lo sviluppo dell’applicazione è pronto per entrare nel vivo: l’implementazione. 43 CAPITOLO 3 IMPLEMENTAZIONE 3.1 Introduzione La realizzazione dell’applicazione porta allo sviluppo di due software, uno da installare sul dispositivo mobile, microNews, e l’altro risiedente sull’application server, INS Server. Abbiamo deciso di sviluppare in primo luogo l’application server, in modo da definire, implementare, testare ed utilizzare sin da subito tutte le funzionalità richieste dall’applicazione. 3.2 INS Server L’applicazione INS Server consta a sua volta di 3 componenti: l’interfaccia web, composta da pagine jsp, la Mobile interaction, il cui compito è di intercettare interpretare e inoltrare le richieste dei client mobili, ed infine l’application core, vero e proprio motore del sistema contiene tutte le servlet e le classi d’appoggio concepite e sviluppate per esser utilizzate sia da web che da device mobile. 44 3.2.1 Interfaccia Web L’interfaccia web è un insieme di pagine jsp e servlet che permettono di visualizzare avvisi, notizie e comunicazioni inserite dai docenti in bacheca e di utilizzare le funzioni dell’applicazione previa una verifica di credenziali, tramite la procedura di Login. Ogni utente viene accolto da index.jsp che controlla l’esistenza di una sessione a lui appartenente e, in accordo con la definizione delle site-view, mostra o cela le funzioni riservate di invio comunicazioni e modifica template messaggi. Di seguito è riportata la pagina inviaMessaggio.jsp. 45 Questa pagina non solo permette di inserire nei campi “Oggetto” e “Testo” gli omonimi componenti della comunicazione da pubblicare, ma mostra anche tutti i corsi di cui il docente è titolare, permettendo di selezionarli come destinatari, ed inoltre consente di selezionare, in accordo con la priorità del messaggio stesso, il mezzo con cui avvertire i destinatari. Supponendo di voler affiggere un avviso in bacheca, è sufficiente inserire nella form “oggetto”, “testo” e attivare la checkbox “Bacheca”. Non è necessario selezionare alcun corso come destinatario in quanto la notizia verrà comunque inserita in bacheca e, di conseguenza, sarà visibile da ogni studente. Al contrario, per inviare una comunicazione urgente via sms, è necessario specificare almeno un corso-destinatario, in modo da permettere al sistema di contattare gli studenti frequentanti il dato corso. L’applicazione permette inoltre di creare messaggi partendo da template (frasi pre-composte) parametrici. E’ di seguito riportata la pagina modificaTemplate.jsp che, appoggiandosi alla servlet ModificaTemplate, permette di visualizzare i propri template e di modificarli. Inoltre, sfruttando componiMessaggio.jsp, consente di inviare un messaggio partendo dal template selezionato. Cliccando sul pulsante “Invia” viene aperta la pagina componiTemplate.jsp, di cui è riportato uno spaccato, che permette di valorizzare i parametri all’interno del testo del template, e di inoltrare il tutto (oggetto e testo) a inviaMessaggio 46 dove, come gia illustrato, sarà possibile selezionare la destinazione della comunicazione. Conseguenza della pressione del bottone “Conferma Messaggio” è la seguente pagina: 47 3.2.2 Mobile Interaction L’obbiettivo principale è stato assicurare una solida e sicura interazione fra Mobile e Server, inoltre ci siamo prefissati di sfruttare al massimo il “javaadvantage”, per poter costruire, all’interno dell’application core, delle servlet modulari: in grado di soddisfare parallelamente e in modo trasparente le richieste indipendentemente dal canale di provenienza, sia esso il web o la wireless network. Ritenendo ottimale gestire ogni operazione in modo atomico, per garantire maggior integrità, coerenza e consistenza dei dati, e non potendo disporre di un microbrowser, alle richieste è stato imposto un percorso forzato all’interno dell’application server in modo da assicurare che nessuna di esse possa perdersi, portare il server verso esecuzioni non previste oppure accedere a servizi non concessi. E’ stato quindi necessario implementare, all’interno delle servlet, metodi di forwarding anziché di redirezione. E’ riportato il codice del metodo implementato per effettuare la redirezione e il semplice utilizzo che ne deriva. private void fwd (String destinationPage, HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{ RequestDispatcher disp = req.getRequestDispatcher(destinationPage); disp.forward(req, res); } fwd(page,request,response); 48 49 Il primo passo del sistema di interazione con la device mobile è composto dalla servlet J2meInterceptor che, invocata dalle midlet attraverso richieste http, si occupa di: • • • • intercettare tutte le richieste provenienti dal Mobile controllare se per ognuna di esse esiste già una sessione aperta e, di conseguenza, se l’utente che tenta di accedere ai servizi è gia autenticato inoltrare le richieste da parte di utenti non autenticati alla procedura di Login interpretare, formattare ed inoltrare le richieste autorizzate verso RequestServlet RequestServlet può essere considerata come la porta d’accesso verso l’application core in quanto questa servlet si occupa di indirizzare le richieste dei client mobili alle varie operazioni/servlet dell’application core basandosi su un sistema di operation code. RequestServlet a questo punto fa forward alla servlet desiderata passando sessione, request e response. Frammento di codice di RequestServlet void executeCommand(String c, HttpSession session, HttpServletRequest request, HttpServletResponse response) { ResultSet result; String tmp; if(session.getAttribute("userid")!=null){ try{ DbInterface DB = new DbInterface(); if(c.equals("1")){ //login }else if(c.equals("2")){ //Sincro Template result = DB.selectQuery("OID,OGGETTO,TESTO","TEMPLATE","OWNERID='"+ session.getAttribute("userid")+"'"); while(result.next()){ tmp=result.getString("OID")+"§§§"+ result.getString("OGGETTO")+"§§§"+ result.getString("TESTO"); out.println(tmp); } }else if((c.equals("3"))){ //Invio messaggio fwd("InviaMessaggio",request,response); }else if(c.equals("4")){ // 4 = monitoraggio email fwd("MailControl",request,response); }else if(c.equals("5")){ //Sincro Corsi 50 result = DB.selectQuery("CORSO.CODCORSO,CORSO.NOME"," INSEGNA INNER JOIN CORSO ON INSEGNA.CORSO=CORSO.CODCORSO"," (INSEGNA.DOCENTE)='"(String)session.getAttribute("userid")+"); while(result.next()){ tmp=result.getString(1)+"§§§"+result.getString(2); out.println(tmp); } }else if(c.equals("5")){ // 5 = invio fax fwd("FaxServlet",request,response); } DB.closeConn(); }catch(Exception e){ e.printStackTrace(); } } } Successivamente l’application core svolge le funzioni richieste e indirizza gli output di ogni operazione a CompletedRequest, la servlet che si occupa di rispondere al dispositivo mobile, sia in caso di interruzioni che di operazioni completate con successo. 3.2.3 Application Core E’ il vero motore di tutta l’applicazione, essenzialmente costituito da servlet e classi di utilità. Questa porzione di software è stata sviluppata appositamente per poter gestire in modo completamente trasparente sia le richieste web che quelle provenienti dai dispositivi mobili. Inoltre è necessario riconoscere la provenienza di ogni richiesta affinché, durante il suo iter all’interno dell’application server, venga maneggiata di conseguenza. L’identificazione delle richieste avviene attraverso la studio dell’header http “User-Agent”, permettendo di capire se il client utilizza un browser oppure una MIDlet. If (request.getHeader("User-Agent").startsWith("Profile/MIDP")) { destinationPage = "J2meInterceptor"; response.setContentType("text/plain"); } 51 Ogni servlet dedicata all’invio di notizie quindi deve discernere fra request mobili e fisse per decidere a chi effettuare forward una volta terminata la propria esecuzione. Per quanto riguarda invece l’implementazione delle funzionalità applicative vere e proprie tutto è gestito dal reciproco rapporto fra servlet e classi: FaxSender con FaxServlet, MailReceiver con MailControl e MailSender, etc.. Sostanzialmente una richiesta di invio messaggio, dopo esser stata filtrata ed analizzata, giunge alla servlet InviaMessaggio la quale si occupa di: • • • • selezionare i canali di comunicazione (bacheca, mail, sms) richiesti selezionare i destinatari della comunicazione attraverso una query a DB invocare i relativi metodi di invio comunicare al client, fisso o mobile, il risultato dell’invio Frammento di InviaMessaggio Address[] to; if(mail!=null){ mail="1"; to= this.selezionaDestinatari("MAIL",corsi); try{ stmt=conn.prepareStatement("SELECT MAIL FROM DOCENTE WHERE USERNAME = '"+userid+"'"); res = stmt.executeQuery(); res.next(); param = res.getString(1); }catch(SQLException w){ w.printStackTrace(); param = ""; } MailSender sendmail = new MailSender(param,to,oggetto,testo); }else mail="0"; if(sms!=null){ sms="1"; to= this.selezionaDestinatari("CELL",corsi); SmsSender sendsms = new SmsSender(to,"OGGETTO: "+oggetto+"\n TESTO: "+testo); sendsms.start(); System.out.println("Inviato al Sms Gateway"); }else sms="0"; if(bacheca!=null){ bacheca="1"; }else bacheca="0"; int ij=0; StringBuffer tes = new StringBuffer(); Escaper es= new Escaper(); testo=es.escape(testo); 52 stmt = conn.prepareStatement("SELECT MAX(OID) FROM NOTIZIA"); res= stmt.executeQuery(); res.next(); int oid = Integer.parseInt((res.getString(1))); out.println(String.valueOf(oid)); stmt=conn.prepareStatement("INSERT INTO NOTIZIA (OID, OGGETTO, TESTO, IDOWNER, BACHECA, SMS, MAIL, DATA) values ('"+(oid+1)+"','"+oggetto+"','"+testo+"', '"+userid+"','"+bacheca+"','"+sms+"','"+mail+"','"+data+"')"); stmt.execute(); stmt.close(); RequestDispatcher disp = request.getRequestDispatcher(destinationPage); disp.forward(request, response); }catch(SQLException e){ e.printStackTrace(); session.setAttribute("error","Errore: Problemi con il DB"); RequestDispatcher disp = request.getRequestDispatcher(destinationPage); disp.forward(request, response); } Metodo di selezione dei destinatari: private Address[] selezionaDestinatari(String canale, Vector listaCorsi)throws SQLException{ Connection conn=DriverManager.getConnection("jdbc:odbc:INS","",""); int i=0; int dim=0; ResultSet res; PreparedStatement stmt; Address[] outPut=new Address[dim]; String temp; int cc; Iterator g = listaCorsi.iterator(); while(g.hasNext()){ temp=(g.next()).toString(); cc = Integer.parseInt(temp); System.out.println("Cod Corso: "+cc); stmt = conn.prepareStatement("SELECT STUDENTE."+canale+" FROM STUDENTE INNER JOIN FREQUENTA ON STUDENTE.MATRICOLA=FREQUENTA.MATRICOLA WHERE FREQUENTA.CODCORSO ="+cc); res= stmt.executeQuery(); while(res.next()){ Address[] tmpAddress=new Address[dim+1]; for (int k=0; k<dim; k++) { tmpAddress[k]=outPut[k]; } outPut=tmpAddress; String indirizzi=res.getString(canale); System.out.println("Addr: "+indirizzi); 53 try{ Address to = new InternetAddress(indirizzi); outPut[dim]=to; }catch(AddressException Ae){Ae.printStackTrace();} System.out.println("Address "+dim+": "+outPut[dim].toString()); dim++; } } return outPut; } Invio SMS La gestione degli Short Message System (SMS) è stata implementata utilizzando le librerie Java COMM API e JSMSEngine API. Le librerie Java COMM sono una estensione della Java 2 Standard Edition, e permettono ad una applicazione scritta in Java di comunicare con dispositivi collegati ad una porta COM del computer. Le librerie JSMSEngine permettono ad una applicazione, sfruttando le Java COMM, Java di inviare SMS utilizzando come gateway SMS un modem GSM, oppure il proprio telefono cellulare collegato al computer tramite infrarossi (IRDA). Un vincolo delle librerie JSMSEngine, è che “comunicano” con il dispositivo utilizzato come gateway SMS solo tramite porta COM del computer. Nel caso di un modem GSM il problema non sussiste, infatti questo è collegato direttamente alla porta COM (tipicamente ad una delle prime 4), e l’invio del messaggio avviene aprendo un canale di comunicazione tra il modem e librerie Java COMM, e sfruttando nel codice i servizi messi a disposizione dalle JSMSEngine API. Nel caso di un telefono cellulare invece, per poter comunicare con il dispositivo occorre che la porta IRDA del computer sia “mappata“ su una porta COM, oppure occorre utilizzare un simulatore IRDA-COM. Come mostrato nella figura sottostante, il processo di invio SMS è stato simulato utilizzando come SMS gateway un telefono cellulare. Il simulatore IRDA-COM utilizzato per il test della nostra applicazione è irCOMM2k. 54 Il processo di invio SMS può essere cosi riassunto: 1. Grazie all’emulatore irCOMM2k, il telefono cellulare benché sia connesso alla porta infrarossi, viene simulato sulla porta COM3 2. Nel codice della applicazione Java (classe SmsSender), viene istanziato un servizio di JSMSEngine, indicando la COM da utilizzare per connettersi con il telefono e la velocità della stessa: CService srv = new CService("com3", 9600); 3. In seguito dopo opportuni settaggi, viene creato l’oggetto message ed inviato: COutgoingMessage msg = new COutgoingMessage(destSMS,mes); Invio FAX Per il sevizio di invio fax, sono state utilizzate le librerie Java COMM API e RFax API. Come precedentemente citato, le Java COMM API sono delle librerie che permettono ad una applicazione scritta in Java di comunicare con un dispositivo collegato ad una porta COM. Le librerie RFax invece, sono delle librerie proprietarie che sfruttano il modem 56k di un computer per inviare un fax. Le librerie RFax sono state utilizzate nella classe FaxSender. Il processo di invio di un fax può essere cosi riassunto: 55 1. Viene creato l’oggetto FaxModem sfruttando le librerie RFax: FaxModem modem=new FaxModem(); 2. Si setta la porta su cui è in ascolto il modem: modem.setPortName("com4"); 3. Si imposta la classe appartenenza del modem (0,1,2): modem.faxClass=1; 4. Si invia il fax: modem.open(this); modem.sendFax("0123456789"); Per interfacciare l’applicazione al Data Base Management System, abbiamo introdotto la classe DbInterface, che permette di eseguire interrogazioni alla Java, in modo tale che, per adattare il software ad un nuovo DBMS, sia sufficiente cambiare pochissime righe di codice. 56 3.3 microNEWS L’applicativo microNEWS è costituito da un package “ins”, contenente tutte le interfacce grafiche, e da un sottopackage “ins.core”, che si occupa della gestione dei dati vitali dell’applicazione, sottostanti l’interfaccia grafica. 57 3.3.1 Mobile Core Tutte le classi contenute in ins.core sono responsabili della gestione dei dati necessari alla logica di business dell’applicazione, offrendo funzionalità di: • • • • Memorizzazione persistente dei dati Connessione HTTP Gestione profilo utente Gestione template Memorizzazione persistente dei dati Per i motivi spiegati nel capitolo 1 è ancor oggi praticamente impossibile utilizzare un DBMS relazionale su dispositivo mobile. Dovendo comunque mantenere all’interno memoria locale una porzione di dati persistenti relativi al profilo utente, si è scelto di memorizzare i dati tramite Record Management System,utilizzando le librerie javax.microedition.rms Questa soluzione ha però lo svantaggio di salvare tutti i record in una tabella costituita da tuple di una sola cella, indicizzate in modo crescente. Analizzando il recordStore che memorizza i dati dell’utente (“userinfo”), vediamo che è costituito da: 58 id 1 2 Valore Userid Password Per quanto riguarda invece la memorizzazione dei template, si è scelto di creare un recordStore per ogni template, realizzato nel modo seguente: id 1 2 Valore Titolo template Testo template Si è reso necessario inoltre creare una apposita classe RMSManager, custodita nel package util, che agisce da wrapper sull’RMS, semplificando notevolmente la programmazione ovunque richieda accesso a dati. • Costruttore ... recordStore = RecordStore.openRecordStore(name, true); ... • Metodo Insert ... recordStore.addRecord(record.getBytes(),0,record.length()); ... • Metodo Update ... recordStore.setRecord(id,S.getBytes(),0,S.length()); ... • Metodo Select ... byte[] buffer = new byte [50]; String recordValue = null; if (recordStore.getRecordSize(id) > buffer.length) buffer = new byte[recordStore.getRecordSize(id)]; int len = recordStore.getRecord(id, buffer, 0); recordValue = new String(buffer, 0, len); return recordValue; ... 59 Connessione HTTP Seguendo le specifiche SUN MIDP 2.0, la connessione viene istanziata in un thread differente dal quello che cattura i comandi dalla device, si è quindi scelto di implementare ServletInteraction come Thread. La suddetta classe che si occupa di effettuare connessioni al server j2ee, inviare richieste, interpretare risposte e notificare il successo di queste operazioni Le classi ServletUpdTemplates, ServletUpdCorsi, estendono ServletInteraction, ridefinendo solamente il metodo process(), all’interno di quale si svolgono le attività caratterizzanti l’operazione (processamento della response e successivo aggiornamento di corsi e template). Si riportano i frammenti di codice più significativi: • Metodo Success o Visualizzazione della notifica di successo/insuccesso dell’operazione void success(boolean success, String message) { message=message; AlertType alertType=AlertType.ERROR; if (success) alertType=AlertType.INFO; Alert splashScreenAlert; splashScreenAlert = new Alert("", message, null, alertType); splashScreenAlert.setTimeout(Alert.FOREVER); display.setCurrent(splashScreenAlert,disp); } • Metodo Process o Processamento della response (in se non molto significativo) void process(String response) { progress.setValue(9); if (code==200) success(true, defSuccess); else success(true, defError); } • Metodo Run o Chiamato all’avvio del thread ... StringBuffer buffer = new StringBuffer(); try { progress=new ProgressMonitor(11); Form tmpForm= new Form(""); tmpForm.append(progress); display.setCurrent(tmpForm); 60 progress.setValue(1); conn = (HttpConnection)Connector.open(url+queryString,Connector.READ_WRITE); progress.setValue(3); conn.setRequestMethod(HttpConnection.POST); conn.setRequestProperty("User-Agent","Profile/MIDP-2.0 Configuration/CLDC-1.0"); progress.setValue(4); if (data!=null) { conn.setRequestProperty("Content-Type","application/x-www-formurlencoded"); conn.setRequestProperty("ContentLength",String.valueOf(data.length())); OutputStream os = null; os = conn.openOutputStream(); os.write(data.getBytes()); os.close(); } InputStream is = conn.openInputStream(); progress.setValue(5); int ch; progress.setValue(6); while ((ch = is.read()) != -1) { buffer.append( (char)ch ); } progress.setValue(7); is.close(); progress.setValue(8); String response=buffer.toString(); progress.setValue(9); if (response.startsWith("Errore")) { success(false,response); } else process(response); } catch ( Exception e ) { if (e instanceof IOException) success(false, " Errore di Connessione \n"); else success(false,defError); e.printStackTrace(); } ... • Metodo process in ServletUpdTemplates o Effettua il parsing della response, memorizzando tramite la classe apposita, i template del docente void process(String response) { int j=0; while (j<response.length()-2) { StringBuffer lineBuff=new StringBuffer(); while((response.charAt(j) != '\n')) { lineBuff.append(response.charAt(j)); j++; 61 } parseLine(lineBuff.toString()); j++; } } progress.setValue(9); success(true, defSuccess); void parseLine(String line) { int id; String title; String text; int j=0; char c=line.charAt(j); id=c-48; while(line.charAt(j) == '§') j++; StringBuffer titleBuff= new StringBuffer(); while(line.charAt(j) != '§') { titleBuff.append(line.charAt(j)); j++; } while(line.charAt(j) == '§') j++; StringBuffer textBuff= new StringBuffer(); while((line.charAt(j) != '§')&&(j<line.length()-1)) { textBuff.append(line.charAt(j)); j++; } textBuff.append(line.charAt(j)); title=titleBuff.toString(); text=textBuff.toString(); Templates.modTemplate(id, title,text); } In maniera analoga è realizzato il metodo process() della classe responsabile dell’aggiornamento dei corsi. Gestione profilo utente La classe principale implementata per gestire il profilo utente è ins.core.UserId, realizzata staticamente, e dotata dei seguenti metodi: • public static void setInfo(String usr, String pwd, String url) o Memorizza su RMS le informazioni relative al profilo utente • • • public static String getUser() public static String getPass() public static String getUrl() o Restituiscono i dati relativi al profilo utente • public static void setCorsi(String[] corsi) o Memorizza su RMS la lista dei corsi con relativo id 62 • public static Course[] getCorsi() o Restituisce un array di oggetti Course • public static void initData() o Metodo chiamato all’avvio dell’applicazione per caricare i dati da RMS e renderli disponibili sulle classi a runtime Altra classe utilizzata è ins.core.Course, le cui istanze rappresentano i corsi (id, nome corso) relativi al docente correntemente loggato nell’applicazione Gestione Template La classe responsabile della gestione dei template è ins.core.Templates, la quale, realizzata staticamente, fornisce i seguenti metodi: • • public static void modTemplate(int pos, String title, String text) o Modifica il template in posizione pos, settando i valori titolo e testo public static Template getTemplate(int pos) o Restituisce un oggeto oggetto di tipo Template in base all’identificato della posizione Ins.core.Templates utilizza la classe ins.core.Template, le rappresentano un singolo template identificato da titolo e testo cui istanze 3.3.2 Interfaccia Grafica L’interfaccia grafica è realizzata tramite le librerie javax.microedition.lcdui.* le quali permettono di definire delle primitive di visualizzazione, lasciando poi al dispositivo il rendering grafico vero e proprio. Questa caratteristica è molto importante poichè permette di sviluppare software J2ME in modo totalmente indipendente dalla device su cui poi verrà visualizzato. Come esempio riportiamo la visione del nostro applicativo su due telefonini diversi: 63 La midlet ins.Main è l’applicativo che viene lanciato all’apertura del programma, presentando un menù (realizzato tramite List) attraverso il quale è possibile accedere a tutte le funzionalità offerte dall’applicazione: • • • • • • Invio Messaggi Gestione Template Configurazione Monitoraggio Email Invio Fax Informazioni Configurazione 64 Attraverso la schermata di configurazione è possibile salvare i dati necessari all’autenticazione del docente e l’indirizzo del server a cui connettersi, oltre alla funzione di sincronizzazione dei corsi, la quale prevede il download e la memorizzazione persistente sul dispositivo dell’elenco dei corsi tenuti da un docente. Segue un frammento di codice di ins.SubConfigure: void save() { UserId.setInfo(tfUsr.getString(), tfPwd.getString(), tfUrl.getString()); } Come è possibile vedere il metodo di salvataggio dei dati utilizza la classe ins.core.UserId. void syncronize() { String usr=tfUsr.getString(); String pwd=tfPwd.getString(); String queryString = "?username="+usr; String postData = "&password="+pwd+"&opcode=5"; try{ Thread servlet = new ServletUpdCorsi(queryString, postData, main.menu); servlet.start(); servlet.setPriority(Thread.MAX_PRIORITY); } } catch(Exception e){e.printStackTrace();} Gestione Template 65 La schermata di Gestione Template (realizzata attraverso Form) contiene una lista (ChoicheGroup) dei template disponibili per l’invio messaggi, editabili tramite la schermata di Modifica Template, e sincronizzabili con quelli presenti nel database, utilizzando la classe ins.core.ServletUpdTemplates, la quale funziona in modo molto simile a ServletUpdCorsi Invio Messaggi La funzione di Invio Messaggi (non a caso posizionata come prima opzione del menù) è la più importante dell’applicazione, permette appunto l’invio di un messaggio, attraverso un iter di 3 fasi: 1. Scegliere se il nuovo messaggio deve essere composto da zero, oppure se si vuole semplicemente compilare un template precedentemente impostato. 66 2. Inserimento titolo e testo messaggio oppure riempimento dei campi relativi al template selezionato 3. Scelta dei corsi a cui il messaggio è riferito e del canale di comunicazione desiderati (bacheca, mail, sms) Terminato il suddetto iter, cliccando sul pulsante opzioni e selezionando “invia”, l’applicativo si connette al server J2EE, e invia la richiesta, attraverso il seguente metodo di ins.core.ServletInteraction: void submit() { String usr=UserId.getUser(); String pwd=UserId.getPass(); String queryString = "?username="+usr; postData+=("&password="+pwd+"&opcode=3"); boolean[] selectedChan = new boolean[3]; 67 chan.getSelectedFlags(selectedChan); if (selectedChan[0]) postData+="&bacheca=on"; if (selectedChan[1]) postData+="&mail=on"; if (selectedChan[2]) postData+="&sms=on"; boolean[] selectedCors = new boolean[corsi.length]; cors.getSelectedFlags(selectedCors); for (int i=0; i<corsi.length; i++) { if (selectedCors[i]) postData+="&"+corsi[i].getId()+"=on"; } try{ Thread servlet = new ServletInteraction(queryString, postData, main.menu); servlet.start(); servlet.setPriority(Thread.MAX_PRIORITY); main.mainMenu(); } catch(Exception e) { e.printStackTrace(); } } Invio Fax La schermata di invio fax è stata ideata come modo veloce ed economico per mandare fax testuali, infatti interagisce mandando solamente una HTTP request (contenente i dati del fax da inviare) all’application server, il quale di occupa di inviare il fax tramite l’infrastruttura in cui è collocato. L’interazione è svolta direttamente da ins.core.ServletInteraction in modo 68 Monitoraggio Email La funzione di monitoraggio email permette di controllare se nella propria casella di posta elettronica (settando username e password del server POP3) sono arrivati messaggi inviati da un particolare mittente, specificato nel campo “indirizzo da monitorare” Alla ricezione di una mail da parte dell’indirizzo specificato, si riceverà un sms che riporterà oggetto e i primi caratteri del testo 69 CAPITOLO 4 APPENDICE 4.1 Ambiente di Sviluppo L’applicazione è stata sviluppata sia su piattaforma Windows che GNU-Linux. Per quanto concerne INS Server, è stato sviluppato interamente con NetBeans IDE, la base di dati è gestita da Access tramite bridge JDBC-ODBC (sono stati effettuati test di compatibilità con database MySQL e PostgreSQL). Lo sviluppo di MicroNEWS è stato effettuato con SUN ONE Studio MobileEd, versione rivisitata ad hoc di NetBeans per lo sviluppo di applicazioni J2ME, integrato con Nokia Developer Suite. 4.2 Testing e Debugging Al termine della fase di implementazione si è testato l’applicazione alla ricerca di “bugs”. I test sono stati effettuati su web server Tomcat per quanto riguarda INS Server, e su un telefonino Nokia 6600 (oltre che su svariati emulatori) per quanto riguarda MicroNEWS. Sulla macchina ospitante il web server sono state installate le librerie necessarie per simulare l’invio di mail, sms e fax. Un primo problema riscontrato nell’utilizzo dell’applicazione è stato quello di gestire la connessione http da client mobile verso il web server. Infatti, al primo tentativo di connessione, si è riscontrato un problema relativo ai processi in esecuzione sul dispositivo mobile, ovvero l’impossibilità di effettuare una connessione http nello stesso thread della applicazione principale, è stato quindi necessario istanziarla in un thread separato, per evitare di bloccare di il telefono in caso di fallimento della connessione. Inoltre per poter mandare dati tramite post, ma allo stesso tempo renderli reperibili tramite una tradizionale request.GetAttribute, è stato necessario impostare i parametri della connessione nel modo seguente: String data=”¶m=”+param; //i parametri sono inseriti come in una querystring conn = (HttpConnection)Connector.open(url+queryString,Connector.READ_WRITE); conn.setRequestMethod(HttpConnection.POST); conn.setRequestProperty("User-Agent","Profile/MIDP-1.0 Configuration/CLDC-1.0"); conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length",String.valueOf(data.length())); OutputStream os = null; os = conn.openOutputStream(); os.write(data.getBytes()); //os.flush(); os.close(); 70 E’ importante notare la property content-Type che è stata settata come application/x-www-form-urlencoded, e il non utilizzo del metodo flush() sull’outputstream os che può causare problemi a causa di un noto bug. Dopo avere risolto il problema della connessione http, è stato deciso di testare l’interazione con il DBMS direttamente da dispositivo mobile. Nella classe DbInterface, adibita alla gestione del DB, sono state riscontrate difficoltà nell’interazione con il sistema software per la gestione dei dati, infatti esiste un problema relativo all’uso di caratteri speciali, quali apici, attraverso jdbc-odbc driver. Per ovviare al problema è stata introdotta la classe Escaper che permette di sostituire questi caratteri “pericolosi” per questo driver (stile “ ’ ”) con altri meno usati e decisamente più “safe”. Nella parte di invio messaggi sono stati riscontrati svariati problemi dovuti all’ utilizzo di un SMS gateway. Non avendo a disposizione un vero SMS gateway, nella fase di test si è utilizzato un telefono cellulare per riuscire ad inviare questo tipo di messaggi. Come dettagliatamente illustrato nel capitolo precedente, per poter utilizzare un cellulare come SMS gateway, sono state utilizzate le librerie Java COMM e JSMSEngine nella classe SmsSender, “mappando” la porta IRDA sulla porta com3 grazie al simulatore irComm2k. Dopo svariati tentativi, e problemi dovuti soprattutto al tipo di device mobile utlizzato come SMS gateway, e all’uso delle librerie Java COMM, come illustrato nella figura sottostante, è stato possibile inviare il primo SMS. Log dell’application server: Sto usando jSMSEngine API 1.2.4: 14-set-2004 04:09:17 org.jsmsengine.CSerialDriver open INFO: Connecting... Informazioni addizionali sul dispositivo: Produttore : Nokia Modello : Nokia 7210 Serial No : 351114103561xxx IMSI : * N/A * Versione SW : V 3.0902-10-02NHL-4(c) NMP. Livello Batteria : 26% Livello Segnale : 32% SMS per +393293632xxx inviato! SMS per +393281776xxx inviato! 14-set-2004 04:09:48 org.jsmsengine.CSerialDriver close INFO: Disconnecting... L' invio SMS è avvenuto correttamente! Particolari difficoltà sono sorte nell’utilizzo di Record Management System: questa forma primitiva di DBMS infatti “affatica” molto la device mobile, soprattutto nella procedura di inizializzazione. 71 Da sottolineare il fatto che testare l’applicazione su un vero telefono cellulare (data la minore tolleranza in fatto di gestione eccezioni a runtime) ha messo in evidenza svariati bug che faticano a manifestarsi sugli emulatori. Altro grosso problema incontrato è un Bug nell’implementazione del profilo MIDP (più specificamente una errata visualizzazione degli Alert) del Nokia 6600 (firmware 3.42), documentato nella Nokia knowledge base, per il quale non è ancora stato rilasciato un aggiornamento. Nel processo di sviluppo dell’applicazione la decisione di implementare prima la sezione Server ha semplificato notevolmente lo sviluppo di microNEWS poiché ha consentito di effettuare test estensivi e debug ad ogni ampliamento / modifica del codice, permettendo di individuare con tempestività bug ed imperfezioni. 4.3 Conclusioni e sviluppi futuri Lo sviluppo di una applicazione multicanale ha permesso di svelare numerosi aspetti non ancora affrontati nel curriculum di studi, e di affinare una certa sensibilità verso le tematiche di ottimizzazione del codice (per quanto riguarda il dispositivo mobile), e di modularità, volendo poter riutilizzare al massimo le stesse funzioni sia lato mobile che lato web. Da sottolineare la non completa maturità della tecnologia, che potrebbe scoraggiare lo sviluppatore, in quanto per poter realizzare una applicazione veramente funzionante su una vasta gamma di telefonini deve contemplare anche i bug nell’implementazione dei vari profili, in quanto si è constatato che un codice che utilizza estensivamente le librerie MIDP (seppur rimanendo conforme ad esse) potrebbe non risultare compatibile con tutte le device presenti sul mercato. Il più naturale sviluppo dell’applicazione è quello di mettere effettivamente a regime l’applicazione e integrarla con il sistema informativo del Politecnico di Milano. Per fare questo è necessario ridefinire solamente le servlet che si occupano dell’ interazione con il database, avendo a disposizione lo schema ER della base di dati del Politecnico. Altro passo indispensabile è quello di interfacciare lNS Server con un reale SMS Gateway. Ulteriori sviluppi futuri saranno una più profonda conoscenza dell’architettura J2EE-J2ME, in modo da impiegare le capacità e tecniche acquisite anche in ambito professionale. 72 CAPITOLO 5 BIBLIOGRAFIA Sito ufficiale SUN Microsystem http://www.sun.com/ http://java.sun.com/j2me/ Portale ufficiale sviluppatori Nokia http://www.forum.nokia.com Portale ufficiale sviluppatori Ericsson http://www.ericsson.com/mobilityworld/ Portale ufficiale sviluppatori Siemens http://www.siemens-mobile.com Portale ufficiale sviluppatori Motorola http://www.motorola.com/developers News sul modo wireless http://www.pec-forum.com/index.htm Introduzione a J2ME A Brief Look at Java 2 Micro Edition - Michael Nygard Applet, MIDlet, Xlet Understanding J2ME Application Models - Eric Giguere Programmare in J2ME Architettura J2ME e libreria MIDP – Fabrizio Russo API MIDP per l'interfaccia utente – Fabrizio Russo Record Management System - Fabrizio Russo Track wireless sessions with J2ME/MIDP http://www.javaworld.com/ Analisi mercato 2003 – 2007 Embedded Java punta alla leadership Sicurezza in J2ME J2ME End to End Security for M-Commerce – W. Itani and Ayman I.Kayssi Record Management System Using RMS Files - Recital Corporation 73 Bluetooth Special Interest Group Memeber Specification of the bluetooth system: Core https://ww.bluetooth.org/foundry/specification/document/specification Hypertext Transfer Protocol – HTTP/1.1 IETF RFC 2616 JSMSEngine API http://www.jsmsengine.org Java COMM API http://java.sun.com/products/javacomm/index.jsp Java MAIL API http://java.sun.com/products/javamail/ Fax for the Java Platform http://www.java4less.com/java_fax.htm Java2me.org Forum http://forum.java2me.org/ WMLScript Forum http://www.wmlscript.it/j2me/index.asp 74