Как отправить сообщение на пейджер
Использование пейджера в XXI веке
Пейджеры были очень популярны в 90-е годы. В то время я был студентом, и пейджер для меня был чем-то вроде коммуникатора из Star Trek, частью передовых технологий. Забавно вспоминать об этом, потому что теперь я знаю, что технологически протокол пейджинга очень прост. С точки зрения кодирования, пейджер не так уж отличается от беспроводных дверных звонков, которые сейчас продаются за 5 долларов на Aliexpress.
Несмотря на то, что повсеместно пейджеры уже не используются, они всё ещё есть в доме у некоторых людей. Можно ли протестировать пейджер сейчас? Безусловно, и я покажу вам, как это сделать. Давайте начнём.
POCSAG — протокол обмена сообщениями
Допустим, мы хотим отправить сообщение “TEST” на номер “1234”. В двоичной форме оно будет выглядеть примерно так:
А вот как сообщение выглядит в радиоспектре:
Биты кодируются с помощью модуляции с частотной манипуляцией (FSK), с использованием полосы пропускания 9 кГц и скорости 1200 бит в секунду, все это сообщение передается примерно за 0,5 с.
Выглядит просто, и это действительно так. Я пропущу подробности; те, кому интересно, могут прочитать спецификацию протокола. Все эти биты можно легко написать даже на бумаге — в прошлом эти протоколы были простыми, чего не скажешь о современных GSM или Wi-Fi.
В сообщениях POCSAG нет ни аутентификации, ни ключей безопасности — все сообщения для всех клиентов пейджинговой компании доступны в эфире «как есть» и, кстати, могут быть легко декодированы с помощью программного обеспечения для ПК, такого как PDW.
Как клиенты получают свои сообщения? Каждый пейджер имеет уникальный идентификатор, который называется CAP — протокол доступа к каналу, или RIC — код идентификации приёмника. Все пейджеры от пейджинг-провайдера слушают одну и ту же частоту, скажем, 164 МГц. Если код в сообщении равен коду пейджера, пейджер сохраняет сообщение и издаёт громкий звуковой сигнал. Вот и всё. Связь односторонняя, нет обратной отправки подтверждения, у пейджера есть только приёмник, а передатчика нет вообще. Логика и аппаратное обеспечение предельно просты, благодаря чему пейджер может работать более месяца от одной батарейки AAA. Интересно, что пейджеры всё ещё используются в некоторых странах даже сейчас — в больницах или службах неотложной помощи, где важно иметь портативное и лёгкое устройство с длительным временем автономной работы.
Покупка пейджера
Во многих странах по-прежнему доступны пейджинг-провайдеры, с которыми можно подписать контракт и получить новое устройство, но, скажем так, это не слишком увлекательный способ. Я говорю с точки зрения человека, который хочет протестировать пейджер из-за образовательного или ностальгического желания или, может быть, даже имеет дома старый пейджер, сделанный в 1990-х годах. У меня есть хорошая новость — с большой вероятностью он может быть протестирован ещё раз и действительно будет работать. Конечно, не в масштабах всего города, но можно запустить собственную маломощную пейджинговую сеть, по крайней мере в вашей квартире. Сейчас можно купить новый пейджер, но он стоит недёшево. Это первая ссылка, которую я нашёл в Google:
И, наконец, на eBay можно купить подержанный пейджер за 20–50 долларов. Он дешёвый, и это старая винтажная модель, что тоже весело. Но, прежде чем совершать покупку, следует иметь в виду две вещи, которые были описаны ранее в разделе POCSAG:
Чтобы отправить сообщение на пейджер, нужно знать его частоту. У старых пейджеров она написана на обратной стороне. Если вы не знаете частоту и не можете её узнать, пейджер бесполезен.
Чтобы отправить сообщение на пейджер, вам необходимо знать его кэп-код. Это 7-значное число, оно выглядит так: 0001234. Если вы его не знаете, вам понадобится кабель для программирования, чтобы прочитать конфигурацию пейджера.
Рассмотрим практический пример. Я видел этот пейджер Motorola Advisor Gold на eBay (имя продавца скрыто из соображений конфиденциальности):
Цена не такая большая, но стоимость доставки в ЕС составляет почти половину его цены. Ладно, давайте посмотрим на следующее фото:
Мы можем видеть частоту (462,875 МГц) и скорость передачи, но наклейка с кодом доступа была удалена владельцем, возможно, из соображений конфиденциальности, и это не очень хорошо для нас. Можно прочитать кэп-код, но для этого нам нужно купить или изготовить специальный кабель для программирования, а также найти подходящее ПО. Всё это нужно проверять перед покупкой, иначе у нас есть шанс получить «кирпич», который выглядит как пейджер, но не работает. И последняя, необязательная, но важная проверка — мы должны проверить, доступна ли желаемая частота в нашем регионе. Это можно сделать с помощью дешёвого приёмника RTL-SDR и программного обеспечения, такого как HDSDR. Если есть другой сигнал на той же частоте, пейджер также не будет работать. В моём районе частота 462,875 МГц, указанная на обратной стороне пейджера, уже занята, так что в моём случае лучше было найти на рынке другую модель.
Отправка сообщений
Чтобы отправить какие-либо данные на пейджер, мы должны передать сообщение POCSAG, используя соответствующую радиочастоту.
Перед любой передачей, пожалуйста, ознакомьтесь с местными правилами радиосвязи.
Эта статья описывает только техническую возможность, но не юридическую ее сторону, в разных странах правила могут отличаться. Например, в США в соответствии с частью 15 правил FCC, устройства с очень малой мощностью не требуют лицензирования, если излучаемая энергия не превышает 200 мкВ/м на расстоянии 3 метра. Это может обеспечить дальность действия до 30 метров, чего абсолютно достаточно для любых исследовательских или образовательных экспериментов. В других странах правила могут быть иными. Есть 3 простых способа передачи сообщений POCSAG.
Rpitx
Самый простой способ — использовать Raspberry Pi, и, что удивительно, это совершенно бесплатно: с помощью бесплатного opensource ПО rpitx сигнал может быть сгенерирован непосредственно с пина Raspberry Pi. Достаточно надеть на пин GPIO4 короткий провод:
Пейджер достаточно чувствителен, чтобы получить такой сигнал на расстоянии нескольких метров. Чтобы отправить сообщение, нам нужно установить программное обеспечение rpitx и выполнить команду:
Здесь 1000001 — это кэп-код, 465198000 — частота, а 0 — тип сообщения (сообщение может быть одного из 4 типов, например, 0 — только числовое, 3 — буквенно-цифровое). Другие параметры, такие как инверсия сигнала или скорость передачи, также могут быть изменены при необходимости. Выходная мощность однозначно невысокая, но её достаточно для проверки пейджера в квартире. Приложение rpitx работает на удивление хорошо для своей (нулевой) цены, но, конечно, Raspberry Pi в целом не является точным радиочастотным генератором. Частота может быть не на 100 % правильной, и может потребоваться небольшая корректировка значения в диапазоне нескольких килогерц (также хорошо иметь RTL-SDR в качестве контрольного приёмника).
Плата MMDVM
Следующий способ — купить специальную плату MMDVM (Multi-Mode Digital Voice Modem), которую можно прикрепить к Raspberry Pi:
Эта плата содержит передатчик ADF7021 с возможным диапазоном частот 80–940 МГц и небольшую антенну. Несмотря на название, плата MMDVM может передавать не только голос, но и сообщения POCSAG. Чтобы использовать плату, нам необходимо установить приложение MMDVMHost и настроить файл MMDVM.ini (установить желаемую частоту и включить модули «POCSAG» и «Remote Control»). После этого мы можем запустить приложение MMDVMHost (его можно разместить в /etc/rc.local для автозапуска или запустить как службу при необходимости). В другом окне терминала мы можем использовать эту команду для отправки сообщения:
Здесь 7642 — это порт дистанционного управления, 1000001 — код доступа. Использование MMDVMHost немного сложнее и требует некоторых знаний Linux, но выходной сигнал лучше по сравнению с использованием пина Raspberry Pi в качестве вывода.
GNU Radio
Людям, у которых нет Raspberry Pi, но есть LimeSDR, HackRF, USRP или любой другой приёмопередатчик SDR, можно отправлять сообщения POCSAG с помощью GNU Radio.
Существует несколько кодировщиков POCSAG, я нашёл модуль gr-pocsag от ON1ARF самым простым в использовании: он даже не требует установки и может работать из любой папки.
Описание блоков GNU Radio выходит далеко за рамки этой статьи, желающие могут самостоятельно проверить страницу gr-pocsag. Все описанные решения маломощные. Те, кто хочет большей дальности, могут использовать специальный радиопередатчик, такой как Motorola GM-350, который может обеспечить дальность действия в несколько километров, но для этого типа передачи, очевидно, потребуется действующая лицензия.
Настройка пейджера
Другие модели, такие как Alphapoc, можно настроить вручную, даже без программного обеспечения, или с помощью относительно дешевого инструмента программирования через USB. Старые, выпущенные в 1990-х годах пейджеры Motorola Advisor, имеют 3 контакта последовательного порта (можно использовать USB-Serial):
Программное обеспечение для этих пейджеров требует среды MS-DOS, но может запускаться с помощью DOSBox. У более новых (около 1997 г. выпуска) пейджеров Motorola Advisor Gold есть двухконтактный интерфейс. Я нашел эту схему подключения в Интернете, но сам не проверял:
Пейджеры Motorola требуют старого программного обеспечения, написанного для MS-DOS, его можно найти в Интернете. Увы, многие страницы и ссылки, созданные 20 лет назад, сейчас недоступны — когда речь идёт о вещах, созданных 20 лет назад, возникает хорошо известная проблема «вымирания ссылок». Другая проблема, которая может возникнуть, — многие операторы пейджинга использовали пароль для предотвращения изменения конфигурации пейджера. Возможно, это было сделано из соображений безопасности: после изменения кэп-кода владелец пейджера может читать сообщения, предназначенные для другого клиента. Если конфигурация пейджера защищена паролем, при чтении настроек появится запрос:
Этот пароль можно прочитать из EEPROM пейджера с помощью созданных энтузиастами сторонних инструментов, но для этого потребуются некоторые навыки пайки.
Заключение
Было весело протестировать пейджинг и исследовать, как он работает.
Также очевидно, что нет никакой гарантии, когда вы покупаете вещи 20-летней давности — даже если продавец пишет «проверено» в описании, максимум, что он сделал, — это поставил батарею и проверил логотип на экране. Я не ожидаю, что продавцы знают о частотах или кодах доступа. Но в моём случае это было сделано для развлечения и самообразования, так что проблем с этим нет, даже если что-то не работает.
Ещё одна проблема, с которой я столкнулся при тестировании пейджеров, — это «вымирание ссылок». Раньше все думали, что «Google знает всё» и «информация в Интернете бесплатна», но на самом деле это не так. Хранение файлов и размещение сайтов стоят денег, через некоторое время веб-страницы становятся недоступными. Многие старые сообщения на форуме имеют мёртвые ссылки и содержат пустые квадраты вместо изображений. При попытке найти информацию о старых вещах всё это стало очевидным. Мне удалось найти полезное программное обеспечение на некоторых старых и заброшенных веб-страницах, но нет гарантии, что эти ссылки будут живы в течение длительного времени.
Могут быть и юридические причины, например, я не уверен, что Motorola официально разрешила кому-то публиковать программное обеспечение для программирования своих пейджеров, даже если публикация сделана 25 лет назад. Но для сохранения технического наследия может быть важно сохранить такие вещи. Наконец, пейджеры можно протестировать, и это весело.
Для тех, кто хочет провести больше тестов в более крупном масштабе, также можно использовать POCSAG на любительских радиочастотах и присоединиться к сети любительского радио DAPNET (децентрализованная любительская пейджинговая сеть). Для этого потребуется лицензия любительского радио, но для тех, кто интересуется цифровой связью, она может оказаться достойной её получения. Желаю всем читателям удачи и интересных экспериментов!
Несмотря на возраст этого вида связи, пейджерам до сих пор находится применение. Но если для технологии, 20 лет — это уже солидный возраст, то для языков программирования это еще даже не юность. Например С++, созданный Бьёрном Страуструпом аж в 1983 — до сих пор в топе самых популярных языков в мире благодаря своей чистой и красивой логике и гибкости. Если вы хотите разнообразить свой набор скилов этим языком — обратите внимание на наш курс по разработке на С++, ведь этот язык для миллионов программистов был и остаётся не менее важным, чем английский.
Узнайте, как прокачаться и в других специальностях или освоить их с нуля:
Как отправить сообщение на пейджер
Пе́йджер (от англ. to page — вызывать, что, в свою очередь, происходит от слова page — паж, слуга, мальчик на посылках — ср. «to send a page after» [1] ) — приёмник персонального вызова. Сообщения на него передаются по пейджинговой сети. Для того, чтобы отправить почту на пейджер, надо набрать телефон оператора, сообщить номер или название абонента и продиктовать сообщение.
Каждому пейджеру в системе присваивается индивидуальный код, служащий своеобразным адресом, по которому передаваемая информация попадает к нужному абоненту. Сообщение для передачи поступает по телефону или электронной почте к оператору системы, который направляет его по радиоканалу в пейджинговую сеть с указанием индивидуального кода получателя. Приём сообщения возможен только пейджером — владельцем данного кода. Объём передаваемой информации может достигать нескольких сотен знаков, продолжительность передачи — несколько секунд. Пейджер имеет память, позволяющую записывать принимаемые сообщения и затем просматривать их в любое удобное для пользователя время. Он существенно дешевле мобильного телефона и очень удобен в случаях, когда двухсторонняя связь необязательна, например для вызова аварийных бригад при авариях на линиях электропередачи, на газо- и нефтепроводах, для связи с отдыхающими на даче при отсутствии телефона, для оповещения жителей прибрежных посёлков о надвигающемся шторме.
Первый в мире пейджер выпустила компания Motorola в 1956 году. Первые пейджеры взяли на вооружение сотрудники больниц и менеджеры. Затем пейджерами обзавелись все, кто хотел быть всегда доступным.
Содержание
Преимущества [ править | править код ]
Пейджинговая связь по сравнению с сотовой имеет ряд преимуществ:
Существует так называемый «двусторонний пейджинг», при котором реализована возможность отправки коротких сообщений непосредственно с абонентского оборудования. Этот метод больше похож на современную сотовую связь.
История [ править | править код ]
В 1921 году полиция Детройта впервые применила принцип оповещения по радио мобильных подразделений через диспетчера. Позднее, в 30-е годы, подобные системы достаточно широко использовались в подразделениях армии и полиции США. Однако только в 1956 году английской фирмой Multitone была разработана и установлена в одной из больниц Лондона первая в мире система персонального радиовызова (ПРВ) современного типа. В её состав входили передатчик, который передавал кодированные сигналы, и приёмные устройства, которые эти сигналы принимали. Приёмные устройства выдавались врачам и другому руководящему персоналу больницы. Если требовалось кого-либо из них срочно найти, то передатчик передавал сигнал, а абонент по индивидуальному звуковому сигналу (писку) идентифицировал его и тем или иным способом связывался с администрацией. Подобные приёмные устройства назвали биперами (от англ. beep «пикать», «пищать»). В дальнейшем эти системы связи развивались эволюционно, и только в последние годы они вступили в фазу бурного роста, чему способствовали как успехи технологии, так и потребности общества. В СССР подобная связь применялась в отдельных государственных структурах (органы государственного управления, КГБ, некоторые медицинские службы) с конца 60-х гг., однако распространение она получила только с 1979 года (в период подготовки к Олимпиаде-80).
Принцип действия [ править | править код ]
Под пейджингом, или сетью персонального радиовызова (ПРВ), понимают систему односторонней беспроводной передачи сообщений. Желающий послать сообщение на пейджер по телефону звонит оператору пейджинговой компании, называет номер абонента и диктует сообщение. Передача сигнала осуществляется специальным радиопередатчиком (базовой станцией, БС). Приём сигнала осуществляется переносным устройством абонента — пейджером, размером меньше сигаретной пачки. Каждому приёмному устройству присвоен уникальный номер. Пейджер всё время «слушает» определённую (фиксированную) радиочастоту. Приёмник ждёт до тех пор, пока не «услышит» в эфире свой номер. После этого он переходит в активный режим, принимает и отображает сообщение на дисплее. Зона уверенного приёма (дальность связи) зависит, в основном, от мощности и типа передатчика.
Среди приёмных устройств первыми были тональные биперы — устройства, способные издавать только однообразные звуки, несущие закодированную информацию. Позднее, по мере развития микроэлектроники, появились цифровые аппараты, способные выводить на табло цифровой ряд — как правило, номер телефона.
Ношение пейджеров [ править | править код ]
Большинство пейджеров имело клипсу для открытого ношения на ремне или других деталях одежды. некоторые пейджер носили и на шее, также были чехлы с клипсами и отверстия для ремней.
Прочитав заголовок, вы, наверное, немного удивились необычности задачи, которую я перед собой поставила. Однако, как ни странно, пейджеры до сих пор иногда могут пригодиться в жизни, даже несмотря на появившееся в последние 15 лет обилие других средств коммуникации. Один из частных случаев их применения — (около)медицинское учреждение, расположенное в железо-бетонном здании, глушащем WiFi и сигнал мобильного телефона. Обслуживающий персонал, тем не менее, должен каким-то образом получать сообщения о том, куда им надо срочно переместиться в случае чего. Для решения этой проблемы руководство учреждения в нашем случае поставило себе дорогую станцию и раздало всем сотрудникам пейджерА пейджеры, которые должны были среди прочих принимать наши сигналы. Соответственно, нашей (меня и моих коллег) задачей являлась их отправка.
Уже прошли те времена, когда для отправки текста на пейджер надо было сначала пообщаться с сонной девушкой с телефонного узла. Теперь достаточно дозвониться до станции и набрать номер абонента и сообщение в тоновом режиме. Арсенал при этом сильно ограничен: можно отправлять только цифры, символы * и #, иногда буквы ABCD. Но для передачи, скажем, номера комнаты или кода ошибки должно хватить. Это довольно сильно упрощает задачу и роднит её с другими — с дозвоном в общую переговорную комнату, например.
Несмотря на кажущуюся прозрачность решения и вторичность моего опыта, я решила подробно описать свои действия, потому что информации в интернете по теме представлено не очень много: на форумах на вопросы отвечают редко и неметко. Кому-то этот текст, возможно, сильно сэкономит время.
Шаг 1 — INVITE
Первый этап — дозвон на пейджинговую станцию — был реализован через протокол SIP и с помощью соответствующей Java-библиотеки jain-sip. Самое лучшее описание принципов работы протокола я нашла на Хабре в публикациях «Взаимодействие клиентов SIP. Часть 1» и «Взаимодействие клиентов SIP. Часть 2», а самый удобоваримый туториал по джейн — вот здесь (но коллекция примеров отсюда отказалась получше).
В качестве предпоготовки я создала класс:
c необходимыми полями, которые вначале должны быть инициализированы так, как указано в туториале:
Как предписывают нам правила, сначала необходимо отправить INVITE-сообщение на телефон. Обратите внимание на то, что адресат в To- и Request-хедерах записывается по-разному. В первом случае заголовок просто собирается из глобального телефонного номера:
Во втором случае необходимо указать хост, с которого производится отправка сообщения, инициирующего общение:
Другим интересным элементом является, собственно, тело SDP-сообщения, представляющее собой описание того, что понадобится для успешной коммуникации. В нашем случае оно выглядело примерно так:
Атрибуты «o» и «s» не являются особо важными, в «p» пишем свой телефон. Основная часть — «m» (media), в которой прописываются используемые кодеки (в нашем случае на отправителе они могут быть не установлены) и порт для принятия ответов по теме.
Шаг 2 — аутентификация
Если нам удалось отправить правильный инвайт, то в лучшем случае сервер-получатель пришлет нам желанное OK-сообщение со статусом 200, а в худшем — решит еще немного помучить идентификацией. Во втором случае ответый статус будет 401 или 407. Вот код, с помощью которого посылается ответ. Для его поддержки понадобится одна из последних версий jain-sip (например, 1.2.228). Его надо поместить в метод processResponse(), получающий в качестве аргумента ResponseEvent responseEvt.
Обратите внимание на четверый аргумент метода handleChallenge(), без него формат сообщения изменится, станет неподходящим и ваша аутентификация провалится.
Классы AccountManagerImpl и тоже неоходимый UserCredentialsImpl должны быть дописаны вами, я их писала по модели тех, что представлены здесь.
После отправки своих регистрационных данных мы можем смело ожидать искомый 200 OK, на который надо не забыть отправить ACK. Такой тип сообщения изготавливается крайне просто:
Шаг 3 — SIP INFO
Сама процедура отправки выглядит немного странно (кажется, построенной по модели «через Жмеринку в Париж»), но иначе у меня ничего не работало. Вообще библиотека мне показалась немного глючной: очень часто одно из нескольких решений, выглядевших по большому счету одинаково, не срабатывало.
Что я могу сказать? После реализации этого шага оказалось, что не все VoIP-сервера одинаково дружелюбны: некоторым достаточно было сигналов, передаваемых через SIP, а кому-то их не хватило, так как они не производят звукового сигнала и потому остаются незамеченными. Естественно, по закону подлости моей целью был сервер второго типа. Поэтому…
Шаг 4. формирование RTP-пакета
Вообще когда я осознала, что одним SIP-ом проблему не решить, я надеялась, что хотя бы смогу воспользоваться другой библиотекой, которая умеет ненапряжно отправлять DTMF-сигналы. Но не тут-то было. Обычно, если мы говорим «RTP через джаву», то подразумеваем JMF. Но, во-первых, она уже старенькая и не особо поддерживается. Во-вторых, она больше подходит для передачи более сложных медиа. В-третьих, туториалы, которые мне удалось найти, были не очень толковыми. Вот один из примеров из документации, в середине которого всплывает некая rtpSession, следов которой в первые сколько-то минут поиска мне найти вообще не удалось.
Другим вариантом была библиотека libjitsi, представляющая из себя целый коммуникатор. Из неё ничего позаимствовать тоже не удалось, хотя там есть милая метода sendDTMF или что-то в этом духе. Структура кода такова, что он берётся или целиком, или никак. В итоге было решено по-нормальному сделать человеческий пакет и отправить его через UDP-соккет.
Итак, вот значимый фрагмент класса RtpPacket: его основные поля и конструктор со значениями, подходящими для передачи DTMF. Что значат все эти вещи, написано много где, поэтому повторяться не буду. Отмечу только, что значение параметра ssrc в принципе роли не играет, но у всех отправляемых в одной сессии пакетов оно должно совпадать. Номер формата полезной нагрузки у DTMF-пакетов (payload type) — 101 (его мы прописали, когда инициировали SIP-коммуникацию).
Самый важный этап создания пакета — заполнение байтового массива данных. У DTMF, естественно свой формат: первый байт — это, собственно, значение передаваемого сигнала (от 0 до 16), первая половина второго байта — различные маркеты (обычно 0), вторая половина второго байта- громкость (стандартное значение — 10), остальные два — это длительность (стандартное значение — 160).
Для каждого сигнала создается около 10 пакетов (число может варьироваться):
— первый, начальный, имеет marker = 1, остальные — 0;
— последние три — конечные, marker = 0, зато первый бит второго байта блока данных = 1. Блок данных в неконечном пакете для передачи сигнала 1 будет выглядеть так:
А в конечном вот так:
Метка времени у всех DTMF-пакетов, относящихся к одному сигналу, может оставаться одинаковой (предположим, T). Зато время следующего пакета должно быть:
Шаг 5. RTP-канал
Можно было создать только один соккет для отправления и принятия сообщений. Но — в любом случае — никакой отправки, естественно, не случится, если не знать хоста и порта назначения. Это уже совсем не те данные, через которые проходила SIP-коммуникация. Свои координаты телефонный сервер присылает нам в ответных SIP сообщениях во время нашего дозвона. Их можно получить, вставив в метод processResponce() вот такой код (тут можно увидеть, зачем мы ранее инициализаровали sdpFactory):
Дальше, как я наивно полагала, мне оставалось только понаделать из моих байтов DatagramPacket’ов, засунуть их в сокет и запулить в сервер. Но не тут-то было. В ответ сервер продолжал обрывать коммуникацию на полуслове, как будто ничего и не получал. А Wireshark в принципе не принимал мои сообщения за RTP, отображая из как простые UDP.
Шаг 6. RTP-коммуникация
На то, чтобы понять, в каком направлении двигаться дальше, ушло много времени. Я вложила много усилий в то, чтобы перечитать все имеющиеся в наличии спецификации и сто раз проверить свои пакеты на правильность. На седьмой же день Зоркий Глаз в моем лице заметил, что стандартная RTP-коммуникация не начинается сразу же с отправки DTMF-данных, а что ей предшествует непродолжительный обмен пакетами с сервером, которые выглядят несколько иначе.
Формат полезной нагрузки, объявленный в заголовке, равен 0, данных нет, зато есть собственно сама полезная нагрузка (payload), которая занимает 160 байт. Этот набор байтов различается во всех приходящих и уходящих сообщениях и выглядит составленным довольно случайно. Так или иначе, я не смогла найти информации о том, как именно он должен формироваться, поэтому каждый раз забивала его рандомами.
После того, как я стала отправлять эти вспомогательные пакеты перед каждым DTMF-сигналом, Wireshark наконец-то признал RTP-формат. Всё выглядело лучше, но коммуникация по-прежнему прерывалась, хотя сервер теперь от радости тоже стал меня забрасывать «пейлодными» пакетами.
Я уже и не знала, что еще бы могла сделать, но тут вспомнила, что RTP есть брат-неразлучник — RTCP. Проблема, по всей видимости, действительно была в нем: сервер пытался мне что-то отправить, но ему от меня постоянно приходили сообщения о том, что соответствующий порт закрыт. Поскольку я не хотела заморачиваться отправкой еще и RTCP-пакетов, я начала просто с открытия чакры порта:
Это оказало решающее воздействие: абонент получил моё сообщение «305*1*66» на пейджер!
Заключение
В последних строках моей телеги хотелось бы подчеркнуть, что это мой первый пост на Хабре, так что не судите меня строго. Я совершенно не считаю себя гуру телематики или чего-либо ещё. Просто при написании исходного кода очень много времени ушло на поиск информации. Что-то я находила в спецификациях, которые от начала до конца в один присест осилить было сложновато, что-то было описано нормальным языком, но как-то неярко мелким шрифтом на полях, что-то я делала наугад. Так что в какой-то момент просто решила, что если у меня всё получится, я опишу все свои действия в одном месте и оставлю это индексироваться где-нибудь в интернете.
Так что очень надеюсь, что хоть кому-то моя статья пригодится или хотя бы покажется интересной.
Приколы,
Стихи
Сообщения на пейджер
«Срочно узнай номер моего пейджера и скинь мне его на него.»
Сообщение на пейджеp:
«Лена, не pаскачивай так сильно бедpами, меня yкачивает. Твой ПЕЙДЖЕР. «
Абонент:
— Архив за несколько дней прочитайте, пожалуйста.
Оператор читает:
— Рома, у меня задержка. — Рома, я еду к врачу.
— Рома, ты скоро станешь папой. — Рома, у нас будет ребенок.
Абонент неожиданно разражается хохотом:
— А мне по барабану, меня Дима зовут.
Новый русский говорит другу:
— Мой пейджер 32-04. И запомнить легко: 32 зуба и 4 пальца.
«Позвони мне на пейджер. Очень хочу услышать твой голос.»
«Все ушли. Остались я и Чари. Подпись — Чари.»
— Девушка! У Вас интервал есть?
— Да.
— Дайте ему через интервал.
— Миша — это подпись?
— Hет! Зовут меня так.
— Это пункт приема сообщений?
— Девушка, Вы пейджер?
«Ты где? Я тебя заждался. Когда подойдешь, ударь по моей машине, я тебя услышу.»
— Поставьте, пожалуйста, 3 восклицательных знака вопроса.
«Мы больше не будем прелюбодействовать тебе на нервы.»
— Девушка, прочитайте ему, пожалуйста, с выражением эту информацию.
— Hазовите, пожалуйста, номер абонента.
— Вы мне эти буржуазные штучки бросьте.
«Позвони мне завтра в любое удобное для тебя время с 7 до 8 утра.»
«Приезжай ко мне непосредственно в квартиру.»
«Включи пейджер и перезвони мне.»
«Я и баранья нога едем домой. Мама.»
«Сообщи стоимость вешалки под плечики.»
«Прошу обеспокоить Вячеслава Михайловича в дому.»
«У меня все нормально. Меня пронесло.»
«Оля, ты обещала 2 инвалидов. Жду. Папа.»
— Долбаните ему пару раз, чтобы он понял.
Hетрезвый голос поздно вечером:
— Секретарша срочно вызывается в офис для выполнения своих прямых обязанностей.
«Как только проснетесь и соберетесь ехать к Шурику, срочно сейчас перезвони мне домой.»
«Hе забудь в субботу привезти постирать пеленки и малыша.»
Диктует:
«Света — тире — позвони. Постскриптум — Илья.»
«Позвони мне в автомат.»
«Дверь пришла. Жду дома. Саша.»
Сообщение в 11 часов:
«Приезжай срочно в 15 часов на Войковскую.»
— Приезжай срочно? Сейчас только 11.
— Да он успеет, он близко живет.
«Милый, я вчера забыла юбку в твоей машине. Верни ее, пожалуйста.»
— Это все сообщение?
— Hу, добавьте ему еще от себя.
«Если ты в пределах телефона, позвони. Мама.»
— Дайте ему эту информацию 2 раза через раз.
— Извините, это как?
— Как, как! 2 раза через 2 минуты.
«Сижу на фонтане. Жду дальнейших указаний.»
«Жду звонка в натуре. Меня кинули на телефон.»
В окошке примечаний указано пожелание абонента дублировать сообщения 2 раза через 10 минут:
— Девушка, дайте ему 2 раза через 5 минут.
— Hе могу! У него стоит 2 раза через 10-ть.
«Срочно вызывай сантехника. У нас нет памперсов и еды.»
«Слава, тебя ждет дома Андрей и звонок из Спектрсервиса.»
«Дублируйте им пару раз. Они люди с гор, читать умеют плохо.»
«Девушка, передайте с акцентом, пожалуйста!»
«Вася, будешь идти мимо моей комнаты, занеси мне мои штаны и галстук.»
С мучительными паузами:
— Ехай за мной как можно быстро!
— Приезжай за мной как можно быстрее?
— О! Точно!
Претензия:
— Почему у вас с 20 до 22 не работал оператор?
— Какой номер оператора?
— Откуда я знаю? Он же не работал.
— Передайте передачу.
— Девушка, передайте, пожалуйста, сообщение!
— Хорошо! Передаду.
«Твоя сестра разжирела как Монтсеррат Кабалье. Купи ей 2 упаковки пластыря для похудения, и пусть она его жрет пачками.»
Звонит абонент и жалуется, что ему не пришли сообщения. Оператор предлагает сделать повтор сообщений за данный промежуток времени и вместе дождаться прихода информации. Абонент соглашается.
Проходит минута, оператор спрашивает:
— Поступила информация или нет?
— Откуда я знаю. Я — дома, а пейджер — в машине.
«Милый, я хочу или гамбургер, или «Сникерс», или тебя. Лена.»
«Дорогая, позвони мне, пожалуйста, по поводу вечера. Хочу пригласить тебя в ресторан или в лес. Юрий.»
«Даша, я думаю, что сейчас ты прыгаешь по травке и хрустишь морковкой и, очень надеюсь, что через некоторое время ты будешь ползать по асфальту и пить водку. Ваня.»
«Я еду по Москве, сам не знаю куда. Когда разберусь, сообщу, как меня искать. А вообще, я здесь до вечера воскресенья. Женя.»
«Алексей, будь готов с кирпичом подъехать к программисту, который покажет и объяснит программу. Руками понапрасну не размахивай. Hе дай бог выпадет. Сергей.»
Абонент: — Могу я продиктовать сообщение?
Оператор (флегматично): — Я для этого и живу.
«Подумай о совести, а то подумаешь о вечном. Срочно позвони.»

