Realizzazione e test di una Xlet
In questo articolo, contributo del JUG siena, viene illustrato come poter realizzare una XLet, applicazione Java per il digitale terrestre.
Premessa
Questo articolo presenta un breve esempio di realizzazione di una XLet Java.
I requisiti sono:
- La Java 2 Platform, Standard Edition (J2SE) J2SE 1.4.2
- Le Java TV API 1.0
- Il Viewer XLet
ed infine un IDE di sviluppo (noi usiamo eclipse).
Le specifiche MHP e DVB
Le Multimedia Home Platform (MHP) forniscono le specifiche per la realizzazione di un ambiente per la TV digitale terrestre, indipendentemente dal “Vendor”. Alla base delle MHP vi è la piattaforma Java e la definizione di un generico set di API in grado di fornire l’interazione con i terminali di Tv digitale terrestre. Un’applicazione Java che sfrutta queste API è detta applicazione DVB-J.
Le MHP 1.1 aggiungono ulteriori funzinalità alle MHP 1.0.1:
- download delle applicazioni dal canale;
- supporto per la gestione di plug-ins;
- persistenza delle applicazioni in memoria;
- accesso al lettore di smart card;
- una serie di clients (Web browser, e-mail, …);
Le applicazioni MHP non sono applicazioni Java™ complete, ma, piuttosto, Applets. Il gestore delle applicazioni (residente nel Set-Top-Box) controlla il loro ciclo di vita. Queste applicazioni sono chiamate Xlets
Le Xlet
Di fatto per realizzare una Xlet è necessario implementare una interfaccia “implements Xlet
“. Di seguito l’implementazione di una Xlet (si noti l’import delle API TV):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import javax.tv.xlet.Xlet; import javax.tv.xlet.XletContext; import javax.tv.xlet.XletStateChangeException; public class SimpleXLet implements Xlet{ private XletContext context; public SimpleXLet() { } public void initXlet(XletContext xletContext) throws XletStateChangeException { context = xletContext; } public void startXlet() throws XletStateChangeException { } public void pauseXlet() { } public void destroyXlet(boolean flag) throws XletStateChangeException { context.notifyDestroyed(); } } |
Un Xlet di fatto prevede 4 metodi:
- initXlet : Chiamata quando il gestore delle applicazioni inizializza la Xlet.
- startXlet : Chiamata quando il gestore delle applicazioni esegue la Xlet.
- pauseXlet : Chiamata quando il gestore delle applicazioni decide di mettre in pausa la Xlet.
- destroyXlet : Chiamata quando il gestore delle applicazioni distrugge la Xlet.
Si noti che una Xlet ha a disposizione un contesto di applicazione Xlet context che è l’oggetto che la Xlet usa per accedere al sistema. Il contesto di una Xlt prevede i seguenti metodi:
- notifyDestroyed : Per la notifica di distruzione.
- notifyPaused : Per la notifica di pausa.
- java.lang.Object getXletProperty(java.lang.String key) : Per ottenere le propietà di contesto.
- resumeRequest : Per rinnovare la richiesta.
Gli stati possibili di una Xlet sono: Loaded, Active, Paused, e Destroyed. La figura seguente mostra il ciclo di vita completo
Java TV API
Le Java TV API sono molto di più di una specifica per definire le Xlet, forniscono infatti anche una serie di importanti classi per l’accesso alle risorse, lo streaming dati ecc.
- javax.tv.service e javax.tv.service.navigation : Per l’interazione con il servizio (il canale).
- javax.tv.service.guide : Per la gestione dell’EPG (electronic program guides).
- javax.tv.service.transport : Per la gestione dello stream MPEG-2.
Le Java TV API sfruttano le Java Media Framework APIs (JMF 1.0) per la gestione del media trasmesso in broadcast. Adesso è il caso di fissare le idee e di passare dalla teoria alla pratica. Il codice della Xlet riportato precedentemente può essere utilizzato per creare il nostro pacchetto JAR
Prima di installarlo occorre compilarlo aggiungendo come jar di riferimento il package javatv.jar.
1 2 3 4 5 |
Linux: ${JAVA_HOME}/bin/javac -classpath=${CLASSPATH}:./javatv.jar JUGSIXlet.java Windows: %JAVA_HOME%/bin/javac -classpath=%CLASSPATH%:./javatv.jar JUGSIXlet.java |
Infine occorre eseguire l’emulatore XletView e installare l’applicazione: (1) Applications -> Manage Applications -> New Application, (2) quindi scegliere il path dove avete installato l’applicazione e (3) scegliere la classe applicazione
L’esempio è abbastanza semplice (anzi vuoto!), ma mostra il ciclo di vita di una Xlet.
Per eseguire un test un po’ più completo è opportuno dotarsi di alcuni packages (in realtà sono già inclusi nel jar XletView) di utilità in grado di interagire graficamente con il STB: presso http://sourceforge.net/projects/xletview è possibile reperire un esempio completo.
Al contrario un esempio che sfrutti solamente le classi fornite dal package javatv.jar è presentato di seguito:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
import com.sun.tv.si.*; import com.sun.tv.receiver.*; import java.awt.*; import javax.tv.xlet.*; import javax.tv.graphics.*; import javax.tv.service.*; import javax.tv.service.navigation.*; import java.awt.Color; import java.awt.Font; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.tv.xlet.Xlet; import javax.tv.xlet.XletContext; import javax.tv.xlet.XletStateChangeException; public class JUGSIXlet implements Xlet { private XletContext context; private Label msg = new Label("WOW");; public JUGSIXlet() { } public void initXlet(XletContext xletContext) throws XletStateChangeException { context = xletContext; Container rootContainer = TVContainer.getRootContainer(xletContext); rootContainer.setLayout(new BorderLayout()); rootContainer.setForeground(Color.white); rootContainer.setSize(new Dimension(300, 300)); msg.setForeground(Color.blue); rootContainer.add("Center", msg); rootContainer.validate(); } public void startXlet() throws XletStateChangeException { System.out.println("started"); } public void pauseXlet() { } public void destroyXlet(boolean flag) throws XletStateChangeException { context.notifyDestroyed(); System.out.println("destroyed"); } } |
Il quale presenta una scritta “WOW” come in figura:
E’ possibile testare direttamente l’esempio sopra mostrato con l’emulatore fornito dalle Java TV API:
Il test è possibile effettuarlo aggiungendo il seguente metodo main della classe sopra riportata:
1 2 3 4 5 6 7 8 |
... public static void main(String args[]) { SIManager manager = SIManager.createInstance(); SIEmulator emulator = SIEmulator.getInstance(); emulator.putXlet(0, "com.jesyre.test.tv.JUGSIXlet", "com.jesyre.test.tv.JUGSIXlet", null); } ... |
Bibliografia
DVB-HTML – an optional declarative language within MHP 1.1
DVB-MHP/Java TvTM Data Transport Mechanisms – John Jones
JavaTV™ API Technical Overview
Autori
Valeria Abbate
Giacomo Veneri