Пособие по написанию WAP сайтов
ГЛАВА 9
Подробнее о приложении WapPage.wml
Подробнее о сценарии языка Perl WapPage.pl
Подробнее о приложении WapPage.hdml
Подробнее о WapPageHDML.pl.
Пересылка сообщений посредством сети Интернет
В течение многих лет пейджеры способствовали тому, чтобы люди быстро находили друг друга. С увеличением популярности сотовых телефонов, пейджеры начали отходить в прошлое. К счастью, многие сотовые телефоны позволяют передавать сообщения на другие индивидуальные сотовые телефоны. ПриложениеWapPage (передача сообщений с использованием протокола WAP) сочетает в себефайлы формата WML и сценарий языка Perl для предоставления пользователювозможности передавать сообщения другим людям, используя сеть SprintPCS (дляотправки сообщений людям, которые не пользуются сетью SprintPCS, нужно модифицировать сценарий языка Perl). Когда пользователь запустит приложение,сотовый телефон предложит пользователю ввести номер для ответа (номер, покоторому получатель сообщения сможет выйти на пользователя), как показанона Рис. 9.1. После того как пользователь введет свой номер для ответа с помощьюцифровой клавиатуры, приложение предложит пользователю ввести номер, покоторому надо послать сообщение, как показано на Рис. 9.2. После этого будетпредложено непосредственно ввести текстовое сообщение, которое может содержать до 80 символов, как показано на Рис. 9.3. Далее, приложение отобразититоговый экран, как показано на Рис. 9.4.
Если вы еще не установили пакет инструментальных средствдля разработки программного обеспечения (SDK) для WAP, например, с сайта www.openwave.com, можно протестироватьприложение WapPage, используя сотовый телефон, поддерживающий протокол WAP. Для этого с помощью телефона необходимо набрать адрес waplib.com/WapPage/WapPage.hdml, еслибраузер телефона поддерживает язык HDML. Если браузер поддерживает язык WML, то надо ввести адресwaplib.com/WapPage/WapPage.wml.
Пересылка сообщений посредством сети Интернет
Пересылка сообщений посредством сети Интернет
Для пересылки сообщений описанные ранее «беспроводные» приложения просто пересылают данные сценарию языка Perl, который, запускаясь, посылает сообщение электронной почты в центр сообщений Sprint PCS. Поэтому имеетсмысл разработать Web-страницу, с которой можно будет посылать сообщения
другим людям.
Рис. 9.5 отображает подобную страницу (файл WebPage.html), которая приглашает пользователя ввести информацию SendTo, ReplyTo и MsgText.
Если вы захотите протестировать файл WebPage.html, то,просматривая меню приложений сайта waplib.com, вы не найдете там приложения WebPage.html, Так сделано потому, чтофайл WebPage.html не является «беспроводным» приложением.Подобный файл необходимо запускать в стандартном браузере,таком как, например, Microsoft Internet Explorer. ФайлWebPage.html можно запустить в своем браузере из папкиChaptered, которая находится на прилагаемом к книге компакт-диске, или найти его в Интернете по адресуwww.waplib.com/WebPage/WebPage.html.
Подробнее о приложении WapPage.hdml
Подробнее о приложении WapPage.hdml
Как и приложение формата WML, файл WapPage.hdml позволяет пользователюпослать сообщение на сотовый телефон сети Sprint PCS. Дека WapPage.hdml также взаимодействует со сценарием языка Perl, содержание которой практическиидентично сценарию WapPageWML.pl. Дека WapPage.hdml имеет следующий исходный код:
<HDML Version=3.0 Markable=True TTL=0>
<Entry Name=Start Format=NNN-NNN-NNNN Key=ReplyTo Default="">
<Action Type=Accept Task=GO Dest=#GetTo>
<Center>WAP Page <br><br>Reply To:
</Entry>
<Entry Name=GetTo Format=NNN-NNN-NNNN Key=SendTo Default="">
<Action Type=Accept Task=GO Dest=#GetText>
<Center>WAP Page <br><br>Send To:
</Entry>
<Entry Name=GetText Format=80M Key=MsgText Default="">
<Action Type=Accept Task=GO Dest=#Confirm>
<Center>WAP Page <br><br>Message:
</Entry>
<Display Name=Confirm>
<Action Type=Accept Task=GO Label=Send Method=Post PostData=$(ReplyTo:noesc)&$(SendTo:noesc)&$ (MsgText:noesc) Dest=../waplibcgi/WapPageHDML.pl>
<Center>WAP Page <br>Reply-To: $(ReplyTo) <br>To: $(SendTo) <br>Text: $(MsgText)
</Display>
</HDML>
Первый в исходном коде элемент сообщает браузеру (или другим программистам),какая версия языка HDML используется приложением. Далее выражение Markable=True сообщает браузеру, что он может установить закладку в исходной деке, атть=0 сообщает ему о невозможности кэширования (таким образом, браузер должен перезагружать эту деку каждый раз при обращении к ней пользователя).
Дека использует те же имена переменных - SendTo, ReplyTo, MsgText. Для обеспечения пользователю ввода информации используется элемент <Entry>, который также определяет и формат данных. После того как данные будут введены,приложение передает управление карте Confirm, которая отображает приглашение к нажатию Send (Послать). Когда пользователь нажимает Send (Послать),приложение вызывает сценарий WapPageHDML.pl, который и выполняет основную обработку полученной информации.
Подробнее о приложении WapPage.wml
Подробнее о приложении WapPage.wml
Когда пользователь запускает приложение WapPage, дека WapPage.wml отображает запросы на ввод номера пользователя для ответа, номера получателя и непосредственно текстового сообщения. После того как пользователь введет эту информацию, приложение подключает сценарий языка Perl WebPageWML.pl, который и выполняет большинство необходимых действий. Дека WapPage.wml имеетследующий исходный код:
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head>
<meta http-equiv="Cache-Control" content="max-age=0" forua="true"/>
</head>
<card id="WAPPage" title="WAP Page">
<onevent type="onenterforward">
<refresh> <setvar name="SendTo" value="" /> <setvar name="MsgText" value="" /> </refresh>
</onevent>
<onevent type="onenterbackward">
<refresh> <setvar name="SendTo" value="" /> <setvar name="MsgText" value="" /> </refresh>
</onevent>
<do type="accept"> <go href="#Confirm" /> </do>
<p align="center">
WAP Page<br/>
</p>
<p align="left">
Reply To: <input name="ReplyTo" type="text" format="NNN-NNN-NNNN" />
</p>
<p align="center">
WAP Page<br/>
</p>
<p align="left">
Send To: <input name="SendTo" type="text" format="NNN-NNN-NNNN" />
</p>
<p align="center">
WAP Page<br/>
</p>
<p align="left">
Message: <input name="MsgText" type="text" format="80M" />
</p>
</card>
<card id="Confirm">
<do type="accept" label="Send"> <go method="post" href="../waplibcgi/WapPageWML.pl"> <postfield name="ReplyTo" value="$(ReplyTo)&"/> <postfield name="SendTo" value="$(SendTo)&"/> <postfield name="MsgText" value="$(MsgText)"/> </go> </do>
<p align="center">
WAP Page
</p>
<p align="left" mode="wrap">
Reply-To: $(ReplyTo) <br/>To: $(SendTo) <br/>Text: $(MsgText)
</p>
</card>
</wml>
Так же как и во всех деках формата WML, первые два ее элемента сообщают браузеру, какую из версий спецификации WAP поддерживает данное приложение. Внашем случае WML-страница поддерживает версию 1.0 языка XML и версию 1.1описания типа документа (DTD), разработанного ассоциацией WAP Forum.
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
Далее, за информацией о версиях, каждый WML-файл начинается с тега <wml>. Вконце каждого файла вводят </wml>, что означает окончание исходного кодаприложения. За <wml> следуют теги <head> и </head>, внутри которых находитсяинформация о самом исходном коде, включая метаданные и информацию обуправлении доступом. Многие программисты называют метаданные «данными оданных». Другими словами, в этом случае метаданные, которые считывает и обрабатывает браузер, сообщают ему, как трактовать данные.
<head>
<meta http-equiv="Cache-Control" content="max-age=0" forua="true"/> </head>
Элемент <meta> позволяет точно определить метаинформацию для исходногофайла. В нашем случае строка http-eguiv="Cache-Control" сообщает браузеруWAP, что эта часть метаинформации используется системой кэширования памяти. Аналогично, строка content=max-age=0 сообщает браузеру, что максимальноевремя, в течение которого будет кэшироваться этот файл, равно нулю секунд;значит, браузер не будет кэшировать данные, а загружать данные с сервера каждый раз, когда они будут запрошены. Для этой книги значение нуля было выбрано для содействия процессу обучения читателя. При выборе нуля каждый раз,когда будут происходить изменения, они будут передаваться на телефон. В реальном приложении статическое меню, подобное этому, можно использовать поумолчанию в течение 30 дней. Последняя строка forua="true" определяет, чтозначение Cache-Control предназначено для телефона и не может быть измененокаким-либо промежуточным агентом. -
Приложение использует три переменные для отслеживания введенной пользователем информации: ReplyTo, SendTo, MsgText. За первыми строками исходного кода деки используются два элемента <onevent> для очистки значений переменных SendTo и MsgText, в случае, если пользователь будет продвигаться впередили назад в приложении, используя команды <до> и <prev>.
Событие Onenterforward происходит в том случае, когда пользователь переходит к карте с помощью команды <до>. Аналогично, когда используется команда<prev>, происходит событие Onenterbackward. После этого приложение передает сообщение сценарию языка Perl, который использует элемент <до> для возврата в начало и пользователь может послать другое сообщение, если желает. Приложение полагает, что номер в переменной ReplyTo остается прежним, поэтомуи не удаляет его каждый раз, как две другие переменные.
<onevent type="onenterforward">
<refresh> <setvar name="SendTo" value="" /> <setvar name="MsgText" value="" /> </refresh>
</onevent>
<onevent type="onenterbackward">
<refresh> <setvar name="SendTo" value="" /> <setvar name="MsgText" value="" /> </refresh>
</onevent>
Далее, в исходном коде используется элемент <input> для определения формататрех вводимых переменных. Как вы видите, элементы <input> следуют в том жепорядке, в каком они появляются на дисплее телефона. Заметьте также, что элемент <input> определяет формат для каждой из переменных. Формат NNN-NNN-NNNN для переменных SendTo и ReplyTo, к примеру, ограничивает значение каждой переменной числовыми данными в виде телефонного номера. Аналогично,формат 80М для переменной MsgText допускает ввод не более 80 символов.
После того как пользователь введет желаемые данные, приложение обратится ккарте Confirm (Подтверждение), отображающей данные, которые необходимопередать. После того как пользователь нажмет кнопку Send (Послать), дека передаст данные сценарию языка Perl WapPageWML.pl, как показано ниже:
Карта использует элемент <do> для отображения итогового сообщения и кнопкиSend на дисплее сотового телефона. Если пользователь нажимает Send, данныепередаются сценарию языка Perl.
Подробнее о сценарии языка Perl WapPage.pl
Подробнее о сценарии языка Perl WapPage.pl
Как было сказано выше, каждый раз, когда пользователь выбирает опцию Send,приложение WapPage.wml запускает сценарий языка Perl, который и посылает
данные конкретному получателю сообщения. Далее, этот сценарий создает новую деку формата WML, которая после обработки браузером отображает сообщение о подтверждении отправки сообщения. Как вы увидите, для отправки сообщения просто используется электронная почта (e-mail). Исходный код сценарияWapPageWML.pl приведен ниже:
#!/usr/bin/perl
require 'DeckUtils.pl';
$mailprog = "/bin/sendmail";
# Get the CGI variables. %cgiVars = &AppUtils::ParseCGIVars(); $ReplyTo = $cgiVars{"ReplyTo"}; $SendTo = $cgiVars{"SendTo"}; $SendTo =~ s/-//g; $SendTo .= "\@messaging.sprintpcs.com"; $MsgText = $cgiVars{"MsgText"};
open(MAIL, "|$mailprog $SendTo");
print MAIL "From: Demo\@WapLib.com\n"; print MAIL "To: $SendTo\n"; print MAIL "Subject: $ReplyTo\n\n";
print MAIL "$MsgText\n";
close(MAIL);
print "Content-type: text/vnd.wap.wml\n\n"; print "<?xml version=\"1.0\"?>\n"; print "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\"\n"; print "\"http://www.wapforum.org/DTD/wml_1.1.xml\">\n\n"; print "<wml>\n"; print "<card>\n"; print "<do type=\"accept\">\n"; print "<go href=\"../WapPage/WapPage.wml\" />\n"; print "</do>\n"; print "<p align=\"left\">\n"; print "Message has been sent to: $SendTo\n"; print "</p>\n"; print "</card>\n"; print "</wml>\n";
Первая строка сценария представляет собой комментарий, сообщающий интерпретатору командной строки, где находится интерпретатор языка Perl. Втораястрока информирует интерпретатор языка о том, что этот сценарий требуеттакже для работы сценарий языка Perl DeckUtils.pl.
Сценарий DeckUtils.pl поставляется совместно с SDK и содержит функцию РагseCGlVars, извлекающую пары данных имя/значение, которые передает сценарию карта Confirm. Далее, сценарий просто определяет символ для краткой записи, имеющий имя mailprog. После этого приложение анализирует список полученных параметров (которые передает ему карта Confirm формата WML) дляизвлечения переменных SendTo, ReplyTo и MsgText. После этого приложениезапускает почтовую программу и использует print для адресации собщения, ввода текста сообщения и так далее. Как было сказано, сценарий всего лишь пересылает почту на телефоны Sprint PCS. Если вы проанализируете исходный код, выувидите, что он присоединяет адрес электронной почты@messaging.sprintpcs.com к адресу SendTo:
$SendTo .= "\@messaging.sprintpcs.com";
Далее, сценарий закрывает почтовую программу, которая сама посылает сообщение получателю. После этого он создает новую деку, которая отображает дляпользователя посланное сообщение. Сценарий пересылает сообщения посредством сети Sprint PCS. Для передачи сообщения пользователю, используещему услуги другого провайдера, вы должны знать адрес для сообщений этому провайдеру и необходимый формат данных. К примеру, компания AT&T использует 10-значный номер телефона, такой же, как и Sprint. К ней вы можете обратиться поадресу @mobile.att.net.
Пoдрoбнee o WapPageHDML.pl
Пoдрoбнee o WapPageHDML.pl
Когда пользователь вводит информацию ReplyTo, SendTo и MsgText в приложении WapPageHDML.pl, оно передает данные сценарию WapPageHDML.pl, который,в свою очередь, передает сообщение электронной почты центру сообщенийSprint PCS, непосредственно доставляющему сообщение получателю. Как вы, наверное, уже поняли, элементы передачи сообщения в сценарии WapPageHDML.plпрактически идентичны элементам в сценарии, описанным в этой главе выше.Исходный код сценарий приведен ниже:
#!/usr/bin/perl
$mailprog = "/bin/sendmail";
read (STDIN, $Buffer, $ENV{'CONTENT_LENGTH'});
@data = split(/&/, $Buffer);
$ReplyTo = $data[0]; $SendTo = $data[1]; $SendTo =~ s/-//g; $SendTo .= "\@messaging.sprintpcs.com"; $MsgText = $data[2];
open(MAIL, "|$mailprog $SendTo");
print MAIL "From: Demo\@WapLib.com\n"; print MAIL "To: $SendTo\n"; print MAIL "Subject: $ReplyTo\n\n";
print MAIL "$MsgText\n";
close(MAIL);
print "Content-type: text/x-hdml\n\n"; print "<HDML Version=3.0 Markable=True TTL=0>\n\n"; print "<Display>\n"; print "<Action Type=Accept Task=GO Dest=../WapPage/WapPage.hdml"; print " Vars=SendTo=&MsgSubject=&MsgText=>"; print "Message has been sent to: $SendTo\n"; print "</Display>\n"; print "</HDML>\n";
Если вы сравните эти два сценария языка Perl, вы увидите, что каждый из ниханализирует переданные параметры по-своему. Это происходит в связи с тем, чтоpostfield из языка WML работает несколько иначе по сравнению с postdata изязыка HDML Postfield передает пары имя/значение, a postdata передает только значения данных, поэтому приложение должно знать их порядок.
Приглашение к вводу номерадля ответа
Рис.. 9.1. Приглашение к вводу номерадля ответа
Ввод номера для отправкисообщения
Рис.. 9.2. Ввод номера для отправкисообщения
Приглашение к вводу текстасообщения
Рис.. 9.3. Приглашение к вводу текстасообщения
Обзор общего резюме сообщения
Рис.. 9.4. Обзор общего резюме сообщения
Для того чтобы запустить приложение WapPage из своей собственной системы, вы должны использовать операционную систему Unixили Linux.
Передача сообщения с сайта Интернет
Рис.. 9.5. Передача сообщения с сайта Интернет
После того как пользователь введет необходимую для сообщения информацию инажмет кнопку Send, файл формата HTML пошлет данные сценарию языка Perl,который, обработав эту информацию, посредством электронной почты перешлет сообщение в центр обработки сообщений PCS Sprint. Файл WebPage.htmlимеет следующий исходный код:
<html>
<head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta http-equiv="Content-Language" content="en-us"> <title>Web Page</title> </head>
<body> <p align="center"><font face="Arial" size="6">Web Page</font></p> <p align="center"><font face="Arial" >(Page a Sprint PCS phone)</font></p>
<form method="POST" action="http://waplib.com/waplibcgi/ WebPage.pl">
<table width="43%"> <tr> <td width="30%"><font face="Arial" size="4" ><b>Reply-To:</b></font></td> <td width="70%"> <input type="text" name="ReplyTo1" size="3" maxlength="3"> <font face="Arial" size="4">- </font> <input type="text" name="ReplyTo2" size="3" maxlength="3"> <font face="Arial" size="4">-</font> <input type="text" name="ReplyTo3" size="3" maxlength="4"></td> </tr> <tr> <td width="30%"> </td> <td width="70%"></td> </tr> <tr> <td width="30%"><font face="Arial" size="4" ><b>Send To:</b></font></td> <td width="70%"> <input type="text" name="SendTo1" size="3" maxlength="3"> <font face="Arial" size="4">- </font> <input type="text" name="SendTo2" size="3" maxlength="3"> <font face="Arial" size="4">-</font> <input type="text" name="SendTo3" size="3" maxlength="4"></td> </tr> <tr> <td width="30%"><font face="Arial" size="4"><b>Text:</b></font></td> <td width="70%"><textarea rows="4" name="MsgText" cols="20"></textarea></td> </tr> <tr> <td width="30%"> </td> <td width="70%"></td> </tr> <tr> <td width="30%"><input type="submit" value="Send" name="SendButton"></td> <td width="70%"><input type="reset" value="Reset" name="ResetButton"></td> </tr> </table> </form> </body>
</html>
Файл формата HTML использует элемент <input> для получения значений переменных ReplyTo, SendTo HMsgText. Элемент <input> используется также для определения формата вводимых данных. Для облегчения ввода данных, имеющихвид телефонных номеров, в файле используется таблица для ввода компонентовтелефонного номера. После того как пользователь введет данные и нажметкнопку Send, в исходном коде происходит передача данных сценарию языка PerlWebPage.pl, исходный код которого приведен ниже:
#!/usr/bin/perl
require 'DeckUtils.pl';
$mailprog = "/bin/sendmail";
# Get the CGI variables. %cgiVars = &AppUtils::ParseCGIVars();
$ReplyTo1 = $cgiVars{"ReplyTo1"}; $ReplyTo2 = $cgiVars{"ReplyTo2"}; $ReplyTo3 = $cgiVars{"ReplyTo3"}; $ReplyTo = $ReplyTo1; $ReplyTo .= "-"; $ReplyTo .= $ReplyTo2; $ReplyTo .= "-"; $ReplyTo .= $ReplyTo3; $MsgSubject = $ReplyTo;
$SendTo1 = $cgiVars{"SendTo1"}; $SendTo2 = $cgiVars{"SendTo2"}; $SendTo3 = $cgiVars{"SendTo3"}; $SendTo = $SendTo1; $SendTo .= $SendTo2; $SendTo .= $SendTo3; $SendTo .= "\@messaging.sprintpcs.com";
$MsgText = $cgiVars{"MsgText"};
open(MAIL, "|$mailprog $SendTo");
print MAIL "Reply-To: $ReplyTo\n"; print MAIL "From: Demo\@waplib.com\n"; print MAIL "To: $SendTo\n"; print MAIL "Subject: $MsgSubject\n\n";
print MAIL "$MsgText\n";
close(MAIL); print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<Body>\n"; print "Message has been sent to: $SendTo\n"; print "</Body>\n"; print "</HTML>\n";
В начале сценария используется функция $cgiVars для извлечения значений параметров. Так как в файле формата HTML данные ReplyTo и SendTo вводятсятремя частями (три части, составляющие телефонный номер), файл должен извлекать значения параметров в переменные ReplyTol, ReplyTo2, ReplyToS,SendTol, SendTo2, SendTo3. Исходный код должен объединить эти значения в переменные ReplyTo И SendTo.
Далее, сценарий создает и пересылает сообщение электронной почты. Приокончании работы сценарий также создает новый файл формата HTML, сообщающий пользователю о том, что сообщение передано.