В помощь радиолюбителю: принимаем сигналы AIS морских судов
Морские суда непрерывно передают о себе информацию при помощи автоматической системы идентификации (AIS, Automatic Identification System). Она помогает уменьшить риск столкновения судов друг с другом, а также дать возможность капитанам иметь актуальную информацию об окружающей обстановке, особенно в сложных метеоусловиях. Сегодня мы попробуем принять сигналы AIS от морских судов в Средиземном море и посмотрим, насколько они информативны.
Немного о самой системе
Наверняка вы хотя бы раз пользовались сервисом FlightRadar24 для отслеживания самолётов в реальном времени. Большинство гражданских (и не только) бортов имеет ADS-B-передатчики, которые автоматически передают в эфир множество данных о полёте. Эта информация помогает авиадиспетчерам и другим лётчикам получать более точные данные о воздушной обстановке и параметрах полёта каждого конкретного воздушного судна. Сигнал передаётся на частоте 1 090 MHz и легко перехватывается при помощи любого дешёвого USB-донгла RTL-SDR на чипах E4000 или Rafael Micro R820T.
Сервис FlightRadar24 с самого начала строился как сеть вот таких приёмников, первое время компания бесплатно отсылала комплекты оборудования, которое должно было передавать перехваченные пакеты данных на серверы компании. Взамен пользователь, у которого стоит такое оборудование, получал бесплатный премиум-доступ к сервису.
Для отслеживания морских судов также существуют специальные сервисы, такие как MarineTraffic или VesselFinder. Эти сервисы, как и FlightRadar24, основываются на данных, которые ему в реальном времени поставляются с любительских и профессиональных AIS-приёмников. Каждый корабль с включённым передатчиком AIS попадает на эту карту, и вы практически в реальном времени можете за ним наблюдать. Для радиолюбителей тоже нет никаких проблем с тем, чтобы перехватить сигналы AIS на двух основных частотах: 161.975 MHz и 162.025 MHz (ширина 25 KHz). Возьмём простейший SDR-свисток и попробуем это сделать.
Софт
Для начала посмотрим, при помощи какого софта можно декодировать принятый сигнал. Под Windows проще всего взять такую программу, как ShipPlotter от COAA. Она платная, но стоит не слишком дорого (25 евро за персональную лицензию). Плюс есть три недели триала «на попробовать». Открываем приложение и видим, что на вход ему надо подать что-то из следующего:
сигнал со звуковой карты
записанный звуковой сигнал в формате WAV
поток данных по стандарту NMEA
лог-файл с данными NMEA
Самым простым способом будет подать сигнал со звуковой карты. Но чтобы не придумывать велосипед, можно воспользоваться ещё одним очень полезным приложением, созданным российским разработчиком из Новосибирска Евгением Музыченко, — Virtual Audio Cable. Оно даёт возможность создать виртуальные аудиоинтерфейсы для воспроизведения и записи, что позволяет напрямую соединить несколько приложений, каждое из которых рассчитано на использование одного из аудиоинтерфейсов операционной системы.
Приложение тоже платное, но стоит разумных денег — 30 долларов за домашнюю лицензию. Благо никаких подписок — один раз купили и пользуетесь без ограничений. Сразу после установки в системе появляется пара новых аудиоустройств с именем Line 1 (Virtual Audio Cable). Одно служит для ввода аудиосигнала, а второе — для вывода:
Теперь можно принимаемый сигнал забирать с этого виртуального аудиоустройства, а при необходимости ещё и прослушивать его. Пришла пора заняться приёмной частью.
Принимать сигнал мы будем при помощи программы SDRSharp. Она полностью бесплатная и прекрасно подходит для декодирования сигнала с RTL-SDR-свистка. Устанавливаем её на компьютер, но этого будет недостаточно для начала работы. Всё дело в том, что изначально USB-свисток предназначен для приёма FM-радио и цифрового телевидения, так что операционная система сразу ставит ему свой драйвер. Этот драйвер нужно заменить при помощи специальной утилиты Zadig.
Здесь мы столкнемся с системой защиты операционной системы, которая не позволяет устанавливать драйверы без актуальной цифровой подписи, одобренной у Microsoft. Так что надо временно отключить эту защиту.
Пуск → Параметры → Центр обновления Windows → Дополнительные параметры → Восстановление. В пункте Расширенные параметры запуска нажимаем Перезагрузить сейчас. После перезагрузки выбираем Поиск и устранение неисправностей → Дополнительные параметры → Параметры загрузки → Перезагрузить. И после того как компьютер перезапустится, надо выбрать Отключить обязательную проверку подписи драйверов (пункт 7).
Вот теперь можно устанавливать кастомный драйвер. Открываем Zadig, выбираем меню Options и ставим галочку на пункт List All Devices. В списке интерфейсов выбираем интерфейс с именем Bulk-In, Interface (Interface 0) и нажимаем на кнопку Install Driver. Система предупредит, что не может проверить подпись издателя данного драйвера, но позволит установить его на собственный страх и риск.
После того как драйвер установлен, можно закрыть Zadig и открыть SDRSharp. В разделе Main Menu выбираем Source → RTL-SDR USB. Теперь нужно настроить, куда будет направляться вывод аудиосигнала Main Menu → Audio → Output. Из выпадающего списка щёлкните пункт [MME] Line 1 (Virtual Audio Cable). Чтобы в процессе работы слышать сам сигнал, можно в настройках звука настроить вывод на другое аудиоустройство. Пуск → Панель управления → Звук → Запись → Line 1 → Свойства → Прослушать → Прослушивать данное устройство.
Приём сигнала
Выставляем частоту 161.975 MHz и ширину полосы 25 000 Hz. Учитывайте, что RTL-SDR вовсе не прецизионная железка и реальная частота может немного отличаться. Более того, в процессе работы чип нагревается и вместе с его нагревом частота также «уплывает». Даём чипу поработать минут 15 на любой частоте с каким-нибудь известным сигналом (например, жужжалка на 4.625 MHz) и потом корректируем параметр Main Menu → Source → Configure → Offset Tuning.
Принимаемый сигнал будет выглядеть на «водопаде» как короткие всплески различной интенсивности. Чтобы лучше воспринимать их границы, нажимаем кнопку Zoom и подстраиваем параметры Contrast, Range и Offset:
Запускаем прослушивание и открываем ShipPlotter. В меню Options → Audio → Soundcard выбираем Line 1 (Virtual Audio Cable). Затем нажимаем кнопку Start с зелёным кружком. Сперва стоит посмотреть, декодируются ли сообщения. Открываем меню View и щёлкаем Messenges. Если всё сделано правильно, то вы увидите сообщения от кораблей:
Прямо сходу нам повезло найти JENIFFER в Каэр Морхене. Если поискать этот корабль в сети, то сразу же можно увидеть, что это грузовое судно постройки 1984 года, которое ходит под флагом африканской республики Гвинея-Бисау. В качестве пункта назначения указан город Пирей в Греции, и там судно будет ориентировочно через 3 дня:
Находясь на уровне моря, можно увидеть лишь корабли в относительной близости (радиус около 40 км). Земля круглая, и более далёкие сигналы уже нельзя принять на той же высоте. Чем выше вы находитесь, тем на большем расстоянии можно принять сигнал. Наиболее же эффективный приём осуществляется при помощи спутников, находящихся на высоте от 200 до 300 км. Каждый такой спутник способен принимать сигналы в радиусе 200 км, однако есть определённые сложности в местах большого скопления судов. Там наиболее эффективным вариантом остаются наземные приёмные станции.
Open source
Коммерческие решения хороши, но не все готовы за них платить. Так что можно воспользоваться альтернативными вариантами. Они могут быть чуть более сложными в настройке, но будут также исправно выполнять свою работу. Клиентская часть SDR Sharp не работает под Linux, поскольку создавалась для Windows. Тем не менее существуют вполне достойные альтернативы в виде GQRX, Linrad или кросс-платформенного SDR++.
Аналогом Virtual Audio Cable в Linux можно считать JACK Audio Connection Kit. Этот демон позволяет делать то же самое, а именно управлять виртуальными аудиокабелями, для того чтобы передавать аудиоданные, а также MIDI-данные. Он работает с ALSA или, например, библиотекой PortAudio. Но для простого декодирования AIS мы поступим проще и создадим виртуальное аудиоустройство PulseAudio, куда будем выводить звук.
Также нам потребуется приложение pavucontrol, при помощи которого можно удобно настраивать все входы и выходы аудиосигнала. Само декодирование будет осуществляться с помощью консольной утилиты gnuais, и опционально можно установить графический интерфейс gnuaisgui для визуализации, чтобы накладывать метки кораблей на карту:
Освежаем кэш пакетов и обновляем их до актуальных версий:
$ sudo apt update && sudo apt -y upgrade
Ставим приложения и библиотеки:
RTL-SDR для взаимодействия с USB-свистком.
GQRX в качестве SDR-приложения.
PulseAudio Volume Control в качестве микшера.
GNU AIS для декодирования сигналов AIS.
GNU AIS GUI для отображения морских судов на карте.
$ sudo apt install gqrx-sdr rtl-sdr pavucontrol gnuais gnuaisgui
Подключаем наш USB-свисток и проверяем, что он корректно определяется.
$ sudo rtl_test
Если всё ок, то выполняем следующие три команды, которые творят «магию». За них особая благодарность автору вот этого мануала по PulseAudio. Первая добавляет наш виртуальный вход (плюс система автоматически добавляет новый виртуальный источник):
$ pactl load-module module-null-sink sink_name=Line1
Вторая применяет метку описания к виртуальному входу:
$ pacmd update-sink-proplist Line1 device.description=VirtualInput
Третья применяет метку описания к виртуальному источнику:
$ pacmd update-source-proplist Line1.monitor device.description=VirtualInput.monitor
Открыв PulseAudio Volume Control, мы сразу видим, что появился новый виртуальный порт, куда можно выводить звук любого приложения:
Виртуальный порт готов и уже виден в системе
Запускаем серверную часть RTL-SDR. Это чуть усложнит схему, но одновременно позволит разнести приёмник и обработчик сигнала. Например, приёмом может заниматься одноплатник, вроде Raspberry Pi, а обработкой — другой компьютер. Главное, чтобы они находились в одной сети. Если же и серверная, и клиентская части находятся на одном компьютере, то достаточно запустить приложение rtl_tcp с параметрами по умолчанию. Открываем окно терминала и выполняем:
$ sudo rtl_tcp
Сворачиваем окно терминала и открываем GQRX. Вводим следующую строку в разделе Device string:
rtl_tcp=127.0.0.1:1234
Также нужно будет заполнить Input rate = 2 400 000, что соответствует максимальному значению для RTL-свистков. В разделе Audio output выбираем виртуальный порт VirtualInput. Нажимаем ОК, выбираем нужную частоту и запускаем воспроизведение:
Внимательно посмотрите на правую часть в разделе Receiver Options. Поле Mode должно быть заполнено как Narrow FM, а параметр Squelch сброшен до значения -150,0 dB.
Открываем ещё один терминал и в нём запускаем декодер GNU AIS:
$ gnuais
Система сразу начнёт выводить статистику по звуковому сигналу, и важно подстроить громкость таким образом, чтобы она не была ниже 60 или выше 80 процентов. Сразу же после этого видим первые декодированные пакеты:
Если хочется накладывать эти данные на карту, то достаточно открыть ещё одно окно терминала и ввести команду:
$ sudo gnuaisgui
Разумеется, что это уже отдельное приложение, в которое можно будет загрузить актуальную карту с морскими путями, тогда это будет отображаться красиво. Ну, а по умолчанию карты в нём нет, но метки судов присутствовать будут.
Вместо заключения
В этой статье мы попробовали показать лишь два наиболее простых способа приёма и декодирования сигналов AIS. Конечно, вы можете воспользоваться и другими способами — например, создать собственную схему декодирования через GNU Radio или использовать другой софт, не упомянутый здесь. В качестве ещё одного вектора для экспериментов можно взять два приёмника, смикшировать аудиопотоки в один и подать на вход декодера. Это позволит декодировать данные сразу с двух основных частот AIS и видеть более полную картину.
Разумеется, что таким образом вы сможете увидеть лишь гражданские суда, оборудованные соответствующим передатчиком. Прелесть самостоятельного приёма в том, что публичные сервисы удаляют данные о судах, если поступило требование от владельца (например, если не хотят, чтобы кто-то видел, где в конкретный момент плавает какая-нибудь суперяхта вроде «А»). Локальный же приём никто не отменял.
А вы уже пробовали декодировать сигналы AIS? Ждём вас в комментариях.