Перехватываем цифровые радиопереговоры, или куда едут экипажи в 5 утра

Давным-давно, в далекой-далекой заднице мира…

Шел апрель 2020 года, ковидная пандемия набирала обороты. Мы с женой, пользуясь тем, что оба стали работать целиком и полностью удаленно, временно улетели из Санкт-Петербурга в свой родной город, чтобы быть рядом с родителями, которым была нужна помощь в эти непростые времена. Местные власти объявили «карантин», и от скуки сидения дома в один из дней мне пришла в голову мысль разобрать завалы хлама в старой квартире. В одной из коробок мне попался ноунеймовый USB DVB-тюнер на чипе RTL2832U с Алиэкспресса, который я когда-то давно заказал за 10$, и тут я призадумался. Вспомнилось, что много-много лет назад я игрался с ним, и в эфире можно было услышать много интересного. «А почему бы не поиграться еще раз?» — возникла в голове мысль, которая и положила начало этой истории.

eb2d2a661551b8d826580d8381cad80e.jpg

Железо

В качестве станции наблюдения был использован старенький ноутбук Lenovo G430, который нашелся в том же шкафу и старенький монитор ViewSonic оттуда же (на самом деле, я не перестаю удивляться, что же только можно найти в этом самом шкафу, но это уже отдельная история). Жесткий диск у машинки сдох окончательно и бесповоротно, поэтому в качестве системного носителя была использована обычная USB-флешка на 32 гигабайта, с которой его родная Windows 8.1 работала вполне себе сносно.

В качестве антенны была использована обычная телевизионная антенна, тут все банально. С одной стороны, не самая лучшая штука по тактико-техническим характеристикам и чувствительности, с другой стороны — покупается за 200 рублей в любом магазине электроники или находится бесплатно в том же шкафу, а частотный диапазон у таких антенн довольно широкий, от 80 до 800 МГц, что уже дает определенный просто для экспериментов.

Антенна и RTL-SDR-свисток с алиэкспрессаАнтенна и RTL-SDR-свисток с алиэкспресса

«Круглая часть» антенны (на фото), предназначенная, по логике, для дециметровых волн, как выяснилось после разборки антенны, была на деле чисто декоративной — к ней не было припаяно вообще никакого провода. Зато «усы» действительно работали, в том числе в дециметровом диапазоне, и регулирование их на размер, равный половине рассчитанной длины волны давало еще немного децибел в нужном диапазоне на анализаторе спектра.

RTL-SDR-свисток у меня был на старом тюнере Elonics E4000, что тоже внесло небольшой отпечаток на происходящее, но об этом позже.

Софт и начало работы

В качестве SDR-тулы был выбран SDR# (сейчас у них появилась версия для .Net Core, не знаю, совместима ли она со старыми плагинами, но ссылка на версию для .Net 4.x там тоже есть). Началось все с установки софта и базовой настройки и проверки. Установка драйверов для свистка делалась по стандартной инструкции с помощью прилагаемой утилитки Zadig и никаких проблем не вызвала.

image-loader.svg

Проверка работоспособности свистка (многие люди говорят, что эти свистки легко умирают из-за статических разрядов со стороны антенны) свелась к простому: что у нас вещает всегда, на известных частотах, и с хорошим уровнем сигнала? FM-радиостанции! Поэтому накрутив шкалу на нужный диапазон, я ткнул в самый сильный сигнал на спектрометре, и в течение полуминуты пришлось слушать, как какой-то мужик с хриплым голосом пел трагичную историю про некоего социально безответственного типа, которому «светила звезда Магадана». Убедившись, что все работает как надо, я отправился исследовать радиоэфир родного города.

В авиадиапазане не нашлось ничего интересного, то ли потому что я был далековато от аэропорта, то ли просто самолетов в этот момент мимо не пролетало (глянуть на Flightradar24 я как-то не догадался). Послушав немного охранников торгового центра неподалеку, я отправился рыскать по эфиру дальше. И вот, в одном частотном диапазоне, я услышал что-то похожее на звук модема, однако характер передачи (короткими отрезками по 3–10 секунд с длинными паузами) говорил о том, что это, скорее всего, голосовая связь, только с цифровым кодированием. А значит, нужно попробовать ее декодировать, чем мы и займемся.

image-loader.svg

Декодируем

Для декодирования цифровых форматов передачи существует программа DSDPlus. Существует она в разных инкарнациях: публичная версия 1.101, которая была выпущена в 2015 году и с тех пор не обновлялась, а ее более новые версии распространяются только среди владельцев платной подписки (10 долларов в год, 25 долларов навсегда), хотя одну из относительно свежих версий можно спокойной скачать из раздела загрузок с известного сайта радиолюбителей, правда, вопрос моральной и юридической стороны такого дела остается открытым.

DSDPlus может интегрироваться с SDR# двумя способами.

Первый способ классический: в Windows устанавливается так называемый Virtual Audio Cable, регистрирующий в системе дополнительное мультимедийное устройство для записи и воспроизведения звука и создающий «бридж» между ними. SDR# выводит звук радиоэфира на VAC, а DSDPlus с другой стороны VAC слушает звук и декодирует его.
Я тестировал два вида VAC-софта, первый c https://vb-audio.com/Cable/ и второй c https://vac.muzychenko.net/, оба работают вообще без проблем.

Второй способ: обходимся без велосипедов, SDR# будет лить поток сразу в DSDPlus на localhost через TCP.

Так вот… Публичная версия 1.101 вполне себе хорошо работает с TCP, в более новых версиях протокол поменялся, и автор DSDPlus не поделился его описанием с разработчиком SDR#-плагина, поэтому если вы используете более новую версию DSDPlus, то это получится делать только через виртуальный аудиокабель. А жаль.

Итак, если мы используем DSDPlus через аудиоустройство, то будет удобно использовать DSD Interface плагин для SDR# (инструкция есть тут). Если мы работаем через TCP, то плагин уже точно необходим, и называется он DSDTcp.
Устанавливаются плагины киданием их в папку SDR# и прописыванием DLL’ки в файл Plugins.xml. Сам DSDPlus должен лежать тоже где-нибудь неподалеку.

Плагин предоставляет интерфейс конфигурирования DSDPlus, который выглядит примерно так:

image-loader.svg

Первым делом задается путь до экзешника DSDPlus. Если вы работаете через виртуальный кабель, то задаются индексы (порядковые номера) аудиоустройств для входа и выхода. Вы их, скорее всего, не знаете, поэтому достаточно просто запустить DSDPlus вручную и посмотреть, что он пишет в консоль — там будет список системных аудиоустройств с их номерами, это поможет задать правильные настройки:

image-loader.svg

Там же есть настройки записи файлов (и с этим связан один странный баг, но об этом позже). На второй вкладке можно оставить все по умолчанию, ведь мы пока еще не знаем, какого именно типа радиосигнал мы будем слушать:

image-loader.svg

Не забываем обязательно нажать на «Create command line», иначе ничего не сохранится. Если DSDPlus при старте ругается на нераспознанные аргументы командной строки, то просто удаляем их. Мне помогло, ничего не сломалось :)

После этого запускаем DSDPlus кнопкой из плагина, и если все сделано правильно, то как только начнется передача и SDR# начнет принимать радиосигнал, в окошке DSDPlus побегут логи, а из колонок мы услышим декодированный звук:

image-loader.svg

Казалось бы, хэппи энд? Нет, не совсем. Очень скоро я заметил, что переговоры «прыгали» по частотам. Несколько секунд на одной частоте, спустя пол минуты следущий сеанс связи — на другой, и так далее, и таких частот набирался чуть ли не десяток. Знающие люди, наверное, прочитав это, поняли, в чем дело, но я в тот момент понял, что мне нужен сканер частот.

Сканируем

И такой плагин для SDR# был. Точнее, есть два плагина. Первый — менеджер частот со сканером: вы забиваете интересующие вас частоты в список, и он поочередно перебирает их, проверяя, ведется ли передача на какой-либо. Второй — именно сканер с поиском частот, он наблюдает за широким спектром, и как только на какой-то из частот появляется сигнал выше определенного уровня на определенное время, он переключается на эту частоту, и заодно ведет статистику времени передачи по разным частотам. Именно им я и воспользовался. Ширина полосы моего RTL-SDR позволила мне встать как раз «в середину» нужного диапазона, чтобы была возможность охватить все интересующие частоты без перестройки тюнера.

Выглядит интерфейс сканера примерно так:

image-loader.svg

Кнопками вверх-вниз можно установить уровень срабатывания сканера — если сигнал на какой-то частоте выше этого уровня, сканер встанет на эту частоту. Всё что ниже заданного уровня считается шумом. Двойным кликом мыши по полоске частоты можно также занести ее в список игнорируемых.

Сканер имеет дополнительное окошко настроек, можно задать, например, автопропуск каналов где активность длится слишком долго или даже внесение таких каналов в список исключений, автоматическое удаление из списка каналов, на которых было слишком мало переговоров, и т.д.

image-loader.svg

Запись

Я не нахожусь за компьютером круглосуточно, но было весьма интересно знать, о чем говорили в эфире в мое отсутствие. Соответственно, встал вопрос записи. Первая идея была проста: устанавливаем еще один виртуальный аудиокабель и перенаправляем вывод звука DSDPlus на какую-нибудь программу-рекордер. Правда, как оказалось, очень нелекго стабильно найти программу-рекордер, которая бы соответствовала простому набору требований: умела записывать сразу в mp3 или ogg и умела автоматически разделять запись на файлы при паузах в звуке длиннее заданного количества секунд. Хорошо подошел MP3 Recorder Studio, если бы не одно НО — он shareware, бесплатная версия ограничена записью в 30 секунд, и когда переговоры длились более 30 секунд без пауз, программа выплевывала окошко с предложением купить платную версию и запись останавливалась, было необходимо ее перезапускать вручную, что, само собой, было неприемлемо. От покупки полной версии меня остановил тот факт, что на сайте разработчика можно было купить не одну программу, а только целый пакет из кучи утилит за 60$, и тут меня, прямо скажем, задушила жаба.

А потом в голову пришло очевидное: у DSDPlus есть встроенная функция записи. Но и тут все не так уж и гладко. Публичная версия DSDPlus 1.101 имеет весьма странный баг при записи в MP3: запись как будто ведется с ускорением в 2 раза. И это не неправильная частота дисретизации, а именно ускорение: частота дискретизации для самого файла — 8000 герц, и и когда в аудиоредакторе ты изменяешь скорость файла на нормальную, фактически происходит срез частот еще в два раза — речь хоть и все еще разборчива, но слушать такое очень неприятно. В непубличной версии DSDPlus этот баг исправлен.

А для пользователей публичной версии есть простой выход: записывать эфир в несжатые WAV-файлы и настроить периодический запуск .bat- или powershell-скрипта, который будет натравливать на них LAME или OGG энкодер и удалять оригиналы.

DSDPlus так же умеет разбивать запись на файлы чтобы не превышать определенную длительность, и писать в отдельный файл таймкоды о том, в какое именно время и откуда именно была произведена запись. Правда, форматом файла почему-то был выбран .srt — в таком формате, например, часто хранятся субтитры к фильмам и сериалам. Для меня это было не очень удобно, поэтому я за один вечер набросал небольшую утилику, которая конвертит эти .srt-файлы от DSDPlus в обычные CUE Sheets, группируя записи по длине пауз между ними, и в результате записанный длинный wav/mp3 файл можно легко разбить на отдельные файлы какой-нибудь программой для split’а аудио, например, mp3splt.

Утилитку можно стащить с моего Github: https://github.com/uprt/srt2cue
Писалось, как я уже сказал, за один вечер и чисто для себя, поэтому код местами кривоват, но работает. Ставьте плюсики, присылайте пулл-реквесты, ага.

А как было правильно?

На самом деле, то, на что я наткнулся — это не просто цифровая, а еще и транкинговая связь. Если говорить очень упрощенно, то в эфире кроме ряда голосовых каналов есть специальный служебный канал, и когда кто-то выходит на связь, там передается информация о том, на какой частоте производится передача. Я, по сути дела, на это забил, просто прикрутив к SDR# сканер частот, но если вы хотите узнать, как же это сделать правильно, то читайте дальше.

Для работы с транкинговой цифровой связью существует специальный софт: UniTrunker. Он как раз умеет слушать и декодировать служебный канал и понимать, на какую частоту нужно перенастроиться в конкретный момент времени. Подробный мануал можно найти вот тут.

Работать он может по-разному:

  1. У вас 2 RTL-SDR приемника, один слушает служебный канал, другой настраивается на нужную частоту для приема.

  2. И служебный, и голосовые каналы влезают в принимаемую полосу вашего приемника — тогда можно обойтись только одним RTL-SDR-свистком.

    Выход точно так же можно направить на DSDPlus, хотя я встречал упоминаниял, что новые версии юнитранкера умеют декодировать голос сами (но могу ошибаться).

Почему я этим не воспользовался? У меня был тюнер на старом чипе Elonics E4000, а UniTrunker умеет работать только с более новыми приемниками на базе R820T.

Впрочем, решение все равно было. Например, мне попалась на глаза схема, когда
— или запускается сразу два SDR# с двумя тюнерами, один из которых слушает служебный канал, а второй настраивается на голос;
— или когда запускается один SDR#, но со специальным плагином, позволяющему ему настраиваться сразу на две частоты в пределах полосы тюнера, выводя оба сигнала на разные аудиоустройства и передавая звук с одной частоты через виртуальный аудикабель в UniTrunker, а звук с другой в DSDPlus.
В этих схемах UniTrunker должен каким-то образом сообщать SDR#, на какую именно частоту надо перенастроиться, и для этого есть специальный плагин для него. Сайт плагина давно уже умер, но хвала web.archive.org (ссылка раз, ссылка два). А сам плагин остался на github’е: https://github.com/walczakp/serial-controller. Для коммуникации между UniTrunker и SDR# разработчик почему-то выбрал виртуальный COM-порт. Я, конечно, не очень понимаю, зачем (что мешало обойтись тем же tcp-сокетом?), но, видимо, так захотелось :)

Что можно услышать

Вопрос, который, наверное, интересует всех: что же там можно услышать? Да много чего разного. Для меня основной интерес составили переговоры местных дорожных полицейских. Обычно там все было вполне стандартно: один стоит на горе и высматривает нарушителей, передавай номера и приметы экипажу, стоящему чуть ниже; сообщения о разных ДТП; классическое «тут реверсивное движение забыли на мосту переключить, уже два часа как светофор неправильно горит», и подобное. Правда, пару раз удалось наткнуться на погони в прямом эфире, когда очередной лихач на дорогой машине не остановился по требованию ДПС и в итоге за ним гонялись через весь город. Конец был не героический: у одной машины полицейских кончился бензин, а от другой машины нарушитель ушел по сельхозполям в пригороде. Учитывая, что он был на лендкрузере, а преследователи на чем-то легковом, то, в принципе, не удивительно.
Потом выяснилось, что очень-очень рядом на соседней частоте сидят еще другие представители органов порядка. Переговоры у них слышно нечасто, но, в принципе, бывает тоже интересно послушать. То школьники ночью разбили стекло в алкомагазине, то наркоман выламывает кому-то квартирную дверь топором, то жильцы дома устроили массовую драку из-за занятого кем-то «чьего-то» парковочного места во дворе. В общем, нормальная жизнь российского провинциального города.

Legal disclaimer

И самый главный вопрос: законно ли это? Долгое время существовал проект DPS-FM, который занимался ничем иным, как трансляцией в интернет переговоров ДПС в Петербурге. Они изучали российское законодательство и сделали простой вывод: явного запрета на прослушивание радиопереговоров, передаваемых в открытом (не шифрованном виде) в законах нет, следовательно, это разрешено. Более того, парни даже сделали запрос в Роскомнадзор о легальности такой деятельности и получили такой ответ:

image-loader.svg

Другое дело, что на некоторых радиолюбительских форумах я встречал упоминания, что незаконно публиковать конкретные частоты, на которых вы услышали что-либо интересное. Обоснование было простое: в ряде документов силовых структур эти частоты перечислены в документах «для служебного пользования», и если вы «разгласите» эту информацию, то могут возникнуть проблемы. С одной стороны, притянуто за уши, а с другой стороны, не забывайте, что это все-таки Россия и ожидать от государства можно всего чего угодно, лучше не ходить по тонкому льду.

Ну и последний вопрос о моральной составляющей вопроса. Я считаю, что это хорошо и правильно. Переговоры изначально передаются в открытом и незашифрованном виде — если бы надо было скрыть от наблюдателей, зашифровали бы. Граждане имеют конституционное право на свободу получения и распространения информации. В конце концов, это общественный контроль над структурами, которые работают на налоги граждан и должны работать на благо граждан.

Удачных исследований радиоэфира!

© Habrahabr.ru