Per prendere confidenza con la tecnologia WAP ho iniziato scrivendo un po'
di pagine WML e mettendole in linea su un server HTTP.
In seguito ho fatto alcuni esperimenti con un WAP gateway.
4.1. Configurazione del server HTTP
Il server che ha ospitato le pagine è allocato nel
Dipartimento di Ingegneria ed è un computer di classe
Intel Pentium III, biprocessore, con sistema operativo Linux.
Su tale macchina era già presente il software Apache,
utilizzato per servire, via protocollo [HTTP], le pagine del sito web del
dipartimento.
Per poter utilizzare al mio scopo questa macchina, è stato
registrato il nome a dominio wap.chaos.cc sul
DNS1 di Dipartimento ed è
stato aggiunto un host virtuale alla configurazione di
[APACHE].
Si tratta di queste righe nel file httpd.conf:
<VirtualHost 192.167.215.104:80>
ServerAdmin g.mazzini@ieee.org
DocumentRoot /automnt/tlc1/reti/wap/doc
ServerName wap.chaos.cc
ErrorLog logs/error-wap
TransferLog logs/wap
ScriptAlias /cgi/ /automnt/tlc1/reti/wap/cgi/
<Directory /automnt/tlc1/reti/wap/doc>
Options Includes ExecCGI FollowSymLinks
AllowOverride All
order allow,deny
allow from all
</Directory>
</VirtualHost>
In questo modo è stata instaurata un'associazione tra URL e
directory, del tipo:
Per terminare l'operazione, possiamo specificare anche che, se non
altrimenti specificato, il file che deve essere utilizzato come indice
di una directory in cui si trovano contenuti WAP si chiama
index.wml:
4.2. Un file di esempio
Ho predisposto dentro le due directory una serie di file WML studiati
appositamente per testare le varie possibilità del linguaggio ed
esplorare l'uso dei vari tag.
Ecco ad esempio il file index.wml:
<?xml version="1.0" encoding="ISO-8859-1">
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<!-- by Simone Piunno pioppo@ferrara.linux.it -->
<template>
<do type="prev"><prev/></do>
</template>
<card id="main" title="WML test" newcontext="true">
<p>
Ciao! Questo è un sito di test.
<a href="#2">Avanti</a>
</p>
</card>
<card id="2" title="WML test">
<p>
Il suo scopo è dimostrarti le capacità
del linguaggio WML
<a href="#3">Avanti</a>
</p>
</card>
<card id="3" title="Elenco1">
<p>
Scegli quale raggruppamento vedere:
<select title="gruppi" name="gruppo">
<option value="intestazioni">Intestazioni</option>
<option value="layout">Layout</option>
<option value="input">Input</option>
<option value="eventi">Eventi</option>
</select>
<a href="#$(gruppo)">Procedi</a>
</p>
</card>
<!-- altre cards... -->
</wml>
Per verificare che tutto funzionasse ho utilizzato un telefono
Siemens S35i e mi sono assicurato che dal telefono le pagine
fossero visibili correttamente.
Tutti i files sono consultabili con un browser WAP all'indirizzo
http://wap.chaos.cc/test/
4.3. Un CGI di esempio
Per verificare che anche la generazione dinamica di contenuti WML fosse
funzionante, ho scritto un piccolo programmino in liguaggio
[PERL] che, quando interpellato,
restituisce una pagina WML nella quale riporta l'orario.
Perl è un linguaggio semi-interpretato particolarmente adatto alla
costruzione di [CGI] e del quale è
disponibile una implementazione gratuita.
L'interprete è di norma presente di serie sulle macchine dotate di
sistema operativo Linux.
Il programmino è visitabile all'indirizzo
http://wap.chaos.cc/cgi/ora.cgi e questo è il codice:
#!/usr/bin/perl
print "Content-type: text/vnd.wap.wml\n\n";
print <<EOF;
<?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="Ora Esatta">
<p>
Sono le ore:<br/>
EOF
print qx(date);
print "</p></card></wml>\n";
Si noti la seconda riga: poichè il server HTTP rimanda al browser
un testo generato dinamicamente, non può riconoscere automaticamente
il tipo MIME (cosa che normalmente viene fatta esaminando l'estensione del
file) e questo comporta l'obbigo di iniziare il testo con
Content-type: text/vnd.wap.wml seguito da riga vuota.
4.4. Kannel
Le prove effettuate visualizzando le mie pagine sul Siemens s35i sono
state condotte passando per il gateway fornito da Telecom Italia Mobile
per i suoi abbonati.
In particolare il telefono dialogava con il gateway TIM utilizzando la
modalità WAP over CSD (ovvero incapsulando WAP dentro
IP/PPP) e passando di fatto attraverso l'equivalente di un dialup Internet
provider fornito anch'esso dall'operatore di telefonia.
Per capire meglio il meccanismo ho installato e configurato un gateway
free per sistemi Unix chiamato
Kannel3
anche se questo componente è risultato poi non necessario per lo
svolgimento dei progetti successivi.
Kannel è strutturato in maniera modulare: un oggetto di nome
bearerbox riceve connessioni WAP UDP sulla porta 9201 e consegna ad
un pool di altri oggetti denominati wapbox il compito materiale di
recuperare la risorsa richiesta e tradurla (tokenizzarla) opportunamente.
Contiene anche un sistema di gestione degli
SMS4 che non ho utilizzato: al
bearerbox è possibile connettere un numero arbitrario di moduli
smsbox che ricevono via HTTP richieste di invio messaggi; questi
ultimi vengono passati al bearerbox che li instrada verso un server
SMSC5.
La comunicazione tra il bearerbox e i vari wapbox e smsbox avviene
attraverso socket UDP così che i vari moduli possano essere messi
in esecuzione su macchine diverse permettendo di costruire una struttura
scalabile e fault-tolerant.
Per portare a termine l'installazione di Kannel bisogna prima installare
la libreria libxml6, utilizzata per
il parsing e la tokenizzazione dei file WML.
Ecco ad esempio una configurazione per il bearerbox:
# Kannel.conf
max-threads = 20
http-port = 12345
admin-username = "pippo"
admin-password = "lapass"
wapbox-port = 13000
heartbeat-freq = 30
max-queue = 1000
allowed-hosts = "127.0.0.1"
denied-hosts = "*.*.*.*"
pid-file = "/tmp/bb.pid"
log-file = "/tmp/bearerbox.log"
log-level = 0
wdp-upd = wap
interface-name = *
wap-service = "wsp"
wdp-upd = wsp-wtp
interface-name = *
wap-service = "wsp/wtp"
Ed eccone una invece per il wapbox:
# kannel.wapconf
bearerbox-host = localhost
bearerbox-port = 13002
heartbeat-freq = 30
pid-file = "/tmp/wapbox.pid"
log-file = "/tmp/wapbox.log"
log-level = 0
Dopo aver lanciato un bearerbox e uno wapbox, ho effettuato un po'
di simulazioni utilizzando il programma fakewap fornito in
dotazione con kannel.
fakewap simula un client WAP connettendosi al bearerbox con il
protocollo WSP e chiedendo di ricevere pagine dagli URL specificati
sulla linea di comando.
Kannel recupera le pagine richieste e le consegna tokenizzate a
fakewap, il quale ne mostra in output un dump esadecimale.
Esaminando i log ho potuto ispezionare nei dettagli il funzionamento
di un WAP gateway.
Testare il funzionamento con un vero telefono WAP è molto costoso
e ne ho avuto uno a disposizione solo per brevi periodi.
Dopo varie ricerche sulla rete ho scoperto che erano disponibili molti
emulatori, tutti funzionanti soltanto sul sistema operativo Windows,
nessuno fornito con il codice sorgente: Nokia WAP toolkit, Ericsson WAP
IDE SDK, Motorola Mobile ADK, Phone.com UP.SDK, WapMan, WinWap.
Ho trovato anche tre tentativi di realizzare un emulatore WAP che potesse
essere utilizzato da un normale browser WEB, con grande vantaggio in
termini di interoperabilità, ma nessuno di questi sembrava
funzionare molto bene:
Non avendo a disposizione un emulatore per ambienti Unix, ai quali il
mio lavoro era vincolato, ho infine deciso di realizzarne uno.