31.05.2013 Views

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

SHOW MORE
SHOW LESS

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

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

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!