Bob Swart (aka Dr.Bob)
Hoofdpijn van WAP

WAP staat voor Wireless Application Protocol, en is een ontwikkeling waar menigeen een mening over heeft; vaak zonder precies te weten hoe de vork precies in de steel zit (of de WAP in het Web). Om hoofdpijn van te krijgen! In dit artikel probeer ik niet alleen uit te leggen wat er met WAP allemaal wél en niet kan, maar ik zal ook laten zien hoe we met een omgeving als Delphi op eenvoudige wijze WAP toepassingen kunnen schrijven en deployen.

WAP != Web
Allereerst begin ik maar met wat misverstanden uit de weg te ruimen: WAP is geen Web, en met een WAP telefoon kun je niet over het web surfen. En da's maar goed ook, want als je ergens hoofdpijn van krijgt is het wel een website bekijken in een 200 bij 160 pixel schermpje (zonder kleur). En zelfs platte tekst is beperkt tot korte zinnen (want veel meer dan drie regels tekst kun je ook niet kwijt). Wat kan WAP dan wel? De raakvlak met het Web is in ieder geval de architectuur: een WAP server (web server die WAP-enabled is), WAP Gateway (de ISP om "in te bellen") en clients (de browsers, voor WAP een WAP telefoon). De beperking zit hem - op dit moment - nog in de client (het kleine scherm en beperkte geheugen van de telefoontjes) en de bandbreedte - of liever gezegd de kosten voor de bandbreedte. Dat betekent dat toepassingen voor WAP zich voorlopig zullen moeten beperken wat betreft de output en het gebruik van bandbreedte. De ultimate thin-client dus...

WAP = WML
Waar het Web werkt met HTML en web pagina's, daar werkt WAP met WML (Wireless Markup Language) en cards (kaarten) in plaats van pagina's. WML is gebasseerd op XML, en niet zo heel erg moeilijk te leren, zeker niet als je al een-en-ander van HTML af weet. Belangrijk om te weten is dat de WML "browsers" (lees: de WAP telefoontjes) niet zo vergevingsgezind zijn als de normale HTML browsers waar iedereen mee gewend is te werken. Waar een ontbrekende </p> tag in HTML niet zo'n zonde is, leidt het onherroepelijk tot foutmeldingen of het gewoon niet werken van een WML card. We moeten ons dan ook vanaf het begin aan de regels houden, en de eerste regels zijn dat alle tags in kleine letters moeten, en alle tags ook afgesloten moeten worden. Daarnaast mogen we geen attributen gebruiken (binnen tags) die onbekend zijn. Dat klinkt allemaal behoorlijk heftig, en is vaak lastig te testen. Vandaar dat het geen kwaad kan om een simulatie-omgeving bij de hand te hebben, zodat je in ieder geval de WML card (of toepassing) kunt testen voordat je het hele zaakje ge-upload hebt bij de WAP-enabled web server. De WAP simulatie-omgeving die ikzelf dagelijks gebruik is van Nokia, en kun je downloaden van http://forum.nokia.com (als je geregistreerd bent - wat weinig moeite kost - kun je hem ook direct downloaden van http://www.forum.nokia.com/wapforum/main/1,6668,1_1_30_2_3,00.html).

WAP en WML Cards
Er zijn voldoende informatiebronnen beschikbaar over de exacte WML syntax, dus daar wil ik niet te lang bij stilstaan. Een WML "document" kan meerdere cards bevatten, elk binnen een <card> en </card> tag. Zo'n document, met meerdere cards dus, heet ook wel een "deck", en het geheel zit altijd tussen <wml> en </wml> tags. De eerste twee regels van een WML deck zijn ook verplicht, en geven aan dat het een XML-subset is. Hieronder staat een voorbeeld van een eenvoudige WML card die alleen maar "Hallo, SDGN" zegt, en als potentiële aktie voor de "accept" knop (de knop waarmee je ook inkomende gesprekken "accepteert") een aanroep naar een web server applicatie heeft, namelijk http://www.eBob42.com/cgi-bin/wap.exe

  <?xml version="1.0"?>
  <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
    "http://www.wapforum.org/DTD/wml_1.1.xml">

  <wml>
   <card id="sdgn" title="Hallo, SDGN">
    <p>
     Druk op <b> de knop </b> voor meer...
    </p>
    <do type="accept" label="de knop">
     <go href="http://www.eBob42.com/cgi-bin/wap.exe"/>
    </do>
   </card>
  </wml>
In de Blueprint simulator van de Nokia Toolkit versie 2.0 zit bovenstaand WML document er als volgt uit:

Dit is natuurlijk maar een statische pagina, en we hebben er niet eens Delphi voor nodig gehad. Voor dat laatste moeten we eerst eens kijken naar de mogelijke WAP toepassingen die we kunnen bedenken.

WAP Toepassingen
Gegeven de beperkingen die ik hiervoor aangaf; wat zouden nu typische WAP toepassingen (kunnen) zijn? Op dit moment zijn er al enkele beschikbaar. Denk aan de weersverwachting (voor een bepaalde regio), verkeersinformatie, financiële informatie (saldo, overschrijven van geld, stand van de AEX), het inchecken van een vlucht met de KLM, of het reserveren van een film- of theatervoorstelling. Dit zijn echter vooral zaken die ook met een "gewone" telefoon kunnen (alhoewel het schermpje soms handig is om de informatie ook zwart-op-wit te zien). Persoonlijk zie ik WAP toepassingen vooral een succes worden als ze toegang bieden tot informatie die tijdsgevoelig is (bijvoorbeeld de beurskoers, verkeersinformatie of weersverwachting). Een andere mogelijkheid zie ik in de consumentenmarkt, en dan met name om vergelijkend warenonderzoek op basis van prijs en/of prestatie. Iets wat hier nauw op aansluit is de adviesfunktionaliteit. En dan niet alleen betreffende de soort hypotheek die iemand moet nemen, maar wellicht ook welke wijn het beste past bij welk eten, hoe een verstuikte enkel het beste te behandelen is, of wat voor hoofdpijn iemand heeft. Om het laatste voorbeeld te nemen: de gemiddelde apotheker in Nederland heeft een stapel brochures staan die de klanten gratis mee kunnen nemen. Eén van deze foldertjes gaat over het herkennen van bepaalde soorten hoofdpijn. Omdat ik zelf nogal vaak last heb van hoofdpijn, ken ik deze folder inmiddels uit mijn hoofd (vandaar de pijn wellicht).

Hoofdpijn
De hoofdpijn folder bestaat uit een 13-tal ja/nee-vragen op basis waarvan een diagnose (één van zes) wordt gesteld (die aangeeft wat voor soort hoofdpijn de persoon heeft). Stel dat je dit ook zónder folder zou willen doen. Het is niet zo moeilijk om een toepassing te maken die de vragen stelt. De hoofdpijn toepassing als "normale" web server toepassing is te proberen op http://www.eBob42.com/cgi-bin/PijnBox.exe (voor normale browsers). Ik heb twee manieren geprobeerd om hem als WAP toepassing beschikbaar te maken. De eerste manier bestaat uit het volledig uitschrijven van iedere vraag en diagnose als individuele "card" van een groot deck bestaande uit 19 cards. Het resultaat is te zien (en te laden in de Nokia simulator) onder de naam http://www.drbob42.co.uk/PijnBox.wml (als je dit met een gewone browser wilt bekijken krijg je de mogelijkheid om het bestand te downloaden, waarna je de inhoud zelf nader kunt bekijken). In de Blueprint simulator ziet het eerste scherm er als volgt uit:

Na zo'n drie tot vijf vragen kan het systeem een conclusie trekken. Omdat iedere aktie wijst naar een card in hetzelfde deck zal de WAP-telefoon (na het eerste kontakt) geen dataverkeer meer hoeven te hebben, want alles zit al in het geheugen van de client. Het WML bestand (het deck) is 5.789 bytes groot - een "diagnose"-systeem in minder dan 6K! Helaas is zelfs 6K te groot voor sommige WAP telefoontjes die ik in praktijk heb geprobeerd (de test is eenvoudig in de telefoonwinkel uit te voeren: de URL is http://www.drbob42.co.uk/PijnBox.wml). Mede door deze praktijksituatie, bestaat de tweede poging uit het maken van de PijnBox als WAP toepassing met behulp van de Delphi WebBroker techniek (waar ik natuurlijk al vaker over heb geschreven). Alleen op die manier kunnen we de output (de hoeveelheid WML die per keer over de lijn (of liever gezegd: door de lucht) wordt gestuurd beperken tot 2K ofzo, en daarmee de PijnBox met alle WAP-telefoontjes laten werken).

WAP WebModule
Start Delphi 5, en begin een nieuwe Web Server Application (File | New - Web Server Application). Kies voor het type dat je zelf het prettigst vindt (ik kies hier voor een CGI toepassing). Start vervolgens de Action Editor (door met de rechter muisknop op de Web Module te klikken) en maak vervolgens een 19-tal WebActionItems aan. Geef de eerste 13 als PathInfo de extentie /card11 tot en met /card23, en de laatste zes de PathInfo /diagno1 tot en met /diagno6. De eerste WebActionItem /card11 wordt meteen onze default (zet de default property op True), en zal de eerste vraag van de PijnBox vertonen. Belangrijk bij het bouwen van WAP toepassingen is het herinneren dat we WML moeten genereren en geen HTML (wat de default is). We zullen dit moeten aangeven door de Response.ContentType op 'text/vnd.wap.wml' te zetten. Zie ook de sidebar (aan het eind van het artikel) waarin ik aangeef hoe de web server zelf WAP-enabled gemaakt kan worden. Als eenmaal de juiste ContentType is aangegeven, rest ons om de Content zelf de juiste waarde te geven. De Content moet altijd met dezelfde twee regels beginnen (die we ook eerder in het WML voorbeeld zagen), en bevat daarna de WML code voor één enkele card:

  procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
    Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
  begin
    Response.ContentType := 'text/vnd.wap.wml';
    Response.Content :=
      '<?xml version="1.0"?>' + #13#10 +
      '<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" '+
      '"http://www.wapforum.org/DTD/wml_1.1.xml">'+
      #13#10 +
      #13#10 +
      '<wml>' +
      '<card id="card11" title="PijnBox">' +
      '<p>' +
      'Komt uw hoofdpijn meestal in aanvallen die vaak langer dan 4 uur duren?' +
      '</p>' +
      '<do type="prev" label="Ja">'+
      ' <go href="http://www.eBob42.com/cgi-bin/wap.exe/card12"/></do>' +
      '<do type="next" label="Nee">'+
      ' <go href="http://www.eBob42.com/cgi-bin/wap.exe/card16"/></do>' +
      '</card>' +
      '</wml>';
  end;
Behalve de vraag ("Komt uw hoofdpijn meestal in aanvallen die vaak langer dan 4 uur duren?") zien we ook twee mogelijke antwoorden: de linkerknop (Nee) en de rechterknop (Ja). Beide knoppen zorgen voor een actie, namelijk de aanroep van onszelf (wap.exe is de naam van de CGI toepassing die ik hiervoor heb gebruikt), maar dan met een andere waarde voor PathInfo, oftewel met een andere WebActionItem waarvan de OnAction item wordt uitgevoerd. En ook daarin zal dan een (vervolg)vraag gesteld worden of een diagnose worden vermeld (voor de PathInfo's diagno1 tot en met diagno6). Net als de code voor de gehele pijnbox.wml (met alle 19 cards in één deck) is de source code voor de gehele toepassing te lang om hier af te drukken (maar wel beschikbaar om te downloaden van www.drbob42.nl). Ter illustratie volgt hier de code voor het OnAction event van de /diagno1 WebActionItem:
  procedure TWebModule1.WebModule1WebActionItem14Action(Sender: TObject;
    Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
  begin
    Response.ContentType := 'text/vnd.wap.wml';
    Response.Content :=
      '<?xml version="1.0"?>' + #13#10 +
      '<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" '+
      '"http://www.wapforum.org/DTD/wml_1.1.xml">'+
      #13#10 +
      #13#10 +
      '<wml>' +
      '<card id="diagno1" title="Migraine?">' +
      '<p>' +
      'Uw klachten wijzen op migraine (maar niet alle kenmerken zijn aanwezig).' +
      '<br/>' +
      'Aangenomen wordt dat 15% van alle vrouwen en '+
      '6% van alle mannen last heeft van migraine.'  +
      'Tegenwoordig kan migraine goed behandeld worden.' +
      'Vraag uw huisarts om een specifiek middel tegen migraine.' +
      '</p>' +
      '<do type="next" label="Opnieuw">' +
      '<go href="http://www.eBob42.com/cgi-bin/wap.exe"/></do>' +
      '</card>' +
      '</wml>';
  end;
Merk op dat op het eind de mogelijkheid wordt geboden om via de linkerknop opnieuw te beginnen met de sessie. In dat geval roepen we de wap.exe weer aan zónder daarbij een PathInfo aan te geven, zodat de defaul action voor /card11 weer wordt uitgevoerd (om de allereerste vraag weer te laten zien).

Optimalisaties
Natuurlijk is bovenstaande toepassing nog steeds niet echt spannend, maar het laat wel meteen zien hoe beperkt in feite de mogelijkheden van WAP telefoons zijn (los van het kleine scherm hebben ze ook weinig intern geheugen, dus maar in staat om kleine hoeveelheden WML te ontvangen). Als optimalisatie voor de CGI toepassing die ik voor de PijnBox heb gebouwd zou ik in ieder geval de eerste twee regels van iedere Content tekst als een aparte constante kunnen definieren, en daarnaast elke vraag en diagnose flink kunnen inkorten (dat vereist soms wel wat materiekennis), waardoor er nog minder WML over de lijn gaat. Het oorspronkelijke pijnbox.wml bestand kan met deze laatste techniek ook kleiner gemaakt worden (van 6K tot zelfs iets minder dan 4K).

WebBroker en WAP
Voor de pijnbox heb ik alleen maar wat simpele WML codes gegenereerd, en geen gebruik gemaakt van de WebBroker componenten die bij Delphi zitten. Daar is een goede reden voor, want ze zijn niet allemaal geschikt om WML mee te genereren. Met name de "TableProducers" genereren HTML code die niet compatible is met WML. Alleen de PageProducer en DataSetPageProducer componenten zijn te gebruiken - op basis van een WML-template - binnen een WAP toepassing. De MidasPageProducer is uiteraard volslagen onbruikbaar, als was het maar omdat ik een WAP-telefoon nog geen 60K aan JavaScript include files zie downloaden (laat staan de DHTML en XML data die erbij wordt gegenereerd).

Toekomst van WAP
WAP is een jonge technologie (maar op zich al ruim een jaar oud), waarvan op voorhand al duidelijk is dat de huidige versie niet het eeuwige leven zal hebben. Echter, wie nu al ervaring opdoet met de huidige versie van WAP, WML, WBMP en aanverwante technieken zal straks alleen maar meer ervaring hebben wanneer (niet als) de wireless toepassingen echt doorbreken. En dat Delphi daarbij een hulpmiddel kan zijn om WAP toepassingen te maken heb ik hopelijk in dit artikel laten zien.
Mocht iemand nog vragen, opmerkingen of suggesties hebben, dan hoor ik die het liefst via .

WAP-enabled Web Server
Zoals ik in dit artikel enkele malen aangeef, zijn de WML pagina's (zowel statisch als dynamisch) alleen vanaf www.drbob42.co.uk te bekijken. Dit is normaal gesproken mijn mirror website, gehost door TDMWeb, maar wel als enige van mijn hosts WAP-enabled. Mijn www.drbob42.com en www.drbob42.nl domeinen zijn dit dus niet, en WML pagina's zullen niet als zodanig gehost kunnen worden door die twee web servers. Onder Windows is het mogelijk om ook zelf een web server te installeren (bijvoorbeeld Personal Web Server onder Windows 95 of 98, of Internet Information Server onder Windows NT of 2000). Deze web server kun je WAP-enabled maken door hem WML en eventueel ook WBMP (het grafische formaat dat WAP gebruikt) te laten ondersteunen. Start de Internet Service Manager, en klik op de (Default) Web Site die je WAP-enabled wilt maken. Kies met de rechter muisknop voor de Properties dialoog, en ga daarin naar de HTTP Headers tab. Klik hierin op de File Types knop, en voeg aan het lijstje de twee regels toe die in het plaatje rechts te zien zijn:


Dit artikel is eerder verschenen in SDGN Magazine #64 - 2001

This webpage © 2001-2006 by webmaster drs. Robert E. Swart (aka - www.drbob42.com). All Rights Reserved.