Прошло более 20 лет с того момента, когда тарифы на мобильную связь указывались в у.е., а GPRS трафик подразделялся на GPRS-Internet и GPRS-WAP. Последний был довольно дорогим способом почитать новости или проверить электронную почту, зато работал практически на любом телефоне. Именно на WAP абоненты тратили солидные суммы, ведь трафик был дорогим — 10 Кб стоили от 0,06 до 0,08 $ на 2004 год.
И хотя я прекрасно помню обилие WAP-сайтов на просторах всемирной паутины в то время, мне практически ничего не было известно о том, как их создавали и тестировали. Только недавно я задался этим вопросом и решил узнать, какими инструментами пользовались разработчики таких ресурсов. Ну и, разумеется, захотелось попробовать сделать простейший WAP-сайт самостоятельно. Подробности — дальше.

Зарождение WAP
В конце 90-х годов мобильная отрасль сосредоточила усилия на том, чтобы дать доступ к интернет-контенту и услугам через сотовые телефоны. Задача была довольно сложной, ведь это подразумевало под собой разработку стандарта, который не был бы привязан к какому-либо виду сотовой связи и мог функционировать поверх любой мобильной сети. В России на тот момент преобладал GSM, однако в некоторых регионах была развернута NMT (Дельта-Телеком aka Скай Линк).
Решение задачи стал Wireless Application Protocol (WAP), предложенный альянсом Open Mobile Alliance (OMA), состоящий из компаний-лидеров мобильной индустрии той эпохи, различных некоммерческих организаций и Международного союза электросвязи (ITU). Последний формально является специализированным учреждением ООН, регулирующим вопросы международного использования радиочастот и выпускающим рекомендации провайдерам по взаимодействию с сетями связи по всему миру.
Важнейшую роль в разработке WAP сыграла компания Unwired Planet, позже поглощенная Openwave Systems Inc. Взяв за основу HTML, они разработали язык разметки HDML (Handheld Device Markup Language), адаптированный для работы на девайсах с ограниченными ресурсами, вроде мобильных телефонов и КПК.
Не стоит забывать о том, что у многих таких устройств на дисплее помещалось всего 2–4 строки текста. Мизерные скорости передачи данных (например, 9,6 Кбит/с) также нужно было учитывать. Ввод с цифровой клавиатуры, а возможности навигации ограничены парой кнопок «вверх» и «вниз». Так что, центральной концепцией HDML стала карточная модель (Cards & Decks).
Каждый отдельный экран (или шаг взаимодействия) можно было представить в виде условных карт (Cards). Наборы таких карт объединяются в колоду (Deck) — логический блок, что-то наподобие веб-страницы. Когда она загружена на устройство, внутренние переходы не требуют дополнительных сетевых запросов и данных. Минимально в колоде должна быть хотя бы одна карта. Вот пример кода на HDML:
<HDML VERSION=3.0>
<!-- Первая карта: приветствие -->
<DISPLAY NAME="hello">
Hello, Habr!
<BR>
<ACTION TYPE="ACCEPT" LABEL="Enter" TASK="GO" DEST="#menu">
</DISPLAY>
<!-- Вторая карта: главное меню -->
<CHOICE NAME="menu">
Main Menu:
<LI LABEL="News" TASK="GO" DEST="news.hdml">
<LI LABEL="Weather" TASK="GO" DEST="weather.hdml">
<LI LABEL="Exit" TASK="EXIT">
</CHOICE>
</HDML>
Увы, проприетарность формата и отсутствие возможности запустить нативный браузер UP.Browser из древних телефонов конца 90-х не дали мне показать, как это выглядело. Но, вооружившись обычным HTML, можно реализовать примерное представление:

HDML, с одной стороны, неплох, но с другой — его контролировала исключительно сама Unwired Planet. Плюс он был SGML-подобным и невалидируемым. Закрывать теги не всегда обязательно, а парсинг, несмотря на всю гибкость, не отличался стабильностью.
WML
В качестве единого стандарта был разработан язык WML (Wireless Markup Language). Базой стал формат XML, поскольку обладал рядом существенных преимуществ: возможность строгой валидации, предсказуемость синтаксиса и легкий парсинг. Каждый тег должен быть закрыт, нет необходимости играть в «угадайку» с интерпретацией невалидного кода. Также меньше риск, что битый документ загрузит лишние данные или приведет к «вылету» браузера.
Модель Cards & Decks оказалась настолько удачным решением, что оно без особых изменений перекочевало в WML из HDML. Последний, кстати, не единственный язык разметки, который повлиял на WML. У Nokia, например, был свой проприетарный формат TTML (Tagged Text Markup Language). Из него были почерпнуты многие идеи и элементы взаимодействия, характерные для Nokia UI/UX.
Давайте глянем, как бы выглядел тот же самый HDML-файл в формате WML:
<?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="hello" title="Hello">
<p>Hello, Habr!</p>
<do type="accept" label="Enter">
<go href="#menu"/>
</do>
</card>
<!-- Вторая карта: главное меню -->
<card id="menu" title="Main Menu">
<p>Main Menu:</p>
<p>
<anchor>
News
<go href="news.wml"/>
</anchor><br/>
<anchor>
Weather
<go href="weather.wml"/>
</anchor><br/>
<anchor>
Exit
<prev/>
</anchor>
</p>
</card>
</wml>
Для тестирования я воспользуюсь наиболее продвинутым симулятором мобильных телефонов той эпохи, OpenWave V7 Simulator. Нажатием Enter происходит переход из карты hello в menu:

Кстати, симулятор от OpenWave вовсе не единственный, который можно использовать для тестирования. В далеком 2001 году в Дубне существовала компания ЗАО «Лаборатория Информационных Технологий». Одним из продуктов был M3Gate — браузер, созданный с помощью ActiveX и позволяющий без проблем тестировать работу WAP-сайтов с любого компьютера под управлением 9x/ME/2000/XP:

WMLScript
Еще одним важным преимуществом WML по сравнению с HDML стала поддержка скриптов. Разумеется, ожидать здесь полноценного JavaScript не стоит. WML использует собственный безопасный язык WMLScript, предназначенный для выполнения простой логики прямо на устройстве клиента.
Тут стоит учитывать, что любые скрипты на WMLScript компилируются на сервер в байт-код с расширением .wmlsc. Подключить его можно двумя способами: через тег <wmls> или как <go href="script.wmls?func()"/>.
Попробую сделать простейший калькулятор, который умеет складывать два числа на стороне клиента и выводить результат. Начну с интерфейса на WML, назову его calc.wml:
<?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="input" title="Add">
<p>Enter two numbers:</p>
<p>
A: <input name="a" title="A" format="*N"/><br/>
B: <input name="b" title="B" format="*N"/><br/>
</p>
<do type="accept" label="Calculate">
<go href="calc.wmlsc#add($(a),$(b))"/>
</do>
</card>
<card id="result" title="Result">
<p>The result is: $(result)</p>
<do type="accept" label="Back">
<go href="#input"/>
</do>
</card>
</wml>
Как видно, в языке есть глобальные переменные. Их добавили только для того, чтобы лишний раз не использовать сеть передачи данных. Теперь накидаю скрипт, что-то вроде:
extern function add(a, b)
{
var sum;
sum = a + b;
WMLBrowser.setVar("result", sum);
WMLBrowser.go("calc.wml#result");
}
Назову файл calc.wmls — это наш исходник, который предстоит скомпилировать. Собственно, задача решается при помощи wmlsc. Запускаю Ubuntu 22.04 и скачиваю тарбол:
$ wget https://cpan.metacpan.org/authors/id/P/PE/PERRAD/WAP-wmls-1.13.tar.gz
Распаковываю:
$ tar xvf WAP-wmls-1.13.tar.gz
Перехожу в директорию:
$ cd WAP-wmls-1.13
Готовлю к компиляции:
$ perl Makefile.PL
Компилирую проект:
$ make
Отправляю бинарники в системные директории:
$ sudo make install
Теперь нужен модуль Parse::Yapp, без него wmlsc откажется работать. Обновляю пакеты и устанавливаю cpanminus для инсталляции модулей из CPAN:
$ sudo apt update && sudo apt install cpanminus
Ставлю Parse::Yapp:
$ sudo cpanm Parse::Yapp
Теперь можно и скрипт подготовить:
$ wmlsc calc.wmls
В той же директории появился бинарник calc.wmlsc. Дело за малым — положить его рядом с calc.wml и скормить последний симулятору под видом домашней странички:

Получившиеся файлы, кстати, совсем крошечные: 579 и 53 байта соответственно. Разумеется, сюда можно добавить графику. Предельный размер загружаемого файла зависит от устройства, но при этом будет жестко ограничен лимитом в 1,4 Кб (1 397 байт, если быть точным). Это не прихоть, а вынужденная мера, обусловленная очень слабым железом мобильных телефонов тех лет.
Что в итоге
Развитие стандарта WAP и языка WML стали отличным переходным звеном между эпохой пейджеров и голосовых звонков и будущим мобильным интернетом. Несмотря на жесткие технические ограничения, WAP стал популярным и познакомил абонентов с возможностями интерактивного взаимодействия с сервисами.
В 2005 году WAP стал терять актуальность, а вместо него рассматривалась альтернатива в виде i-mode. Этот стандарт имел беспрецедентную популярность в Японии. Уже в сентябре 2005 года MTS дал доступ своим абонентам к новому сервису благодаря стратегическому партнерству с NTT DoCoMo, крупнейшему японскому оператору мобильной связи.
Увы, но формат сервиса не снискал популярности, а телефонов с его поддержкой было не слишком много. Так что i-mode прекратил свое существование в 2008 году. Ну а дальнейшее снижение стоимости мобильного трафика и активное развитие смартфонов окончательно убрали необходимость разработки какой-либо альтернативы WAP.
В 2025 году создание WAP-сайтов — удел энтузиастов, коллекционеров старых мобильных устройств и музеев техники. Тем не менее это вполне возможно на современных ОС и прекрасный способ прикоснуться к прошлому технологий связи.
Комментарии (5)
ereinion
05.08.2025 07:39В 2002 году Мегафон тестировал GPRS в Петербурге и почти год доступ был бесплатным. У меня тогда был Ericcson R520m. В основном, он использовался как модем и за год прокачал больше сотни гигов данных (огромный объем в те времена)!
Среди прочего довелось погонять и WAP))) С этим связана забавная ситуация...
Один из друзей раскопал WAP-сайт с эротическими картинками. Это было не столько эммм, exciting, сколько funny - представьте себе обнаженных дам в разрешении 96х64 пикселя, отображаемых с 4 градациями серого, две из которых черный и белый...
unreal_undead2
По крайней мере у нас в Нижнем в 2003-2005 GPRS (включая WAP) раздавался бесплатно в тестовом режиме - сначала так было у Билайна, позже тестировать начал НСС. Так что, скажем, читал книжки на Siemens C55 по дороге на работу в маршрутке на WAP сайтах - на самом телефоне всю память съедали мелодии и игрушки.
K0styan
Это WAP через GPRS - он действительно долго был в тестовой эксплуатации, да и потом стал стоить у большинства операторов по обычным трафиковым тарифам.
Но до того WAP работал через CSD, circuit switch data - по сути занимая полностью один из каналов/слотов БС. И тарифицировался поминутно, что было накладно даже с очень простенькими страничками.
unreal_undead2
В статье сказано конкретно про GPRS ) И да, первый мобильник я купил, когда он уже был, но ещё тестировался. Через CSD, насколько понимаю, тарификация как за голосовой звонок.