Linguaggi ed Applicazioni Multimediali A.A. 2002/2003 Diego Alicata SERVIZI MULTIMEDIALI AVANZATI CON 1 L’evoluzione tecnologica alla quale assistiamo ormai da anni, ha permesso, e permette sempre più, la diffusione di informazioni multimediali sia su personal computer che su altri devices (es: PDA, cellulari di ultima generazione, ecc…) Per capire quanto il modo di interagire con la rete sia cambiato, basti ricordare quanto la prima Internet pubblica fosse caratterizzata nelle pagine web, dalla grande abbondanza di testi e dalla quasi totale assenza di immagini, audio e video. L’evoluzione tecnologica, la riduzione dei costi di connessione, l’aumento di utenza a banda larga, la diffusione di dispositivi per l’input/output di dati multimediali sta cambiando il modo stesso di interagire col web sempre più caratterizzato da una vera e propria esperienza multimediale. 2 Fino a ieri il multimedia era relegato all’offline, oggi e sempre più in futuro, il multimedia sarà online. Offrire dati multimediali online significa potere gestire dinamicamente i contenuti e potere offrire all’utente ciò che desidera in tempo reale. NASCE IL BISOGNO DI NUOVI SERVIZI MULTIMEDIALI DINAMICI 3 Per modificare il contenuto di pagine web basate su HTML in modo classico è necessario: -Scaricare il file HTML da modificare -Modificarlo -Fare l’upload del file modificato sul server Tutto questo comporta quindi la necessità di un intervento umano per l’aggiornamento dei contenuti ed ovviamente l’aggiornamento richiederà del tempo. E’ per questo motivo che sono nati linguaggi di programmazione orientati al web che creano in tempo reale la pagina HTML corrispondente generandola dinamicamente. Tra questi linguaggi ricordiamo PHP (per server Linux) ed ASP (Active Server Pages, per server Windows). 4 Se quindi con le normali pagine HTML avviene che: RICHIEDE index.html BROWSER Trasmette il file index.html SERVER Con ASP e PHP avviene che: RICHIEDE index.asp BROWSER Trasmette il codice HTML SERVER -Il server legge index.asp -Lo interpreta -Genera un codice HTML Nasce quindi la possibilità concreta di realizzare servizi multimediali on-demand per il web 5 Per fornire un servizio via web in Tempo Reale, o comunque cercando di avvicinarsi a questo traguardo, uno dei problemi principali da superare è quello di diminuire il tempo di risposta del server. Interpretare codice ASP o PHP richiede grande occupazione di risorse e soprattutto molto tempo di CPU. Inoltre maggiori sono le richieste nell’unità di tempo tanto più tali risorse possono saturarsi ed il server rallentarsi o addirittura bloccarsi. Con Microsoft .NET la richiesta di risorse ed il tempo di CPU è di molto ridotto, questo perché .NET produce codice compilato che quindi sarà direttamente eseguito (non interpretato). Microsoft .Net è una piattaforma di sviluppo dotata di un FRAMEWORK che: -Si occupa della compilazione dei codici -Si occupa dello scheduling delle richieste alle risorse -Gestisce le transazioni e gli eventuali overload 6 Per quanto riguarda la programmazione web .Net mette a disposizione dei programmatori ASP.Net: l’evoluzione .Net di ASP. I campi di applicazione di ASP.Net sono i più disparati ed in particolare, limitandoci ad i casi che affronteremo, vedremo come: 1. Manipolare delle immagini dinamicamente (ridimensionare, comprimere, e salvare in diversi formati). 2. Utilizzare un GATEWAY per spedire SMS via web 3. Implementare il GATEWAY per offrire servizi PUSH via WAP e WML 7 PARTE 1: Manipolare le immagini dinamicamente 8 CENNI INIZIALI: Familiarizziamo prima con il codice ASP.NET (1) .Net ed ASP.Net supportano la sintassi di 21 linguaggi tra i quali i più importanti Visual Basic e C# (una sorta di C). In realtà prendendo due qualsiasi linguaggi in .Net ci accorgiamo che la sintassi è davvero molto simile. Noi comunque ci riferiremo alla sintassi del linguaggio di default ossia Visual Basic. 9 CENNI INIZIALI: Familiarizziamo prima con il codice ASP.NET (2) .Net mette a disposizione una sorta di librerie chiamate NAMESPACES. Come nel C, se utilizziamo funzioni di tali librerie dovremo prima dichiararle. Il codice ASP.Net è racchiuso tra <% e %>, tutto ciò che è fuori viene trattato come normale codice HTML. 10 CENNI INIZIALI: Familiarizziamo prima con il codice ASP.NET (3) PER LA LETTURA DI UN FILE PER ESEMPIO AVREMO: <%@ import namespace="system.io" %> <% dim s as Stream = File.Open("E:\daleggere.txt", FileMode.Open, FileAccess.Read) dim r as New BinaryReader(s) Dim output as String Do While r.PeekChar() output &= r.ReadChar() Loop r.Close() s.Close() %> 11 MANIPOLARE IMMAGINI: Leggere un immagine Il namespace che .Net mette a disposizione per la gestione delle immagini è system.drawing. VEDIAMO ORA COME LEGGERE UN IMMAGINE: <%@ import namespace="system.drawing" %> <% Dim image As New system.drawing.bitmap(“immagine.gif”) %> L’immagine è ora caricata in memoria ed attribuita all’oggetto image. L’immagine, in questo caso gif, quindi a scala di colori, è stata convertita in RGB True Color a 24 bit. 12 MANIPOLARE IMMAGINI: Ridimensionare un immagine Come fare a ridimensionare l’immagine che abbiamo caricato? Se per esempio vogliamo renderla del 50% più piccola ECCO COME FAREMO: … Dim larghezza, altezza as Integer larghezza = Int(image.width/2) altezza = Int(image.height/2) Dim nuova As New Bitmap(larghezza, altezza) Dim g As Graphics = Graphics.FromImage(nuova) g.CompositingQuality = Drawing2D.CompositingQuality.HighQuality g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic Dim rect As New Rectangle(0, 0, larghezza, altezza) g.DrawImage(image, rect, 0, 0, altezza, larghezza, GraphicsUnit.Pixel) 13 … MANIPOLARE IMMAGINI: Restituire l’immagine compressa Vogliamo ora restituire al browser l’immagine così creata come jpeg con qualità 90 (in qualità da 0 a 100) ECCO COME FAREMO: … Dim myEncoderParameters As New EncoderParameters(1) Dim myEncoderParameter As New System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 90) myEncoderParameters.Param(0) = myEncoderParameter Dim objImageCodecInfo() As ImageCodecInfo objImageCodecInfo = ImageCodecInfo.GetImageEncoders response.contenttype="image/jpeg" nuova.Save(Response.OutputStream, objImageCodecInfo(1), myEncoderParameters) nuova.dispose() image.dispose() %> 14 ECCO IL RISULTATO: ASP.NET restituisce al browser image.gif 15 MANIPOLARE IMMAGINI: Applicazioni Le applicazioni di quello che abbiamo visto possono essere tantissime, immaginiamo di volere inviare ad un cellulare una immagine presa da un giornale web, o pensiamo ad un’applicazione che sotto il controllo dell’utente effettua il fotoritocco di un immagine. 16 PARTE 2: Utilizzare un GATEWAY per spedire SMS 17 Spedire SMS: COSA SONO I GATEWAY (1) Supponiamo di volere creare una applicazione che via web dovrà spedire degli sms, magari per inviare le ultime notizie, oppure per spedire informazioni sui cinema o, se creiamo una applicazione per l’università, un’applicazione che spedisca sms indicando le date degli appelli di esame. Per fare ciò è prima di tutto necessario un GATEWAY Internet -> Cellulari, ossia un particolare hardware che faccia da tramite e che codifichi i dati provenienti da internet in normali SMS per la telefonia mobile. Si tratterà quindi di un hardware che dovrà gestire le informazioni su vari protocolli. Questi GATEWAY esistono e sono a disposizione dei programmatori (sotto pagamento di un canone). 18 Spedire SMS: COSA SONO I GATEWAY (2) Ecco quindi cosa avverà: RICHIEDE sms.asp BROWSER Inviando i dati per la spedizione dell’sms L’applicazione ASP restituisce al browser una pagina HTML specificando che l’sms è stato inviato Invia una richiesta al Gateway SERVER Inviando i dati per la spedizione dell’sms GATEWAY Informa il server, e l’applicazione ASP, che l’sms è stato inviato Invia l’SMS 19 Spedire SMS: l’implementazione (1) Vediamo ora il codice per spedire un sms con testo ‘Ciao’ ad un cellulare. ECCO COME FAREMO: <%@ import namespace="system.io" %> <%@ import namespace="system.net" %> <% Dim st As Stream Dim sr As StreamReader Dim risposta As String Dim stringa As String Stringa = “ACCOUNT=xxxx&PASSWORD=xxxx&COUNTRYCODE=+39&GSMCODE=347&PHONENUMBER=1072548&TEXTM ESSAGE=Ciao” … Dove ad xxxx sostituiremo il nome account e la password per il gateway 20 Spedire SMS: l’implementazione (2) Continuando: … Dim req As WebRequest = WebRequest.Create("http://gateway.smsitaly.com/gate/check.asp?“ & stringa) Dim resp As WebResponse = req.GetResponse st = resp.GetResponseStream sr = New StreamReader(st) Risposta = sr.ReadToEnd() If Risposta = “01” then Response.Write(“SMS inviato correttamente”) Else Response.Write(“Impossibile spedire l’SMS”) End if sr.Close() st.Close() %> 21 PARTE 3: Servizi PUSH via WAP 22 Servizi PUSH via WAP: Introduzione Ci occuperemo ora di sfruttare le potenzialità di ASP.net e della creazione dinamica di contenuti per creare dei servizi PUSH accessibili via cellulari WAP. Nel caso particolare la nostra applicazione dovrà rendere possibile che: -l’utente si colleghi al sito wap dinamico e possa scegliere una materia di esame di Informatica Applicata -l’applicazione spedirà un SMS indicando le date degli appelli per la materia scelta. 23 Servizi PUSH via WAP: WML Se il linguaggio di markup di pagine web è l’HTML, lo standard per le pagine WAP è il WML. Il WML è un particolare XML, ossia un XML definito da un particolare DTD che definisce la sintassi di WML. Per questo nel prologo di un file WML dovremo avere sempre: <?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD wml 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> Dopo il prologo avremo il tag <wml> che dichiara l’inizio di codice WML, avremo il tag </wml> alla fine di tutto il codice. 24 Servizi PUSH via WAP: Il codice (1) Semplificando, le pagine visualizzate verranno chiamate CARDS, avremo quindi tra <wml> e </wml> i tag <card> e </card> La sintassi è molto semplice, quindi vediamo come dovrà essere il file wml che intendiamo creare: … (prologo) <wml> <card title="PROVA ASP.NET"> <p>Per ricevere informazioni sugli appelli di Informatica Applicata compila i seguenti campi.<br/><br/><br/> Materia di Appello: <select name="materia"> <option value="01">Ling. Appl. Mult.</option> <option value="02">Basi Dati</option> <option value="03">Economia d'Impresa</option> </select><br/> Numero Cellulare : <input name="cell" size="15"/><br/><br/> <anchor title="Invia">Clicca qui per Inviare i Dati<br/> <go href="spedisci_wap.aspx" method="post"><postfield name="MateriaI" value="$materia" /><postfield name="Cellulare" value="$cell" /></go> </anchor></p></card></wml> 25 Servizi PUSH via WAP: Il codice (2) Il file spedisci_wap.aspx riceverà quindi il valore della materia sotto la variabile MateriaI e il numero di cellulare sotto la variabile Cellulare. Vediamo quindi il codice di spedisci_wap.aspx <%@ import namespace="system.io" %> <%@ import namespace="system.net" %> <% Dim st As Stream Dim sr As StreamReader Dim risposta, stringa, Numero, MateriaN, Materia(3), GSMCode, PhoneNumber, Sender, TextMessage As String Materia(1)="Linguaggi e Applicazioni Multimediali: 1 appello 13/06 ore 14.30 - 2 appello 23/06 ore 09.30 - post appello 30/06 ore 9.30" Materia(2)="Basi Dati e Sistemi Informativi: 1 appello 09/06 ore 10.30 (PRESSO S.T.I.) - 2 appello 16/06 ore 10.30 (PRESSO S.T.I.) - post appello 09/07 ore 10.30" Materia(3)="Economia e Gestione dell'Impresa: 1 appello 03/06 ore 14.30 (PRESSO S.T.I.) - 2 appello 25/06 ore 09.00 (PRESSO S.T.I.) - post appello 10/07 ore 14.00 (PRESSO S.T.I.)" Numero=Request("Cellulare") MateriaN=Request("MateriaI") … 26 Servizi PUSH via WAP: Il codice (3) Continuando: … GsmCode = left(Numero,3) PhoneNumber = right(Numero,len(Numero)-3) Sender = "PROVA" TextMessage = Materia(int(MateriaN)) Stringa = "Account=xxxx&Password=xxxx&CountryCode=+39&GsmCode=" & GsmCode & "&PhoneNumber=" & PhoneNumber & "&Sender=" & Sender & "&TextMessage=" & TextMessage Dim req As WebRequest = WebRequest.Create("http://gateway.smsitaly.com/gate/check.asp?“ & stringa) Dim resp As WebResponse = req.GetResponse st = resp.GetResponseStream sr = New StreamReader(st) Risposta = sr.ReadToEnd() … 27 Servizi PUSH via WAP: Il codice (4) Continuando: If Risposta = “01” then MessaggioOUT=“SMS contenente le informazioni sulla materia specificata inviato.” Else MessaggioOUT=“Impossibile spedire l’SMS” End if sr.Close() st.Close() %> <?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <card title="PROVA ASP.NET"> <p><%=MessaggioOUT%></p> </card> 28 </wml> Servizi PUSH via WAP: Il codice (5) Vedremo ora il servizio all’opera. Ricordiamoci che questo è solo un piccolo esempio di servizio PUSH che è possibile realizzare. E’ per esempio possibile anche realizzare servizi che accedono a determinate informazioni contenute in database od in siti internet e le restituiscono a chi le chiede (es: notizie aggiornate dal mondo, carriera lavorativa, ferie prese, ferie spettanti, ecc.) 29 Servizi PUSH via WAP: Il servizio all’opera (1) Vediamo ora come funzionerà il servizio PUSH da noi creato. Per prima cosa ci connetteremo via WAP alla pagina iniziale: 30 Servizi PUSH via WAP: Il servizio all’opera (2) Apparirà così la pagina iniziale dalla quale sceglieremo la materia di cui ci interessa conoscere gli appelli (supponiamo Linguaggi e Applicazioni Multimediali): 31 Servizi PUSH via WAP: Il servizio all’opera (3) Sceglieremo poi il numero di cellulare al quale spedire l’SMS, magari possiamo spedirlo ad un amico a cui interessava quell’esame: Clicchiamo poi su ‘Clicca qui per Inviare i dati’ 32 Servizi PUSH via WAP: Il servizio all’opera (4) A questo punto il servizio ci informerà che l’sms è stato spedito correttamente: Potremo così leggere l’SMS ricevuto e, se lo vorremo, mantenerlo memorizzato come promemoria: 33 CONCLUSIONI 34 CONCLUSIONI: Abbiamo visto come è possibile struttare ASP.net ed i gateway per creare dei servizi molto potenti. Allo stesso modo, con codice molto simile, sarà presto possibile creare anche applicazioni avanzate per UMTS. Già oggi è possibile creare dinamicamente codice SMIL che può essere direttamente interpretato per esempio da alcuni PDA per creare applicazioni quali: karaoke, animazioni, guide interattive e tanto altro… 35