Содержание статьи
Каждый, конечно, летал на самолете или видел его хоть раз в своей жизни. Большие металлические птицы кружат над всей планетой и доставляют сотни миллионов людей в разные части света. Так было не всегда: еще каких‑то 100 лет назад люди могли перемещаться только по земле, а сверхнадежных летательных аппаратов не было.
Уже после изобретения самолетов и начала коммерческих рейсов стало понятно, что надо как‑то отслеживать все находящиеся в воздухе судна, иначе аварий не избежать. Радары или тем более визуальное наблюдение для этого годятся плохо, и в ход пошла радиосвязь. Теперь на борту каждого самолета стоит авиационный транспондер. Он сильно облегчает работу диспетчерам и пилотам и позволяет в полете передавать данные с бортовых датчиков и получать указания с земли.
Простым языком авиационный транспондер — это устройство двунаправленной радиосвязи, которое делает две вещи:
- Отвечает на запросы наземных станций: когда диспетчер запрашивает данные, а транспондер отвечает ему в автоматическом режиме. Запрос данных еще называется интеррогацией (это слово в переводе с английского означает «допрос свидетеля»).
- Служит радиомаяком воздушного судна: в этом режиме транспондер раз в некоторое время передает информацию о себе, например местоположение или скорость.
Существуют разные поколения, они же режимы транспондеров. Каждый из них создавался для разных целей и имеет свою структуру сигнала, хотя более поздние режимы поддерживают все то же, что и более ранние (при этом сигналы этих протоколов несовместимы). Всего есть пять основных режимов:
- Mode A передает только идентификационный номер летательного аппарата. Этот номер может быть жестко зашит в транспондер или назначен диспетчером перед вылетом. На практике использовался только для отслеживания того, в каком аэропорту находится самолет.
- Mode C, созданный позже, позволял отслеживать не только номер аппарата, но и высоту его полета. Главное его преимущество было в том, что он позволял получать высоту самолета автоматически, не спрашивая ее у пилота.
- Mode S — это современный режим, который сейчас используется на 99% всех самолетов. Позволяет не только получать данные с бортовых датчиков, но и отправить данные обратно на самолет. В этом режиме самолет имеет полную двустороннюю связь с наземными станциями. ADS-B, который мы будем рассматривать сегодня, является частью этого режима.
- Mode 4 и Mode 5 более продвинутые, но используются только военными. Оба они защищены куда лучше (то есть вообще хоть как‑то защищены, в отличие от прошлых), и поковыряться там не получится.
Внимательный читатель сразу заметит, что в моем списке нет Mode B, как и Mode D, — оба эти режима просуществовали очень недолго, так что рассматривать их нет смысла.
info
Ты можешь купить себе собственный транспондер — их можно легко найти на eBay по цене до пяти тысяч долларов.
ADS-B
Если внимательно почитать описание Mode S, можно заметить, что сообщения, которые передаются по этому протоколу, должны отправляться транспондером по запросу наземного диспетчера — все, кроме ADS-B (Automatic Dependent Surveillance — Broadcast). На русский язык это вольно переводится как «автоматическая система слежения за самолетами». Слово Broadcast тут означает, что сообщения передаются всем подряд, а не кому‑то конкретному, и это открывает перед нами возможность их принимать.
Многие выделяют ADS-B как отдельный режим работы транспондера, на уровне Mode A, C или S, но на самом деле это всего лишь часть одного большого режима S. Сообщение ADS-B — это просто сообщение Mode S, имеющее тип 17.
Типы сообщений Mode S
В этой статье рассматривается только ADS-B (тип 17), но для общего развития будет нелишним знать и про другие типы сообщений Mode S:
- All-call reply (тип 11) — в этом сообщении по запросу оператора передается уникальный 24-битный идентификатор транспондера. Этот номер обычно прошивается на заводе и не меняется, но в военных целях этот номер иногда подменяют.
- ACAS short and long replies (тип 0/16) — сообщения для предотвращения столкновений между самолетами. Если транспондер обнаружит поблизости другой самолет, он отправит оповещение другим системам, которые смогут предотвратить столкновение в воздухе.
- Altitude and identity replies (тип 4/5) — сообщение с данными о высоте и позывном (так называемый squawk-код, который пилот вводит вручную перед полетом).
- Comm-B (тип 20/21) — это сообщения с показаниями бортовых датчиков, намеченным маршрутом и другими данными, которые могут быть полезны для управления судном.
Особенно хитро работает ACAS, но разговор о нем выходит за рамки этой статьи. Если хочешь глубже изучить тему — отмечайся в комментариях, и, возможно, я напишу продолжение!
Все сообщения Mode S передаются на самолет на частоте 1030 МГц, а на землю — на частоте 1090 МГц.
Сама радиопередача никак не шифруется, а передается масса интересной информации о местонахождении самолета, его высоте, скорости и других параметрах, так что в какой‑то момент появились сервисы вроде Flightradar24, которые сделали информацию о самолетах доступной всем и даром. Сами сервисы эту информацию получают от большого количества датчиков, установленных у добровольцев по всему миру. Ты тоже можешь стать одним из них — достаточно просто изъявить желание и получить от владельцев сервиса датчик для установки.
Физическая структура сигнала
Сигналы ADS-B самолет передает на частоте 1090 МГц, как и все остальные сигналы Mode S. Вторая частота — 1030 МГц (uplink) — тут не нужна, потому что сигналы ADS-B передаются без запроса.
Для кодирования используется PPM (Pulse-Position Modulation). Грубо говоря, в эфир просто передаются биты, которые можно прочитать, сделав выборку каждые N микросекунд. Это хорошо видно на изображении из Википедии.
В ADS-B длительность каждого такого бита равна 0,5 мкс, а значит, можно сделать выборку каждые 0,5 мкс, увидеть высокий или низкий уровень каждого бита, записать, а потом преобразовать результат в байты, чтобы получить исходное сообщение. Но это в теории, потому что на практике есть проблемы, с которыми мы будем разбираться по ходу повествования.
Структура пакета
Если принять данные как есть, получится битовая каша, из которой еще нужно вытащить полезные данные. Сами они имеют очень четкую структуру, так что, если заметить ее постоянные части в потоке данных, можно будет получить и весь пакет.
Пакет состоит из преамбулы и собственно данных. На картинке выше хорошо видно, что преамбула идет 8 мкс, а дальше в течение 56 или 112 мкс идут данные.
Вступление особенно важно, если вспомнить, что все самолеты вещают на одной частоте и сигналы от них могут приходить одновременно. Проблема потери накладывающихся сигналов решается очень просто: если что‑то не ловится, это поймает кто‑то другой. Приемников очень много, и покрывают они всю обитаемую площадь Земли, так что, если конкретный сигнал оказался слишком слабым и не был принят на одном приемнике, он будет достаточно громким для другого приемника и не потеряется. Конечно, такой подход не означает, что будут получены все сигналы, но это и не нужно — они регулярно повторяются, и от потери части сигналов беды не будет.
Я уже говорил, что каждый бит кодируется 0,5 мкс, и это действительно так, но для упрощения приема была введена условность: 1 настоящий бит кодируется двумя по 0,5 мкс. Единица при этом кодируется как 1 и 0, а ноль — как 0 и 1 (то есть данные 1011 будут выглядеть как 10011010). Это не усложняет приемник, но защищает от помех и позволяет надежно ловить сигнал. Без этой доработки передача нескольких нулей будет выглядеть как тишина в эфире, а так приемник всегда точно видит сигнал, даже если передаются нули.
Структура полезных данных
Предположим, мы декодировали сигнал и нашли в нем сообщение. Теперь нужно декодировать блок полезных данных и отсеять ненужное (то есть все сообщения Mode S, кроме ADS-B).
Длина интересующего нас сообщения — 112 мкс, что как раз равно 112 бит (спасибо двухбитному кодированию!), и делится оно на пять основных блоков:
- DF (Downlink Format) — код формата передачи, 5 бит. Для ADS-B он всегда равен 17.
- CA (Transponder capability) — тип передатчика и его уровень возможностей, 3 бита. Нужно это поле для того, чтобы диспетчер знал, какие данные можно запрашивать у этого транспондера. Это поле может иметь значение 0, 4, 5 или 6, а 1–3 и 7 зарезервированы для будущего использования. 0 — это транспондер первого уровня, и обычно такие транспондеры не имеют ACAS (системы предотвращения столкновений). 4 — это транспондер второго или более совершенного уровня, тоже не имеющий ACAS, но умеющий передавать высоту (то есть работать с Mode C и Mode S). 5 и 6 — это тот же 4, но с поддержкой ACAS, который может быть включен (6) или выключен (5).
- ICAO — уникальный номер самолета, 24 бита. Номер нужен для определения отправителя сигнала. Этот номер однократно прошивается на заводе и никогда не меняется в процессе эксплуатации, но все же есть ребята, которые умеют их менять. Существуют еще военные транспондеры, но на них вообще никакие правила не действуют, так что там может быть что угодно.
- ME (Message) — собственно полезная нагрузка с данными о высоте, скорости или чем‑то другим, длина — 56 бит. Этот блок мы будем подробно разбирать ниже.
- PI (Parity/Interrogator ID) — контрольная сумма, 24 бита.
Поле ME
Поле ME — это самая интересная для нас часть, ведь именно тут передаются координаты, скорость полета, высота и другие данные с бортовых датчиков. 56 бит маловато для передачи всех данных разом, так что у каждого сообщения свой тип, который указывается в первых пяти битах этого поля. Получается эдакая матрешка: свой формат сообщения у Mode S, чтобы обозначить ADS-B, и свой формат сообщения внутри ADS-B, чтобы сказать, что за данные внутри.
Всего у ADS-B 31 тип данных, но мы разберем только самые главные.
Код 1–4 — сообщение с идентификационными данными. Там содержится позывной и другие данные, связанные с регистрацией и опознавательными свойствами самолета (например, легкий летательный аппарат или тяжелый). Эти позывные показываются на терминалах в аэропортах и представляют собой номер рейса. Декодированное сообщение выглядит примерно так:
ME : ADSB Msg Type : (4) Aircraft Identification and Category
CAT: Aircraft Cat : (0:0) No ADS-B Emitter Category Information
flight Number : SIA224
Wake Type : (TC:4 CAT:0) - No Information Provided
Код 5–8 — позиция на земле. Эти данные обычно используются, чтобы знать, где и на какой полосе находится самолет. В сообщении можно найти широту, долготу, скорость и направление движения самолета. Пример декодированного сообщения:
ME : ADSB Msg Type : (7) Surface Position
Super Sonic? : No
velocity : 0.00
EW/NS VEL : (East/west: 0) (North/South: 0)
heading : 253.12
Before Decoding : Half of vehicle location
UTC Sync? : false
CPR Frame : Odd
CPR latitude : 8675
CPR longitude : 17674
Код 9–19 — позиция в воздухе (обычно передается вместе с высотой). Важно понимать, что найти в примере ниже привычную широту и долготу нельзя, поскольку используется короткая нотация координат вместо нормальной. Что делать с такими координатами — расскажу ниже.
ME : ADSB Msg Type : (14) Airborne Position (with Barometric altitude)
Containment Radius: 1852.00 metres
Surveillance : (status:0) No condition information
NIC Supplement B : 0
Nav Integrity : 5
AC: altitude : 3100 feet (q bit: false, m bit: false)
Before Decoding : Half of vehicle location
UTC Sync? : true
CPR Frame : Odd
CPR latitude : 101906
CPR longitude : 103292
Код 19 — скорость воздушного судна.
ME : ADSB Msg Type : (19) Airborne velocity
SUB: Sub Type : 3
Intent Change : false
IFR Capable : true
Nav Accuracy Cat : 0
heading : 8.44
Super Sonic? : No
velocity : 136.00
EW/NS VEL : (East/west: 0) (North/South: 0)
Vertical Rate : -768
HAE Delta : Unavailable
Разбирать по битам структуру каждого сообщения можно очень долго, так что, если тебе действительно интересно, можно поискать готовые парсеры ADS-B на GitHub и подсмотреть структуру там. Нам же сейчас разбирать строение этих сообщений нет смысла еще и потому, что передавать мы пока что ничего не будем, а углубляться в тонкости протокола не хочется.
CPR, или как усложнить простое
Для точного определения координат обычно используются два числа — широта и долгота. 32 бита float обеспечивают точность до семи знаков после запятой, что в пересчете на координаты дает точность порядка нескольких сантиметров, а если чуть уменьшить точность (до десятков сантиметров), то два таких числа как раз можно запихнуть в 56 бит сообщения, и не придется городить неведомо что с компактными координатами. Точность даже в десятки сантиметров для самолета, летящего со скоростью больше 100 м/с, просто огромна, так что, чем руководствовались авторы протокола, понять сложно.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»