Подключение к интерфейсу«Интеллектуального» Дома
Рисунок 6.1. Подключение к интерфейсу«Интеллектуального» Дома
Подробнее о приложении SmartHouse.hdml
Подробнее о приложении SmartHouse.hdml
Подобно приложению SmartHouse.wml, приложение SmartHouse.hdml отображаетсообщение, извещающее пользователя о том, что он подсоединен к интерфейсудома, и второе сообщение, которое приглашает подтвердить, хочет ли он работать далее. Файл SmartHouse.hdml содержит следующий исходный код:
<HDML Version=3.0 Markable=True TTL=0>
<Display Name=Start>
<Action Type=Accept Task=GO Method=Post PostData=-1&-1&-1&-1&-1 Dest=../waplibcgi/UpdateHouseHDML.pl>
<Center>Smart House<br> <Line>Connected.<br><br> Get current status?
</Display>
</HDML>
Первый элемент внутри деки сообщает браузеру (или другим программистам) отом, какая версия языка 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
<HDML Version=3.0 Markable=True TTL=0>
<Choice Name=House>
<Action Type=Accept Label=OnOff>
<Center>Smart House
$CEBedroom $CEKitchen $CELiving $CEOffice $CEOutside
</Choice>
</HDML>";
print $Deck;
Второе отличие заключается в формировании элементов <СЕ>. Когда запускаетсясценарий UpdateHouseHDML.pl, ему в качестве аргумента передается случайноечисло. Это присходит в связи с особенностями работы системы кэшированияпамяти. Как вы видите, каждый раз, когда пользователь производит выбор, сценарий UpdateHouseHDML.pl вызывает сам себя для выполнения обработки данных. Даже несмотря на установленное в ноль значение TTL, которое показывает,что дека не может быть никогда перезагружена из кэша, когда дека вызывает самасебя, она всегда перезагружается из кэша. Посредством присвоения случайногозначения аргументу, браузер интерпретирует полученную информацию как другую деку и загружает ее с сервера.
Подробнее о приложении SmartHouse.wml
Подробнее о приложении SmartHouse.wml
При запуске пользователем приложения SmartHouse, загружается дека из файла SmartHouse.wml. После загрузки на дисплее появляется сообщение, сигнализирующее о подключении к интерфейсу дома, и далее, второе сообщение, желаетли пользователь продолжать начатые действия. Если пользователь собираетсяэто делать, приложение загружает сценарий языка Perl UpdateHouseWML.pl, передавая ему параметры, содержащие информацию о текущих установках в доме.Приведенный ниже исходный код отображает содержимое деки SmartHouse.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="SmartHouse">
<do type="accept"> <go href="../waplibcgi/UpdateHouseWML.pl?-1& -1&-1&-1&-1" /> </do>
<p align="center">
Smart House<br/>
</p>
<p align="left" mode="nowrap">
Connected.<br/><br/> Get current status?
</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 предназначено для телефона и не может быть измененокаким-либо промежуточным агентом.
В деке используется тег абзаца <р> для вывода заголовка приложения, сообщенияо подключении пользователя к дому и запроса на продолжение действий. Еслипользователь посчитает нужным продолжить начатые действия, в деке используется элемент <do> для запуска сценария языка Perl:
<head>
<meta http-equiv="Cache-Control" content="max-age=0" forua="true"/>
</head>
Подробнее о сценарии языка 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 = "<option onpick=\"UpdateHouseWML.pl?1\& $Kitchen\&$Living\&$Office\&$Outside\">"; $OptionBedroom = $OptionBedroom . "Bedroom is OFF</option>"; } else { $OptionBedroom = "<option onpick=\"UpdateHouseWML.pl?0\& $Kitchen\&$Living\&$Office\&$Outside\">"; $OptionBedroom = $OptionBedroom . "Bedroom is ON</option>"; }
if ($Kitchen eq 0) { $OptionKitchen = "<option onpick=\"UpdateHouseWML.pl? $Bedroom\&1\&$Living\&$Office\&$Outside\">"; $OptionKitchen = $OptionKitchen . "Kitchen is OFF</option>"; } else { $OptionKitchen = "<option onpick=\"UpdateHouseWML.pl? $Bedroom\&0\&$Living\&$Office\&$Outside\">"; $OptionKitchen = $OptionKitchen . "Kitchen is ON</option>"; }
if ($Living eq 0) { $OptionLiving = "<option onpick=\"UpdateHouseWML.pl? $Bedroom\&$Kitchen\&1\&$Office\&$Outside\">"; $OptionLiving = $OptionLiving . "Living room is OFF</option>"; } else { $OptionLiving = "<option onpick=\"UpdateHouseWML.pl? $Bedroom\&$Kitchen\&0\&$Office\&$Outside\">"; $OptionLiving = $OptionLiving . "Living room is ON</option>"; }
if ($Office eq 0) { $OptionOffice = "<option onpick=\"UpdateHouseWML.pl? $Bedroom\&$Kitchen\&$Living\&1\&$Outside\">"; $OptionOffice = $OptionOffice . "Office is OFF</option>"; } else { $OptionOffice = "<option onpick=\"UpdateHouseWML.pl? $Bedroom\&$Kitchen\&$Living\&0\&$Outside\">"; $OptionOffice = $OptionOffice . "Office is ON</option>"; }
if ($Outside eq 0) { $OptionOutside = "<option onpick=\"UpdateHouseWML.pl? $Bedroom\&$Kitchen\&$Living\&$Office\&1\">"; $OptionOutside = $OptionOutside . "Outside is OFF</option>"; } else { $OptionOutside = "<option onpick=\"UpdateHouseWML.pl? $Bedroom\&$Kitchen\&$Living\&$Office\&0\">"; $OptionOutside = $OptionOutside . "Outside is ON</option>"; }
$Deck = "Content-type: text/vnd.wap.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=\"House\">
<do type=\"accept\" label=\"OnOff\"> <noop /> </do>
<p align=\"center\">
Smart House
</p>
<p align=\"left\" mode=\"nowrap\">
<select>
$OptionBedroom $OptionKitchen $OptionLiving $OptionOffice $OptionOutside
</select>
</p>
</card>
</wml>";
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. Браузер отображает конечный результат установок надисплее сотового телефона.