Нет лучшего времени, чтобы купить свой первый пейджер.
▍ Преамбула
Основной показатель крутости пейджера (а, следовательно, и его владельца) — количество строк сообщения, которые он мог вместить экран за раз. Однострочные пейджеры были самыми бюджетными, двухстрочные модели представляли средний уровень, а четырёхстрочные считались самым мажорным вариантом.
Philips Messenger Lux — возможно, единственный пейджер с восьмистрочным дисплеем. С подсветкой! Один этот факт делает его самым люксовым пейджером, который когда-либо существовал.
Кроме дисплея, Messenger Lux отличался внушительной памятью для сообщений: до 22000 символов в 99 сообщениях. Остальные функции стандартны: уведомление звуковым сигналом, вибрацией и/или светодиодом. Восемь рингтонов. Часы с шестью настраиваемыми будильниками. Работает от двух батареек AAA.
Есть, однако, существенная проблема: в России не осталось публичных пейджинговых операторов. Есть компании, которые предлагают развёртывание пейджинговых сетей в масштабах предприятий (например, системы связи для официантов в ресторанах или энергетиков на АЭС), но не осталось ни одного оператора масштаба города или области, куда можно прийти со своим пейджером, подписать договор и за пару сотен рублей в месяц оперативно получать на него сводку новостей, прогноз погоды и курсы валют.
Значит, если мы хотим пользоваться пейджером как пейджером, а не модными часами — работу оператора придётся брать на себя. От инфраструктуры до контента.
▍ Синхрослово
Чтобы передать сообщение на пейджер, нужно закодировать сообщение согласно протоколу пейджинговой связи POCSAG и передать его в эфир на той частоте, которую слушает пейджер. У операторов связи для этих задач имелись специализированные устройства для кодирования сообщений, профессиональные радиостанции, мощные усилители и специальные антенны, часто — в составе не одного, а целой сети таких комплектов. Но мы не оператор: у нас нет лицензии для вещания на нужных частотах, нет дорогостоящего оборудования и мы живём не в девяностых. Последнее, впрочем, как раз таки хорошо — у нас есть недорогие программно-определяемые радиостанции малой мощности вроде HackRF. Именно такой великолепной штукой мы решим вопрос передачи сообщения в эфир, а само сообщение сформируем на том же компьютере, к которому мы подключим плату.
В теории — всё просто. Практика, как водится, оказалась сложнее и гораздо интереснее. Чтобы воплотить задумку в жизнь — потребовалось собрать в кучу кусочки документации с нескольких старых форумов и заброшенных сайтов, собрать свой собственный программатор и провести настоящее детективное расследование.
Для начала — немного теории и о том, почему задачу не получилось решить с наскока. Протокол POCSAG, которым пользовались большинство операторов и с которым работает большинство пейджеров, определяет: формат кодирования сообщения, три скорости передачи сообщения, идентификацию принимающих устройств и множество тонких особенностей передачи отдельных символов. Однако частоту передачи техническое описание протокола не устанавливает. Это стало первой проблемой — мы не знаем, на какой частоте нужно передавать сообщение. На некоторых пейджерах рабочая частота печаталась на задней крышке, но, к сожалению, не на нашем экземпляре.
Судя по оформлению и вот этой наклеечке — пейджер привезён из Австрии и работал в сети оператора Airpage. Однако, меню пейджера на русском языке, значит, его перепрограммировали под одного из отечественных операторов. А раз его перепрограммировали — изменить могли и другие параметры, например, скорость передачи сообщения и номер пейджера. Это стало второй проблемой: неизвестны скорость, с которой нужно передавать сообщение, а также номер пейджера, которому нужно адресовать сообщение.
Всю эту информацию мы можем получить, подключив пейджер к компьютеру и считав его конфигурацию. Звучит просто? Не совсем.
Производители пейджеров не хотели, чтобы любой владелец с помощью компьютера мог запросто вшить своему пейджеру произвольный номер и таким образом получать чужую переписку. Для программирования требовалось специальное ПО и, что важно — специальный кабель для подключения к специальному разъёму на устройстве. И то и другое можно было получить только напрямую от производителя и только если вы — оператор. Впрочем, ПО со временем в Интернет всё-таки утекло. Осталось только изготовить кабель.
На подавляющем большинстве пейджеров программирование осуществлялось с помощью спрятанных где-то на корпусе контактов. Например, другой популярный топовый пейджер NEC 21A Maxima скрывает разъём для программирования под резиновой заглушкой на торце.
Инженеры Philips решили не портить внешний вид своего люксового пейджера какими-то разъёмами-заглушками и реализовали процедуру программирования пейджера без проводов.
Те, кто учился в школе в начале нулевых, наверняка застали такое замечательное средство социализации, как телефон с ИК-портом. Такой телефон включал его владельца в сеть обмена картинками с приколами, мелодиями и, конечно же, Java-играми. Для этого, однако, передающий и принимающий телефон нужно было обязательно держать окошками ИК-портов друг напротив друга и ни в коем случае не двигать (желательно даже не дышать в их сторону) — передача могла прерваться по совершенно неочевидным причинам.
Примерно тем же способом выполняется и программирование Люкса, но с одним отличием: приёмник и передатчик находятся на разных местах корпуса, а не за одним окошком. С пейджера данные передаются в программатор с помощью того же светодиода, который загорается при получении сообщений. Фотоприёмник же расположен за незаметным ИК-прозрачным окошком на передней панели под дисплеем.
▍ Полезная нагрузка
Знающие и умеющие люди с форума radioscanner.ru уже давно отреверсили схему программатора для нашей модели пейджера. Она не включает в себя некоторых функций оригинального программатора от производителя, но зато проста, собирается из небольшого количества доступных деталей и справляется с нашей задачей.
Ну, зато работает
ПО для программирования пейджера гуглится, оставим этот этап на совести читателя, если он вдруг решит повторить эксперимент автора.
ПО работает на DOS. Берём копию DOS, разворачиваем её на виртуалке, запускаем PROG20
. Располагаем программатор так, чтобы инфракрасный светодиод светил в фотоприёмник пейджера, а фотоприёмник программатора закрепляем прямо над светодиодом пейджера:
Beam me up, Scotty
Попробуем считать конфигурацию. Жмём F4
. Едва заметно начинает мерцать светодиод на программаторе (в ИК-диапазоне он светит гораздо ярче, но мы этого почти не видим), пейджер в ответ подмигивает своим красным индикатором.
Удивительно, но сработало. Мы видим совершенно не такой, как на наклейке, номер в поле Master RIC
, два из четырёх Secondary RIC
для получения общих новостных рассылок, локализация Russian
. На второй странице указана скорость передачи данных — 512 бод. На третьей странице — несущая частота в 161.5 МГц.
Данных достаточно для пробной передачи. Ненадолго отложим пейджер и соберём передающую станцию. У нас есть SDR плата HackRF, на которую мы можем передать сформированный на компьютере сигнал. Мощность передачи небольшая, сигнал не распространится за пределы помещения и не повлияет на другие устройства, работающие на этих частотах (мы же помним про лицензию на вещание, да?).
Для формирования сигнала с сообщением и передачи его на SDR воспользуемся пакетом программ GNUradio. Это крайне гибкий инструмент для работы со всевозможными сигналами, который основан на модульном подходе: чтобы что-то куда-то передать, нужно собрать конвейер из модулей, каждый из которых выполняет ровно одну задачу и передаёт результат своей работы следующему модулю. Умные люди из интернета и здесь нам помогли: для GNURadio уже написан модуль gr-mixalot, который формирует сигнал с произвольным сообщением протокола POCSAG или FLEX, поэтому читателю не придётся вникать во всякие страшные понятия вроде «манипуляция сдвигом частоты без возвращения к нулю» и «двухбитовый код коррекции ошибки» (что, впрочем, не помешает любопытствующим почитать, например, этот материал).
Разработчик модуля gr-mixalot оказался настолько любезен, что включил в комплект с исходниками файл конвейера для GNUradio Companion с примером передачи сообщения через SDR вроде нашего HackRF:
На схеме ничего сложного: создаём и кодируем сообщение блоком Single-Page POCSAG Xmit, преобразуем его вывод в цифровые значения, эти значения частотно модулируем, немного преобразуем сигнал модулями умножения и ресемплинга, и наконец, отправляем в HackRF. Нужно, однако, поправить несколько переменных: номер пейджера (capcode), частоту (pagerfreq) и сообщение (message). Вводим наши данные, включаем HackRF, пейджер кладём поближе к антенне. Всё готово:
Запускаем схему в GNURadio… И ничего не происходит. Ещё один запуск — снова произошло ничего.
Досадно. Давайте разбираться, что не так. Возьмём ещё одну SDR и послушаем, уходит ли вообще сигнал в эфир:
Определённо уходит, частота верная. Поищем возможные проблемы на стороне пейджера.
В документации PROG20 поле частоты описано следующим образом:
Receiver Frequency
Допустимые значения: 0-999.9999999
Назначение параметра: Содержит конкретное значение рабочей частоты пейджера (в МГц). Это поле записывается при изготовлении пейджера и не может быть изменено с помощью программатора.
То есть, программно изменить частоту приёма сообщений невозможно. Вероятность, что Airpage и местный оператор, на которого переключили этот пейджер, вещают на одной и той же частоте — невелика. Из этих двух фактов выдвигаем гипотезу: частоту приёмника изменили аппаратно.
Заглянем внутрь Люкса:
Заметно, что тут поработали паяльником. Обратите внимание на контакты детали с надписью 82.500. Это — кварцевый генератор, который при подаче на него напряжения выдаёт вибрирующий с заранее известной частотой сигнал. Кварц — незаменимый компонент любого устройства, где есть необходимость в точном периодическом сигнале — от наручных часов Монтана до компьютеров всех сортов. Радиоприёмники цифровых сигналов тоже входят в этот спектр.
Очевидно, кварц на нашем экземпляре меняли. Значит, теперь его приёмник слушает другую частоту. Если обратиться к документации на микросхему приёмника — мы найдём процедуру настройки на частоту. Если кратко: с точно той же частотой колеблется контур приёмника и её можно измерить на тестовых точках (золотистые контакты в правом верхнем углу). Тут другая проблема: для измерения такой частоты нужно лабораторное оборудование. Очень дорогое лабораторное оборудование. Осциллограф с полосой пропускания до 1 ГГц стоит примерно как новый автомобиль. Более простой частотомер с подходящими характеристиками стоит на два порядка меньше, но всё ещё неоправданно дорого для единичного применения.
Можно отправить сообщение на каждой из возможных частот, но перебирать их придётся по одной. Приятной особенностью GNURadio Companion является возможность преобразовать конвейер из блоков в код Python. Для нас это означает, что достаточно выполнить файлик .py с нужными параметрами сообщения, номера и частоты, а не править конвейер вручную для каждой следующей частоты. В полученный код можно добавить простой цикл и перебирать частоты им.
В руководстве упоминается полезная функция, которая выводит на экран значок с перечёркнутой антенной, если пейджер не принимает вообще никаких сигналов на своей частоте в течение 30 секунд. В годы активного функционирования сети он был бы индикатором отсутствия покрытия оператора, но сейчас должен отображаться почти постоянно. Включить её можно в том же программаторе.
Соберём пейджер обратно, снова установим его в программатор, запустим PROG20. Изменим параметр Out Of Range
с Disabled
на 30 seconds
, запустим процедуру программирования клавишей F6
. Заморгали лампочки, побежали проценты… И тут — здравствуйте:
Интересно. Попробуем считать текущую рабочую конфигурацию и её же записать. Для верности накроем пейджер с программатором чёрной салфеткой, чтобы избежать влияния других источников света.
Ошибка та же. Появляется где-то на 12% записи новой программы.
Возможно, поможет сброс к заводским настройкам. Есть риск потери хитрых хаков, которые, вероятно, устанавливали в сервисе местного оператора, если таки вообще были.
Сохраним текущую конфигурацию в файл и запустим процедуру сброса. Для применения новых параметров PROG20 перезагружает пейджер в особый режим, в котором пейджер может только принимать команды от программатора и не запускает интерфейс. По идее, пейджер должен перезагрузиться в обычный режим, как только получит корректную программу.
Однако запись программы и в этом режиме обрывается с той же ошибкой, с которой мы уже столкнулись. Пейджер всё ещё ждёт указаний от программатора, но тому не удаётся ничего туда записать.
Самое время остановиться и подвести невесёлый промежуточный итог:
- Приёмник пейджера был аппаратно перенастроен на неизвестную частоту;
- Из-за сбоя записи настроек программатор не может вывести пейджер из режима программирования;
- Пейджер застрял в режиме программирования и не загружается в штатный режим работы, даже если вытащить из него батарейки.
▍ Код коррекции ошибок
Давайте разбираться.
Начнём с самого пейджера. Чтобы привести его в чувство, нужно понять, почему программатору не удаётся записать программу в пейджер. В ветке на Радиосканнере, где нашлась схема программатора, кто-то неодобрительно высказывался о работе программатора на виртуальной машине. «Только голое железо», писали они. DOSBox тоже не годится.
Нам нужен компьютер с разъёмом RS232. Пришло время посетить кладовку.
Из кладовки выжившие возвращаются с великолепным устройством, уже знакомым некоторым читателям. Встречайте: Франкеноут (можно просто Фрэнк):
Собранный из двух половинок разных ноутбуков, Фрэнк был моим походным ноутбуком большую половину студенчества. С завода наивное устройство, которому после череды непростых жизненных испытаний предстояло стать Фрэнком, вышло под именем RoverBook. После трагической потери дисплея ему пожертвовал крышку ноутбук Acer с отказавшей материнской платой. Крышка оказалась немного больше и тяжелее базы, и держится в открытом виде, при помощи лески. Из-за медленно умирающего южного моста часть периферийных портов Френка перестала работать, но ясность ума и основные функции он сохранил. К тому же он имеет никогда ранее не использованный, но так нужный нам сейчас порт RS-232.
Скопируем уже настроенный DOS с программатором из виртуалки на флешку. Сделаем её загрузочной. Воткнём в один из ещё рабочих портов Фрэнка и попробуем с неё загрузиться. Работает!
Подключим программатор. К сожалению, удлиняющего кабеля под DB-9 в кладовке не нашлось (возможно он там и есть, но кто бывал в кладовке — тот знает, что лишний раз там лучше не шариться), поэтому втыкаем программатор прямо в порт.
… с этим можно работать. Поднесём зависший пейджер к светодиоду программатора, фотоприёмник программатора поднесём к красному окошку пейджера, любой свободной конечностью нажмём F4
.
Считалось, уже неплохо. Теперь скрестим пальцы на оставшихся свободными конечностях и попробуем завершить процедуру сброса.
Пейджер ожил! Пока всё работает — зашьём в него нужные нам параметры Out of Range
. Заодно поменяем International Variant
на ANSI
на всякий случай.
Вернёмся к вопросу поиска частоты. Перебирать все частоты — не очень хорошая идея, поскольку диапазоны частот определены не стандартом POCSAG, а государственными органами радиочастотного надзора. И определены они довольно широко, а шаг между частотами явно не определён вообще. Простым перебором мы можем очень легко промахнуться мимо нужной частоты.
Попробуем пойти по-другому: поищем информацию об отечественных пейджинговых операторах и их рабочих частотах.
Нашлась она там же, где нашли программатор — по соседству с его архивом лежат несколько справочников с частотами операторов. Приведём частоты к общему виду, составим таблицу.
GNURadio позволяет скомпилировать блок-схему в исполняемый код на питоне. Воспользуемся этой функцией. Код можно немного дописать таким образом, чтобы он мог принимать аргументы из командной строки, которыми будет гораздо удобнее задавать сообщение и частоту.
У нас есть длинный список частот, есть готовый к применению код на питоне. Немного магии баша — и мы можем отправить по одному сообщению на каждой частоте из справочника. В качестве сообщения можно указать ту же частоту, чтобы единственное сообщение, которое дойдёт до пейджера, сразу содержало ответ на загадку.
Запускаем и ждём.
Открытие первое: пейджер очень громко трезвонит, когда получает сообщение. И вибрирует. И мигает лампочкой. И не затыкается, пока пользователь не нажмёт на кнопку! Это вам не деликатное сообщение из Телеграма, которое тихонько тренькнет и будет ждать в шторке уведомлений — пейджер требует всё ваше внимание!
Открываем Входящие и совершаем открытие второе:
Вот и наша искомая частота: 165 МГц ровно. Ровно в два раза больше указанной на кварце частоты 82.500. Кто бы знал.
Попробуем передать какое-нибудь другое сообщение. Указываем частоту, задаём сообщение, отправляем:
Радость, однако, была неполной. Да, сообщения пошли, но только из латинских букв. А пейджер ведь явно может работать с кириллицей, мы видели меню на русском. Дожмём? Дожмём!
Но сначала придётся немного остановиться на том, что такое кодировки и чем они отличаются одна от другой.
Стандарт POCSAG предполагает кодирование информации по семибитной таблице. Для стандартного латинского алфавита она соответствует стандартной таблице ASCII (она же ANSI):
Этой кодировкой пользовались ещё на телетайпах в 1960-х годах. Логично было использовать её и для ЭВМ тех и последующих лет. Семь бит позволяют хранить 128 символов, чего хватает для двух регистров латиницы, основных знаков препинания и нескольких управляющих кодов (выделены цветом). Вроде хватает, но только для латиницы. Ни символов других алфавитов, ни даже букв вроде ä
или ß
из немецкого языка в неё уже не добавить. Поэтому универсальной эта кодировка не стала.
С кириллическими кодировками было особенно сложно. Со времён, когда в СССР ещё делали свои вычислительные машины, остались кодировки КОИ-7 и КОИ-8. У винтажных Макинтошей была своя, ни на что не похожая, кодировка. Windows использовала кодировку 1251, где кириллические символы размещались в дополнительном диапазоне следом за латинскими. Её особенность — в соседней кодировке 1250 в тех же позициях располагались символы языков западной Европы, что радовало тогдашних пользователей такими строчками:
Winamp: đĺŕëüíî áü¸ň ëŕěó ďî ćîďĺ!
Потому что, конечно же, операционные системы далеко не всегда правильно определяли, в какой кодировке сохранён текст.
Вернёмся к нашей задаче. POCSAG использует ту же семибитную таблицу ASCII. Тут ни убавить, ни прибавить — в таблице ровно 128 символов. Стандарт POCSAG не предлагает кириллических кодировок, поэтому у пейджеров Philips существует два варианта кодировки для русского языка — Russian-ANSI
и Russian
. Первый — комбинированный вариант, который содержит и латиницу, и кириллицу, но только заглавные буквы. Второй содержит и заглавные, и строчные, но только кириллицы.
Одной быстрой прошивкой на Френке позже — пейджер готов принимать сообщения в кодировке Russian-ANSI
. К которому у нас таблицы нет. Но тут несложно догадаться, что кириллические буквы размещены там, где в обычной ANSI были строчные латиницы. Попробуем отправить фразу THIS IS BIG TEST and this is small test
:
Кодировка работает, русские буквы есть. Надо только составить таблицу соответствий.
15 минут и около трёх десятков сообщений спустя, таблица готова:
Букве Ё
места в таблице не нашлось.С буквой Я
возникла другая проблема — Все буквы до неё занимают места от 60
до 7E
в таблице ASCII, и она должна быть в таблице на месте 7F
. Однако в таблице ASCII в этом месте находится спецсимвол DEL
. Мы не можем ввести его с клавиатуры.
К счастью, это и не обязательно. Автор модуля gr-mixalot позже разработал более удобный способ отправлять сообщения. Он предусматривает постоянно работающий сервер, которому можно сообщить номер пейджера, тип и содержимое сообщения, что гораздо удобнее для массового использования. Важная и полезная нам особенность — сообщение ему нужно передавать в виде последовательности кодов из таблицы ASCII, а не готовых букв.
Если объединить таблицы ASCII с нашими открытиями, получим следующую таблицу для кодировки Russian-ANSI:
Со знанием этим составим новое сообщение:
717a65787c20657965207d726875206c7f636a6875207470606d767367716a68752061
736b6e6a20646020627b6f65692077607e
Отправим его на пейджер. Принято следующее:
Теперь давайте попробуем поработать с таблицей Russian
. Напрашивается гипотеза: буквы там в тех же позициях, что и в Russian-ANSI
. Прошьём пейджер и отправим на пейджер ту же строку. Ответ удивил:
Гипотеза проверку не выдержала, хотя некоторые буквы всё же остались на своих местах.
Составим таблицу символов для кодировки Russian
тем же методом, которым мы составляли таблицу для Russian-ANSI
:
Знающие люди сразу распознают в этой таблице почти точную копию кодировки КОИ-7, набор 1. Эти же знающие люди вспомнят особенность этой кодировки — при замене таблицы ASCII на КОИ-7 Н1 текст на английском автоматически транслитируется. Не идеально, но вполне можно читать. Отправив на пейджер фразу «invalid device», получим:
Кое-кто из читателей точно этого ждал
На этом этапе возможности полученной системы ограничиваются лишь воображением. Не составляет труда написать небольшой скрипт, который преобразует получаемую строку в одну из нужных кодировок и автоматизировать отправку сообщений на сервер с помощью netcat
, возможно написать небольшую страничку, чтобы любой желающий мог через интернет отправить на Люкс своё сообщение…
▍ Постамбула
Но зачем?..
Если опустить общий стиль повествования, постоянные обращения к читателю и множество не подкреплённых источниками заявлений, самый большой допущенный автором академический промах — в самом начале работы не была обозначена её цель. А без цели — не ясно, к какому результату мы должны были прийти.
К счастью для нас, текст не претендует на академичность, процесс был довольно увлекательным, а вынесенный опыт — ценным. Пусть даже практического применения полученный комплекс пока не нашёл.
И всё же, где лучше остановиться?
Здесь. Стоило того!
Присоединяйтесь к нам в следующий раз, мы будем играть в «Позвоните Кузе» с помощью дискового телефона.
P.S.
Черновик этой статьи был написан осенью 2019 года по мотивам событий, произошедших полугодом ранее. Черновик в основном остался неизменным, однако часть фотоматериалов была утеряна. Для восстановления недостающих фотографий автор полностью воссоздал описанный в статье стенд, столкнувшись с рядом новых проблем: радиомодуль пейджера пришёл в негодность, модуль gr-mixalot не был обновлён для совместимости с актуальной версией GNURadio, а программатор был утерян. Не подвёл только Френк, за что ему большая благодарность и бережное ТО.
Отдельной благодарности заслуживает Александр, оперативно подготовивший два новых радиомодуля для Люкса.
Автор:
K3lwiN