Прошло более 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-сайтов — удел энтузиастов, коллекционеров старых мобильных устройств и музеев техники. Тем не менее это вполне возможно на современных ОС и прекрасный способ прикоснуться к прошлому технологий связи.
Комментарии (28)
ereinion
05.08.2025 07:39В 2002 году Мегафон тестировал GPRS в Петербурге и почти год доступ был бесплатным. У меня тогда был Ericcson R520m. В основном, он использовался как модем и за год прокачал больше сотни гигов данных (огромный объем в те времена)!
Среди прочего довелось погонять и WAP))) С этим связана забавная ситуация...
Один из друзей раскопал WAP-сайт с эротическими картинками. Это было не столько эммм, exciting, сколько funny - представьте себе обнаженных дам в разрешении 96х64 пикселя, отображаемых с 4 градациями серого, две из которых черный и белый...
gorod0k
05.08.2025 07:39А что можно было в те времена в таких количествах качать?
ereinion
05.08.2025 07:39А еще - варез и дивХ киношки!
elnights
05.08.2025 07:39О, 2002-й. Тариф 100 мБ в месяц. Всё, что весит больше метра, качаем только с локалки(до сих пор скучаю по ним).
И обязательное отключение картинок в браузере.
И только мажоры с безлимитом юзают чудо-технологию под названием Kazaa.
Jorell
05.08.2025 07:39за год прокачал больше сотни гигов данных
Такое невозможно!
Даже еслиб скорость была бы стабильная 100 килобит в секунду (кбит/с), то за год такой скорости хватит на передачу примерно 393 мегабайт (МБ) информации.
Расчет:
100 кбит/с = 100 * 1024 бит/с = 102400 бит/с
1 байт = 8 бит, значит 102400 бит/с = 12800 байт/с
1 килобайт (КБ) = 1024 байт, значит 12800 байт/с = 12.5 КБ/с
1 мегабайт (МБ) = 1024 КБ, значит 12.5 КБ/с = 0.0122 МБ/с
За год 365 дней 24 часа 60 минут * 60 секунд = 31536000 секунд
Всего за год: 0.0122 МБ/с * 31536000 с = 384537.6 МБ
Приблизительно 393 МБ (с учетом округлений).
А реальная скорость была максимум 50 килобит в секунду.
unreal_undead2
05.08.2025 07:39384537.6 МБ
Приблизительно 393 МБ (с учетом округлений).
Странное округление с отбрасыванием трёх порядков.
ereinion
05.08.2025 07:39393 Гбайт, а не Мбайт все же. Скорость была конечно не особо стабильная, но средняя 50-60 кбит/с выходила. Ну и часов 10-16 (свободное от учебы и гуляний время) в день телефон стабильно был в режиме модема. Делайте выводы)
Assargin
05.08.2025 07:39Помню, как хотелось накачать рингтонов на свой первый Sony Ericsson T290i, но то ли цена кусалась (+ жаба давила платить за каждый из них), то ли принципы... Я просто накачал их на компьютер, сверстал по-быстрому WML-страницу со ссылками на файлы, закачал это всё на бесплатный holm.ru и зашёл по WAP с аппарата.
sourbarberry
05.08.2025 07:39Были и обратные истории. Помню, мне трафик на скачивание java-игры стоил больше, чем сама игра :)
Потом ещё долго опасался большой кнопки "i" на клавиатуре)
unreal_undead2
05.08.2025 07:39На Siemens C55 первое, что делалось после покупки - разлочивалась заливка мелодий и джавы с компа, после этого всё записывалось по кабелю. Не помню, чтобы с WAP страниц что-то скачивал, хотя по сайтам лазил.
bolk
05.08.2025 07:39WAP-сайты, кстати, открывала десктопная старая «Опера» (которая была до продажи торговой марки китайцам), именно так я эти сайты и смотрел.
Anexroid
05.08.2025 07:39Когда-то именно за статью о WML я получил инвайт на Хабр (внезапно обнаружил, что ныне она в черновиках лежит, а не в опубликованном)
2011 год был...
А первый сайт свой на WML я писал ещё с мобильного телефона, через какое-то FTP на JavaME (или как оно тогда называлось) заливал на свой первый хостинг, год 2007-2008-ой
Ностальгия :)
muxa_ru
05.08.2025 07:39Помним, помним то время, когда "одно неловкое движение и ты попал на платный WAP". На хабре даже отголоски есть:
- https://habr.com/ru/articles/370417/
- https://habr.com/ru/companies/yandex/articles/273385/
R1TBS
05.08.2025 07:39Кстати именно МТС тогда придумал тарифицировать трафик, с задержкой в две недели. Бабуля и папуля сильно на меня - школьника разозлились за 5к долга. «На шаг впереди!»
K0styan
05.08.2025 07:39Я в те годы работал в CBOSS - эти ребята делали биллинг для МТС. И вот он в реальном времени считать просто не умел.
Точнее, там хитро было: был "настоящий" счётчик, который с каким-то лагом собирал данные из всех источников (включая роуминговых партнёров) и списывал финальную сумму. И был некий оперативный счётчик, который делал быструю оценку только по базовой выгрузке с коммутаторов, чтобы при запросе баланса правдоподобный остаток говорить. Вот он мог до какого-то момента в целом трафик игнорить.
В итоге, да, когда до баланса клиента добирался-таки "настоящий" биллинг, он (баланс) мог резко похудеть на всю ту сумму, которую оперативный биллинг недоучёл. Отсюда же и слухи про "воруют!"
R1TBS
05.08.2025 07:39Хм… Я про 2004…2005. Ещё у.е. да были. И всё работало как часы тогда. Скачал с funs или artemka «bribumer.mid», ну час пройдёт максимум -$0.16. А как то утром, бац, скачал, и не списалася! Ну думаю выжду денёк, наверное сбой какой-то. Ан нет. Как было $1,35 на *100#, так и есть. Ну думаю, ещё денек подожду - всё на месте. Ну и на следующий день, я уже всей продвинутой части класса качал всё что они хотели. А через 2 недели, сперва -$8,16, ещё через день -$26,7. Ну а спустя две недели с первого списания -$163,00. Связь конечно заблокировали и никому из родных не сообщил про сей казус. А когда пришла письменная претензия, то тайное стало явным. Ещё входящие тогда платные были помню. Поэтому не знаю, конечно много воды утекло с тех лет, но всё таки считаю что я такой не один был. А вот до покупки мелодий СМС кодом не доехал. Думаю вы чего? На артёмке всё же бесплатно есть!
unreal_undead2
По крайней мере у нас в Нижнем в 2003-2005 GPRS (включая WAP) раздавался бесплатно в тестовом режиме - сначала так было у Билайна, позже тестировать начал НСС. Так что, скажем, читал книжки на Siemens C55 по дороге на работу в маршрутке на WAP сайтах - на самом телефоне всю память съедали мелодии и игрушки.
K0styan
Это WAP через GPRS - он действительно долго был в тестовой эксплуатации, да и потом стал стоить у большинства операторов по обычным трафиковым тарифам.
Но до того WAP работал через CSD, circuit switch data - по сути занимая полностью один из каналов/слотов БС. И тарифицировался поминутно, что было накладно даже с очень простенькими страничками.
unreal_undead2
В статье сказано конкретно про GPRS ) И да, первый мобильник я купил, когда он уже был, но ещё тестировался. Через CSD, насколько понимаю, тарификация как за голосовой звонок.
gvitaly
Много лет назад был такой тариф Джинс Хот. Там минуты по выходным стоили то ли в 3, то ли вообще в 12 раз дешевле, чем по будням. Я тогда по самим страничкам лазил в режиме WAP-GPRS, чтобы читать подольше. А вот скачивал те же java-игры уже в поминутном режиме WAP-CSD. Так заметно дешевле выходило.
Solar_fox
Чего это вдруг тарифицировался поминутно, это же ведь не adsl))) Вап тарифицировался по переданному трафику!
unreal_undead2
GPRS WAP - по трафику (он занимал слоты только при передаче пакетов, не передаёшь данные - не занимаешь слот). А CSD, как и голос, при установке соединения выбирал конкретный частотный канал и слот и занимал его всё время.
nitro80
А я помню как качал книги Перумова в jar c wap-сайтов