Пособие по написанию WAP-сайтов

         

Подключение к интерфейсу«Интеллектуального» Дома



Рисунок 6.1. Подключение к интерфейсу«Интеллектуального» Дома




Подробнее о приложении SmartHouse.hdml



Подробнее о приложении SmartHouse.hdml

Подобно приложению SmartHouse.wml, приложение SmartHouse.hdml отображаетсообщение, извещающее пользователя о том, что он подсоединен к интерфейсудома, и второе сообщение, которое приглашает подтвердить, хочет ли он работать далее. Файл SmartHouse.hdml содержит следующий исходный код:

&ltHDML Version=3.0 Markable=True TTL=0&gt

&ltDisplay Name=Start&gt

&ltAction Type=Accept Task=GO Method=Post PostData=-1&-1&-1&-1&-1 Dest=../waplibcgi/UpdateHouseHDML.pl&gt

&ltCenter&gtSmart House&ltbr&gt &ltLine&gtConnected.&ltbr&gt&ltbr&gt Get current status?

&lt/Display&gt

&lt/HDML&gt

Первый элемент внутри деки сообщает браузеру (или другим программистам) отом, какая версия языка HDML используется приложением. Далее, выражениеMarkable=True сообщает браузеру, что он может установить закладку в исходнойдеке, a TTL=0 сообщает о невозможности кэширования.

Для отображения сообщений приложение использует элемент <Display>. Внутри <Display> используется элемент <Action> для определения имени и места

нахождения сценария, который приложение запустит, как только пользователь вответ на запрос выберет продолжение работы. Как вы видите, приложение передает -1 в качестве значения параметра сценарию языка Perl, что говорит о первом его запуске и необходимости сгенерировать случайную последовательностьустановок ON/OFF. Для имитирования оборудования в доме используется сценарий языка Perl UpdateHouseHDML.pl, содержимое которого подобно сценарию UpdateHouseWML.pl, заисключением двух значительных отличий. Во-первых, приложение создает новую деку формата HDML, используя элементы <Choice> и <СЕ> для отображениянового состояния и установки последующих изменений, как показано ниже:

$Deck = "Content-type: text/x-hdml

&ltHDML Version=3.0 Markable=True TTL=0&gt

&ltChoice Name=House&gt

&ltAction Type=Accept Label=OnOff&gt

&ltCenter&gtSmart House

$CEBedroom $CEKitchen $CELiving $CEOffice $CEOutside



&lt/Choice&gt

&lt/HDML&gt";

print $Deck;

Второе отличие заключается в формировании элементов <СЕ>. Когда запускаетсясценарий UpdateHouseHDML.pl, ему в качестве аргумента передается случайноечисло. Это присходит в связи с особенностями работы системы кэшированияпамяти. Как вы видите, каждый раз, когда пользователь производит выбор, сценарий UpdateHouseHDML.pl вызывает сам себя для выполнения обработки данных. Даже несмотря на установленное в ноль значение TTL, которое показывает,что дека не может быть никогда перезагружена из кэша, когда дека вызывает самасебя, она всегда перезагружается из кэша. Посредством присвоения случайногозначения аргументу, браузер интерпретирует полученную информацию как другую деку и загружает ее с сервера.





Подробнее о приложении SmartHouse.wml



Подробнее о приложении SmartHouse.wml

При запуске пользователем приложения SmartHouse, загружается дека из файла SmartHouse.wml. После загрузки на дисплее появляется сообщение, сигнализирующее о подключении к интерфейсу дома, и далее, второе сообщение, желаетли пользователь продолжать начатые действия. Если пользователь собираетсяэто делать, приложение загружает сценарий языка Perl UpdateHouseWML.pl, передавая ему параметры, содержащие информацию о текущих установках в доме.Приведенный ниже исходный код отображает содержимое деки SmartHouse.wml:

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

&ltwml&gt

&lthead&gt

&ltmeta http-equiv="Cache-Control" content="max-age=0" forua="true"/&gt

&lt/head&gt

&ltcard id="SmartHouse"&gt

&ltdo type="accept"&gt &ltgo href="../waplibcgi/UpdateHouseWML.pl?-1& -1&-1&-1&-1" /&gt &lt/do&gt

&ltp align="center"&gt

Smart House&ltbr/&gt

&lt/p&gt

&ltp align="left" mode="nowrap"&gt

Connected.&ltbr/&gt&ltbr/&gt Get current status?

&lt/p&gt

&lt/card&gt

&lt/wml&gt

Так же как и во всех деках формата WML, первые два ее элемента сообщают браузеру, какую из версий спецификации WAP поддерживает данное приложение. Внашем случае WML-страница поддерживает версию 1.0 языка XML и версию 1.1описания типа документа (DTD), разработанного ассоциацией WAP Forum.

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

Далее, за информацией о версиях, каждый WML-файл начинается с тега <wml>. Вконце каждого файла вводят </wml>, что означает окончание исходного кодаприложения.


За <wml> следуют теги <head> и </head>, внутри которых находитсяинформация о самом исходном коде, включая метаданные и информацию обуправлении доступом. Многие программисты называют метаданные «данными оданных». Другими словами, в этом случае метаданные, которые считывает и обрабатывает браузер, сообщают ему, как трактовать данные.

&lthead&gt

&ltmeta http-equiv="Cache-Control" content="max-age=0" forua="true"/&gt

&lt/head&gt

Элемент <meta> позволяет точно определить метаинформацию для исходногофайла. В нашем случае строка http-eguiv="Cache-Control" сообщает браузеруWAP, что эта часть метаинформации используется системой кэширования памяти. Аналогично, строка content=max-age=0 сообщает браузеру, что максимальноевремя, в течение которого будет кэшироваться этот файл, равно нулю секунд;значит, браузер не будет кэшировать данные, а загружать данные с сервера каждый раз, когда они будут запрошены. Для этой книги значение нуля было выбрано для содействия процессу обучения читателя. При выборе нуля каждый раз,когда будут происходить изменения, они будут передаваться на телефон. В реальном приложении статическое меню, подобное этому, можно использовать поумолчанию в течение 30 дней. Последняя строка forua="true" определяет, чтозначение Cache-Control предназначено для телефона и не может быть измененокаким-либо промежуточным агентом.

В деке используется тег абзаца <р> для вывода заголовка приложения, сообщенияо подключении пользователя к дому и запроса на продолжение действий. Еслипользователь посчитает нужным продолжить начатые действия, в деке используется элемент <do> для запуска сценария языка Perl:

&lthead&gt

&ltmeta http-equiv="Cache-Control" content="max-age=0" forua="true"/&gt

&lt/head&gt


Подробнее о сценарии языка Perl UpdateHouseWML.pl



Подробнее о сценарии языка Perl UpdateHouseWML.pl

В идеале приложение SmartHouse соединяется с оборудованием, находящимсявнутри вашего дома. В нашем случае это оборудование симулирует сценарий языка Perl. Этот сценарий содержит следующий исходный код:

#!/usr/bin/perl

$Buffer = $ENV{'QUERY_STRING'};

@data = split(/&/, $Buffer);

$Bedroom = $data[0]; $Kitchen = $data[1]; $Living = $data[2]; $Office = $data[3]; $Outside = $data[4];

if ($Bedroom eq -1) { srand; $Bedroom = rand(); $Bedroom = int ($Bedroom + .5);

$Kitchen = rand(); $Kitchen = int ($Kitchen + .5);

$Living = rand(); $Living = int ($Living + .5);

$Office = rand(); $Office = int ($Office + .5);

$Outside = rand(); $Outside = int ($Outside + .5); }

if ($Bedroom eq 0) { $OptionBedroom = "&ltoption onpick=\"UpdateHouseWML.pl?1\& $Kitchen\&$Living\&$Office\&$Outside\"&gt"; $OptionBedroom = $OptionBedroom . "Bedroom is OFF&lt/option&gt"; } else { $OptionBedroom = "&ltoption onpick=\"UpdateHouseWML.pl?0\& $Kitchen\&$Living\&$Office\&$Outside\"&gt"; $OptionBedroom = $OptionBedroom . "Bedroom is ON&lt/option&gt"; }

if ($Kitchen eq 0) { $OptionKitchen = "&ltoption onpick=\"UpdateHouseWML.pl? $Bedroom\&1\&$Living\&$Office\&$Outside\"&gt"; $OptionKitchen = $OptionKitchen . "Kitchen is OFF&lt/option&gt"; } else { $OptionKitchen = "&ltoption onpick=\"UpdateHouseWML.pl? $Bedroom\&0\&$Living\&$Office\&$Outside\"&gt"; $OptionKitchen = $OptionKitchen . "Kitchen is ON&lt/option&gt"; }

if ($Living eq 0) { $OptionLiving = "&ltoption onpick=\"UpdateHouseWML.pl? $Bedroom\&$Kitchen\&1\&$Office\&$Outside\"&gt"; $OptionLiving = $OptionLiving . "Living room is OFF&lt/option&gt"; } else { $OptionLiving = "&ltoption onpick=\"UpdateHouseWML.pl? $Bedroom\&$Kitchen\&0\&$Office\&$Outside\"&gt"; $OptionLiving = $OptionLiving . "Living room is ON&lt/option&gt"; }



if ($Office eq 0) { $OptionOffice = "&ltoption onpick=\"UpdateHouseWML.pl? $Bedroom\&$Kitchen\&$Living\&1\&$Outside\"&gt"; $OptionOffice = $OptionOffice . "Office is OFF&lt/option&gt"; } else { $OptionOffice = "&ltoption onpick=\"UpdateHouseWML.pl? $Bedroom\&$Kitchen\&$Living\&0\&$Outside\"&gt"; $OptionOffice = $OptionOffice . "Office is ON&lt/option&gt"; }

if ($Outside eq 0) { $OptionOutside = "&ltoption onpick=\"UpdateHouseWML.pl? $Bedroom\&$Kitchen\&$Living\&$Office\&1\"&gt"; $OptionOutside = $OptionOutside . "Outside is OFF&lt/option&gt"; } else { $OptionOutside = "&ltoption onpick=\"UpdateHouseWML.pl? $Bedroom\&$Kitchen\&$Living\&$Office\&0\"&gt"; $OptionOutside = $OptionOutside . "Outside is ON&lt/option&gt"; }

$Deck = "Content-type: text/vnd.wap.wml

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

&ltwml&gt

&lthead&gt

&ltmeta http-equiv=\"Cache-Control\" content=\"max-age=0\" forua=\"true\"/&gt

&lt/head&gt

&ltcard id=\"House\"&gt

&ltdo type=\"accept\" label=\"OnOff\"&gt &ltnoop /&gt &lt/do&gt

&ltp align=\"center\"&gt

Smart House

&lt/p&gt

&ltp align=\"left\" mode=\"nowrap\"&gt

&ltselect&gt

$OptionBedroom $OptionKitchen $OptionLiving $OptionOffice $OptionOutside

&lt/select&gt

&lt/p&gt

&lt/card&gt

&lt/wml&gt";

print $Deck;

Как было сказано выше, когда приложение вызывает сценарий языка Perl, емупередаются параметры, которые соответствуют установкам в доме.


Когда сценарий начинает выполняться, он использует функцию $ENV для получения указателя на список параметров. Далее, исходный код использует функцию разделенияsplit (/&/, $Buffer) для анализа переданного, используя символ & (амперсанд)как разделитель и передавая значения массиву с именем gdata. В итоге в сценарии присваиваются значения элементов массива переменным, которые будут использоваться в процессе работы:

$Buffer = $ENV{'QUERY_STRING'};

@data = split(/&/, $Buffer);

$Bedroom = $data[0]; $Kitchen = $data[1]; $Living = $data[2]; $Office = $data[3]; $Outside = $data[4];

Далее, в исходном коде проверяется значение переменной $Bedroom. Если значение этой переменной равно -1, которое означает, что приложение вызываетсценарий в первый раз и сценарий должен сгенерировать случайные значенияустановок ON/OFF (ВКЛ/ВЫКЛ) бытовой техники в доме.

Если приложение вызывает сценарий не в первый раз, сценарий обрабатываетпоследовательность конструкций if-else, определяя, производятся ли пользователем изменения в установках, и если да, то какое значение (ON или OFF) имеет на данный момент определенная установка (сценарий может также менять этизначения).

После этого сценарий с новыми значениями установок создает еще одну карту,используя элемент print. Браузер отображает конечный результат установок надисплее сотового телефона.