Sistemi efficienti con autenticazione per TV Digitale - tlc.unife.it
Sistemi efficienti con autenticazione per TV Digitale - tlc.unife.it
Sistemi efficienti con autenticazione per TV Digitale - tlc.unife.it
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Univers<strong>it</strong>à degli studi di Ferrara<br />
FACOLTA’ DI INGEGNERIA<br />
Corso di Laurea Specialistica in Ingegneria Informatica e<br />
dell’ Automazione<br />
<strong>Sistemi</strong> <strong>efficienti</strong> <strong>con</strong><br />
<strong>autenticazione</strong> <strong>per</strong> <strong>TV</strong> <strong>Dig<strong>it</strong>ale</strong><br />
Tesi di laurea di:<br />
ELISA BENETTI<br />
Anno Accademico 2007/2008<br />
i<br />
Relatore:<br />
Prof. Ing. GIANLUCA MAZZINI
Desidero <strong>per</strong> prima cosa ringraziare il mio relatore, il Prof. Ing. Gianluca<br />
Mazzini <strong>per</strong> avermi assist<strong>it</strong>a ed aiutata durante il <strong>per</strong>iodo della tesi e <strong>per</strong><br />
avermi dato l’ opportun<strong>it</strong>à di collaborare <strong>con</strong> Lepida<strong>TV</strong>.<br />
Ringrazio chi, seppur così lontano, è sempre nel mio cuore.<br />
Ringrazio gli amici, che nonostante i miei <strong>per</strong>iodi di assenza <strong>per</strong> lo studio,<br />
sono sempre stati al mio fianco ed hanno saputo aspettarmi, ed i colleghi<br />
che sono sempre stati un valido e sicuro sostegno nella mia v<strong>it</strong>a<br />
univers<strong>it</strong>aria.<br />
Grazie a mio padre, che c’è sempre stato nel momento del bisogno.<br />
Grazie alle zie che mi hanno sempre sostenuta <strong>con</strong> slancio ed affetto.<br />
Infine, un ringraziamento particolare a mia madre che ha sempre creduto<br />
in me e, pur essendo di un pianeta totalmente diverso dal mio, <strong>per</strong> prima<br />
ha cap<strong>it</strong>o ed accettato le mie att<strong>it</strong>udini e mi ha spronata e sostenuta negli<br />
studi, ed in ogni altra mia scelta, tutti i giorni della mia v<strong>it</strong>a.<br />
ii
Indice<br />
Introduzione 5<br />
1. . <strong>TV</strong> dig<strong>it</strong>ale terrestre interattiva 7<br />
1.1. Struttura trasmissiva ........................................................................ 7<br />
1.2. Il Transport Stream .......................................................................... 8<br />
1.3. Service Information Tables ........................................................... 11<br />
1.3.1. Struttura delle tabelle SI ....................................................... 12<br />
1.4. Il protocollo DSM-CC .................................................................. 13<br />
1.5. Gli standard di trasmissione ........................................................... 16<br />
1.6. Lo standard MHP ........................................................................... 17<br />
1.6.1. Standard di base ................................................................... 17<br />
1.6.2. Arch<strong>it</strong>ettura .......................................................................... 18<br />
1.6.3. Esecuzione delle applicazioni .............................................. 20<br />
1.6.4. Pofili .................................................................................... 20<br />
1.6.4.1. Enhanced Broadcasting ............................................ 21<br />
1.6.4.2. Interactive Broadcasting .......................................... 22<br />
1.6.4.3. Internet Access ......................................................... 23<br />
1.6.5. Il decoder interattivo ............................................................ 23<br />
1.6.6. Interattiv<strong>it</strong>à forte e debole ................................................... 25<br />
2. Xlet e piattaforme di emulazione 27<br />
2.1. Il software stack ............................................................................ 27<br />
2.2. Le API Java<strong>TV</strong> ............................................................................. 28<br />
2.2.1. Ciclo di v<strong>it</strong>a di una Xlet ........................................................ 29<br />
2.2.2. Contesto di applicazione ....................................................... 30<br />
2.3. Interfaccia grafica ......................................................................... 33<br />
2.3.1. HAVi level 2 GUI ................................................................. 33<br />
2.3.1.1. Coordinate in MHP ................................................... 39<br />
2.3.1.2. HScene e HsceneTemplate ....................................... 40<br />
iii
2.3.1.3. ... Il set di widgets HAVi .............................................. 42<br />
2.3.1.4. Il Controllo remoto ...................................................... 43<br />
2.4. Emulatori Open-Source ................................................................. 44<br />
2.4.1. Xle<strong>TV</strong>iew ............................................................................ 45<br />
2.4.1.1. Lim<strong>it</strong>i ris<strong>con</strong>trati .......................................................... 48<br />
3. Meccanismi di <strong>autenticazione</strong> <strong>con</strong> bassa interattivi 51<br />
3.1. Modello standardizzato ................................................................. 52<br />
3.2. Scelta della bassa interattiv<strong>it</strong>à e sue problematiche ....................... 53<br />
3.3. Ottimizzazioni ................................................................................ 54<br />
4. Esempio di implementazione 57<br />
4.1. Accessibil<strong>it</strong>à ed usabil<strong>it</strong>à ................................................................ 57<br />
4.2. Implementazione della grafica ....................................................... 61<br />
4.3. Struttura dei file ............................................................................. 64<br />
5. Funzionamento su Lepida <strong>TV</strong> 69<br />
5.1. OpenCaster ...................................................................................... 69<br />
5.1.1. PMT e AIT Tables ................................................................ 69<br />
5.1.2. Generazione di uno stream DSM-CC ................................... 71<br />
5.1.3. Multiplexing ......................................................................... 72<br />
5.2. Messa in onda su Lepida<strong>TV</strong> .......................................................... 73<br />
5.3. Adattamento Web parallelo ........................................................... 76<br />
6. Conclusioni e sviluppi futuri ............................................................. 79<br />
7. Elenco delle figure .............................................................................. 81<br />
8. Bibliografia e s<strong>it</strong>ografia ..................................................................... 83<br />
iv
Introduzione<br />
Negli ultimi anni è evidente come la tecnologia dig<strong>it</strong>ale stia prendendo il<br />
sopravvento su quella analogica portando ad un miglioramento della<br />
qual<strong>it</strong>à offerta all’ utente grazie soprattutto alla compressione dei segnali ed<br />
alla riduzione del rumore presente.<br />
In questo <strong>con</strong>testo si inserisce il DVB (Dig<strong>it</strong>al Video Broadcasting): un<br />
insieme di standard a<strong>per</strong>ti ed accettati a livello internazionale, atti allo<br />
sviluppo e la diffusione della televisione dig<strong>it</strong>ale.<br />
Nello specifico del nostro Paese lo sw<strong>it</strong>ch-off da analogico a dig<strong>it</strong>ale si<br />
distribuirà nella varie regioni dall’ anno corrente fino al 2012, <strong>con</strong> una<br />
stima di 37 milioni di utenti “dig<strong>it</strong>ali” già nel 2010.<br />
Questa evoluzione tecnologica porterà ad avere ovviamente un<br />
miglioramento della qual<strong>it</strong>à dell’ immagine, un aumento del numero di<br />
canali disponibili e soprattutto, nov<strong>it</strong>à su cui si basa questa tesi, l’<br />
interattiv<strong>it</strong>à, possibile tram<strong>it</strong>e l’introduzione della nuova tecnologia MHP<br />
(Multimedia Home Platform).<br />
Gli studi che verranno qui illustrati sono stati effettuati all’ interno di<br />
Lepida<strong>TV</strong>, canale dig<strong>it</strong>ale della Regione Emilia Romagna che punta a<br />
fornire ai c<strong>it</strong>tadini molteplici servizi erogati da Comuni, Province, Enti<br />
Locali e Regione stessa. L'innovativ<strong>it</strong>à nei servizi offerti da Lepida<strong>TV</strong><br />
<strong>con</strong>siste nel cercare una standardizzazione delle interfacce e soprattutto<br />
nella velocizzazione dell'accesso ai dati, al fine di <strong>con</strong>sentire all’ utente una<br />
navigazione su un insieme di dati nettamente maggiore rispetto a quanto<br />
avviene nelle implementazioni tipicamente utilizzate.<br />
L’ interattiv<strong>it</strong>à offerta si può definire ‘debole’ in quanto Lepida <strong>TV</strong> non<br />
utilizza un canale di r<strong>it</strong>orno, ma scarica sul decoder dell’ utente tutte le<br />
informazioni disponibili dando all’atto della navigazione una parvenza di<br />
interattiv<strong>it</strong>à, <strong>per</strong> questo motivo la mole di dati da trattare risulta notevole.<br />
Nel primo cap<strong>it</strong>olo si comincia quindi <strong>con</strong> una parte teorica che analizza la<br />
struttura del dig<strong>it</strong>ale terrestre. Più nello specifico è strutturato in tre parti: la<br />
prima si occupa della descrizione di un Transport Stream, la se<strong>con</strong>da tratta<br />
più in dettaglio il protocollo di trasporto DSM-CC, infine si prende invece<br />
5
in <strong>con</strong>siderazione lo standard MHP, la sua arch<strong>it</strong>ettura ed i profili esistenti,<br />
soffermandosi sulle differenze tra interattiv<strong>it</strong>à forte e debole.<br />
Nel se<strong>con</strong>do si introduce la descrizione di applicazioni interattive nel<br />
dig<strong>it</strong>ale terrestre partendo dal sistema sottostante ad esse, ovvero l’<br />
ambiente Java e le specifiche API Java<strong>TV</strong> e passando poi ad una breve<br />
descrizione delle funzional<strong>it</strong>à che tali applicazioni, chiamate Xlet,<br />
fornis<strong>con</strong>o. L’ ultima parte del cap<strong>it</strong>olo è dedicata invece all’ emulatore<br />
open source che abbiamo utilizzato <strong>per</strong> le applicazioni MHP, XletView<br />
spiegandone le caratteristiche principali ed i lim<strong>it</strong>i da noi ris<strong>con</strong>trati.<br />
Nel terzo si comincia ad illustrare il serivzio implementato, partendo dalla<br />
scelta di un modello standardizzato e le soluzioni adottate <strong>per</strong> ottimizzare le<br />
tempistiche di navigazione.<br />
Nel quarto vi sono invece una parte dedicata alla struttura dei file<br />
ottimizzata <strong>per</strong> la navigazione di grandi quant<strong>it</strong>à di <strong>con</strong>tenuti, ed un'altra<br />
sulle scelte grafiche dovute all’ obiettivo di Lepida <strong>TV</strong> di offrire usabil<strong>it</strong>à<br />
ed accessibil<strong>it</strong>à, avendo come utenti un target ampio come può essere<br />
quello di tutti i c<strong>it</strong>tadini della Regione: dalla casalinga al giovane, dall’<br />
anziano a chiunque si trovi ad avere più familiar<strong>it</strong>à <strong>con</strong> il televisore<br />
piuttosto che <strong>con</strong> il Web.<br />
Nel quinto ed ultimo cap<strong>it</strong>olo si parte <strong>con</strong> una breve panoramica del<br />
funzionamento del software open source OpenCaster, <strong>per</strong> spiegare poi<br />
come grazie a questo, sono state effettuate le messe in onda dei servizi su<br />
Lepida<strong>TV</strong>.<br />
6
Cap<strong>it</strong>olo 1<br />
Aspetti tecnici della <strong>TV</strong> dig<strong>it</strong>ale<br />
Per comprendere il funzionamento della tv dig<strong>it</strong>ale terrestre è necessario<br />
dapprima capire come il segnale viene gest<strong>it</strong>o al fine di <strong>con</strong>tenere sia il<br />
flusso audio/video che i dati necessari alle applicazioni interattive.<br />
1.1 Struttura trasmissiva<br />
La struttura trasmissiva di un sistema broadcast dig<strong>it</strong>ale può essere<br />
schematizzata come in figura 1.1.<br />
In questa struttura tram<strong>it</strong>e un encoder il segnale analogico viene <strong>con</strong>vert<strong>it</strong>o<br />
in uno dig<strong>it</strong>ale <strong>con</strong> formato MPEG-2, chiamato transport stream. Lo<br />
stream creato può essere di due tipologie: la prima a <strong>con</strong>stant b<strong>it</strong> rate, in<br />
cui si ha appunto b<strong>it</strong> rate costante: in caso il segnale risulti troppo<br />
complesso <strong>per</strong> essere codificato nel b<strong>it</strong> rate specifico viene ridotta la<br />
qual<strong>it</strong>à, in caso <strong>con</strong>trario vengono aggiunti invece pacchetti nulli fino al<br />
raggiungimento del b<strong>it</strong> rate corretto, sprecando <strong>per</strong>ò così la banda a<br />
disposizione. La se<strong>con</strong>da tipologia è invece a b<strong>it</strong> rate variabile in cui la<br />
banda utilizzata varia in base alla compless<strong>it</strong>à del segnale.<br />
Figura 1.1: Struttura trasmissiva del sistema dig<strong>it</strong>ale terrestre<br />
7
In segu<strong>it</strong>o un multiplexer prende uno o più stream MPEG e li associa in un<br />
singolo transport stream occupandosi di inserire un insieme di servizi all’<br />
interno della banda prefissata a disposizione della rete.<br />
I segnali dig<strong>it</strong>ali così ottenuti non possono essere trasmessi direttamente ma<br />
devono prima essere modulati e poi <strong>con</strong>vert<strong>it</strong>i in segnali analogici <strong>per</strong><br />
trasmetterli usando segnali radio o segnali elettrici su cavo. Un modulatore<br />
produce quindi un segnale analogico dato un transport stream in ingresso<br />
modulando il segnale a bassa frequenza <strong>per</strong> poi farlo <strong>con</strong>vertire ad alta<br />
frequenza da un up<strong>con</strong>verter e passarlo al sistema di trasmissione<br />
composto da trasmett<strong>it</strong>ore ed antenna.<br />
1.2 Il Transport Stream<br />
Il segnale dig<strong>it</strong>ale televisivo è trasmesso come uno stream di dati MPEG-2,<br />
chiamato transport stream. Ogni transport stream ha un tasso di dati<br />
su<strong>per</strong>iore a 24 Mb<strong>it</strong>/s, sufficiente <strong>per</strong> 7/8 canali televisivi distinti. Inoltre è<br />
composto da un insieme di sotto-stream, chiamati elementary stream,<br />
ognuno dei quali può <strong>con</strong>tenere o una traccia audio codificata MPEG-2, o<br />
una traccia video MPEG-2 o dati incapsulati in uno stream MPEG-2.<br />
Ogni stream elementare ha un identificativo di pacchetto, <strong>con</strong>osciuto come<br />
PID, che lo identifica univocamente all’ interno del transport stream. Non<br />
possono quindi due elementary stream all’interno dello stesso flusso di<br />
trasporto avere il PID uguale: questo non è un problema grave dal<br />
momento che il PID è formato da 13 b<strong>it</strong> e vi sono quindi 2 13 PID diversi da<br />
poter assegnare.<br />
La generazione di un flusso di trasporto avviene multiplexando più flussi<br />
elementari: <strong>per</strong> prima cosa si codificano l’ audio e il video separatamente e<br />
in se<strong>con</strong>da istanza vi si aggiunge la parte <strong>con</strong>tenente i dati delle<br />
applicazioni. I vari flussi generati sono poi suddivisi in transport packet,<br />
dove ogni pacchetto è lungo 188 byte: il multiplexer prende quindi questi<br />
pacchetti e li inserisce nel transport stream. Con questo meccanismo si<br />
ottiene un transport stream finale <strong>con</strong>tenente un certo numero di elementery<br />
stream senza <strong>per</strong>ò indicare quali tipi di dati vengono trasportati, né come<br />
ricostruire tali stream nel ricev<strong>it</strong>ore. Per risolvere questo problema vengono<br />
quindi aggiunte in fase di multiplexing altre informazioni sottoforma di<br />
8
ulteriori stream elementari <strong>per</strong> fornire informazioni di servizio, chiamati<br />
infatti service information.<br />
Questi non sono altro che tabelle, ognuna delle quali descrive un servizio<br />
<strong>con</strong>tenuto nel transport stream indicando gli elementary stream che<br />
formano un servizio, i PID degli stream ed i tipi di dati <strong>con</strong>tenuti.<br />
Figura 1.2: Struttura di un transport stream<br />
L’ utilizzo di queste tabelle è molto vantaggioso in quanto porta ad un<br />
possibile riuso dello stesso elementary stream in servizi diversi.<br />
Figura 1.3: Suddivisione del transport Stream in più servizi diversi<br />
Riassumendo quindi lo schema, come si può vedere in figura 1.3, uno<br />
stream di trasporto è un flusso MPEG-2 che <strong>con</strong>tiene numerosi servizi,<br />
ogni servizio è legato ad un singolo canale televisivo ed è formato da una<br />
9
serie di eventi <strong>con</strong>secutivi, ogni evento è uno spettacolo televisivo ed è<br />
formato da più stream elementari che sono composti a loro volta da dati,<br />
audio e video codificati in MPEG-2.<br />
La figura 1.4 invece mostra un transport stream reale, ripreso da un<br />
transport stream analyzer. Nelle prima colonna indica il tipo di stream, la<br />
se<strong>con</strong>da il PID associato a ciascun flusso elementare, ed infine il b<strong>it</strong> rate<br />
<strong>per</strong> ciascun stream elementare, sia in forma grafica che numerica, in<br />
Mb<strong>it</strong>/s.<br />
Figura 1.4: Esempio di Transport Stream Analyzer<br />
Oltre al raggruppamento fisico appena descr<strong>it</strong>to, i servizi vengono<br />
raggruppati anche in modo logico tram<strong>it</strong>e un bouquet, che <strong>per</strong>mette di<br />
suddividere i servizi in modo da indirizzarli solo a chi ha determinato<br />
privilegi, vediamolo <strong>con</strong> un esempio. Un broadcaster deve trasmettere 30<br />
canali, essendo il transport stream lim<strong>it</strong>ato a 40 Mb/s, gestendo quindi circa<br />
7/8 canali, serviranno 4 transport stream <strong>per</strong> trasmetterli tutti. Supponiamo<br />
quindi che un utente possa acquistare, ad esempio, un pacchetto base di 10<br />
canali, un pacchetto di sport <strong>con</strong> 5 canali tematici, o un pacchetto cinema<br />
da 3 canali. Il pacchetto base comprende troppi canali <strong>per</strong> essere <strong>con</strong>tenuto<br />
interamente nello stesso transport stream, si comprende quindi come l’ idea<br />
10
di identificare un pacchetto in base al transport stream di appartenenza sia<br />
fallimentare. Per questo motivo si è pensato invece di raggruppare i canali<br />
in bouquet logici ed assegnare un bouquet ad ogni pacchetto.<br />
1.3 Service Information Tables<br />
Come spiegato in precedenza le service information sono flussi elementari<br />
speciali che <strong>con</strong>tengono un database, diviso in tabelle, che descrive la<br />
struttura dello stream di trasporto ed i servizi. Alcune tabelle descrivono i<br />
servizi specifici <strong>con</strong>tenuti nel transport stream, mentre altri, più generali,<br />
descrivono la struttura del transport stream stesso. In alcuni casi questi<br />
particolari elementary stream vengono trasmessi <strong>con</strong> un PID fissato così da<br />
rendere più facile la loro ricerca ai decoder, in altri casi i PID delle SI sono<br />
memorizzati in un’ altra tabella SI.<br />
Le tabelle che si trovano in un flusso si trasporto DVB sono le seguenti:<br />
• PAT (Program Association Table): è una tabella fondamentale, l’<br />
unica che viene trasmessa <strong>con</strong> PID fisso e descrive la quant<strong>it</strong>à dei<br />
servizi <strong>con</strong>tenuti nel transport stream indicando <strong>per</strong> ognuno di essi<br />
un riferimento alla tabella PMT che ne elenca i componenti<br />
elementari;<br />
• PMT (Program Map Table): <strong>con</strong>tiene l’elenco degli elementi che<br />
compongono un servizio. In base alle informazioni in essa <strong>con</strong>tenute,<br />
il decoder individua in quali pacchetti del transport stream sono<br />
<strong>con</strong>tenuti il video, l’audio e gli elementi aggiuntivi da mostrare sullo<br />
schermo. Il PMT non viene trasmesso <strong>con</strong> un PID prefissato ed esiste<br />
un PMT <strong>per</strong> ogni servizio <strong>con</strong>tenuto nel transport stream;<br />
• NIT (Network Information Table): identifica il transport stream<br />
<strong>con</strong>tenuto nella frequenza sintonizzata e riporta informazioni che si<br />
riferis<strong>con</strong>o alle proprietà fisiche del canale di trasmissione utilizzato.<br />
Contiene inoltre il nome del Network ed il relativo ID, che identifica<br />
univocamente la rete che trasmette lo stream di trasporto, e può<br />
differire dall’ ID della rete originale in caso il flusso sia r<strong>it</strong>rasmesso.<br />
• SDT (.Service Description Table): <strong>con</strong>tiene informazioni che<br />
descrivono i servizi trasmessi nel transport stream. A differenza della<br />
PMT esiste un'unica SDT interna ad uno stream di<br />
11
trasporto.Tipicamente <strong>con</strong>tiene il nome del servizio, il relativo ID e<br />
lo stato del servizio stesso.<br />
• EIT (Event Information Table): <strong>con</strong>tiene le informazioni che<br />
descrivono i singoli programmi trasmessi sui servizi della tv dig<strong>it</strong>ale<br />
terrestre, come ad esempio il nome dello spettacolo, la durata, ora e<br />
inizio.<br />
• CAT (Cond<strong>it</strong>ional Access Table): <strong>con</strong>tiene informazioni che<br />
<strong>con</strong>sentono, all’utente che ne ha il dir<strong>it</strong>to, di visualizzare<br />
correttamente i programmi criptati.<br />
• BAT (Bouquet Association Table): elenca e descrive i canali e i<br />
servizi che sono raggruppati in base a particolari esigenze.<br />
• TDT (Time Defin<strong>it</strong>ion Table) e TOT (Time Offset Table): fornis<strong>con</strong>o<br />
un riferimento temporale <strong>per</strong> lo stream. La TDT <strong>con</strong>tiene l’ ora<br />
corrente al meridiano zero, mentre TOT <strong>con</strong>tiene l’ offset <strong>per</strong> avere<br />
l’ ora locale.<br />
• AIT (Application Information Table): Tabella extra, defin<strong>it</strong>a da MHP<br />
segnala la presenza di un’applicazione interattiva all’interno del<br />
transport stream, e <strong>con</strong>tiene le informazioni necessarie al decoder <strong>per</strong><br />
eseguire l’applicazione ed avvisare l’utente della sua disponibil<strong>it</strong>à.<br />
Avrà quindi una voce <strong>per</strong> ogni applicazione presente <strong>per</strong> quel<br />
servizio e comprenderà: un identificatore univoco formato da<br />
organization ID, a 32 b<strong>it</strong>, unico <strong>per</strong> ogni organizzazione che produce<br />
applicazioni MHP e application ID di 16 b<strong>it</strong>. Vi è inoltre uno status<br />
indicator che indica se l’ applicazione deve essere avviata<br />
automaticamente quando viene selezionato il servizio, se deve essere<br />
terminata automaticamente da un ricev<strong>it</strong>ore, o se un utente può<br />
avviarla manualmente. Infine l’ application local descriptor<br />
identifica l’object carousel che <strong>con</strong>tiene l’applicazione.<br />
1.3.1 Struttura delle tabelle SI<br />
La struttura della varie tabelle SI risulta abbastanza simile, formata da un<br />
header segu<strong>it</strong>o da zero o più descr<strong>it</strong>tori i quali referenziano le informazioni<br />
a loro attribu<strong>it</strong>e in una determinata riga del database. I descr<strong>it</strong>tori sono<br />
soggetti ad un riuso che li fa quindi comparire in diversi tipi di tabella,<br />
rendendo così più semplice l’ analisi delle informazioni.<br />
12
I descr<strong>it</strong>tori più usati sono quelli qui di segu<strong>it</strong>o illustrati:<br />
• service_descriptor: nella SDT identifica il nome ed il tipo di servizio.<br />
• linkage_descriptor: allocato in diverse tabelle, fornisce riferimenti ad<br />
altre informazioni su un elemento inerente alle SI, come ad esempio<br />
un link ad un canale televisivo che prende le veci di un se<strong>con</strong>do<br />
servizio bloccato.<br />
• component_descriptor: nella EIT procura informazioni che riguardano<br />
il flusso elementare, come ad esempio il tipo, il formato, e nel caso<br />
di uno stream audio, la lingua.<br />
• data_broadcast_id_descriptor: si trova nella PMT e <strong>con</strong>tiene<br />
informazioni sul tipo di codifica utilizzata da uno stream dati.<br />
• stream_identifier_descriptor: anch’ esso nella PMT, serve <strong>per</strong><br />
attribuire un tag ad uno stream elementare al fine di indentificarlo<br />
univocamente.<br />
• CA_identifier_descriptor: compare in varie tabelle ed identifica il<br />
sistema di cifratura quando questo è presente.<br />
1.4 Il protocollo DSM-CC<br />
Il DSM-CC, ovvero Dig<strong>it</strong>al Storage Media – Command and Control, è uno<br />
standard <strong>per</strong> la trasmissione di dati basato sullo stream MPEG, e viene<br />
usato <strong>per</strong> trasmettere le applicazioni ai ricev<strong>it</strong>ori, fornendo un <strong>con</strong>trollo dei<br />
server video MPEG in una rete <strong>con</strong> play, stop e pausa di un video o audio.<br />
I sistemi broadcast sono di natura unidirezionale: questo indica che un<br />
ricev<strong>it</strong>ore non può richiedere un file specifico dal server, come avviene<br />
invece <strong>per</strong> i PC. Come soluzione il broadcaster trasmette <strong>per</strong>iodicamente<br />
ogni file del filesystem, ed il ricev<strong>it</strong>ore resta in attesa <strong>per</strong> quelli che gli<br />
interessano, esattamente come avviene <strong>per</strong> il teletext attuale: le pagine sono<br />
identificate dal loro numero univoco e vengono trasmesse<br />
<strong>con</strong>tinuativamente in rotazione, quando l’ utente seleziona un numero di<br />
pagina la televisione attende che la pagina venga trasmessa, <strong>per</strong> poi<br />
decodificarla e visualizzarla. Questo tipo di soluzione è chiamata carousel.<br />
Il DSM-CC supporta due tipo di carousel. Il primo, data carousel, <strong>con</strong>siste<br />
in una serie di moduli in cui ognuno <strong>con</strong>tiene un dato come un file, il<br />
13
modulo può essere diviso a blocchi <strong>per</strong> facil<strong>it</strong>arne la trasmissione. Questo<br />
va bene <strong>per</strong> il teletext o una applicazione molto semplice ma non fornisce<br />
informazioni sulla natura dei dati e <strong>per</strong> le applicazioni MHP `e un grande<br />
problema, poiché è importante <strong>con</strong>oscere la struttura dei file e delle<br />
directory <strong>per</strong> distinguere il codice delle applicazioni dalle risorse.<br />
La se<strong>con</strong>da tipologia è l’ object carousel che è costru<strong>it</strong>o in cima ad un<br />
modello data carousel estendendolo <strong>con</strong> il <strong>con</strong>cetto di file, directory e<br />
stream, <strong>per</strong>mettendo ad un carousel di <strong>con</strong>tenere un vero e proprio<br />
filesystem ed un insieme di directory. Ogni object carousel <strong>con</strong>siste in un<br />
directory tree, suddiviso in una serie di moduli, ognuno dei quali è di<br />
dimensione 64 KB e può <strong>con</strong>tenere uno o più file. Non è <strong>per</strong>messo inserire<br />
file in un modulo <strong>per</strong> dimensione su<strong>per</strong>iore a 64 KB, né suddividere i file in<br />
più moduli, così se si ha un file di dimensione maggiore a 64 KB, deve<br />
essere inser<strong>it</strong>o in un proprio modulo, che <strong>con</strong>terrà solo quel file. I file<br />
<strong>con</strong>tenuti in un modulo non devono appartenere alla stessa directory ma<br />
possono provenire da qualsiasi parte dell’ albero. Ad esempio, supponiamo<br />
di voler trasmettere la seguente struttura di figura 1.5:<br />
Figura 1.5: Esempio di file da trasmettere in un carousel<br />
Per prima cosa inseriamo in un modulo i primi due file index.html e<br />
image1.jpg, non possiamo aggiungervi anche il terzo, image2.jpg in quanto<br />
la grandezza del modulo su<strong>per</strong>erebbe i 64 KB. Si può invece aggiungere il<br />
file clip1.aiff ed aggiungere l’ annotazione della directory audio senza<br />
causare problemi. Il file image2.jpg è più grande di 64 KB e viene inser<strong>it</strong>o<br />
14
in un modulo a parte. Infine i file <strong>con</strong>tenuti nella directory classi vanno<br />
suddivisi in due moduli non potendo rientrare tutti nello stesso: <strong>per</strong> prima<br />
cosa inserendo la entry della directory e poi aggiungendo più file possibili.<br />
In questo caso aggiungeremo Main.class e Other.class, mentre Big.class<br />
sarà inser<strong>it</strong>a in un ultimo modulo.<br />
Figura 1.6: Trasmissione dei moduli<br />
I moduli vengono quindi trasmessi sequenzialmente uno dopo l’altro, <strong>per</strong><br />
poi ricominciare dal primo e <strong>per</strong> accedere ad un file il ricev<strong>it</strong>ore deve<br />
aspettare che arrivi il modulo <strong>con</strong>tenente il file che gli serve: questo può<br />
essere poco efficiente se la mole dei dati inviati è grande. Per questo<br />
motivo molti ricev<strong>it</strong>ori hanno una cache che memorizza file singoli o<br />
moduli interi. Inoltre quando si trasmette un DSM-CC carousel, si possono<br />
trasmettere i moduli più di una volta, come si può vedere in figura 1.6: in<br />
questo modo si può ridurre il tempo di accesso ai file più utilizzati,<br />
ovviamente a discap<strong>it</strong>o di quelli meno usati che avranno un tempo di<br />
ricezione maggiore, dal momento che il carousel avrà un incremento della<br />
dimensione totale.<br />
15
1.5 Gli standard di trasmissione<br />
Creato il transport stream, questo deve ovviamente essere inviato in<br />
qualche modo ai vari Set Top Box. Per quanto riguarda la trasmissione dei<br />
programmi televisivi mediante segnali dig<strong>it</strong>ali, il <strong>con</strong>sorzio DVB ha<br />
sviluppato tre classi standard diverse, le cui differenze si basano soprattutto<br />
sul mezzo attraverso il quale passa il <strong>con</strong>tenuto informativo:<br />
• DVB-S: questo standard viene utilizzato <strong>per</strong> le trasmissioni dig<strong>it</strong>ali<br />
satell<strong>it</strong>are (non solo <strong>TV</strong> ma anche internet via satell<strong>it</strong>e). Per la<br />
ricezione, oltre al Set Top Box, è quindi richiesta un’ antenna<br />
parabolica.<br />
• DVB-C: in questo caso invece lo standard prevede l’ utilizzo di una<br />
fibra ottica <strong>per</strong> la creazione di reti televisive su cavo. La<br />
realizzazione di queste reti presenta diffivoltà dal punto di vista<br />
topografico ( difficile infatti raggiungere alcune particolari zone del<br />
terr<strong>it</strong>torio come quelle montane) e finanziarie, essendo molto alto il<br />
costo <strong>per</strong> la costruzione di una rete televisiva di questo tipo.<br />
• DVB-T: è lo standard <strong>per</strong> le trasmissioni dig<strong>it</strong>ali terrestri, rilasciato fin<br />
dal 1997. Utilizza le frequenze VHF/UHF e <strong>per</strong>mette di trasmettere<br />
dai 4 ai 7 canali dig<strong>it</strong>ali dove adesso può trans<strong>it</strong>are un solo canale<br />
analogico. Questo sistema di trasmissione è il più diffuso in quanto<br />
<strong>per</strong>mette di riutilizzare le vecchie antenne usate <strong>per</strong> la ricezione dei<br />
canali analogici, <strong>per</strong> cui l’ utente dovrà solamente fornirsi un Set Top<br />
Box <strong>per</strong> la decodifica del segnale dig<strong>it</strong>ale.<br />
Figura 1.7: I tre standard DVB<br />
D’ ora in poi verranno trattate le tecnologie che <strong>per</strong>mettono l’<br />
implementazione di servizi interattivi (MHP) nella distribuzione del<br />
segnale dig<strong>it</strong>ale <strong>per</strong> via terrestre (DVB-T).<br />
16
1.6 Lo standard MHP<br />
MHP, ovvero Multimedia Home Platform è uno standard molto giovane<br />
rilasciato dal DVB project nella sua prima versione nel 2000. DVB ha<br />
prodotto un’ insieme di specifiche che definis<strong>con</strong>o una piattaforma<br />
middleware e da qui si è defin<strong>it</strong>a l’ intero<strong>per</strong>abil<strong>it</strong>à tra le applicazioni<br />
interattive ed i terminali su cui possono essere esegu<strong>it</strong>e. Durante la<br />
creazione del pacchetto MHP, il DVB Project ha scelto di utilizzare Java<br />
<strong>per</strong> il core del middleware così da <strong>per</strong>mettere ai forn<strong>it</strong>ori di servizi di poter<br />
sviluppare, seguendo lo standard DVB-MHP , i propri servizi in modo<br />
indipendente dal sistema di ricezione sottostante.<br />
Infine, c’è da notare come alcuni elementi di MHP vengano forn<strong>it</strong>i da altre<br />
organizzazioni: <strong>per</strong> esempio le applicazioni java si basano sulle API<br />
Java<strong>TV</strong>, mentre <strong>per</strong> l’ interfaccia grafica vengono utilizzate le API HAVI.<br />
1.6.1 Standard di base<br />
Figura 1.8: Set top box MHP<br />
Lo standard di base specifica in quale ambiente si possono eseguire le<br />
applicazioni <strong>per</strong> la tv interattiva dig<strong>it</strong>ale, indipendentemente da hardware e<br />
software sottostant, ed è defin<strong>it</strong>o dalla specifica MHP 1.0 che <strong>con</strong>tiene:<br />
• l’ arch<strong>it</strong>ettura di base dell’ MHP,<br />
• informazioni dettagliate sui profili Enhanced Broadcasting ed<br />
Interactive <strong>TV</strong>, profili che tratteremo più avanti,<br />
• diversi formati <strong>con</strong>tenuti in MHP tra cui JPEG e MPEG-2 video e<br />
audio,<br />
• protocolli di trasporto, compreso DSM-CC <strong>per</strong> la trasmissione<br />
17
oadcast e IP <strong>per</strong> il canale di r<strong>it</strong>orno eventuale,<br />
• modelli di applicazione DVB-J e DVB-HTML,<br />
• allegati al profilo DSM-CC, una presentazione testuale e varie API.<br />
In un se<strong>con</strong>do momento è stata rilasciata la specifica MHP 1.1, <strong>per</strong><br />
implementare il profilo Internet Access, e <strong>con</strong>tiene:<br />
• informazioni dettagliate sui profili Interactive <strong>TV</strong> ed Internet Access,<br />
• la disponibil<strong>it</strong>à di immagazzinare le applicazioni nella memoria<br />
<strong>per</strong>sistente,<br />
• download delle applicazioni mediante i canali broadcast o di<br />
interazione,<br />
• estensioni al DVB-J <strong>per</strong> supportare meglio le applicazioni e l’ accesso<br />
a lettori di smart card non certificati,<br />
• supporto <strong>per</strong> la gestione di plug-in intero<strong>per</strong>abili<br />
• supporto <strong>per</strong> i riferimenti bidirezionali tra il <strong>con</strong>tanuto di MHP ed il<br />
<strong>con</strong>tenuto Internet.<br />
1.6.2 Arch<strong>it</strong>ettura<br />
L’ arch<strong>it</strong>ettura base della piattaforma MHP è strutturata su tre livelli:<br />
Figura 1.9: I livelli dell’ arch<strong>it</strong>ettura MHP<br />
• Resources: Le risorse e <strong>per</strong>iferiche dell’ MHP sono standardizzate<br />
solo in parte allo stato attuale. Tra le risorse hardware abbiamo:<br />
sintonizzatore, demodulatore hardware MPEG, moduli di accesso<br />
18
<strong>con</strong>dizionato, gestione della grafica, processore, memorie, hard disk.<br />
Tra le <strong>per</strong>iferiche: telecomando, lettore DVD, smart-card.<br />
• System Software: il software di sistema ha accesso diretto alle<br />
informazioni dello stream audio-video in modo <strong>con</strong>forme agli<br />
standard MPEG2 e DVB. Gestisce inoltre le risorse hardware e le<br />
<strong>per</strong>iferiche. Questo livello strutturale include: una macchina virtuale<br />
Java (JVM), pacchetti software <strong>con</strong> funzioni generali (nucleo <strong>con</strong><br />
API Java di Sun) e <strong>con</strong> funzioni specifiche (Java <strong>TV</strong> API,DAVIC e<br />
HAVI), un application manager responsabile della gestione del ciclo<br />
di v<strong>it</strong>a delle applicazioni e i protocolli di trasporto DVB.<br />
• Applications: sono l’ interfaccia tra un servizio interattivo e il display<br />
di visualizzazione e si dividono in 3 categorie:<br />
o residenti: specifiche del decoder cost<strong>it</strong>uis<strong>con</strong>o una<br />
differenziazione dei terminali ed un motivo di competizione<br />
commerciale tra i produttori,<br />
o installabili: offerte dagli o<strong>per</strong>atori di servizi <strong>per</strong> arricchire il<br />
bouquet proposto, sono applicazioni che integrano il<br />
funzionamento di quelle residenti,<br />
o scaricabili, sono facoltative e <strong>con</strong>formi allo standard,<br />
anch’esse offerte dagli o<strong>per</strong>atori <strong>per</strong> l’ arricchimento del<br />
bouquet.<br />
Figura 1.10: L’ arch<strong>it</strong>ettura MHP<br />
19
1.6.3 Esecuzione delle applicazioni<br />
MHP offre la possibil<strong>it</strong>à di implementare applicazioni come: EPG<br />
(Electronic Program Guide), servizi informativi come il su<strong>per</strong> teletext,<br />
servizi interattivi come la navigazione vincolata o la navigazione a<strong>per</strong>ta su<br />
internet, e servizi transattivi come e-commerce.<br />
Nello standard MHP queste applicazioni si chiamano Xlet e possono<br />
<strong>con</strong>tenere solo tipologie spicifiche di dati: classi java, file xml o txt,<br />
immagini png, jpg o gif, audio mp2 e video mpg. Il middleware del<br />
ricev<strong>it</strong>ore <strong>con</strong>tiene un application manager che gestisce il mon<strong>it</strong>oring dei<br />
servizi e la gestione delle applicazioni, segnalando all’utente la lista delle<br />
applicazioni MHP disponibili su quel canale televisivo.<br />
Prima che sia possibile eseguire l’applicazione l’ application manager deve<br />
sa<strong>per</strong>e se è disponibile un’ applicazione MHP e se l’ utente ha il <strong>per</strong>messo<br />
di eseguirla in quel dato momento, infine deve poter accedere alle risorse<br />
necessarie all’ applicazione come i file class e i dati.<br />
Quando l’ utente seleziona una applicazione dalla lista di quele disponibili,<br />
l’ application manager inizia il download in memoria dei moduli relativi<br />
all’ applicazione scelta, partendo dallo scaricare quelli necessari alla<br />
<strong>per</strong>tenza dell’ Xlet, <strong>per</strong> poi scaricare, solo se necessari, quelli rimanenti.<br />
I soggetti che partecipano allo scenario della trasmissione dei segnali<br />
dig<strong>it</strong>ali e delle applicazioni sono:<br />
• Content Producer: elabora le applicazioni MHP.<br />
• Broadcaster: si occupa della diffusione dei canali televisivi e della<br />
aggregazione delle applicazioni interattive.<br />
• O<strong>per</strong>atori di rete MHP: in alcuni casi, ad esempio nella trasmissione<br />
satell<strong>it</strong>are, l’ o<strong>per</strong>atore di rete non coincide <strong>con</strong> il broadcaster,<br />
quindo l’ o<strong>per</strong>atore aggrega le applicazioni prima della trasmissione.<br />
• Vend<strong>it</strong>ore dei terminali MHP: il set top box è il terminale su cui le<br />
applicazioni MHP vengono esegu<strong>it</strong>e.<br />
1.6.4 Profili<br />
Lo standard MHP prevede tre profili, che si riferis<strong>con</strong>o ognuno ad un’ area<br />
applicativa e quindi sono legati alle capac<strong>it</strong>à dei set top box. Ogni profilo è<br />
20
a sua volta diviso in due profili evolutivi. Per ogni profilo sono richieste<br />
determinate dotazioni hardware di cui la piattaforma deve<br />
obbligatoriamente disporre, ed altre invece che sono raccomandate o<br />
opzionali. Varia di <strong>con</strong>seguenza anche la presenza delle interfacce software<br />
necessarie a gestire tali <strong>per</strong>iferiche.<br />
Figura 1.11: I profili MHP<br />
1.6.4.1 Enhanced Broadcasting<br />
Questo è il profilo base che è stato progettato al fine di mostrare le<br />
funzional<strong>it</strong>à del sistema middleware esistente e le applicazioni possibili da<br />
eseguire. Permette servizi di arricchimento del <strong>con</strong>tenuto audio-video come<br />
<strong>con</strong>tenuti multimediali, EPG, su<strong>per</strong> teletext, e giochi, che vengono<br />
memorizzati nella memoria del terminale dell’ utente.<br />
Per questo profilo non sono quindi richieste prestazioni elevate nel set top<br />
box, è necessario essere provvisti di un accesso al canale di trasmissione<br />
broadcast mentre la presenza di un canale di r<strong>it</strong>orno è opzionale.<br />
Comprende la Java virtual machine, le API Java DVB, i protocolli di<br />
trasporto broadcast e le opzioni HTML.<br />
21
1.6.4.2 Interactive Broadcasting<br />
Questo è un profilo intermedio che tram<strong>it</strong>e un canale di r<strong>it</strong>orno<br />
obbligatorio, è in grado di fornire servizi multimediali interattivi più<br />
complessi, come la pubblic<strong>it</strong>à interattiva, le transazioni (home-banking, ecommerce).<br />
I servizi interattivi possono essere indipendenti o meno dai<br />
<strong>con</strong>tenuti trasmessi in broadcast, <strong>per</strong>mettendo anche di rendere i <strong>con</strong>tenuti,<br />
ricevibili da tutti gli utenti, accessibili solo da che ne possiede l’<br />
autorizzazione.<br />
In questo profilo la navigazione Internet è implic<strong>it</strong>a, ciè trasparente all’<br />
utente in quanto codificata all’ interno delle applicazioni. Le applicazioni<br />
possono essere scaricabili o residenti, e in quest’ ultimo caso sono<br />
implementate in modo proprietario.<br />
Figura 1.12: Schematizzazione di una catena DTT interattiva<br />
Alcuni di questi servizi potrebbero anche richiedere che le applicazioni<br />
software abbiano accesso ad una o più smart-card, <strong>con</strong>nesse tram<strong>it</strong>e un<br />
lettore embedded nel terminale MHP. Per fornire il canale interattivo sul<br />
set top box sono possibili due modal<strong>it</strong>à: tram<strong>it</strong>e modulo di rete integrato o<br />
modulo di rete esterno. In quest’ ultimo caso la <strong>con</strong>nessione tra il modulo<br />
di rete ed il set top box è realizzata tram<strong>it</strong>e In Home Dig<strong>it</strong>al Network , che<br />
<strong>per</strong>mette l’utilizzo di interfacce stabdard quali Ethernet, Wi-fi o Bluetooth.<br />
22
1.6.4.3 Internet Access<br />
Quest’ ultimo profilo è ancora più complesso e <strong>per</strong>mette, tram<strong>it</strong>e il canale<br />
di r<strong>it</strong>orno, di accedere ai <strong>con</strong>tenuti di Internet e <strong>con</strong>sentirà di effettuare<br />
transazioni commerciali sfruttando i protocolli di sicurezza già sviluppati<br />
<strong>per</strong> Internet. Si può quindi dire che Internet Access rappresenti il vero<br />
punto di <strong>con</strong>vergenza tra le tecnologie informatiche e quelle televisive.<br />
L’ integrazione dei sistemi di accesso <strong>con</strong>dizionato <strong>con</strong> la piattaforma può<br />
essere realizzata:<br />
• Dal costruttore della stessa che quindi, <strong>con</strong>cordandosi <strong>con</strong> gli<br />
o<strong>per</strong>atori dei servizi, individua anche il sistema da integrare,<br />
• Dall’ o<strong>per</strong>atore del servizio televisivo interessato, se il costruttore ha<br />
introdotto nel proprio apparato il dispos<strong>it</strong>ivo standard di Interfaccia<br />
Comune.<br />
Le applicazioni possono quindi <strong>con</strong>trollare le o<strong>per</strong>azioni basilari dei client<br />
residenti su Internet, come web browser ed e-mail.<br />
Per rendere possibili le funzional<strong>it</strong>à descr<strong>it</strong>te ed integrare il formato<br />
applicativo DVB-J, lo standard MHP 1.1 ha defin<strong>it</strong>o un nuovo nuovo tipo<br />
di applicazione opzionale: DVB-HTML, che è un linguaggio di mark-up<br />
basato su HTML e <strong>per</strong>mette ad un ricev<strong>it</strong>ore di presentare le applicazioni<br />
della tv interattiva dig<strong>it</strong>ale in HTML.<br />
Le specifiche DVB-HTML presentano le stesse estensioni e restrizioni<br />
delle specifiche del linguaggio W3C esistente.<br />
1.6.5 Il decoder interattivo<br />
Per ricevere i segnali dig<strong>it</strong>ali del DTT, è necessario quindi avere un<br />
decoder, anche chiamato Set top Box da collegare alla presa d’ antenna ed<br />
al televisore tram<strong>it</strong>e una normalissima presa SCART. Tram<strong>it</strong>e questo<br />
dispos<strong>it</strong>ivo si può innanz<strong>it</strong>utto decodificare il segnale da dig<strong>it</strong>ale ad<br />
analogico <strong>per</strong> gli apparecchi televisivi analogici, ed inoltre si possono<br />
eseguire applicazioni Java grazie alla presenza di una Personal JVM<br />
embedded. Come mostrato in figura 1.13 questo decoder è formato da una<br />
parte hardware (Cpu, memoria, modem), da un sistema o<strong>per</strong>ativo e da una<br />
interfaccia MHP.<br />
23
Figura 1.13: Schematizzazione della struttura di un Set Top Box<br />
Più nello specifico dal segnale ricevuto e demodulato si ottiene uno stream<br />
binario che viene elaborato dalla circu<strong>it</strong>eria dig<strong>it</strong>ale, l’ elaborazione del<br />
segnale dig<strong>it</strong>ale viene in segu<strong>it</strong>o effettuata mediante un microprocessore ed<br />
il software ad esso associato. Ogni funzional<strong>it</strong>à implementata dal ricev<strong>it</strong>ore<br />
è <strong>con</strong>trollata via software.<br />
Questo software di gestione può inoltre essere aggiornato da remoto<br />
<strong>per</strong>mettendo il miglioramento delle funzioni già comprese e l’inclusione di<br />
nuove funzional<strong>it</strong>à.<br />
Il modello base di Set Top Box è un semplice ricev<strong>it</strong>ore dig<strong>it</strong>ale <strong>con</strong><br />
possibil<strong>it</strong>à di organizzare le liste dei programmi ed accedere al teletext. I<br />
Set Top Box <strong>con</strong> funzioni avanzate invece si suddividono in tre categorie:<br />
• Livello 1: dotato di interattiv<strong>it</strong>à locale, cioè <strong>con</strong> la possibil<strong>it</strong>à di<br />
scaricare dall’ etere le applicazioni <strong>con</strong> le quali l’ utente può agire<br />
<strong>con</strong> il telecomando.<br />
• Livello 2: offrono invece funzional<strong>it</strong>à multimediali di tipo interattivo<br />
mediante l’ utilizzo del canale di r<strong>it</strong>orno<br />
• Livello 3: è provvisto di interattiv<strong>it</strong>à avanzata, cioè l’accesso al World<br />
Wide Web, e di diversi optional come videoscr<strong>it</strong>tura, videocamera e<br />
microfono<br />
A livello 2 e 3 è necessario quindi un collegamento tra il decoder dell’<br />
utente e quello che viene chiamato “Centro Servizi”.<br />
In questo centro Servizi vengono svolte le seguenti principali o<strong>per</strong>azioni:<br />
24
• Gestione del traffico di richieste provenienti dagli utenti<br />
• Dialogo <strong>con</strong> il broadcaster<br />
• Dialogo <strong>con</strong> i server del forn<strong>it</strong>ore dei servizi<br />
• Trasformare l’ informazione dalla codifica idonea al Set top Box alla<br />
codifica idonea al server del forn<strong>it</strong>ore di servizi<br />
• Ricevere ed inviare informazioni ad ogni utente <strong>con</strong>nesso<br />
Figura 1.14: Modello delle relazioni nella catena DTT<br />
Tutte queste richieste di interazione vengono verificate da opportuni<br />
componenti presenti nel Centro Servizi che, se necessario, si occu<strong>per</strong>anno<br />
in segu<strong>it</strong>o di re<strong>per</strong>ire i dati richiesti dall’ utente dai Service Provider,<br />
se<strong>con</strong>do modal<strong>it</strong>à <strong>con</strong>cordate tra le parti. Come ultimo step il Centro<br />
Servizi provvederà poi ad inviare queste informazioni verso l’ utente finale.<br />
Vediamo ora più approfond<strong>it</strong>amente le differenze che intercorrono tra un’<br />
interattiv<strong>it</strong>à che sfrutti il canale di r<strong>it</strong>orno ed una in cui questo non sia<br />
invece utilizzato.<br />
1.6.6 Interattiv<strong>it</strong>à forte e debole<br />
Da ciò che abbiamo appena visto si può quindi dedurre che i servizi<br />
interattivi <strong>per</strong> il dig<strong>it</strong>ale si suddividono in due grandi tron<strong>con</strong>i a se<strong>con</strong>da<br />
25
che sia o meno utilizzato il canale di r<strong>it</strong>orno. Il canale di r<strong>it</strong>orno <strong>con</strong>siste in<br />
un collegamento fra il box interattivo ed il centro servizi, e può essere<br />
esegu<strong>it</strong>o mediante la linea telefonica PSTN (scelta attualmente utilizzata<br />
dalla total<strong>it</strong>à dei decoder in commercio), un collegamento di tipo ADSL o<br />
un collegamento mediante rete mobile.<br />
Vediamo quindi le due tipologie di interattiv<strong>it</strong>à che si possono sviluppare:<br />
• Interattiv<strong>it</strong>à forte: queste applicazioni ricadono nel profilo<br />
precedentemente illustrato dell’ Interactive Broadcast, e <strong>per</strong> queste<br />
DVB ha defin<strong>it</strong>o protocolli di comunicazione ed interfaccia <strong>con</strong> la<br />
rete in grado di assicurare l’ elevata affidabil<strong>it</strong>à che questi servizi<br />
richiedono. Si può notare come, dovendo il <strong>con</strong>tenuto essere fru<strong>it</strong>o<br />
solamente nell’ istante in cui viene richiesto, non è rilevante l’<br />
aspetto riguardante la capac<strong>it</strong>à di memorizzazione del decoder o la<br />
presenza di un data carousel <strong>con</strong> ciclo di v<strong>it</strong>a breve. L’ interazione<br />
on-line dell’ utente <strong>con</strong> il forn<strong>it</strong>ore di <strong>con</strong>tenuti <strong>con</strong>sente quindi una<br />
maggiore libertà nella creazione di nuove tipologie di servizi, a<br />
discap<strong>it</strong>ò <strong>per</strong>ò di sicurezza e semplic<strong>it</strong>à.<br />
• Interattiv<strong>it</strong>à debole: dove non è invece presente il canale di r<strong>it</strong>orno, il<br />
telespettatore può accedere a un servizio attraverso un’ applicazione<br />
<strong>con</strong> “interattiv<strong>it</strong>à” locale. Utilizzerà cioè una serie di <strong>con</strong>tenuti<br />
trasmessi ciclicamente mediante il data carousel. Queste applicazioni<br />
possono essere sfruttate al momento o memorizzate nel decoder <strong>per</strong><br />
essere utilizzate successivamente, navigando al loro interno. Nel<br />
caso il Set Top Box disponga di memoria di massa elevata è anche<br />
possibile introdurre servizi basati sul caricamento via etere, o<br />
downloading, di elevate quant<strong>it</strong>à di dati. Questa se<strong>con</strong>da tipologia di<br />
servizi ricade quindi all’ interno del profilo Enhanced Broadcasting.<br />
26
Cap<strong>it</strong>olo 2<br />
Le applicazioni <strong>per</strong> MHP: le Xlet<br />
Per comprendere come sia possibile creare un’ apllicazione interattiva,<br />
dobbiamo prima esaminare le API Java su cui MHP si basa, e in cosa<br />
<strong>con</strong>siste più nello specifico una Xlet.<br />
2.1 Il software stack<br />
Il software stack MHP è molto complesso. Uno degli aspetti più importanti<br />
delle API MHP è che molte di loro possono essere costru<strong>it</strong>e su altre API e<br />
questo <strong>per</strong>mette un approccio modulare nella costruzione del software.<br />
Figura 2.1: Schematizzazione delle API che compongono lo stack MHP<br />
Le API possono essere suddivise in due parti, una delle quali si occupa dei<br />
servizi relativi agli stream MPEG, l’ altra fornisce servizi costru<strong>it</strong>i<br />
direttamente le API pJava. La principale differenza sarà che le API del<br />
primo tipo saranno legate più strettamente alla piattaforma hardware<br />
sottostante.<br />
Il core delle API che si occupano dell’ MPEG sono le API section filtering,<br />
tutte le altre API riguardanti MPEG sono costru<strong>it</strong>e sopra queste. Le API<br />
DSM-CC analizzano le sezioni DSM-CC ed utilizzano le API SI, service<br />
information, <strong>per</strong> cercare nelle tabelle SI quali stream in un servizio<br />
<strong>con</strong>tengono gli object carousel DSM-CC. Le API tuning, sempre tram<strong>it</strong>e le<br />
27
API SI, individuano il transport stream che deve essere visualizzato cosi da<br />
potersi sintonizzare su quello corretto, analogamente le API Java<strong>TV</strong><br />
service selection cercano il servizio che deve essere sintonizzato. Infine le<br />
API service selection usano le API application management <strong>per</strong> terminare<br />
le applicazioni quando viene selezionato un nuovo servizio o viene<br />
distrutto un service <strong>con</strong>text.<br />
Passando alle altre API dobbiamo dire innanz<strong>it</strong>utto che date le differenze<br />
tra MHP e le normali implementazioni Java, sono necessari dei<br />
cambiamenti rispetto all’ AWT <strong>con</strong>osciuto: ad esempio, la maggior parte<br />
dei widget awt sono stati rimossi in quanto la piattaforma MHP non<br />
richiede un window manager. Le API HAVi sono costru<strong>it</strong>e su AWT, quindi<br />
molte classi in Havi sono sottoclassi in AWT, inoltre sono stati aggiunti<br />
nuovi elementi, come ad esempio HScenes. Le API DVB UI, nella maggior<br />
parte dei casi estendono semplicemente le funzional<strong>it</strong>à di AWT. Per ultime<br />
le API UI events reindirizzano l’ input event al normale processo di<br />
gestione degli eventi di AWT.<br />
2.2 Le API Java <strong>TV</strong><br />
Queste API di Sun hanno sicuramente un ruolo fondamentale e fornis<strong>con</strong>o<br />
un set di classi ed interfacce <strong>per</strong> sviluppare servizi interattivi della<br />
telecisione dig<strong>it</strong>ale utilizzando il linguaggio di programmazione Java.<br />
Il loro scopo è quello di accedere alle funzional<strong>it</strong>à dei ricev<strong>it</strong>ori dig<strong>it</strong>ali<br />
quali lo streaming audio e video, l’ accesso ai canali dati, i <strong>con</strong>trolli <strong>per</strong><br />
cambiare canale e quelli <strong>per</strong> l’ interfaccia grafica sul televisore. Fornis<strong>con</strong>o<br />
inoltre alcune importantissime funzional<strong>it</strong>à addizionali come la<br />
sincronizzazione dei media, che <strong>per</strong>mette ai <strong>con</strong>tenuti interattivi di<br />
sincronizzarsi <strong>con</strong> l’ audio-video di un programma televisivo, ed il<br />
<strong>con</strong>trollo del ciclo di v<strong>it</strong>a delle applicazioni. Le API Java <strong>TV</strong> <strong>per</strong>mettono ai<br />
programmatori di non occuparsi dei dettagli specifici dell’ hardware<br />
sottostante e si differenziano dallo standard MHP in quanto non sono<br />
vincolate ai sistemi DVB <strong>per</strong> la <strong>TV</strong> dig<strong>it</strong>ale.<br />
Sono composte da un insieme di pacchetti Java, il più importante dei quali<br />
è appunto javax.tv.xlet che <strong>con</strong>tiene le classi necessarie a gestire il ciclo di<br />
v<strong>it</strong>a delle Xlet.<br />
28
Le Xlet, anche chiamate abblicazioni DVB-J, sono quindi particolari<br />
applicazioni scr<strong>it</strong>te in Java che <strong>con</strong>sistono in un insieme di classi trasmesso<br />
in broadcast. Sono molto simili alle applet: come queste infatti, <strong>per</strong>mettono<br />
ad un software specifico esterno, nel caso MHP l’ application manager, di<br />
<strong>con</strong>trollarne il ciclo di v<strong>it</strong>a, ma la differenza più grande è che un Xlet, al<br />
<strong>con</strong>trario di un’ applet, può essere messa in pausa ed essere riavviata in un<br />
se<strong>con</strong>do momento.<br />
Le interfacce fondamentali da utilizzare sono java.tv.xlet.Xlet e<br />
java.tv.xlet.XletContext, che verranno ora analizzate più nello specifico.<br />
2.2.1 Ciclo di v<strong>it</strong>a di una Xlet<br />
Una Xlet di fatto implementa i 4 metodi presenti in java.tv.xlet.Xlet:<br />
• in<strong>it</strong>Xlet che viene invocato dall’ application manager <strong>per</strong> inizializzare<br />
l’ Xlet;<br />
• startXlet che serve <strong>per</strong> eseguire l’ Xlet;<br />
• pauseXlet <strong>per</strong> mettere in pausa l’ Xlet;<br />
• destroyXlet invocata dall’ application manager alla terminazione dell’<br />
Xlet.<br />
Figura 2.2: Ciclo di v<strong>it</strong>a di un’ Xlet<br />
Il ciclo di v<strong>it</strong>a di una Xlet infatti è caratterizzato da 4 stati:<br />
• Loaded: Xlet creata ma ancora non inizializzata. Se avviene un’<br />
eccezione in questa fase, passa allo stato di Destroy. Una Xlet si<br />
trova in questo stato una sola volta nel suo ciclo di v<strong>it</strong>a.<br />
29
• Paused: L’ Xlet è inizializzata e può trovarsi in questo stato sia dopo<br />
che il metodo in<strong>it</strong>Xlet r<strong>it</strong>orna <strong>con</strong> successo dallo stato Loaded, sia<br />
dopo che il metodo pauseXlet r<strong>it</strong>orna <strong>con</strong> successo dallo stato<br />
Active.<br />
• Active: L’ Xlet è attiva e utilizza le risorse che le servono <strong>per</strong> fornire i<br />
suoi servizi.<br />
• Destroyed: L’ Xlet si predispone alla sua terminazionerilasciando tutte<br />
le risorse in suo possesso.<br />
L’ esempio di una tipica sequenza di ciclo di v<strong>it</strong>a è il seguente:<br />
1. L’ applicazione si trova nello stato Loaded dopo che l’<br />
application manager ha caricato la classe principale della Xlet,<br />
segnalata dal broadcaster, e ne ha creato un’ istanza.<br />
2. Quando l’ utente, o un’ altra Xlet, avvia questa Xlet,<br />
l’application manager invoca il metodo in<strong>it</strong>Xlet e dopo l’<br />
inizializzazione l’ Xlet si trova nello stato Paused, pronta <strong>per</strong><br />
essere esegu<strong>it</strong>a.<br />
3. L’ application manager quindi invoca startXlet segnalando il<br />
passaggio dell’ Xlet dallo stato Paused allo stato Active.<br />
4. Durante l’ esecuzione può essere invocato il metodo pauseXlet<br />
che fa passare da Active a Paused l’ Xlet. Questa tornerà allo<br />
stato Active dopo l’ invocazione di startXlet, e ciò può accadere<br />
svariate volte nella v<strong>it</strong>a di un’ Xlet.<br />
5. Alla fine del ciclio di v<strong>it</strong>a. L’ application manager invoca<br />
destroyXlet, <strong>con</strong> cui l’ Xlet passa allo stato Destroyed, liberando<br />
tutte le risorse, e a questo punto non può più essere richiamata.<br />
2.2.2 Contesto di applicazione<br />
Ogni Xlet ha un <strong>con</strong>testo di applicazione, chiamato XletContext che è un’<br />
istanza della classe javax.tv.xlet.XletContext che prevede i seguenti metodi:<br />
• notifyDestroyed;<br />
• notifyPaused;<br />
• getXletPro<strong>per</strong>ty;<br />
• resumeRequest.<br />
30
I primi due metodi notifyDestroyed e notifyPaused <strong>per</strong>mettono ad una Xlet<br />
di notificare al decoder che l’applicazione sta <strong>per</strong> terminare o <strong>per</strong> mettersi<br />
in pausacosì che il ricev<strong>it</strong>ore possa <strong>con</strong>oscere lo stato di ogni applicazione<br />
e possa effettuare le azioni appropriate. Questi metodi devono essere<br />
richiamati immediatamente prima che l’Xlet entri negli stati Paused o<br />
Destroyed, <strong>per</strong> ev<strong>it</strong>are che il ricev<strong>it</strong>ore possa effettuare alcune o<strong>per</strong>azioni<br />
<strong>per</strong> le quali l’applicazione non è pronta.<br />
Per passare dallo stato Paused allo stato Active l’ Xlet può usare il metodo<br />
resumeRequest, che richiede che un’applicazione venga fatta partire<br />
nuovamente, anche se il software del ricev<strong>it</strong>ore potrebbe scegliere di<br />
ignorare questa richiesta a causa di lim<strong>it</strong>i nelle risorse.<br />
Il metodo getXletPro<strong>per</strong>ty <strong>per</strong>mette alla Xlet di accedere alle proprietà<br />
segnalate dal broadcaster. Allo stato attuale è stata defin<strong>it</strong>a una sola<br />
proprietà da Java<strong>TV</strong> e da MHP, XletContext.ARGS, che <strong>per</strong>mette ad<br />
un’applicazione di accedere agli argomenti che le vengono segnalati<br />
tram<strong>it</strong>e AIT.<br />
Analizziamo ora <strong>con</strong> un esempio cosa succede quando una Xlet chiede di<br />
cambiare il proprio stato tram<strong>it</strong>e l’Xlet <strong>con</strong>text, <strong>con</strong>siderando una Xlet che<br />
voglia mettersi in pausa e successivamente richieda di riavviarsi.<br />
1. Innanz<strong>it</strong>utto, l’Xlet notifica al suo Xlet <strong>con</strong>text che si è messa in<br />
pausa, invocando il metodo XletContext.notifyPaused().<br />
2. L’Xlet <strong>con</strong>text inoltra questa informazione all’application manager<br />
presente nel middleware.<br />
3. L’application manager aggiorna il suo stato interno <strong>per</strong> notificare che<br />
l’applicazione si è messa in pausa, quindi l’Xlet si ferma.<br />
Figura 2.3: Dialogo tra applicazione e <strong>con</strong>text <strong>per</strong> la messa in pausa<br />
31
4. Quando un’applicazione vuole riavviare le o<strong>per</strong>azioni, ad esempio<br />
<strong>per</strong>ché è passato un certo tempo prefissato oppure <strong>per</strong>chè l’utente ha<br />
premuto un tasto, viene richiamato dalla Xlet il metodo<br />
XletContext.requestResume().<br />
5. Come accaduto in precedenza, l’Xlet <strong>con</strong>text passa tale richiesta<br />
all’application manager.<br />
6. L’application manager può quindi decidere se riavviare<br />
l’applicazione oppure no. Se la riavvia, aggiorna il proprio stato<br />
interno <strong>per</strong> notificare il cambiamento, quindi chiama il metodo<br />
startXlet() sulla Xlet: come tutte le altre o<strong>per</strong>azioni che <strong>con</strong>trollano il<br />
ciclo di v<strong>it</strong>a della Xlet, questo metodo viene richiamato direttamente<br />
dall’application manager e non attraverso l’Xlet <strong>con</strong>text.<br />
7. Infine l’Xlet riavvierà le proprie o<strong>per</strong>azioni.<br />
Figura 2.4: Dialogo tra applicazione e <strong>con</strong>text <strong>per</strong> il riavvio<br />
Il costruttore della classe principale di ogni Xlet deve essere lasciato vuoto:<br />
quando il middleware avvia un’applicazione, all’inizio crea un’istanza della<br />
classe principale. In questo modo invoca il costruttore di default, se esiste,<br />
ed esegue il codice <strong>con</strong>tenuto. In realtà una Xlet possiede un altro metodo<br />
che deve essere usato <strong>per</strong> questo tipo di setup: il metodo in<strong>it</strong>Xlet(), che<br />
<strong>per</strong>mette un <strong>con</strong>trollo migliore delle o<strong>per</strong>azioni. Tutte le inizializzazioni<br />
devono essere fatte nell’implementazione di questo metodo. Durante<br />
l’inizializzazione, se qualcosa fallisse verrebbe lanciata un’eccezione,<br />
passando direttamente allo stato Destroyed.<br />
32
2.3 Interfaccia grafica<br />
Lo standard MHP basa la creazione di un’ interfaccia grafica sull’ utilizzo<br />
di una parte della classe AWT e di una GUI API appartenente alle<br />
specifiche Havi (Home Audio Video intero<strong>per</strong>abil<strong>it</strong>y).<br />
Per la grafica bisogna necessariamente <strong>con</strong>siderare le seguenti<br />
problematiche:<br />
• Diversi rapporti di formato dei pixel: Possono esserci difetti di<br />
visualizzazione in quanto le Api grafiche assumono che i pixel siano<br />
quadrati, mentre le applicazioni <strong>TV</strong> non usano pixel di questo tipo.<br />
• Diversi rapporti di formato dello schermo: Il rapporto del segnale<br />
video <strong>TV</strong> è passato da 4:3 a widescreen (16:9 o 14:9), o a causa dello<br />
stesso segnale tv o <strong>per</strong> una segnalazione da parte dell’ utente. In<br />
entrambi i casi una grafica non progettata <strong>per</strong> questa tipologia di<br />
formato potrebbe causare molti problemi.<br />
• Translucenza e trasparenza: può essere necessario uno strumento che<br />
renda la grafica trasparente così che l’ utente possa vedere ciò che è<br />
al di sotto di essa.<br />
• Spazio dei colori: Ci deve essere un’ interfaccia hardware che mappi<br />
lo spazio dei colori RGB, che usa Java, nello spazio YUV utilizzato<br />
nei segnali televisivi.<br />
• Impossibil<strong>it</strong>à dell’ uso di Window Manager: <strong>per</strong> la maggior parte di<br />
piattaforme MHP essi sono infatti troppo complessi da usare, servirà<br />
quindi una soluzione alternativa <strong>per</strong> ottenere un’ area su cui inserire<br />
oggetti grafici.<br />
• Differenze di interfaccia utente: un’ applicazione MHP non potrà<br />
avere la focalizzazione di un input (input focus) se un’ altra<br />
applicazione è attiva in quell’ istante.<br />
2.3.1 HAVi level 2 GUI<br />
Lo standard HAVi definisce un ampliamento delle GUI Java standard,<br />
<strong>con</strong>osciuto appunto come HAVi level 2 GUI le cui classi sono <strong>con</strong>tenute nel<br />
package org.havi.ui e sono usate <strong>per</strong> molteplici applicazioni grafiche. All’<br />
interno di questo package vi è un set du GUI extra, create appos<strong>it</strong>amente<br />
<strong>per</strong> l’ utilizzo della grafica su un display televisivo, che soddisfano l’<br />
33
adattamento alle lim<strong>it</strong>azioni e richieste delle specifiche <strong>TV</strong>. Infatti le classi<br />
relative alle GUI HAVi, come ad esempio org.havi.ui.HComponent e<br />
org.havi.ui.HContainer, devono essere utilizzate al posto delle classi<br />
corrispondenti in AWT.<br />
Come si può vedere dalla figura 2.5 il modello grafico defin<strong>it</strong>o dallo<br />
standard MHP si basa su 3 layer:<br />
• Background layer: può <strong>con</strong>tenere un colore o un’ immagine statica,<br />
rappresentata da un particolare frame MPEG-2)<br />
• Video layer: rappresentato dal flusso audio-video del canale <strong>TV</strong> o da<br />
una qualsiasi altra fonte in formato MPEG-2<br />
• Graphic layer: <strong>con</strong>terrà la grafica creata nell’ Xlet, e può essere<br />
strutturato su più livelli sovrapposti.<br />
Figura 2.5: I tre layers del display <strong>TV</strong><br />
Il Graphic layer può avere una risoluzione diversa rispetto a quella del<br />
layer video e di background e può avere un diverso formato dei pixel. I<br />
layer possono essere <strong>con</strong>figurati separatamente in quanto i componenti<br />
responsabili della loro generazione sono diversi. Può comunque esservi<br />
qualche piccola interazione fra questi apparati che porrebbe così vincoli<br />
sulla <strong>con</strong>figurazione di uno o più strati.<br />
Nell’ amb<strong>it</strong>o di questa problematica HAVi e MHP definis<strong>con</strong>o la classe<br />
HScreen che rappresenta un apparato di visualizzazione fisico: ogni<br />
ricev<strong>it</strong>ore MHP avrà quindi un’ istanza HScreen <strong>per</strong> ogni display ad esso<br />
34
<strong>con</strong>nesso. Ad ognuno di questi HScreen viene attribu<strong>it</strong>o un numero di<br />
oggetti HscreenDevice, che rappresentano i diversi layer dello schermo:<br />
• HBackgroundDevice, rappresenta il layer di background<br />
• HVideoDevice, rappresenta il layer video<br />
• HGraphicDevice, rappresenta il layer grafico<br />
Vediamo la definizione della classe HScreen:<br />
public class HScreen<br />
{<br />
public static HScreen[] getHScreens();<br />
public static HScreen getDefaultHScreen();<br />
public HVideoDevice[] getHVideoDevices();<br />
public HGraphicsDevice[] getHGraphicsDevices();<br />
public HVideoDevice getDefaultHVideoDevice();<br />
public HGraphicsDevice getDefaultHGraphicsDevice();<br />
public HBackgroundDevice getDefaultHBackgroundDevice();<br />
public HScreenConfiguration[]<br />
getCoherentScreenConfigurations();<br />
public boolean setCoherentScreenConfigurations(<br />
HScreenConfiguration[] hsca);<br />
}<br />
Come si può notare, possiamo ottenere le referenze dei device sopra<br />
descr<strong>it</strong>ti chiamando i metodi appropriati sull’ oggetto HScreen. Possiamo<br />
avere accesso ai device di default, ma nel caso di quelli video e graphic<br />
possono essere presenti ulteriori device ai quali accedere. Ovviamente si<br />
può avere un solo background, ma caratteristiche come “picture-in-picture”<br />
<strong>per</strong>mettono l’ esistenza di video device multipli, e se sono supportati layer<br />
grafici multipli, si puà avere un device grafico <strong>per</strong> ogni layer, come<br />
mostrato nello schema in figura 2.6:<br />
Figura 2.6: Periferiche Video e Grafiche multiple<br />
35
Una volta individuato un device, questa <strong>per</strong>iferica di schermo può essere<br />
<strong>con</strong>figurata <strong>con</strong> istanze della classe HScreenConfiguration e delle sue<br />
sottoclassi. Grazie al loro utilizzo possiamo settare il rapporto di formato<br />
dei pixel, il rapporto del formato video, la risoluzione dello schermo ed<br />
altri parametri che si potrebbe desiderare cambiare. Queste <strong>con</strong>figurazioni<br />
sono impostate utilizzando sottoclassi della classe HScreenConfigTemplate.<br />
L’ oggetto HscreenConfigTemplate prevede un meccanismo che ci<br />
<strong>per</strong>mette di impostare i parametri che desideriamo <strong>per</strong> un determinato<br />
device e si possono avere informazioni sulla possibil<strong>it</strong>à o meno di attribuire<br />
la <strong>con</strong>figurazione ottenuta ad altri display.<br />
Per esaminare il suo funzionamento si prende come esempio una <strong>per</strong>iferica<br />
grafica. La classe HgraphicsDevice ha la seguente interfaccia:<br />
public class HGraphicsDevice extends HScreenDevice {<br />
public HGraphicsConfiguration[]<br />
getConfigurations();<br />
public HGraphicsConfiguration<br />
getDefaultConfiguration();<br />
public HGraphicsConfiguration<br />
getCurrentConfiguration();<br />
public boolean setGraphicsConfiguration(<br />
HGraphicsConfiguration hgc)<br />
throws Secur<strong>it</strong>yException,<br />
HPermissionDeniedException,<br />
HConfigurationException;<br />
public HGraphicsConfiguration getBestConfiguration(<br />
HGraphicsConfigTemplate hgct);<br />
public HGraphicsConfiguration getBestConfiguration(<br />
HGraphicsConfigTemplate hgcta[]);<br />
}<br />
I primi tre metodi illustrati sono abbastanza ovvi e r<strong>it</strong>ornano un elenco di<br />
possibili <strong>con</strong>figurazioni, la <strong>con</strong>figurazione di default e la <strong>con</strong>figurazione<br />
corrente. Il metodo successivo è altrettanto ovvio e ci <strong>per</strong>mette di impostare<br />
la <strong>con</strong>figurazione del dispos<strong>it</strong>ivo. Da notare invece la presenza dell’<br />
eccezione HConfigurationException, che viene lanciata se si tenta di<br />
impostare una <strong>con</strong>figurazione che non è compatibile <strong>con</strong> quelle associate<br />
agli altri schermi. Gli ultimi due metodi risultano invece più interessanti. Il<br />
metodo getBestConfiguration() ha come argomento un oggetto<br />
36
HGraphicsConfigTemplate, sottoclasse di HScreenConfigTemplate. Questo<br />
<strong>per</strong>mette all’ utente di costruire una maschera, settare alcune preferenze e<br />
vedere qual’ è la migliore <strong>con</strong>figurazione che può essere generata, data l’<br />
attuale <strong>con</strong>figurazione degli altri dispos<strong>it</strong>ivi. La variante di questo metodo<br />
prende un array di oggetti HGraphicsConfigTemplate e r<strong>it</strong>orna la struttura<br />
migliore dopo averli esaminati tutti. Una volta che abbiamo la<br />
<strong>con</strong>figurazione adatta possiamo settarla tram<strong>it</strong>e il metodo<br />
setGraphicsConfiguration().<br />
Come abbiamo già visto le API HAVi utilizzano la classe<br />
HScreenConfigTemplate <strong>per</strong> definire una serie di preferenze di<br />
<strong>con</strong>figurazione. Questa classe definisce costanti che referenziano ogni<br />
possibile preferenza, dando la possibil<strong>it</strong>à di attribuire ad ognuna di esse un<br />
livello di prior<strong>it</strong>à. ZERO_GRAPHICS_IMPACT e ZERO_VIDEO_IMPACT<br />
sono preferenze che vengono utilizzate <strong>per</strong> specificare che la<br />
<strong>con</strong>figurazione non deve interferire <strong>con</strong> applicazioni grafiche già in corso o<br />
in fase di riproduzione video. VIDEO_GRAPHICS_PIXEL_ALIGNED<br />
invece indica che i pixel nel layer video e nel layer grafico devono essere<br />
allineati in modo <strong>per</strong>fetto.<br />
La parte più interessante è comunque quella che riguarda le prior<strong>it</strong>à che<br />
viene assegnata ad ogni preferenza. Queste possono assumere uno dei<br />
seguenti valori:<br />
• REQUIRED, indica che la preferenza deve essere rispettata<br />
• PREFERRED, indica che la preferenza dovrebbe essere rispettata, ma<br />
se necessario, può essere ignorata<br />
• UNNECESSARY, indica che l’ applicazione non ha bisogno di un<br />
valore specifico da attribuire a questo tipo di preferenza<br />
• PREFERRED_NOT, indica che la preferenza non dovrebbe assumere<br />
il valore specificato, ma lo può fare se r<strong>it</strong>enuto strettamente<br />
necessario<br />
• REQUIRED_NOT, indica che la preferenza non deve <strong>per</strong> alcun<br />
motivo assumere il valore specificato.<br />
Questo <strong>per</strong>metta all’ applicazione di avere un buon grdo di libertà nelle<br />
specifiche della <strong>con</strong>figurazione, e allo stesso tempo dà comunque modo al<br />
ricev<strong>it</strong>ore di essere flessibile in corrispondenza delle esigenze degli<br />
applicativi, in virtù della presenza di altre applicazioni e di vincoli imposti<br />
37
dalle <strong>con</strong>figurazioni delle altre <strong>per</strong>iferiche.<br />
Quando l’ applicazione chiama il metodo<br />
HGraphicsDevice.getBestConfiguration(), il ricev<strong>it</strong>ore <strong>con</strong>trolla le<br />
preferenze specificate nell’ HScreenConfigTemplate e tenta di trovare una<br />
<strong>con</strong>figurazione che soddisfi tutte le richieste indicate come REQUIRED e<br />
REQUIRED_NOT, rispettando i vincoli imposti dalle altre applicazioni. Se<br />
tutto va a buon fine, il metodo rest<strong>it</strong>uisce un oggetto<br />
HGraphicsConfiguration che rappresenta la nuova <strong>con</strong>figurazione o NULL<br />
se i vincoli non possono essere rispettati.<br />
Per ciascuna delle tre classi del dispos<strong>it</strong>ivo HBackgroundDevice,<br />
HVideoDevice e HGraphicsDevice si hanno nomi analoghi <strong>per</strong> le classi di<br />
<strong>con</strong>figurazione, HBackgroundConfiguration, HVideoConfiguration e<br />
HGraphicsConfiguration, e così pure <strong>per</strong> le maschere di <strong>con</strong>figurazione:<br />
HBackgroundConfigTemplate, HVideoConfigTemplate ed infine<br />
HGraphicsConfigTemplate.<br />
Appare evidente come un tipo di <strong>con</strong>figurazione possa cambiare mentre un’<br />
applicazione è in esecuzione. Dal momento che gli applicativi <strong>per</strong><br />
piattaforma MHP hanno necessariamente bisogno di sa<strong>per</strong>e se le proprietà<br />
del display sono cambiate, la classe HScreenDevice <strong>per</strong>mette loro di<br />
aggiugersi al sistema nel ruolo di “ascoltatori”, ovvero listener, di eventi<br />
HScreenConfigurationEvent utilizzando il metodo<br />
addScreenConfigurationListener(). Grazie a questo un’ applicazione può<br />
quindi accorgersi di cambiamenti nella <strong>con</strong>figurazione del display e reagire<br />
di <strong>con</strong>seguenza.<br />
Il layer di Background in un ricev<strong>it</strong>ore MHP è in grado di mostrare un<br />
colore solido o un’ immagine. Una applicazione può scegliere quale di<br />
queste due opzioni usare settando le preferenze appropriate nell’<br />
HBackgroundConfigTemplate in fase di <strong>con</strong>figurazione. Se un’<br />
applicazione sceglie l’ opzione immagine, allora la <strong>con</strong>figurazione che<br />
r<strong>it</strong>irnerà sarà una sottoclasse di HBackgroundConfiguration. Questa<br />
sottoclasse, HStillImageBackgroundConfiguration, aggiunge due metodi<br />
extra a quelli standard della classe HBackgroundConfiguration:<br />
public void displayImage(HBackgroundImage image);<br />
public void displayImage(HBackgroundImage image,<br />
HScreenRectangle r);<br />
38
Entrambi I metodi prendono come parametro un HBackgroundImage,<br />
classe progettata <strong>per</strong> manipolare immagini nel layer di background. Questo<br />
differisce dalla classe java.awt.Image dal momento che implementa solo i<br />
metodi necessari <strong>per</strong> visualizzare immagini di sfondo, come vediamo dal<br />
seguante codice:<br />
public class HBackgroundImage<br />
{<br />
public HBackgroundImage(String filename);<br />
public void load(HBackgroundImageListener l);<br />
public void flush();<br />
public int getHeight();<br />
public int getWidth();<br />
}<br />
La classe HBackgroundConfiguration accetta file di tipo .gif, .jpeg, .png o<br />
.mpeg I-frame come argomenti del costruttore, e l’ immagine deve essere<br />
caricata e disposta in modo esplic<strong>it</strong>o usando rispettivamente i metodi load()<br />
e flush().<br />
2.3.1.1 Coordinate in MHP<br />
MHP supporta tre diversi sistemi di coordinate, utilizzati <strong>per</strong> fornire diverse<br />
soluzioni <strong>per</strong> il posizionamento degli oggetti sullo schermo. Differenti API<br />
sono associate a questi sistemi, che elenchiamo qui di segu<strong>it</strong>o:<br />
• Sistema di coordinate normalizzate: Questo sistema ha l’ origine delle<br />
coordinate posta a (0.0,0.0) nell’amgolo in alto a sinistra dello<br />
schermo, <strong>per</strong> raggiungere il valore massimo (1.0,1.0) nell’ angolo in<br />
basso a destra. Con questa modal<strong>it</strong>à si possono posizionare oggetti in<br />
relazione ad altri, senza specificare il valore assoluto delle coordinate<br />
dello schermo. Il sistema a coordinate normalizzate è utilizzato dalle<br />
classi HAVi, specialmente da HScreenPoint e HScreenRectangle.<br />
• Sistema di coordinate schermo: Ha un valore massimo non predefin<strong>it</strong>o<br />
che varia in funzione della <strong>per</strong>iferica: <strong>per</strong> quanto riguarda l’ MHP le<br />
sue specifiche indicano che il valore rifer<strong>it</strong>o alla coordinata x non<br />
deve su<strong>per</strong>are 72, quello della coordinata y non deve invece su<strong>per</strong>are<br />
576. Questo se<strong>con</strong>do spaziodi coordinate è defin<strong>it</strong>o dall’ oggetto<br />
HGraphicsDevice e viene utilizzato da HAVi, nel posizionamento<br />
39
delle Hscene e <strong>per</strong> la <strong>con</strong>figurazione della risoluzione degli oggetti<br />
HScreenDevice.<br />
• Sistema di coordinate AWT: è utilizzato dall’ omonimo package ed è<br />
basato su pixel. Non si riferisce all’intero display ma lla finestra<br />
“radice” dell’ applicativo <strong>per</strong> la quale l’origine è posizionata in alto a<br />
sinistra del <strong>con</strong>tainer AWT, mentre il massimo è in basso a destra<br />
nella finestra che lo stesso <strong>con</strong>tainer referenzia.<br />
Figura 2.7: <strong>Sistemi</strong> di coordinate MHP<br />
2.3.1.2 Hscene e HSceneTemplate<br />
Come già accennato, non è possibile implementare un Window Manager a<br />
causa della lim<strong>it</strong>ata memoria e potenza di calcolo dei set-top-box. Non si<br />
può quindi usare la classe java.awt.Frame come finestra top-level dell’<br />
applicazione. Si usa al suo posto org.havi.ui.HScene che definisce un<br />
oggetto simile come <strong>con</strong>cetto al frame ma <strong>con</strong> svariate lim<strong>it</strong>azioni: ad<br />
esempio un’ applicazione MHP non può accedere a componenti diverse da<br />
quelle inser<strong>it</strong>e nella gerarchia AWT della proprioa Hscene, tutti gl<br />
applicativi quindi sono totalmente isolati dalle altre attiv<strong>it</strong>à grafiche.<br />
Un esempio di questa visibil<strong>it</strong>à è dato dalla figura 2.8 in cuil’applicazione<br />
associata ai componenti blu non può manipolare gli eventi della struttura<br />
rosa poiché sono appartenenti ad un altro applicativo.<br />
Una volta istanziata l’ HScene infatti, l’ applicazione a essa associata non<br />
sarà nemmeno a <strong>con</strong>oscenza dell’ esistenza di altri componenti al di fuori<br />
della propria gerarchia.<br />
40
Figura 2.8: Esempio di visibil<strong>it</strong>à in HScene<br />
Un’ altra differenza tra la classe Frame e quella di HAVi è che mentre in<br />
Java non vi è limiute al numero di frame, in MHP solo una HScene può<br />
essere istanziata. Questo è possibile solo nel caso vi siano più display<br />
disponibili e quindi le HScene sono associate ad HScreen diversi.<br />
Per istanziare una HScene si utilizza la classe HSceneFactory, mentre la<br />
classe HSceneTemplate <strong>per</strong>mette di specificare vincoli come la grandezza,<br />
la locazione, ed attribuire a questi elementi una certa prior<strong>it</strong>à come si può<br />
notare dalla classe stessa:<br />
public class HSceneTemplate extends Object {<br />
}<br />
// prior<strong>it</strong>ies<br />
public static final int REQUIRED;<br />
public static final int PREFERRED;<br />
public static final int UNNECESSARY;<br />
// possible preferences that can be set<br />
public static final Dimension LARGEST_DIMENSION;<br />
public static final int GRAPHICS_CONFIGURATION;<br />
public static final int SCENE_PIXEL_RESOLUTION;<br />
public static final int SCENE_PIXEL_RECTANGLE;<br />
public static final int SCENE_SCREEN_RECTANGLE;<br />
// methods to set and get prior<strong>it</strong>ies<br />
public void setPreference(<br />
int preference,<br />
Object object,<br />
int prior<strong>it</strong>y);<br />
public Object getPreferenceObject(int preference);<br />
public int getPreferencePrior<strong>it</strong>y(int preference);<br />
Analizzando le prior<strong>it</strong>à, quelle unnecessary vengono ignorate nel momento<br />
in cui si crea un’ istanza HScene, quelle referred sono <strong>con</strong>siderate solo se<br />
41
la piattaforma MHP le supporta, e quelle required non devono essere<br />
ignorate: se non si ries<strong>con</strong>o a soddisfare tutte, l’ applicazione chiamata non<br />
potrà mai istanziare una HScene.<br />
La classe HSceneFactory definisce i metodi seguenti:<br />
public class HSceneFactory extends Object{<br />
public static HSceneFactory getInstance();<br />
public HSceneTemplate getBestSceneTemplate(<br />
HSceneTemplate hst);<br />
public HScene getBestScene(HSceneTemplate hst);<br />
public void dispose(HScene scene);<br />
public HSceneTemplate resizeScene(<br />
HScene hs,<br />
HSceneTemplate hst)<br />
throws java.lang.IllegalStateException;<br />
public HScene getSelectedScene(<br />
HGraphicsConfiguration selection[],<br />
HScreenRectangle screenRectangle,<br />
Dimension resolution);<br />
public HScene getFullScreenScene(<br />
HGraphicsDevice device,<br />
Dimension resolution);<br />
}<br />
Dove, ad esempio, getBestScene prende come argomento unn<br />
HSceneTemplate e r<strong>it</strong>orna, se tutti i vincoli sono rispettati, un HScene,<br />
oppure NULL. Una volta ottenuta l’ HScene se ne può disporre <strong>con</strong> il<br />
metodo dispose. Il getBestSceneTemplate invece <strong>per</strong>mette all’ applicativo<br />
di negoziare <strong>con</strong> la piattaforma <strong>per</strong> l’ uso delle risorse disponibili.<br />
2.3.1.3 Il set di widgets HAVi<br />
HAVi Level 2 GUI offre un set di widget che può essere utilizzato in modo<br />
sost<strong>it</strong>utivo a quelli mancanti di AWT e sono il set standard che ci si aspetta<br />
da un qualunque sistema GUI:<br />
• Bottoni, check-boxes e radio buttons<br />
• I<strong>con</strong>e<br />
• Liste corredate di scroll<br />
• Finestre di dialog<br />
• Campi di testo<br />
42
Questi sono in effetti molto simili alle classi AWT. Ad esempio se<br />
vogliamo implementare una label utilizzeremo la classe Htext, che<br />
comprende un numero notevole di metodi <strong>per</strong> la gestione della stessa: dal la<br />
dimensione, al posizionamento, fino alla gestione del focus che <strong>per</strong>mette<br />
una navigazione grafica.<br />
2.3.1.4 Il <strong>con</strong>trollo remoto<br />
Un decoder MHP si interfaccia <strong>con</strong> l’ utente tram<strong>it</strong>e il <strong>con</strong>trollo del<br />
telecomando. Vengono riportate in figura 3.9 tutti i key event possibili<br />
specificando il nome della costante, il relativo pulsante ed il codice<br />
associato.<br />
I codici di VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT e VK_ENTER<br />
sono defin<strong>it</strong>i dalla piattaforma Java e sono gli unici sicuramente ricevibili<br />
su qualsiasi decoder MHP, mentre <strong>per</strong> altri il telecomando può generare<br />
codici differenti. La lista completa degli eventi è descr<strong>it</strong>ta nella classe<br />
org.havi.ui.event.HrcEvent.<br />
Nel modello <strong>con</strong>venzionale Java standard è da ricordare che purtroppo un<br />
componente può ricevere un evento da tastiera solo dopo esser stato<br />
focalizzato. Per questo motivo è stato creato il package org.dvb.event che<br />
definisce un’ API che <strong>per</strong>mette alle applicazioni di avere accesso agli<br />
eventi prima che essi entrino nel meccanismo di gestione di AWT.<br />
Nome della costante Key Key code<br />
VK_UP Freccia verso l’alto Non standardizzata<br />
VK_DOWN Freccia verso il basso Non standardizzata<br />
VK_LEFT Freccia sinistra Non standardizzata<br />
VK_RIGHT Freccia destra Non standardizzata<br />
VK_ENTER Tasto OK Non standardizzata<br />
VK_0 to VK_9 Tasti numerici 48-57<br />
VK_EXIT Tasto EXIT Non standardizzata<br />
VK_COLORED_KEY_0 Tasto rosso 403<br />
VK_COLORED_KEY_1 Tasto verde 404<br />
VK_COLORED_KEY_2 Tasto giallo 405<br />
VK_COLORED_KEY_3 Tasto blu 406<br />
Figura 2.9: Key event <strong>per</strong> il <strong>con</strong>trollo remoto<br />
43
Una classe che implementa UserEventListener può ricevere un evento<br />
anche se l’ applicativo non ha un componente focalizzato dall’ utente.<br />
Prima di poter ricevere segnalazioniè necessario istanziare un<br />
UserEventRepos<strong>it</strong>ory che definisce i seguenti metodi <strong>per</strong> abil<strong>it</strong>are e<br />
disabil<strong>it</strong>are il ricev<strong>it</strong>ore alla ricezione di gruppi di tasti:<br />
public class UserEventRepos<strong>it</strong>ory {<br />
}<br />
public UserEventRepos<strong>it</strong>ory (String name);<br />
public void addUserEvent (UserEvent event);<br />
public UserEvent[] getUserEvent ();<br />
public void removeUserEvent (UserEvent event);<br />
public void addKey (int keycode);<br />
public void removeKey (int keycode);<br />
public void addAllNumericKeys();<br />
public void addAllColourKeys();<br />
public void addAllArrowKeys();<br />
public void removeAllNumericKeys();<br />
public void removeAllColourKeys();<br />
public void removeAllArrowKeys();<br />
Una volta che l’ applicazione ha defin<strong>it</strong>o il set di tasti tram<strong>it</strong>e i quali è<br />
abil<strong>it</strong>ata a ricevere eventi, si può utilizzare la classe EventManager <strong>per</strong><br />
richiedere l’ accesso alle segnalazioni elencate. EventManager è defin<strong>it</strong>a da<br />
un oggetto unico, che viene istanziato tram<strong>it</strong>e il metodo EventManager.<br />
getInstance(). Dopo l’ istanziazione si usano i metodi<br />
addUsereventListener() e removeUserEventListener() <strong>per</strong> aggiungere e<br />
rimuovere “ascoltatori” <strong>per</strong> il set di eventi defin<strong>it</strong>i dall’ oggetto<br />
UserEventRepos<strong>it</strong>ory.<br />
2.4 Emulatori Open Source<br />
I software Open Source che <strong>per</strong>mettono di emulare una piattaforma MHP<br />
attraverso un Personal Computer, sono attualmente davvero pochi. Tra di<br />
essi spicca senza dubbio Xle<strong>TV</strong>iew, che è il più usato tra gli sviluppatori di<br />
applicazioni <strong>per</strong> il dif<strong>it</strong>ale, nonostante non sia in grado ancora di emulare in<br />
tutto e <strong>per</strong> tutto un ricev<strong>it</strong>ore MHP.<br />
44
2.4.1 Xle<strong>TV</strong>iew<br />
L’ unico prerequis<strong>it</strong>o <strong>per</strong> l’ utilizzo di Xle<strong>TV</strong>iew è quello di aver installato<br />
sul proprio pc il supporto Java 2 Runtime Environment SE v1.4 o<br />
successive versioni.<br />
Xle<strong>TV</strong>iew può essere scaricato in formato .zip, nella sua ultima versione,<br />
xletview-0.3.6, rilasciata il 06 Giugno 2004. L’ installazione <strong>con</strong>siste<br />
semplicemente nella decompressione del file scaricato, nella directory da<br />
cui desideriamo eseguire il programma, <strong>per</strong> poi poterlo da lì lanciare <strong>con</strong><br />
java –jar xletview.jar. Il file xletview.jar è in effetti l’ applicazione<br />
Xle<strong>TV</strong>iew stessa ed include tutte le classi delle API MHP necessarie all’<br />
esecuzione delle applicazioni in Xle<strong>TV</strong>iew. Gli altri file .jar <strong>con</strong>tenuti nell’<br />
appos<strong>it</strong>a directory del programma, sono semplicemente usati da Xle<strong>TV</strong>iew<br />
e non devono essere quindi inclusi nelle applicazioni che si intendono<br />
sviluppare.<br />
Figura 2.10: Esempio di Implementation status di Xle<strong>TV</strong>iew<br />
Nel s<strong>it</strong>o da cui è possibile effettuare il download del file si uò anche<br />
visualizzare, alla pagina http://xletview.sourceforge.net/status/statuscurrent.html,<br />
l’ attuale elenco completo delle classi già implementate<br />
(segnalate da un quadrato verde), quelle in costruzione (quadrato giallo),<br />
quelle implementate ma <strong>con</strong> bug ri<strong>con</strong>osciuti (quadrato blu) e quelle non<br />
implementate (quadrato rosso).<br />
L’ interfaccia grafica iniziale di Xle<strong>TV</strong>iew è quella che vediamo in figura<br />
4.2: essa simula uno schermo televisivo, <strong>con</strong> alla sua destra un telecomando<br />
dotato dei principali tasti presenti sui telecomandi dei decoder MHP.<br />
45
Cliccando su questi tasti si interagisce <strong>con</strong> l’ applicazione simulando il<br />
<strong>con</strong>trollo remoto che si avrebbe nella realtà.<br />
Figura 2.11: Interfaccia grafica iniziale di Xle<strong>TV</strong>iew<br />
Ogni <strong>TV</strong> ha una lista di canali disponibili, e Xle<strong>TV</strong>iew offre la possibil<strong>it</strong>à<br />
di gestirli. I pulsanti + e – presenti nel telecomando, infatti, non<br />
interagis<strong>con</strong>o <strong>con</strong> gli applicativi ma <strong>per</strong>mettono di “cambiare canale”. Ciò<br />
è possibile ed<strong>it</strong>ando il file \<strong>con</strong>fig\channels.xml:<br />
<br />
<br />
<br />
Nome del primo canale<br />
defaultbg.jpg<br />
<br />
<br />
All’ interno del tag media, che segnala cosa mostrare in background, vi può<br />
essere o un’ immagine jpg, di 720x576 pixel, o un file .avi codificato <strong>con</strong> il<br />
codec Cinepack, unico formato attualmente supportato.<br />
Non tutti i televisori sono in grado di visualizzare la stessa area dello<br />
schermo: fino al 10% dell’ immagine può essere <strong>per</strong>sa <strong>per</strong> overscan e un<br />
ulteriore 10% può soffrire di distorsione. Per aiutare lo sviluppatore<br />
Xle<strong>TV</strong>iew mostra un marcatore <strong>per</strong> indicare quali parti dello schermo sono<br />
all’interno della zona di sicurezza. Come impostazione predefin<strong>it</strong>a è un<br />
marcatore di colore giallo che indica una zona rientrante 10 pixel dai bordi<br />
46
dello schermo, è possibile <strong>per</strong>ò <strong>con</strong>figurare la zona di sicurezza nel file<br />
<strong>con</strong>fig/settings.txt che <strong>con</strong>tiene le seguenti opzioni:<br />
• safearea.show: attiva/disattiva la visualizzazione del marcatore<br />
(default: vero);<br />
• safearea.color: colore del marcatore (default: #ffee00)<br />
• safearea.height: altezza della zona di sicurezza (default: 556)<br />
• safearea.width: larghezza della zona di sicurezza (default: 700)<br />
• safearea.x: pixel di distanza dal bordo sinistro (default: 10)<br />
• safearea.y: pixel di distanza dal bordo in alto (default: 10)<br />
Infine è possibile <strong>con</strong>figurare la visualizzazione del telecomando: tram<strong>it</strong>e il<br />
file <strong>con</strong>fig\remote_<strong>con</strong>trol.xml si può cambiare il numero di pulsanti, la<br />
loro posizione a la KEY a loro legata.<br />
Per eseguire un’ applicazione è necessario precedentemente aggiungerla<br />
alla lista di applicazioni in Xle<strong>TV</strong>iew. Una volta laniato il programma,<br />
cliccare su Applications e in segu<strong>it</strong>o su Manage applications. Questo aprirà<br />
una finestra che ci <strong>per</strong>mette di aggiungere directory e nuove applicazioni.<br />
Scelto il nome da dare all’ applicazione, basta scrivere in Path il <strong>per</strong>corso<br />
della directory <strong>con</strong>tenente i file necessari alla sua esecuzione, in Xlet<br />
selezionare la classe di partenza nel caso ve ne siano più di una, ed infine<br />
premere OK e SAVE & CLOSE.<br />
A questo punto cliccando su Applications comparirà anche l’applicazione<br />
da noi inser<strong>it</strong>a, che verrà lanciata cliccandoci sopra, potendo così simulare<br />
la notra Xlet su un televisore.<br />
Quanto appena descr<strong>it</strong>to lo si può realizzare anche tramide un ed<strong>it</strong>ing del<br />
file \<strong>con</strong>fig\applications.xml, come si può vedere nel seguente esempio:<br />
<br />
<br />
<br />
<br />
<br />
Se<strong>con</strong>dXlet<br />
<br />
/home/elisa/workspace/Se<strong>con</strong>dXlet<br />
<br />
Se<strong>con</strong>dXlet <br />
<br />
47
Figura 2.12: Inserimento nuova applicazione in Xle<strong>TV</strong>iew<br />
Precendentemente abbiamo accennato al <strong>con</strong>trollo remoto: questo è<br />
gestibile attraverso l’ utilizzo del mouse sul telecomando visualizzato, ma<br />
anche tram<strong>it</strong>e la tastiera, <strong>con</strong> la seguente mappatura:<br />
• Frecce telecomando = Frecce tastiera<br />
• OK = Invio<br />
• Numeri dei canali = Numeri del KeyPad<br />
• Tasto Rosso = F1<br />
• Tasto Verde = F2<br />
• Tasto Giallo = F3<br />
• Tasto Blu = F4<br />
2.4.1.1 Lim<strong>it</strong>i ris<strong>con</strong>trati<br />
Come è già stato accennato in precedenza, non tutte le caratteristiche<br />
funzionanti sui decoder MHP sono state implementate in Xle<strong>TV</strong>iew,<br />
vediamone una lista un po’ più dettagliata delle principali carenze:<br />
• Video MPEG<br />
• Caricamento di applicazioni da un transport stream<br />
• Le API org.dvb.si e Java<strong>TV</strong> SI<br />
48
• Supporto <strong>per</strong> un object carousel<br />
• Comunicazioni inter-Xlet<br />
• Controllo del ciclo di v<strong>it</strong>a di un’ applicazione<br />
• Supporto <strong>per</strong> dvb:// locators<br />
• Sicurezza<br />
Una discordanza tra ciò che viene visualizzato in Xle<strong>TV</strong>iew e ciò che<br />
realmente si vede su uno schermo televisivo è invece l’utilizzo dei metodi<br />
setBackground( Color c) defin<strong>it</strong>i <strong>per</strong> le classi HAVi come ad esempio<br />
HText e HgraphicButton, mentre sembrano funzionare sull’ emulatore ,<br />
mantengono a prescindere uno sfondo trasparente sul televisore. Questo<br />
comporta l’ obbligo dell’ utilizzo di immagini di sfondo, sia di background,<br />
sia <strong>per</strong> simulare un focus o comunque la variazione del colore di sfondo di<br />
un componente <strong>per</strong> qualunque motivo. Ovviamente ciò implica un peggiore<br />
utilizzo della banda, dovendo trasmettere file .jpg che non dovrebbero<br />
essere necessari.<br />
Una classe che invece è <strong>per</strong>fettamente implementata sui decoder MHP ma<br />
non è utilizzabile sull’ emulatore è la RandomAccessFile. Nel lavoro<br />
effettuato <strong>per</strong> questa tesi, che verrò ampiamente illustrato nel prossimo<br />
cap<strong>it</strong>olo, è stato fondamentale l’ utilizzo di file binari ad accesso casuale,<br />
che vengono appunto gest<strong>it</strong>i in Java dalla classe suddetta. Questo ha creato<br />
non pochi problemi nell’ implementazione dell’ applicazione dal momento<br />
che i test e i debugging non sono più stati possibili su emulatore in locale,<br />
e sono stati fatti direttamente tram<strong>it</strong>e messe in onda sul canale Lepida<strong>TV</strong>.<br />
49
Cap<strong>it</strong>olo 3<br />
Meccanismi di <strong>autenticazione</strong> <strong>con</strong> bassa<br />
interattiv<strong>it</strong>à<br />
Il Piano Telematico Regionale (PiTER) 2007/2009 ha come obiettivo<br />
quello di creare una efficiente base comune di comunicazione sul<br />
terr<strong>it</strong>torio, tram<strong>it</strong>e una nuova rete di <strong>con</strong>nessione a banda larga tra la<br />
Regione e l’ intero sistema degli enti locali: province, comuni, comun<strong>it</strong>à<br />
montane. Lepida<strong>TV</strong> è uno degli strumenti di PiTER al servizio delle<br />
pubbliche amministrazioni e dei c<strong>it</strong>tadini e si propone di combattere il<br />
dig<strong>it</strong>al divide ed il knowledge divide offrendo le stesse opportun<strong>it</strong>à e gli<br />
stessi servizi anche a chi non è provvisto di <strong>con</strong>nettiv<strong>it</strong>à a banda larga.<br />
Lepida<strong>TV</strong> si basa sulla tecnologia dig<strong>it</strong>ale terrestre. Lo sw<strong>it</strong>ch-off<br />
nazionale del sistema televisivo da tecnologico a dig<strong>it</strong>ale è stato<br />
recentemente parzialmente anticipato. Il nuovo calendario indicato dal<br />
decreto ministeriale e presentato il 9 Settembre 2008 ha sanc<strong>it</strong>o uno sw<strong>it</strong>choff<br />
progressivo sul terr<strong>it</strong>torio <strong>it</strong>aliano che, partendo dalla Sardegna nel<br />
2008, terminerà nel 2012 assicurando <strong>per</strong>ò già al 2010, anno in cui avverrà<br />
lo sw<strong>it</strong>ch-off anche nella regione Emilia Romagna, che il 70% della<br />
popolazione vedrà la tv <strong>con</strong> il nuovo segnale dig<strong>it</strong>ale.<br />
Figura 3.1: Calendario grafico dello sw<strong>it</strong>ch-off in Italia<br />
51
I servizi che Lepida<strong>TV</strong> attualmente offre sono quindi quelli che già sono<br />
erogati dai vari enti sul Web, e li riadatta <strong>per</strong> renderli disponibili al<br />
c<strong>it</strong>tadino sulla tv dig<strong>it</strong>ale, tram<strong>it</strong>e l’ interfaccia grafica chiamata “su<strong>per</strong><br />
teletext”, sfruttando una interattiv<strong>it</strong>à di tipo debole, che spiegheremo in<br />
questo cap<strong>it</strong>olo, dove cominciamo ad analizzare l’ implementazione di un’<br />
Xlet provvista di <strong>autenticazione</strong>.<br />
3.1 Modello standardizzato<br />
Per massimizzare la comprensibil<strong>it</strong>à dell’ applicazione, Lepida<strong>TV</strong> ha<br />
deciso di creare un minimo numero di interfacce standardizzate che<br />
possano essere riutilizzate <strong>per</strong> più servizi possibili. Così facendo l’ utente si<br />
troverà a dover capire il funzionamento di 2 o 3 servizi solamente,<br />
r<strong>it</strong>rovando la stessa impostazione grafica e gli stessi tasti di navigazione<br />
anche negli altri.<br />
Lo studio di questa tesi verte sull’ interfaccia standardizzata che <strong>per</strong>metta<br />
di visualizzare <strong>con</strong>tenuti <strong>per</strong>sonalizzati a segu<strong>it</strong>o di un login, ed è<br />
strutturata come illustrato in figura 3.2:<br />
Figura 3.2: Interfaccia Standardizzata<br />
Vi è quindi una fascia su<strong>per</strong>iore riservata ai loghi del servizio e degli Enti<br />
coinvolti, più quello della rete televisiva che trasmette l’ applicazione.<br />
Sub<strong>it</strong>o sotto un’ area dedicata all’ immissione di testo da parte dell’ utente.<br />
52
Vi sono poi due zone verticali: in quella di sinistra vi è la parte di<br />
inserimento dei parametri <strong>per</strong> il login e sotto l’area di visualizzazione dei<br />
<strong>con</strong>tenuti, a destra in alto un resize dell’ audio-video così che l’ utente<br />
abbia sempre sotto <strong>con</strong>trollo la programmazione in trasmissione mentre<br />
naviga, infine in basso la parte dedicata alle istruzioni di navigazione.<br />
Questo modello offre quindi l’opportun<strong>it</strong>à di gestire implementazioni di<br />
servizi diversi che abbiano la stessa necess<strong>it</strong>à: visualizzare <strong>con</strong>tenuti<br />
<strong>per</strong>sonalizzati legati ad una precedente <strong>autenticazione</strong>.<br />
3.2 Scelta della bassa interattiv<strong>it</strong>à e sue problematiche<br />
Come spiegato nel paragrafo 1.5.5, si possono sfruttare due tipologie di<br />
interattiv<strong>it</strong>à a se<strong>con</strong>da che vi sia o meno la presenza di un canale di r<strong>it</strong>orno:<br />
interattiv<strong>it</strong>à forte e debole.<br />
Lepida <strong>TV</strong> ha scelto di utilizzare l’ interattiv<strong>it</strong>à debole, <strong>per</strong> svariati motivi:<br />
innanz<strong>it</strong>utto <strong>per</strong> una maggiore semplic<strong>it</strong>à dello schema trasmissivo, inoltre<br />
<strong>per</strong> problematiche di sicurezza, che senza canale di r<strong>it</strong>orno non si pongono.<br />
Esempio tipico, ben <strong>con</strong>osciuto anche sul Web soprattutto in passato, è il<br />
Dialer: si può vedere in un esempio semplificato nel seguente codice,<br />
quanto sia semplice realizzarne uno da utilizzare poi interponendosi tra l’<br />
utente ed il centro servizi:<br />
public class ReturnChannelXlet<br />
implements Xlet, ResourceClient, ConnectionListener{<br />
private ConnectionParameters getConnectionParameters() throws<br />
UnknownHostException{<br />
return new ConnectionParameters(" ",<br />
"isp","passwd");<br />
}<br />
public void in<strong>it</strong>Xlet(XletContext ctx) throwsXletStateChangeException{<br />
[ ... ]<br />
try{<br />
//Richiesta di un interfaccia al canale di r<strong>it</strong>orno<br />
ConnectionRCInterface cif = getConnectionRCInterface();<br />
[ ... ]<br />
//Richiesta dei parametri di <strong>con</strong>nessione<br />
cif.setTarget(getConnectionParameters());<br />
//Connessione in corso<br />
cif.<strong>con</strong>nect();<br />
}<br />
catch (Exception e) { ... }<br />
}<br />
53
Inoltre, anche riuscendo ad ottenere un buon livello di sicurezza, si deve<br />
ricordare l’ ampio target di utenza di Lepida<strong>TV</strong>: alcune fasce, come ad<br />
esempio gli anziani, o chi comunque non ha molte es<strong>per</strong>ienze <strong>con</strong> la<br />
gestione generica di una <strong>con</strong>nessione, potrebbe rifiutarsi di collegare la<br />
linea telefonica al decoder, <strong>per</strong> la paura di avere spese inattese. Così<br />
facendo, ovviamente, non potrebbero più usufruire dei servizi interattivi,<br />
mentre lo scopo di Lepida<strong>TV</strong> è appunto renderli accessibili a tutti.<br />
La scelta di utilizzare una interattiv<strong>it</strong>à debole ha <strong>per</strong>ò creato alcune<br />
problematiche dal punto di vista implementativo: all’ utente devono essere<br />
infatti inviati tutti i <strong>con</strong>tenuti disponibili, <strong>per</strong> offrirgli poi una<br />
visualizzazione selettiva di questi basati sulle loro selezioni, dando così una<br />
parvenza di interattiv<strong>it</strong>à <strong>con</strong> il Centro Servizi.<br />
Alcune implementazioni reali del modello che stiamo trattando potrebbero<br />
essere le seguenti:<br />
• Informazioni sull'avanzamento delle pratiche di residenza o di<br />
<strong>per</strong>messo di soggiorno<br />
• Verifica dell'<strong>it</strong>er della propria pratica edilizia<br />
• <strong>con</strong>sultazione del cedolino della pensione e verifica dell’avvenuto<br />
pagamento<br />
• Consultazione delle proprie multe<br />
Prendendo in <strong>con</strong>siderazione, ad esempio, l’ ultima, dovranno essere<br />
trasmesse ad ogni utente tutte le multe di tutti i c<strong>it</strong>tadini iscr<strong>it</strong>ti a questo<br />
servizio: ciò si traduce in decine di migliaia di <strong>con</strong>tenuti almeno<br />
lim<strong>it</strong>andosi ad un servizio pensato <strong>per</strong> una sola provincia e <strong>con</strong> una bassa<br />
media di multe. In segu<strong>it</strong>o all’ <strong>autenticazione</strong> l’ utente potrà poi<br />
ovviamente visualizzare solo quelle corrispondenti a username e password<br />
inser<strong>it</strong>i.<br />
3.3 Ottimizzazioni<br />
I Set Top Box attualmente in commercio hanno bassa memoria e<br />
lim<strong>it</strong>atissima capac<strong>it</strong>à di processamento dei dati e quest’ ultimo è un<br />
notevole problema all’ interno della scelta di una interattiv<strong>it</strong>à debole. Pur<br />
essendo infatti i <strong>con</strong>tenuti inser<strong>it</strong>i in file di testo, che sono quindi di lim<strong>it</strong>ate<br />
dimensioni, la navigazione all’ interno di essi può risultare molto rallentata.<br />
54
In prima istanza i <strong>con</strong>tenuti sono stati inser<strong>it</strong>i in normali file di testo letti in<br />
modo sequenziale <strong>con</strong> la seguente struttura:<br />
Figura 3.3: Struttura file sequenziale<br />
Si inizia quindi scrivendo uno username, la password associata, e di segu<strong>it</strong>o<br />
il t<strong>it</strong>olo e il <strong>con</strong>tenuto di ogni notizia legata a quelle credenziali. Si<br />
prosegue poi <strong>con</strong> un altro username, la sua password e le notizie di queste<br />
ultime credenziali, e così via.<br />
Utilizzando questo sistema, anche suddividendo il file principale in più<br />
sottofile, è stato notato come già una navigazione di 40 <strong>con</strong>tenuti possa<br />
dare dei r<strong>it</strong>ardi nell’ordine di 1 se<strong>con</strong>do e arrivando a 100 <strong>con</strong>tenuti si<br />
hanno tempi di caricamento anche di parecchi se<strong>con</strong>di, che senza ogni<br />
dubbio stancano e disorientano l’ utente.<br />
Ciò è dovuto soprattutto alla scansione sequenziale del file, oltre ad una<br />
non ottimizzata struttura: si è pensato quindi di risolvere questa<br />
problematica tram<strong>it</strong>e l’ utilizzo di file binari, che <strong>per</strong>mettono accessi<br />
casuali al <strong>con</strong>tenuto. Un esempio di struttura sarà spiegatonel dettaglio nel<br />
prossimo cap<strong>it</strong>olo.<br />
55
Cap<strong>it</strong>olo 4<br />
Esempio di implementazione<br />
Data quindi l’ interfaccia standard, vediamo le varie scelte implementative<br />
che sono state effettuate <strong>per</strong> la creazione di un servizio, <strong>per</strong> assicurarne una<br />
buona visibil<strong>it</strong>à e comprensibil<strong>it</strong>à, e soprattutto come strutturare le<br />
informazioni da visualizzare in modo che la navigazione risulti rapida e<br />
fluida all’ utente anche in presenza di un numero molto elevato di<br />
<strong>con</strong>tenuti.<br />
4.1 Accessibil<strong>it</strong>à ed usabil<strong>it</strong>à<br />
Essendo il target di utenza di Lepida<strong>TV</strong> l’ intera popolazione, compresi<br />
anziani e <strong>per</strong>sone che non hanno alcun tipo di es<strong>per</strong>ienza sul Web, ma<br />
<strong>con</strong>os<strong>con</strong>o solo l’ utilizzo del semplice telecomando televisivo analogico<br />
<strong>per</strong> re<strong>per</strong>ire informazioni, risulta ovvio che l’ accessibil<strong>it</strong>à e l’ usabil<strong>it</strong>à<br />
sono stati parti fondamentali nello studio di questa applicazione.<br />
Per quanto riguarda l’ inserimento da parte dell’ utente di caratteri<br />
alfanumerici nelle caselle Username e Password, le opzioni erano tre:<br />
• Utilizzo del telecomando visto come quello del cellulare, in cui a ogni<br />
numero sono associate 3 o 4 lettere alfabetiche a se<strong>con</strong>da del numero<br />
delle pressioni del tasto<br />
• Implementazione grafica sull’ applicazione di una tastiera di tipo<br />
QWERTY navigabile<br />
• Inserire una barra grafica, a due dimensioni quindi ,dove<br />
semplicemente scorrendo a destra e sinistra, si può selezionare la<br />
lettera o il numero desiderato.<br />
La prima opzione è stata scartata in quanto non si può pensare che nel vasto<br />
target di utenza siano tutti in grado di usare il cellulare, inoltre la pressione<br />
dei tasti di un telecomando è più difficoltosa, e la scr<strong>it</strong>tura <strong>con</strong> esso<br />
potrebbe risultare problematica anche a chi è ab<strong>it</strong>uato a mandare SMS, e<br />
quindi a questo metodo di scr<strong>it</strong>tura.<br />
57
Anche la se<strong>con</strong>da opzione può risultare poco intu<strong>it</strong>iva a chi, non avendo<br />
es<strong>per</strong>ienze di lavoro <strong>con</strong> un Personal Computer, trovandosi di fronte ad una<br />
tastiera QWERTY si troverebbe spaesato e faticherebbe a trovare le lettere<br />
desiderate.<br />
Per questo si è adottata la terza soluzione, che ad un primo impatto può non<br />
sembrare la più ottimale dal punto di vista delle tempistiche, ma <strong>per</strong> i<br />
motivi sopra c<strong>it</strong>ati è senz’ altro la migliore dal punto di vista dell’ usabil<strong>it</strong>à.<br />
Come si può infine notare dalla figura 4.1, la barra è stata corredata di due<br />
frecce all’ estrema destra e sinistra che segnalano quando sono present altri<br />
caratteri nelle due direzioni, e scompaiono quindi <strong>per</strong> esplic<strong>it</strong>are il focus<br />
sull’ ultimo carattere (freccia destra) e sul primo (freccia sinistra).<br />
Figura 4.1: Barra di navigazione alfanumerica<br />
Una ulteriore importante scelta di usabil<strong>it</strong>à è collegata alla determinazione<br />
dei pulsanti del telecomando da usare <strong>per</strong> interagire <strong>con</strong> l’ applicazione.<br />
Infatti è risultato che <strong>per</strong> chi, soprattutto gli anziani, è ab<strong>it</strong>uato al normale<br />
telecomando della televisione analogica, trova difficoltà nell’<br />
individuazione ed utilizzo di tasti “nuovi” come le frecce direzionali e l’<br />
OK. Si è quindi deciso di utilizzare i tasti numerici, da sempre presenti.<br />
Più nello specifico i tasti 1 e 3 <strong>per</strong> scorrere a destra e sinistra i caratteri, <strong>per</strong><br />
analogia i tasti sub<strong>it</strong>o sotto a questi, ovvero 4 e 6 <strong>per</strong> selezionare Username<br />
o Password, analogamente 7 e 9 <strong>per</strong> visualizzare la notizia precedente o<br />
quella successiva, nel caso ve ne siano più di una disponibile.Infine il tasto<br />
centrale 5 <strong>per</strong> <strong>con</strong>fermare l’ inserimento del carattere selezionato e 2 <strong>per</strong><br />
cancellarlo.<br />
Le istruzioni <strong>con</strong>sistono semplicemente nelle immagini dei tasti numerici<br />
<strong>con</strong> in testa la loro funzione, così da rendere tutto chiaro “a prima vista”,<br />
senza lunghi testi esplicativi da dover leggere.<br />
58
Figura 4.2: Area delle istruzioni di navigazione<br />
Come si vede dalla figura 4.2, i tasti sono divisi a gruppi e sono associati ad<br />
un diverso colore di sfondo. Questo <strong>per</strong>ché gli stessi colori sono riportati<br />
come sfondo nelle parti dell’ apllicazione in cui si interagisce <strong>con</strong> quel<br />
gruppo di tasti, così da renderne ancora più intu<strong>it</strong>ivo il legame all’ utente.<br />
I colori sono stati scelti e testati tram<strong>it</strong>e Contrast Analyzer, software che<br />
<strong>per</strong>mette di determinare la corretta “visibil<strong>it</strong>à del colore” basandosi su due<br />
algor<strong>it</strong>mi sugger<strong>it</strong>i <strong>per</strong> l’ accessibil<strong>it</strong>à dal World Wide Web Consortium<br />
(W3C):<br />
• Differenza di colore: data dalla seguente formula:<br />
(massimo (valore rosso 1, valore rosso 2) - minimo (valore rosso 1, valore<br />
rosso 2)) + (massimo (valore verde 1, valore verde 2) - minimo (valore<br />
verde 1, valore verde 2)) + (massimo (valore blu 1, valore blu 2) - minimo<br />
(valore blu 1, valore blu 2)<br />
Dovrebbe dare una differenza, tra colore di sfondo e colore delle<br />
scr<strong>it</strong>te, su<strong>per</strong>iore o uguale a 500;<br />
• Differenza di luminos<strong>it</strong>à: la formula <strong>per</strong> il calcolo della luminos<strong>it</strong>à è:<br />
((valore del colore rosso X 299) + (valore del colore verde X 587) + (valore<br />
del colore blue X 114)) / 1000<br />
La differenza fra la luminos<strong>it</strong>à dello sfondo e quella del colore<br />
principale dovrebbe essere in questo caso su<strong>per</strong>iore a 125.<br />
• Contrast Ratio: misura la luminanza relativa ed è dato dalla seguente<br />
formula: L = 0.2126 * R + 0.7152 * G + 0.0722 * B<br />
Il rapporto minimo di <strong>con</strong>trasto di luminos<strong>it</strong>à deve essere pari a 5:1<br />
<strong>per</strong> font di dimensione normale e 3:1 <strong>per</strong> lettere grandi nel caso del<br />
livello AA corrispondente al <strong>con</strong>trasto minimo, mentre i valori sono,<br />
59
<strong>per</strong> caratteri normali 7:1 e nel caso di font di grande dimensione 5:1<br />
<strong>per</strong> il livello AAA del <strong>con</strong>trasto esteso.<br />
La figura 4.3 mostra i risultati ottenuti <strong>con</strong> lo sfondo predominante da noi<br />
scelto:<br />
Figura 4.3: Area delle istruzioni di navigazione<br />
Contrast analyzer provvede infine ad emulare la visione di un daltonico,<br />
suddividendo i risultati in tre esempi corrispondenti a tre patologie:<br />
• Protanopia: Cec<strong>it</strong>à <strong>per</strong> il colore rosso<br />
• Deuteranopia: Cec<strong>it</strong>à <strong>per</strong> il colore verde<br />
• Tr<strong>it</strong>anopia: Cec<strong>it</strong>à <strong>per</strong> il colore giallo e blu<br />
Come si vede dalla figura 4.4, <strong>per</strong> tutti i casi i colori scelti soddisfano i<br />
requis<strong>it</strong>i proposti dal W3C:<br />
Figura 4.4: Analisi nei casi di daltonismo<br />
60
Anche <strong>per</strong> gli altri due colori di sfondo sono state ovviamente fatte scelte<br />
di colore in grado di rispettare tutte le specifiche spiegate.<br />
4.2 Implementazione della grafica<br />
Ricordando il ciclo di v<strong>it</strong>a di un’ Xlet, il primo metodo che andiamo ad<br />
analizzare è startXlet() che, venendo lanciato sulla piattaforma MHP alla<br />
richiesta dell’ esecuzione dell’ applicazione, <strong>con</strong>tiene l’ implementazione<br />
di tutta la grafica statica necessaria alla sua visualizzazione.<br />
Per prima cosa ci preoccupiamo di creare un’ istanza di<br />
UserEventRepos<strong>it</strong>ory su cui chiamare i metodi che abil<strong>it</strong>ano il ricev<strong>it</strong>ore<br />
alla ricezione alla ricezione di eventi dai tasti colorati e dai tasti numerici,<br />
<strong>per</strong> poi aggiungerli come “ascoltatori”:<br />
repos<strong>it</strong>ory = new UserEventRepos<strong>it</strong>ory("UserRepos<strong>it</strong>ory");<br />
repos<strong>it</strong>ory.addAllColourKeys();<br />
repos<strong>it</strong>ory.addAllNumericKeys();<br />
manager = EventManager.getInstance();<br />
manager.addUserEventListener(this, repos<strong>it</strong>ory);<br />
Per definire poi l’ HScene, <strong>per</strong> prima cosa istanziamo un HSceneFactory<br />
attraverso il suo costruttore di default, poi utilizziamo un suo metodo <strong>per</strong><br />
creare un HScene a schermo pieno, indirizzando l’ HScreen e la <strong>per</strong>iferica<br />
grafica di default. Per ultima cosa si setta il formato dell’ HScene, il suo<br />
layout e la sua visibil<strong>it</strong>à:<br />
HSceneFactory hsf = HSceneFactory.getInstance();<br />
scene = hsf.getFullScreenScene(<br />
HScreen.getDefaultHScreen().getDefaultHGraphicsDevice());<br />
scene.setSize(720,576);<br />
scene.setLayout(null);<br />
scene.setVisible(true);<br />
61
Aggiungiamo quindi due HContainer che serviranno da <strong>con</strong>ten<strong>it</strong>ori: il<br />
primo <strong>per</strong> l’ immagine di background e il se<strong>con</strong>do <strong>per</strong> i componenti della<br />
classe HAVi:<br />
<strong>con</strong>tbg = new HContainer(0,0,710,567);<br />
<strong>con</strong>t = new HContainer(0,0,710,567);<br />
Potendo infatti lavorare su più livelli di grafica, aggiungendo alla scene i<br />
vari HContainer in un determinato ordine, potremo sovrapporli nella<br />
visualizzazione:<br />
scene.add(<strong>con</strong>t);<br />
scene.add(<strong>con</strong>tbg);<br />
scene.setVisible(true);<br />
scene.repaint();<br />
Nel resto del metodo vengono dimensionati e posizionati tutte le immagini,<br />
i pulsanti (HgraphicButton) e le aree testo (Htext) necessarie alla grafica di<br />
base, seguento il layout descr<strong>it</strong>to al paragrafo precedente.<br />
Le variazioni di grafica dovute alle interazioni <strong>con</strong> l’ utente vengono<br />
specificate, suddivise <strong>per</strong> tasti, nel metodo userEventReceived, di cui ne<br />
vediamo la prima parte:<br />
public void userEventReceived(UserEvent event){<br />
}<br />
sw<strong>it</strong>ch (event.getCode()){<br />
case HRcEvent.VK_7:<br />
if(pressed==true) {…pressed=false;}<br />
else { pressed=true; }<br />
scene.repaint();<br />
break;<br />
[….….]<br />
La presenza dell’ if-else è dovuta al fatto che le istruzioni del case<br />
verrebbero altrimenti esegu<strong>it</strong>e due volte: all’ evento di pressed e all’ evento<br />
di release. La grafica finale è quella presentata in figura 4.5:<br />
62
Figura 4.5: Interfaccia grafica dell’ applicazione<br />
Per quanto riguarda gli altri due importanti stati del ciclo di v<strong>it</strong>a della<br />
nostra applicazione dobbiamo ricordarci che, nel metodo pauseXlet(), di<br />
rimuovere tutti i tasti dallo userRepos<strong>it</strong>ory e tuttii listener dall’<br />
EventManager, così se un altro applicativo entra in esecuzione ed inoltra la<br />
richiesta di ricezione di eventi, non vi saranno <strong>con</strong>fl<strong>it</strong>ti. Inoltre si notifica<br />
alla piattaforma che l’ applicazione è in pausa, tram<strong>it</strong>e il metodo<br />
notifyPaused() chiamato sull’ oggetto <strong>con</strong>text:<br />
public void pauseXlet(){<br />
}<br />
repos<strong>it</strong>ory.removeAllColourKeys();<br />
repos<strong>it</strong>ory.removeAllArrowKeys();<br />
repos<strong>it</strong>ory.removeAllNumericKeys();<br />
manager.removeUserEventListener(this);<br />
<strong>con</strong>text.notifyPaused();<br />
63
Nel caso invece sia richiesta la distruzione dell’ applicazione, il metodo<br />
destroyXlet() compie le stesse azioni di pauseXlet() ed in più pone l’<br />
HScene a null in modo che venga collezionato dal garbage collector:<br />
4.3 Struttura dei file<br />
public void destroyXlet(boolean un<strong>con</strong>d<strong>it</strong>ional)<br />
}<br />
throws XletStateChangeException{<br />
if (un<strong>con</strong>d<strong>it</strong>ional) {<br />
repos<strong>it</strong>ory.removeAllColourKeys();<br />
repos<strong>it</strong>ory.removeAllArrowKeys();<br />
repos<strong>it</strong>ory.removeAllNumericKeys();<br />
manager.removeUserEventListener(this);<br />
if(scene != null) {<br />
}<br />
scene.setVisible(false);<br />
scene.removeAll();<br />
HSceneFactory.getInstance().dispose(scene);<br />
scene = null;<br />
<strong>con</strong>text.notifyDestroyed();<br />
}else {System.out.println(this.getClass().getName()<br />
}<br />
+" : Richiesta di destroy rifiutata!");<br />
Come anticipato nel paragrafo 3.3, <strong>per</strong> ottimizzare i tempi di navigazioe, i<br />
<strong>con</strong>tenuti sono stati inser<strong>it</strong>i in file binari. Non avendo ancora a disposizione<br />
<strong>con</strong>tenuti realistici <strong>per</strong> questa applicazione, si è supposto di scaricare da un<br />
database nel server di Lepida<strong>TV</strong> la lista di tutti gli Username degli utenti<br />
iscr<strong>it</strong>ti, la Password associate, e <strong>per</strong> ciascuno di essi le notizie disponibili,<br />
Si sono creati quindi, <strong>con</strong> uno script in Java, due file: uno <strong>con</strong>tenente una<br />
lista ordinata di 1000 Username e l’altro <strong>con</strong>tenente la lista di Password,<br />
ordinate se<strong>con</strong>do lo Username corrispondente <strong>con</strong>, di segu<strong>it</strong>o ad ognuna di<br />
esse, un numero randomico di notizie (da nessuna a 5 notizie).<br />
64
int NumLettereLogin=3;<br />
int NumLetterePass=5;<br />
String alfabeto="ABCDEFGHIJKLMNOPQRSTUVWXYZ";<br />
String Login="", Pass="";<br />
int ind=0;<br />
Integer puntInt;<br />
try{<br />
}<br />
String[] Notizie={"Questa e' la notizia uno.","invece questa e' la se<strong>con</strong>da.","Ora la<br />
terza.","Ma di piu', quarta.","Infine quinta."};<br />
RandomAccessFile flogin = new RandomAccessFile("username.txt","rw");<br />
RandomAccessFile fpass = new RandomAccessFile("notizie.txt","rw");<br />
for(int i=0; i=0; w--) {<br />
}<br />
Pass="";<br />
resto=i;<br />
ind=(int)(resto/Math.pow(26, w));<br />
Login=Login+alfabeto.charAt(ind);<br />
resto=(int)(resto%Math.pow(26, w));<br />
for(int w=NumLetterePass-1; w>=0; w--) {<br />
}<br />
ind=(int)(resto/Math.pow(26, w));<br />
Pass=Pass+alfabeto.charAt(ind);<br />
resto=(int)(resto%Math.pow(26, w));<br />
flogin.wr<strong>it</strong>e(Login.getBytes());<br />
flogin.wr<strong>it</strong>e(intToByteArray((int)fpass.getFilePointer()));<br />
fpass.wr<strong>it</strong>e(Pass.getBytes());<br />
int random = (int)(Math.random()*5);<br />
fpass.wr<strong>it</strong>e(intToByteArray(random));<br />
for(int z=0; z
Questi file binari sono in segu<strong>it</strong>o creati se<strong>con</strong>do la seguente struttura:<br />
Figura 4.6: Struttura file binari<br />
Supponiamo allora che la struttura di sinistra sia del file username.txt, e la<br />
struttura di destra quella del file notizie.txt. Quando un utente inserisce<br />
Username e Password, vengono esegu<strong>it</strong>i i seguenti passi:<br />
1. Si compie una ricerca dicotomica nel file username.txt <strong>per</strong> trovare il<br />
nome utente inser<strong>it</strong>o. L’algor<strong>it</strong>mo <strong>per</strong> la ricerca dicotomica che<br />
ottimizza le tempistiche di recu<strong>per</strong>o dello Username inser<strong>it</strong>o è il<br />
seguente:<br />
private static int ricercaDicotomica(String user, int cardine1, int cardine2,<br />
RandomAccessFile f){<br />
int righe=0;<br />
int medio=-1;<br />
int result=-1;<br />
String AppString;<br />
byte[] AppByte= new byte[3];<br />
try{<br />
if(cardine1
}<br />
result=ricercaDicotomica(user, cardine1, medio-1, f);<br />
}<br />
else if(user.compareTo(AppString)>0){<br />
result=<br />
ricercaDicotomica(user, medio+1, cardine2, f);<br />
}<br />
else if(user.compareTo(AppString)==0){result=medio;}<br />
}<br />
if(cardine1==cardine2){<br />
f.seek(cardine1*(3+4));<br />
f.read(AppByte);<br />
AppString=new String(AppByte);<br />
if(user.compareTo(AppString)==0){result=cardine1;}<br />
else{result=-1;}<br />
}<br />
if(cardine1>cardine2){result=-1;}<br />
return result;<br />
2. Si leggono i 4 byte successivi e <strong>con</strong> il metodo seek() si comincia a<br />
leggere nel file notizie.txt al punto in cui si trova la password<br />
corrispondente a quel nome utente (che si suppone unico, come<br />
potrebbe ad esempio essere il codice fiscale)<br />
3. Si <strong>con</strong>trolla se la password immessa dall’ utente corrisponte e in quel<br />
caso si leggono i 4 byte successivi che <strong>con</strong>tengono il numero di<br />
notizie associate a quelle credenziali<br />
4. Si leggeranno poi i primi 4 byte che ci indicheranno la lunghezza in<br />
byte del t<strong>it</strong>olo, che ci dirà quindi quanti dei seguenti byte leggere e<br />
inserire nel t<strong>it</strong>olo, e si compie la stessa o<strong>per</strong>azione <strong>per</strong> il testo<br />
descr<strong>it</strong>tivo della notizia.<br />
5. Si tiene in memoria il puntatore all’ inizio di ogni notizia man mano<br />
l’utente le scorre in avanti, in un vettore grande quanto il numero di<br />
notizie letto al passo 3, così da poterle immediatamente scorrere all’<br />
indietro. Nel caso della lettura della notizia successiva infatti,<br />
associata alla pressione del tasto 9 dovremo semplicemente ripetere<br />
il passo 4:<br />
case HRcEvent.VK_9:<br />
if(pressed==true){<br />
try {<br />
RandomAccessFile fin = new RandomAccessFile("notizie.txt","r");<br />
if(numNotizia
newsLength[numNotizia]=byteArrayToInt(dimNews);<br />
byte[] News = new byte[byteArrayToInt(dimNews)];<br />
fin.read(News);<br />
String appNews = new String(News);<br />
descr.setTextContent(appNews,H Visible.NORMAL_STATE);<br />
currentNews=(int)fin.getFilePointer();<br />
}<br />
fin.close();<br />
}<br />
catch(Exception e) { e.printStackTrace();}<br />
pagenumber.setTextContent((numNotizia+1)+"/"+numNotizie,<br />
HVisible.NORMAL_STATE);<br />
pressed=false;<br />
}<br />
else{pressed=true;}<br />
scene.repaint();<br />
break;<br />
Per la lettura della notizia precendente invece sfrutteremo le<br />
informazioni dei puntatori memorizzati dipo ogni lettura in avanti:<br />
case HRcEvent.VK_7:<br />
if(pressed==true){<br />
try{<br />
RandomAccessFile fin = new RandomAccessFile("pass.txt","r");<br />
if(numNotizia>0){<br />
numNotizia--;<br />
fin.seek(currentNews-newsLength[numNotizia+1]newsLength[numNotizia]-8);<br />
byte[] dimNews = new byte[4];<br />
fin.read(dimNews);<br />
byte[] News = new byte[byteArrayToInt(dimNews)];<br />
fin.read(News);<br />
String appNews = new String(News);<br />
descr.setTextContent(appNews, HVisible.NORMAL_STATE);<br />
currentNews=(int)fin.getFilePointer();<br />
}<br />
fin.close();<br />
}<br />
catch(Exception e){ e.printStackTrace(); }<br />
pagenumber.setTextContent((numNotizia+1)+"/"+numNotizie, HVisible.NORMAL_STATE);<br />
pressed=false;<br />
}<br />
else{pressed=true;}<br />
scene.repaint();<br />
break;<br />
Le prove fatte <strong>con</strong> questa struttura, ed un file quindi di circa 2500<br />
<strong>con</strong>tenuti, hanno <strong>per</strong>messo una navigazione istantanea delle notizie una<br />
volta effettuato il login.<br />
68
Cap<strong>it</strong>olo 5<br />
Funzionamento su Lepida<strong>TV</strong><br />
Con i file strutturati nel modo appena spiegato e la grafica illustrata<br />
precedentemente, non resta che passare all’ ultimo passo: la messa in onda<br />
del servizio sul canale televisivo.<br />
5.1 OpenCaster<br />
Nel lavoro effettuato <strong>per</strong> questa tesi è stato utilizzato il software open<br />
source di Avalpa, OpenCaster, rilasciato appena il 20 giugno del 2008.<br />
OpenCaster è un generatore di transport stream MPEG-2 e manipolatore di<br />
pacchetti che <strong>per</strong>mette di creare le tabelle SI che abbiamo prima spiegato,<br />
trasformare un filesystem in un DSM-CC carousel e multipexare transport<br />
stream a b<strong>it</strong>-rate costante. Vediamo quali sono i passaggi necessari <strong>per</strong><br />
trasmettere un servizio interattivo.<br />
5.1.1 PMT e AIT Tables<br />
OpenCaster offre file in linguaggio python in grado di generare le tabelle<br />
SI necessarie da inserire nel transport stream, che devono ovviamente<br />
essere precedentemente <strong>con</strong>figurati. Per quanto riguarda strettamente le<br />
applicazioni interattive, le SI tables da generare saranno due: PMT ed AIT.<br />
Per la tabella PMT si ha una prima parte, qui non riportata, di descrizione<br />
di uno stream_loop_<strong>it</strong>em <strong>per</strong> la tipologia di stream MPEG-2 video, uno <strong>per</strong><br />
MPEG-2 video ed uno <strong>per</strong> AIT. In segu<strong>it</strong>o a questi vi sarà uno<br />
stream_loop_<strong>it</strong>em <strong>per</strong> ogni applicazione che si vuole trasmettere, <strong>con</strong> la<br />
seguente sintassi:<br />
stream_loop_<strong>it</strong>em(<br />
stream_type = 11,<br />
elementary_PID = 2003,<br />
element_info_descriptor_loop = [<br />
association_tag_descriptor(<br />
association_tag = 0xB,<br />
use = 0,<br />
selector_lenght = 0,<br />
transaction_id = 0x80000000,<br />
timeout = 0xFFFFFFFF,<br />
private_data = "",<br />
69
],<br />
I parametri più importanti sono i seguenti:<br />
)<br />
),<br />
stream_identifier_descriptor(<br />
component_tag = 0xB,<br />
),<br />
carousel_identifier_descriptor(<br />
carousel_ID = 1,<br />
format_ID = 0,<br />
private_data = "",<br />
),<br />
data_broadcast_id_descriptor(<br />
data_broadcast_ID = 240,<br />
ID_selector_bytes = "",<br />
),<br />
]<br />
• stream_type = 11 dove 11 è l’identificativo della tipologia DSMCC.<br />
• elementary_PID: identificativo del DSMCC.<br />
• association_tag: identifica il carousel, è referenziato nella AIT ed è<br />
usato nella generazione del DSMCC tram<strong>it</strong>e oc-update.sh come<br />
vedremo nel paragrafo 1.5.2.<br />
• component_tag: identico all’ association_tag, necessario in quanto a<br />
se<strong>con</strong>da della tipologia del decoder, alcuni cercheranno il campo<br />
association_tag e altri il component_tag: il valore deve essere quindi<br />
lo stesso.<br />
• carousel_id: diverso da association/component tag ma <strong>con</strong> lo stesso<br />
propos<strong>it</strong>o di identificare il carousel.<br />
Per l’ AIT invece si avrà all’ interno di application_loop un<br />
application_loop_<strong>it</strong>em <strong>per</strong> ogni applicazione presente del transport stream:<br />
a<strong>it</strong> = application_information_section(<br />
application_type = DVB_J_application_type,<br />
common_descriptor_loop = [],<br />
application_loop = [<br />
application_loop_<strong>it</strong>em(<br />
organisation_id = 10,<br />
application_id = 1001,<br />
application_<strong>con</strong>trol_code = 2,<br />
application_descriptors_loop = [<br />
transport_protocol_descriptor(<br />
protocol_id = MHP_OC_protocol_id,<br />
transport_protocol_label = 1,<br />
remote_<strong>con</strong>nection = 0,<br />
component_tag = 0xB,<br />
),<br />
application_descriptor(<br />
application_profile = 0x0001,<br />
version_major = 1,<br />
version_minor = 0,<br />
version_micro = 2,<br />
service_bound_flag = 1,<br />
70
)<br />
],<br />
),<br />
],<br />
application_prior<strong>it</strong>y = 1,<br />
transport_protocol_labels = [1],<br />
),<br />
application_name_descriptor(application_name = "Esempio"),<br />
dvb_j_application_descriptor(parameters = ["dvb://1/sample8"]),<br />
dvb_j_application_location_descriptor(<br />
base_directory = "/",<br />
class_path_extension = "",<br />
in<strong>it</strong>ial_class = "EsempioMainClass",<br />
),<br />
In questo caso invece i parametri più importanti sono:<br />
• application_<strong>con</strong>trol_code: 1 indica autostart, ovvero l’applicazione<br />
parte immediatamente <strong>con</strong> la sua esecuzione, 2 indica present, ed il<br />
decoder in questo caso aggiunge l’applicazione alla lista di scelta<br />
delle applicazioni <strong>per</strong> l’utente, 3 indica destroy e segnala di fermare<br />
l’esecuzione dell’ applicazione, 4 è kill e ferma l’esecuzione.<br />
• component_tag: ha lo stesso significato del caso PMT e deve essere<br />
coerente <strong>con</strong> quello che lì è stato indicato.<br />
• Application_name_descriptor: nome dell’ applicazione che l’ utente<br />
vedrà nella lista standard delle applicazioni che si apre premendo il<br />
tasto app del telecomando.<br />
• In<strong>it</strong>ial_class: classe iniziale da eseguire.<br />
5.1.2 Generazione di uno stream DSM-CC<br />
Per implementare un carousel in OpenCaster ci deve essere una directory<br />
<strong>con</strong>tenente tutti i file necessari al funzionamento dell’ applicazione, come<br />
ad esempio i file grafici ed i file di testo <strong>con</strong> i <strong>con</strong>tenuti, <strong>per</strong> poterla<br />
inserire poi in un transport stream, che va ricreato ogni volta che vi è un<br />
cambiamento nella directory. Il comando che genera il transport stream è il<br />
seguente:<br />
oc-update.sh [object_carousel_directory] [association_tag]<br />
[module_version] [dsmcc_pid] [carousel_id][compress_on]<br />
[padding_on] [clean_off]<br />
I significati dei vari parametri sono i seguenti:<br />
• carousel_directory: la directory da inserire nel transport stream. Il suo<br />
nome sarà quello che verrà dato al file .ts di usc<strong>it</strong>a.<br />
71
• association_tag: dve essere quello referenziato nella PMT ed AIT.<br />
• Modules_version: intero che va da 0 a 15 e deve essere lo stesso <strong>per</strong><br />
tutti i moduli.<br />
• dsmcc_pid: pid del transport stream che verrà generato. Anche questo<br />
dovrà corrispondere a quello associato in PMT.<br />
• carousel_id: Identificativa di ogni carousel che viene generato, è<br />
referenziato in PMT.<br />
• compress_on, padding_on, clean_off: booleani che indicano<br />
rispettivamente se il carousel va compresso, se deve essere inser<strong>it</strong>o<br />
del padding nelle varie sezioni e se devono essere eliminati i file<br />
temporanei.<br />
Un esempio di utilizzo può essere il seguente:<br />
oc-update.sh XletTest 0xB 5 2003 1 1 0 0<br />
Che dalla cartella XletTest genererà il file XletTest.ts <strong>con</strong> 0xB come<br />
association tag da inserire in PMT ed AIT, 2003 come pid e 1 come<br />
identificativo del carousel.<br />
5.1.3 Multiplexing<br />
Per trasmettere audio, video ed applicazioni, i transport stream generati<br />
andranno infine multiplexati. In Opencaster questo viene fatto tram<strong>it</strong>e il<br />
seguente comando:<br />
tscbrmuxer [b<strong>it</strong>rate_ts1][ts1_name]… [b<strong>it</strong>rate_ts1][ts1_name ] > muxed.ts<br />
Dove <strong>per</strong> ogni transport stream da trasmettere si specifica prima il suo b<strong>it</strong><br />
rate poi il suo nome. Il file in usc<strong>it</strong>a avrà b<strong>it</strong>rate pari alla somma dei b<strong>it</strong>rate<br />
dei vari transport stream multiplexati. Un esempio di transport stream <strong>con</strong><br />
b<strong>it</strong> rate tipici da multiplexare <strong>per</strong> avere audio, video, una applicazione e le<br />
SI tables necessarie, è il seguente:<br />
tscbrmuxer b:2300000 firstvideo.ts b:188000 firstaudio.ts b:3008 firstpat.ts<br />
b:3008 firstpmt.ts b:1500 firstsdt.ts b:1400 firstn<strong>it</strong>.ts b:1000000 XletTest.ts<br />
b:2000 firsta<strong>it</strong>.ts > myfirsmuxed.ts<br />
72
Con transport stream video firstvideo.ts, transport stream audio<br />
firstaudio.ts, applicazione XletTest.ts e le seguenti tabelle SI: PAT, PMT,<br />
SDT, NIT e AIT.<br />
5.2 Messa in onda su Lepida<strong>TV</strong><br />
Nello specifico del nostro caso quindi, dovremo effettuare le seguenti<br />
o<strong>per</strong>azioni:<br />
• Creare sul server di Lepida<strong>TV</strong> una cartella chiamata<br />
Se<strong>con</strong>daInterfaccia <strong>con</strong> al suo interno il file Se<strong>con</strong>dXlet.class, che<br />
<strong>con</strong>tiene il codice vero e proprio dell’ applicazione, i file<br />
username.txt e notizie.txt che <strong>con</strong>tengono tutti gli utenti e le notizie<br />
aggiornate, e le immagini necessarie alla visualizzazione dell’ Xlet,<br />
come lo sfondo e i pulsanti delle istruzioni.<br />
• Supponendo di avere già un altro servizio in onda <strong>con</strong> i parametri 0xB<br />
association tag, 2003 pid, 1 identificativo del carousel, modificare il<br />
file in python di OpenCaster che <strong>per</strong>mette di creare le SI Tables nei<br />
seguenti modi:<br />
a. Nella parte di creazione della PMT aggiungere un se<strong>con</strong>do<br />
stream_loop_<strong>it</strong>em:<br />
stream_loop_<strong>it</strong>em(<br />
stream_type = 11,<br />
elementary_PID = 2004,<br />
element_info_descriptor_loop = [<br />
association_tag_descriptor(<br />
association_tag = 0xC,<br />
use = 0,<br />
selector_lenght = 0,<br />
transaction_id = 0x80000000,<br />
timeout = 0xFFFFFFFF,<br />
private_data = "",<br />
),<br />
stream_identifier_descriptor(<br />
component_tag = 0xC,<br />
),<br />
carousel_identifier_descriptor(<br />
carousel_ID = 2,<br />
format_ID = 0,<br />
private_data = "",<br />
),<br />
data_broadcast_id_descriptor(<br />
data_broadcast_ID = 240,<br />
ID_selector_bytes = "",<br />
),<br />
]<br />
)<br />
73
Così da assegnare association tag, pid e carousel id<br />
corrispondenti.<br />
b. Analogamente nella parte riguardante l’ AIT aggiungere un<br />
application loop <strong>it</strong>em come segue:<br />
application_loop_<strong>it</strong>em(<br />
organisation_id = 10,<br />
application_id = 1001,<br />
application_<strong>con</strong>trol_code = 2,<br />
application_descriptors_loop = [<br />
transport_protocol_descriptor(<br />
protocol_id = MHP_OC_protocol_id,<br />
transport_protocol_label = 1,<br />
remote_<strong>con</strong>nection = 0,<br />
component_tag = 0xC,<br />
),<br />
application_descriptor(<br />
application_profile = 0x0001,<br />
version_major = 1,<br />
version_minor = 0,<br />
version_micro = 2,<br />
service_bound_flag = 1,<br />
application_prior<strong>it</strong>y = 1,<br />
transport_protocol_labels = [1],<br />
),<br />
application_name_descriptor(application_name = "Test di<br />
Autenticazione"),<br />
dvb_j_application_descriptor(parameters = ["dvb://1/sample8"]),<br />
dvb_j_application_location_descriptor(<br />
base_directory = "/",<br />
class_path_extension = "",<br />
in<strong>it</strong>ial_class = "Se<strong>con</strong>dXlet",<br />
),<br />
],<br />
),<br />
Viene così indicato che la classe da eseguire è Se<strong>con</strong>dXlet, e<br />
nella lista standard delle applicazioni che compare all’ utente<br />
alla pressione del tasto APP, apparirà in posizione 2 il nome di<br />
questo servizio: “Test di Autenticazione”.<br />
• Eseguire il file in python e sost<strong>it</strong>uire i file creati firstpmt.ts e firsta<strong>it</strong>.ts<br />
ai transport stream che in precedenza <strong>con</strong>tenevano queste due SI<br />
tables<br />
• Dalla directory <strong>con</strong>tenente la cartella Se<strong>con</strong>daInterfaccia generare lo<br />
stream DSMCC tram<strong>it</strong>e il comando:<br />
oc-update.sh Se<strong>con</strong>daInterfaccia 0xC 5 2004 2 1 0 0<br />
che crea il file Se<strong>con</strong>daInterfaccia.ts <strong>con</strong> associati i parametri<br />
indicati.<br />
74
• Seguendo il palinsesto, ad ogni cambio dell’ audio-video, verrà<br />
esegu<strong>it</strong>o un multiplexing simile al seguente, <strong>per</strong> creare il transport<br />
stream finale da trasmettere:<br />
tscbrmuxer b:2500000 nuovovideo.ts b:188000 nuovoaudio.ts<br />
b:3008 firstpat.ts b:3008 firstpmt.ts b:1500 firstsdt.ts b:1400<br />
firstn<strong>it</strong>.ts b:2000 firsta<strong>it</strong>.ts b:1000000 PrimaInterfaccia.ts b:200000<br />
Se<strong>con</strong>daInterfaccia.ts<br />
Come si può notare si possono associare b<strong>it</strong>rate differenti alle varie<br />
applicazioni, se ne può quindi assegnare una maggiore alla prima<br />
che, ad esempio ha già <strong>con</strong>tenuti reali ed è già utilizzata, e<br />
assegnarne invece una minore alla se<strong>con</strong>da che è al momento in fase<br />
di test in attesa di dati non f<strong>it</strong>tizi da mostrare.<br />
L’ utente quindi, una volta sul canale di Lepida<strong>TV</strong>, premerà il tasto APP,<br />
selezionerà la se<strong>con</strong>da applicazione, ovvero il nostro Test di<br />
Autenticazione, e verrà caricata la seguente Xlet, attualmente on-air:<br />
Figura 5.1: L’ applicazione in onda<br />
75
Per arrivare a questa schermata sono stati inser<strong>it</strong>i dai file di esempio lo<br />
Username “BAA” e la rispettiva Password “AABAA”, a cui corrispondono<br />
4 notizie, come si può notare nella parte in basso a destra dell’ area del<br />
<strong>con</strong>tenuto, nella quale viene visualizzata la se<strong>con</strong>da di queste notizie.<br />
5.3 Adattamento Web parallelo<br />
Lepida<strong>TV</strong> ha infine scelto di rendere disponibili anche sul suo s<strong>it</strong>o web<br />
http://www.lepida.tv/ i servizi implementati <strong>per</strong> il canale televisivo, al fine<br />
di fornire gli stessi <strong>con</strong>tenuti su entrambi i mezzi di comunicazione.<br />
Sempre seguendo il suo obiettivo di usabil<strong>it</strong>à ha lasciato volutamente<br />
l’interfaccia grafica identica a quella che si può vedere sulla tv, <strong>con</strong> l’unica<br />
differenza che i tasti del telecomando saranno invece i numeri della tastiera<br />
del pc, o in alternativa possono essere semplicemente cliccate le immagini<br />
dei tasti dell’ area delle istruzioni di navigazione:<br />
Figura 5.2: L’ applicazione sul Web<br />
L’ applicazione è stata graficamente adattata <strong>per</strong> essere visualizzata<br />
correttamente su qualsiasi tipo di browser attualmente esistente.<br />
76
Infatti, all’ a<strong>per</strong>tura del file index.html, viene <strong>per</strong> prima cosa effettato il<br />
<strong>con</strong>trollo sul browser in uso dall’ utente che vuole vedere l’ applicazione,<br />
più nello specifico <strong>con</strong>trolla se il browser è Internet Explorer, e in caso<br />
<strong>con</strong>trario chiama un diverso file sul server, /FireFox/Xlet.html, che si adatta<br />
benissimo graficamente anche in altri browser quali O<strong>per</strong>a, Safari e Google<br />
Chrome:<br />
<br />
<br />
<br />
<br />
Reindirizzamento in base al browser<br />
<br />
if (document.all){ // Explorer<br />
document.wr<strong>it</strong>e("");<br />
}<br />
else { // FireFox<br />
document.wr<strong>it</strong>e("");<br />
}<br />
Questa distinzione in due file .html è stata effettuata in quanto Internet<br />
Explorer interpreta diversamente i .css rispetto alla maggioranza dei<br />
browser, ad esempio:<br />
• Line-height: nel caso di Internet Explorer è intesa come l’altezza di<br />
ogni linea all’ interno del box di riferimento, negli altri browser è<br />
intesa come altezza totale del DIV.<br />
• Bordi: In Internet Explorer ci sono di default, negli altri casi no.<br />
• Overflow: nel caso di FireFox l’ overflow è hidden, ovvero se in un<br />
DIV abbiamo del testo troppo grande, il DIV resterà della<br />
dimensione specificata e non si vedrà il testo nella sua interezza. In<br />
Internet Explorer invece è non hidden, e quindi il DIV si adatta<br />
ingrandendosi, <strong>per</strong> visualizzare il testo interamente.<br />
Il funzionamento dell’ applicazione <strong>per</strong> il Web segue i seguenti step:<br />
1. Creare sul server una cartella Web <strong>con</strong> all’ interno il file index<br />
spiegato prima che discrimina i browser, e due cartelle distinte, una<br />
<strong>per</strong> FireFox ( e altri compatibili) e una <strong>per</strong> Internet Explorer. In<br />
77
ognuna di esse vi sarà il relativo file HTML, il foglio di stile<br />
associato .css, <strong>con</strong> le modifiche del caso a se<strong>con</strong>da del browser,<br />
come accennato prima, e tutte le immagini necessarie alla<br />
visualizzazione dell’ applicazione.<br />
2. Si esegue un programma scr<strong>it</strong>to in Java che crea i file di testo<br />
<strong>con</strong>tenenti le notizie da rendere disponibili all’ utente. In questo caso<br />
specifico crea, come visto, file <strong>con</strong> notizie e credenziali f<strong>it</strong>tizie, se si<br />
avessero invece notizie disponibili su Web, scaricherebbe gli RSS<br />
formattandoli in modo opportuno nei file.<br />
3. Da questi file, tram<strong>it</strong>e l’ esecuzione di un se<strong>con</strong>do programma scr<strong>it</strong>to<br />
in Java, viene creato un file javascript <strong>con</strong> tutte le notizie embedded<br />
in array. Infatti adesso, essendo un’ applicazione Web, non abbiamo<br />
più problemi di memoria o processori lim<strong>it</strong>ati, e si possono quindi<br />
effettuare scelte implementative diverse e più semplici rispetto al<br />
caso MHP.<br />
4. Aggingere questo file .js in entrambe le cartelle Internet Explorer e<br />
Firefox.<br />
Con questo metodo quindi risulterà facile un aggiornamento dei <strong>con</strong>tenuti,<br />
che si presuppone giornaliero <strong>per</strong> i servizi offerti da Lepida, rendendoli<br />
sub<strong>it</strong>o disponibili <strong>per</strong> essere navigati sia sul Web, che sul dig<strong>it</strong>ale terrestre,<br />
dove verrà infatti esegu<strong>it</strong>o sempre giornalmente lo stesso aggiornamento<br />
<strong>per</strong> poi ricreare il nuovo Transport Stream dell’ applicazione interattiva.<br />
78
Cap<strong>it</strong>olo 6<br />
Conclusioni e sviluppi futuri<br />
Il lavoro svolto in questa tesi è stato quindi <strong>per</strong> prima cosa un analisi<br />
approfond<strong>it</strong>a degli standard e delle soluzioni tecnologiche <strong>per</strong> comprendere<br />
le basi su cui si fonda la televisione dig<strong>it</strong>ale terrestre.<br />
All’ interno di Lepida<strong>TV</strong> si è quindi proceduto <strong>con</strong> un’ analisi di modelli<br />
standard di navigazione da poter applicare alle Xlet, seguendo una linea<br />
guida all’ insegna dell’ usabil<strong>it</strong>à ed accessibil<strong>it</strong>à <strong>per</strong> quanto riguarda la<br />
parte grafica.<br />
Importante notare che la materia trattata è ancora in fase s<strong>per</strong>imentale ed<br />
essendo pochissime le aziende e strutture che utilizzano questa tecnologia,<br />
le <strong>con</strong>oscenze da loro acquis<strong>it</strong>e nello sviluppo di applicazioni MHP non<br />
sono divulgate sul Web.<br />
Si sono sco<strong>per</strong>ti quindi passo a passo durante lo sviluppo i lim<strong>it</strong>i degli<br />
emulatori esistenti, le loro differenze <strong>con</strong> i decoder reali, cercando di<br />
su<strong>per</strong>are le varie problematiche ris<strong>con</strong>trate.<br />
Una parte molto importante in questa tesi è senz’ altro l’ utilizzo di<br />
strutture di file innovative che <strong>per</strong>mettano di navigare una grande quant<strong>it</strong>à<br />
di <strong>con</strong>tenuti senza alcun tipo di r<strong>it</strong>ardo: scopo diverso da quello <strong>per</strong> cui è<br />
nata l’interattiv<strong>it</strong>à del dig<strong>it</strong>ale terrestre, più improntata ad offrire una<br />
versione di teletext avanzata, <strong>con</strong>tenente poche informazioni e riguardanti<br />
quasi esclusivamente il palinsesto televisivo ed i suoi approfondimenti.<br />
La scelta di Lepida di offrire ai c<strong>it</strong>tadini servizi di pubblica util<strong>it</strong>à è senz’<br />
altro una nov<strong>it</strong>à in quest’amb<strong>it</strong>o, ed offre non pochi ulteriori sviluppi.<br />
La se<strong>con</strong>da parte di questo studio, che l’ha reso <strong>per</strong> me davvero<br />
soddisfacente e stimolante, è stato invece l’esame della struttura<br />
trasmissiva e di come effettuare una messa in onda dell’ applicazione,<br />
potendo così, una volta fin<strong>it</strong>a la programmazione dell’ Xlet sul pc, vederla<br />
sub<strong>it</strong>o funzionante su qualunque televisore collegato ad un decoder MHP.<br />
Riassumendo: <strong>per</strong> questa tesi è stata creata un’ applicazione <strong>con</strong> lo scopo<br />
di fornire notizie a segu<strong>it</strong>o di una <strong>autenticazione</strong>, senz’ altro il passo<br />
79
successivo sarà quello di adattarla a notizie e <strong>con</strong>tenuti reali forn<strong>it</strong>i da<br />
diversi enti.<br />
Si possono pensare ovviamente ulteriori modelli atti ad offrire tipologie di<br />
servizi nettamente diversi.<br />
Un altro modello già esistente e attualmente on-air prevede la navigazione<br />
di <strong>con</strong>tenuti basati su un filtro singolo o multiplo selezionato dall’ utente:<br />
ad esempio, l’ ultimo sviluppo in atto al momento <strong>con</strong>siste nell’ anagrafica<br />
canina di un canile dove l’ utente può visualizzare le caratteristiche dei cani<br />
disponibili all’ adozione selezionandoli in base alla taglia.<br />
Un modello non ancora sviluppato invece è quello di un test di autoverifica<br />
da effettuare in segu<strong>it</strong>o a lezioni trasmesse sul canale televisivo che si basi<br />
su un modello senza più filtri né tastiere alfanumeriche, ma incentrato alla<br />
navigazione di varie domande e alla scelta delle corrispondenti risposte.<br />
Infine un ulteriore studio da completare è sicuramente quello riguardante i<br />
dvb locator, <strong>per</strong> sa<strong>per</strong> così come manipolare i transport stream in<br />
trasmissione e poter quindi visualizzare nello spazio riservato il resize dell’<br />
audio-video in onda mentre si utilizza l’ applicazione.<br />
80
Elenco delle figure<br />
Figura 1.1: Struttura trasmissiva del sistema dig<strong>it</strong>ale terrestre .......................7<br />
Figura 1.2: Struttura di un transport stream ....................................................9<br />
Figura 1.3: Suddivisione del transport Stream in più servizi diversi ..............9<br />
Figura 1.4: Esempio di Transport Stream Analyzer ..................................... 10<br />
Figura 1.5: Esempio di file da trasmettere in un carousel ............................. 14<br />
Figura 1.6: Trasmissione dei moduli ............................................................. 15<br />
Figura 1.7: I tre standard DVB ...................................................................... 16<br />
Figura 1.8: Set top box MHP ........................................................................ 17<br />
Figura 1.9: I livelli dell’ arch<strong>it</strong>ettura MHP ................................................... 18<br />
Figura 1.10: L’ arch<strong>it</strong>ettura MHP .................................................................. 19<br />
Figura 1.11: I profili MHP ............................................................................ 21<br />
Figura 1.12: Schematizzazione di una catena DTT interattiva ..................... 22<br />
Figura 1.13: Schematizzazione della struttura di un Set Top Box ................ 24<br />
Figura 1.14: Modello delle relazioni nella catena DTT ................................ 25<br />
Figura 2.1: Schematizzazione API che compongono stack MHP ................ 27<br />
Figura 2.2: Ciclo di v<strong>it</strong>a di un’ Xlet .............................................................. 29<br />
Figura 2.3: Dialogo tra applicazione e <strong>con</strong>text <strong>per</strong> la messa in pausa .......... 31<br />
Figura 2.4: Dialogo tra applicazione e <strong>con</strong>text <strong>per</strong> il riavvio ....................... 32<br />
Figura 2.5: I tre layers del display <strong>TV</strong> .......................................................... 34<br />
Figura 2.6: Periferiche Video e Grafiche multiple ........................................ 35<br />
Figura 2.7: <strong>Sistemi</strong> di coordinate MHP ........................................................ 40<br />
Figura 2.8: Esempio di visibil<strong>it</strong>à in Hscene .................................................. 41<br />
Figura 2.9: Key event <strong>per</strong> il <strong>con</strong>trollo remoto ............................................... 43<br />
Figura 2.10: Esempio di Implementation status di Xle<strong>TV</strong>iew ..................... 45<br />
81
Figura 2.11: Interfaccia grafica iniziale di Xle<strong>TV</strong>iew .................................. 46<br />
Figura 2.12: Inserimento nuova applicazione in Xle<strong>TV</strong>iew ......................... 48<br />
Figura 3.1: Calendario grafico dello sw<strong>it</strong>ch-off in Italia .............................. 51<br />
Figura 3.2: Interfaccia Standardizzata........................................................... 52<br />
Figura 3.3: Struttura file sequenziale ............................................................ 55<br />
Figura 4.1: Barra di navigazione alfanumerica ............................................. 58<br />
Figura 4.2: Area delle istruzioni di navigazione ........................................... 59<br />
Figura 4.3: Area delle istruzioni di navigazione ........................................... 60<br />
Figura 4.4: Analisi nei casi di daltonismo ..................................................... 60<br />
Figura 4.5: Interfaccia grafica dell’ applicazione ......................................... 63<br />
Figura 4.6: Struttura file binari ...................................................................... 66<br />
Figura 5.1: L’ applicazione in onda ............................................................. 75<br />
Figura 5.2: L’ applicazione sul Web ............................................................ 76<br />
82
Bibliografia e s<strong>it</strong>ografia<br />
Per il cap<strong>it</strong>olo riguardante il Dig<strong>it</strong>al Video Broadcasting Project, la struttura<br />
trasmissiva ed il Multimedia Home Platform, le informazioni sono state<br />
re<strong>per</strong><strong>it</strong>e dalle seguenti fonti:<br />
• Davide Turi, Roberto Borroni, La tv dig<strong>it</strong>ale terrestre. Manuale <strong>per</strong> il<br />
professionista della televisione, 1^ edizione 2007<br />
Presente anche sul web all’ idirizzo http://www.manualepraticodtt.<strong>it</strong><br />
• DVB – Dig<strong>it</strong>al Video Broadcasting official s<strong>it</strong>e, http://www.dvb.org<br />
• ETSI TS 101 812 V1.3.1 (2003-06) Technical Specification, Dig<strong>it</strong>al<br />
Video Broadcasting (DVB) – Multimedia Home Platform (MHP)<br />
Specification 1.0.3<br />
• Il libro bianco sulla televisione dig<strong>it</strong>ale,<br />
http://www.agcom.<strong>it</strong>/provv/libro_b_00/librobianco00.htm<br />
• Per la televisione dig<strong>it</strong>ale:<br />
o http://www.dgtvi.<strong>it</strong><br />
o http://www.dig<strong>it</strong>ale-terrestre.com<br />
o http://www.dig<strong>it</strong>aleterrestre.tv.<strong>it</strong><br />
• MHP – Multimedia Home Platform official s<strong>it</strong>e, http://www.mhp.org<br />
• Tesi su Java Portal, www.javaportal.<strong>it</strong>/rw/27468/ed<strong>it</strong>orial.html<br />
• Wikipedia, http://www.wikipedia.org/<br />
Per il cap<strong>it</strong>olo sulle Xlet e sull’ emulatore usato nello sviluppo dell’<br />
applicazione, le informazioni sono state elaborate dai seguenti s<strong>it</strong>i:<br />
• The Java Technology homapage, http://java.sun.com<br />
• Java <strong>TV</strong>: Specification and Technical Overview,<br />
http://java.sun.com/products/Java<strong>TV</strong><br />
• Moka Byte, http://mokabyte.<strong>it</strong><br />
• The Interactive Web, http://www.mhp-interactive.org<br />
• <strong>TV</strong> W<strong>it</strong>hout Borders, http://www.interactivetvweb.org/<br />
• XletView, http://sourceforge.net/project/xletview<br />
83
Per I cap<strong>it</strong>oli riguardanti lo sviluppo dell’ applicazione <strong>con</strong> <strong>autenticazione</strong> e<br />
la messa in onda su Lepida<strong>TV</strong>, le informazioni sono state re<strong>per</strong><strong>it</strong>e dai<br />
seguenti s<strong>it</strong>i:<br />
• Lepida<strong>TV</strong>, http://www.lepida.tv<br />
• Contrast Analyzer, http://webaccessibile.org/articoli/<strong>con</strong>trast-analyserversione-20/<br />
• World Wide Web Consortium (W3C), http://www.w3.org/<br />
• OpenCaster, http://www.avalpa.com/the-key-values/15-freesoftware/33-opencaster<br />
84