Мониторинг сигналов ADS-B (радарспоттинг) или как отслеживать самолеты. Мой FR24-радар T-UMGG2

Наряду с приемом сигналов ACARS, интерес представляет и прием ADS-B (Automatic dependent surveillance-broadcast) сигналов - радарспоттинг (radarspotting).

Аббревиатура "ADS-B" расшифровывается так:
Automatic – не требует вмешательства пилота или внешнего запроса
Dependant – зависит от точных данных о положении и скорости от навигационной системы самолета (например, GPS)
Surveillance – предоставляет положение воздушного судна, высоту, скорость и другие данные наблюдения службам, которым требуется эта информация
Broadcast – информация передается для использования как воздушными судами, так и наземными службами

ADS-B Out - воздушное судно отправляет информацию наземным станциям и другим воздушным судам
ADS-B In - воздушное судно принимает информацию от наземных станций и других воздушных судов

Воздушные суда оснащаются такими транспондерами ADS-B:
ADS-B транспондер

Транспондер воздушного судна, получив запрос на частоте 1030 Мгц, излучает ответный фазово-импульсный модулированный (PPM - Pulse-position modulation) сигнал на частоте 1090 МГц (режим Mode S : S - "select"). Сигнал содержит информацию о координатах и других текущих параметрах воздушного судна, но не содержит временной метки, мер для проверки целостности сообщения и его шифрования.

Вот так выглядят такие сигналы:
сигналы ADS-B

При описании технологии ADS-B используются термины:
"squawk" - ответ транспондера воздушного судна на запрос с земли
"squit" - периодически передаваемая транспондером информация о воздушном судне

Независимо от поступления запроса, воздушное судно периодически (каждые пол-секунды или каждые 5 секунд - TX Rate 2/с или 0,2/с) транслирует свои координаты (сквиттер - squitter).
Существует три варианта сквиттера:
в режиме Mode C отправляется 3 параметра (не передаются координаты воздушного судна);
в базовом режиме Mode S отправляется 7 параметров;
в расширенном режиме Mode S (extended squitter - 1090ES) может отправляться до 49 параметров (формат DF17).

Формат DF17 для 1090ES:

DF- Downlink Format
5 бит
17 (10001b) - идентификатор формата
CA - Capability
3 бита
дополнительный идентификатор
ICAO
24 бита
код ICAO воздушного судна
DATA
56 бит
данные;
первые 5 бит - TC (Type Code):
1...4 - идентификация воздушного судна;
5...8 - surface position (?);
9...18 - позиция воздушного судна (с барометрической высотой);
19 - скорости воздушного судна;
20...22 - позиция воздушного судна с GNSS-высотой
23...31 - зарезервировано
PI
24 бита
биты четности

Приемник ADS-B In

Для приема я использовал RTL-SDR приемник с различными вариантами антенн

Антенны для приема сигналов ADS-B

Сначала я использовал штатную антенну от донгла:
антенна RTL-SDR приемника
Для улучшения качества приема антенна была расположена на металлическом кожухе от компьютерного блока питания, играющего роль заземляющей поверхности.
Также рекомендуется обрезать антенну до длины 67 мм.
Антенна была расположена внутри дома, у окна, поэтому полярная диаграмма дальности принимаемых сигналов получилась несимметричной (соответствует направлениям, видным из окна и не закрытым препятствиями):
fr24feed
Максимальное расстояние, на котором я смог принять сигнал ADS-B с этой антенной, составило 137 морских миль (nm). 1 морская миля равна 1852 м.

Затем я построил вертикальную четвертьволновую антенну "Ground Plane". Необходимым элементом вертикальной антенны "монополь" (антенны Маркони) длиной в четверть волны ($\lambda \over 4$) является находящаяся под ней проводящая поверхность - "земля" - радиусом не менее $\lambda \over 4$. В качестве такой поверхности можно использовать несколько (обычно четыре или четное количество) проводников длиной $\lambda \over 4$ - радиалов:
конструкция антенны Ground Plane

Такая антенна и получила название "Ground Plane (GP)".
Недостатком этой антенны является ее низкое волновое сопротивление - 36,6 Ом. Для увеличения этого сопротивления необходимо отогнуть проводники "виртуальной земли" вниз - чем больше угол, тем больше сопротивление. Я так и поступил:
Ground Plane антенна

Сопротивление такой антенны также зависит от высоты подъема антенны над землей:
сопротивление антенны

Я закрепил антенну над крышей дома:
Ground Plane антенна

Диаграмма (по статистике сервиса FR24) оказалась намного равномернее, чем в первом случае:
диаграмма FR24

Вместо радиальных проводников можно использовать металлическую банку емкостью 330-350 миллилитров (диаметром 65 мм).

Максимальное расстояние, на котором я смог принять сигнал ADS-B с этой антенной, составило 188 морских миль (nm):
прием сигналов ADS-B

Альтернативой такой антенне служит антенна "${5 \lambda} \over 8$":
антенна пять восьмых

Также можно построить двухэлементную коллинеарную антенну:
двухэлементная коллинеарная антенна

Эта антенна предложена в 1911 году инженером фирмы "Маркони" Франклином.
В ней два вертикальных элемента - длиной в $\lambda \over 4$ и $\lambda \over 2$ - и резонатор (на низких частотах заменяется бескаркасной катушкой).
Полоса пропускания антенны составляет несколько процентов.

Красными штриховыми линиями показана сила тока в антенне.

Диаграмма направленности такой антенны в вертикальной плоскости имеет вид:
...

FlightRadar24
Трансляция на сервис FlightRadar24

Также можно организовать трансляцию информации о принимаемых ADS-B сигналах на сервис FlightRadar24 (FR24).

Для этого я использовал предлагаемую этим сервисом программу fr24feed:
fr24feed

Программа fr24feed при работе отображается в трее таким значком:fr24feed

Мой радар получил код T-UMGG2:
T-UMGG2

Префикс "T" обозначает пользователей, владеющих собственными приемниками, и выгружающих данные на FR24;
префикс "F" - "официальные" приемники сервиса FR24.

Вблизи аэропорта Гомель располагается 5 радаров сервиса FR24:

F-UMGG1 Anonymous
F-UMGG2 gleb_gomel
T-UMGG2 UMGG
F-UMGG3 Avtunich
F-UMGG4

Buda-Koshelevo

F-UMGG5 ZOND_GOMEL

За трансляцию данных сервис FR24 дарит пользователям уровень Business использования своего сервиса:
FlightRadar

При перерыве в вещании уровень меняется на Gold:
flightradar24

Вот пример работы моего радара, отслеживающего борт EW-308PA:
отслеживание самолетов

Программа fr24feed для приема ADS-B-сообщений через RTL-SDR-приемник и их декодирования использует программу mr-dump1090:

mr-dump1090

При работе программы fr24feed я наблюдал такие сообщения в командном окне:

пинг

[feed][n]ping N
[feed][n]syncing stream result: 1

Число N показывает порядковый номер пинга (от 1).

отправка данных

[feed][i]sent 1,0 AC
[feed][i]sent 2,0 AC
[feed][i]sent 3,0 AC
...

синхронизация времени через NTP-сервер

[time][i]Synchronizing time via NTP
[time][i]Time synchronized correctly, offset +0.0882 seconds

Трафик, отправляемый программой за час работы, не превышает 1-2 МБайт.

Программа fr24feed при запуске открывает порт:

[bs][i]Starting server on 0.0.0.0:30003

К этому порту можно подключиться с помощью стандартной утилиты telnet:

telnet 127.0.0.1 300003

В этот порт выдаются сообщения в формате BS - Basestation:
fr24feed

AIR - при входе воздушного судна в зону действия радара
MSG - данные, передаваемые воздушным судном
STA SL/RM - при уходе воздушного судна из зоны видимости радара

Указав ключ

-f имя_файла

можно сохранять сообщения в текстовый файл.

Визуализация и протоколирование ADS-B данных

Для визуализации данных сначала я использовал программу Virtual Radar Server, в настройках приемника fr24feed которой следует указать:

формат сообщений: Basestation
адрес: 127.0.0.1
порт: 30003

настройки fr24feed
Этот же приемник fr24feed следует указать как основной.

Эта программа позволяет отображать положение текущего отслеживаемого борта на Google Картах при обращении в браузере по адресу http://127.0.0.1/VirtualRadar/desktop.html#:
T-UMMG2

Но для использования карт  необходимо получить и указать в программе ключ API.

Но затем я разработал свой виртуальный радар - программу на языке Ruby adsb_radar.rb. Программа получает информацию в Basestation-формате с 30003 порта от программы fr24feed, которую предварительно нужно запустить, а затем запустить саму программу командой

ruby adsb_radar.rb

Для индикации я использовал два светодиода, подключенных через преобразователь USB-COM:

зеленый - к выводу RTS - индикация видимости радаром хотя бы одного воздушного судна
красный - к выводу DTR - индикация нахождения отслеживаемого радаром воздушного судна на высоте ниже 10 000 футов

ADS-B

Программа создает Web-сервер с открытым портом 80, при обращении к которого отображается текущая ситуация в зоне действия радара:
виртуальный радар

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

Справа отображается таблица с информацией о воздушных судах, находящихся в данный момент в зоне видимости радара:
# - порядковый номер
Hex - ICAO-адрес (16-ричный код ICAO (24 бита) (ICAO 24-bit address, Mode-S "hex code") уникален для каждого воздушного судна) - для определения регистрационного номера и типа воздушного судна по его адресу ICAO я использовал базу данных из проекта https://github.com/RobAltenburg/icao_db, удалив лишние поля и преобразовав ее в CSV-формат (файл icao.csv). У воздушных судов РФ он имеет вид 100000...1FFFFF, РБ - 510000...5103FF, Украины - 508000...50FFFF, Польши -  488000...48FFFF, Германии - 3C0000...3FFFFF.
Tail - регистрационный номер

Подробнее о регистрационных номерах воздушных судов можно прочитать здесь.

Type - тип
Cs - позывной (Call Sign)
Airline - авиалиния
Country - страна
Sq - squawk-код (выдается диспетчером данному рейсу для полета)
(специальные коды: 7700 - авария, 7600 - потеря связи, 7500 - захват самолета, 7777 - для военных самолетов)
Alt - высота (в футах, ft)
Trk - курсовой угол (в градусах)
Gs - скорость (в узлах, kts)
Lat - широта (в градусах)
Lng - долгота (в градусах)

Для трансляции данных своего виртуального радара в Интернет я использую программу ngrok. Для просмотра текущей воздушной обстановки в зоне действия моего радара T-UMGG2 (в то время, когда я запускаю вещание в Интернет) можно обратиться в браузере по адресу http://radar.ngrok.foxylab.com:1976. Информация в окне браузера обновляется автоматически каждые 30 секунд.

В текстовый файл bs_YYYYMMDD.txt программа заносит данные воздушных судов (крайняя собранная информация о воздушном судне перед потерей сигнала) - одна строка для сеанса связи в воздушным судном, например:

AC4D43 N892FD  B77L FDX5342 FedEx Express USA  1455  525.0  33000  84.3 52.95273 31.10237 2017/07/07 08:40:29.105 2017/07/07 08:44:17.162

AC4D43 - ICAO-адрес
N892FD - регистрационный номер
B77L - тип
FDX5342 - позывной
FedEx Express - авиалиния
USA - страна
1455 - squawk-код
525.0 - скорость
33000 - высота
84.3 - курсовой угол
52.95273 - широта
31.10237 - долгота
2017/07/07    08:40:29.105 - время начала сеанса связи
2017/07/07    08:44:17.162 - время окончания сеанса связи

Для прерывания работы программы необходимо нажать в командном окне программы сочетание клавиш CTRL-C.

Программу можно загрузить из репозитария на GitHub:
...

Предыдущие варианты моих программ:

программа vr_parse.rb на Ruby, которая периодически (каждые 30 секунд) опрашивает сервер, создаваемый программой Virtual Radar Server, по адресу http://127.0.0.1/VirtualRadar/AircraftList.json и сохраняет данные бортов в текстовый файл crafts_YYYYMMDD.txt (YYYY - год, MM - месяц, DD - день) - https://github.com/Dreamy16101976/vr_parse

программа bs_parse.rb на Ruby , которая получает информацию в Basestation-формате с 30003 порта и заносит в текстовый файл bs_YYYYMMDD.txt данные воздушных судов (крайняя собранная информация о воздушном судне перед потерей сигнала) - https://github.com/Dreamy16101976/bs_parse

Список интересных зафиксированных мной воздушных судов можно посмотреть здесь.

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

В качестве примера я приведу случай с бортом Boeing 737-524 (рег. номер VP-BFW) авиакомпании UTair, выполнявшим 2 августа 2017 года рейс "Москва-Минск". Этот борт был направлен из-за погодных условий вместо Минска в Гомель:
VP-BFW

В результате, по данным системы ADS-B самолет приземлился не в аэропорту Гомель, а в чистом поле smiley:
VP-BFW

Альтернативные декодеры ADS-B сигналов

Для декодирования принимаемых ADS-B сигналов также можно использовать программу rtl1090:
rtl1090

Эта программа выдает данные в TCP-порт 31001:
rtl1090

Продолжение следует

Яндекс.Метрика