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

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

При описании технологии 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
Сначала я использовал штатную антенну от донгла:

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

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

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

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

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

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

Вместо радиальных проводников можно использовать металлическую банку емкостью 330-350 миллилитров (диаметром 65 мм).
Максимальное расстояние, на котором я смог принять сигнал ADS-B с этой антенной, составило 188 морских миль (nm):

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

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

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

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

Программа fr24feed при работе отображается в трее таким значком:
Мой радар получил код 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 использования своего сервиса:

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

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

Программа fr24feed для приема ADS-B-сообщений через RTL-SDR-приемник и их декодирования использует программу 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:

AIR - при входе воздушного судна в зону действия радара
MSG - данные, передаваемые воздушным судном
STA SL/RM - при уходе воздушного судна из зоны видимости радара
Указав ключ
-f имя_файла
можно сохранять сообщения в текстовый файл.
Визуализация и протоколирование ADS-B данных
Для визуализации данных сначала я использовал программу Virtual Radar Server, в настройках приемника fr24feed которой следует указать:
формат сообщений: Basestation
адрес: 127.0.0.1
порт: 30003

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

Но для использования карт необходимо получить и указать в программе ключ API.
Но затем я разработал свой виртуальный радар - программу на языке Ruby adsb_radar.rb. Программа получает информацию в Basestation-формате с 30003 порта от программы fr24feed, которую предварительно нужно запустить, а затем запустить саму программу командой
ruby adsb_radar.rb
Для индикации я использовал два светодиода, подключенных через преобразователь USB-COM:
зеленый - к выводу RTS - индикация видимости радаром хотя бы одного воздушного судна
красный - к выводу DTR - индикация нахождения отслеживаемого радаром воздушного судна на высоте ниже 10 000 футов

Программа создает 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:
...
Предыдущие варианты моих программ:
программа bs_parse.rb на Ruby , которая получает информацию в Basestation-формате с 30003 порта и заносит в текстовый файл bs_YYYYMMDD.txt данные воздушных судов (крайняя собранная информация о воздушном судне перед потерей сигнала) - https://github.com/Dreamy16101976/bs_parse
Список интересных зафиксированных мной воздушных судов можно посмотреть здесь.
Следует отметить, что иногда транспондеры воздушных судов выдают неверные данные об их текущем местоположении.
В качестве примера я приведу случай с бортом Boeing 737-524 (рег. номер VP-BFW) авиакомпании UTair, выполнявшим 2 августа 2017 года рейс "Москва-Минск". Этот борт был направлен из-за погодных условий вместо Минска в Гомель:

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

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

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

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