Способы приема ADS-B самолета

ADS-B прием сигнала самолета

ADS-B (Automatic Dependent Surveillance — Broadcast) — это технология, которая позволяет самолетам автоматически передавать данные о своем местоположении, высоте, скорости и другую информацию. Эти данные передаются в виде радиосигнала и могут приниматься специальными приемниками. В этой статье я расскажу о способах приема ADS-B самолета. Мы рассмотрим простой и сложный способ.

Еще по теме: Обзор лучших SDR для хакера

Способы приема ADS-B самолета

Для точ­ного опре­деле­ния коор­динат обыч­но исполь­зуют­ся два чис­ла — широта и дол­гота. 32 бита float обес­печива­ют точ­ность до семи зна­ков пос­ле запятой, что в перес­чете на коор­динаты дает точ­ность поряд­ка нес­коль­ких сан­тимет­ров, а если чуть умень­шить точ­ность (до десят­ков сан­тимет­ров), то два таких чис­ла как раз мож­но запих­нуть в 56 бит сооб­щения, и не при­дет­ся городить неведо­мо что с ком­пак­тны­ми коор­дината­ми. Точ­ность даже в десят­ки сан­тимет­ров для самоле­та, летяще­го со ско­ростью боль­ше 100 м/с, прос­то огромна, так что, чем руководс­тво­вались авто­ры про­токо­ла, понять слож­но.

Тем не менее для записи коор­динат исполь­зует­ся фор­мат CPR (Compact Position Reporting), который, как ясно из наз­вания, пред­назна­чен для ком­пак­тной переда­чи коор­динат. Часть дан­ных мы уже видели в при­мере сиг­нала с коор­дината­ми выше. Пос­коль­ку ужать боль­шое количес­тво дан­ных в малень­кий объ­ем невоз­можно, эти дан­ные прос­то раз­делили на час­ти и отправ­ляют в два захода, а пакеты ста­ли называть­ся прос­то «чет­ный» и «нечет­ный». Как из это­го получить нор­маль­ные коор­динаты? Сей­час покажу!

Пред­ста­вим, что все самоле­ты лета­ют в 2D-прос­транс­тве. Это одно прос­транс­тво раз­делим на две сет­ки с раз­ными парамет­рами и назовем их чет­ной сет­кой и нечет­ной. Чет­ную сде­лаем 4 на 4, а нечет­ную — 5 на 5.

До­пус­тим, мы хотим передать мес­тополо­жение самоле­та в сет­ке раз­мером 16 на 16 — пусть это будут коор­динаты (9,7). Если бы у нас была одна сет­ка, то мы бы переда­ли прос­то 9 и 7, а опе­рато­ры бы у себя на кар­те нас наш­ли, но в CPR на самом деле сеток две.

Две сет­ки коор­динат
Две сет­ки коор­динат

В таких сет­ках мы ука­жем наше положе­ние (9,7) в виде (1,3) на чет­ной сет­ке (сле­ва) и (4,2) в нечет­ной сет­ке (спра­ва). Ког­да опе­ратор получа­ет оба сооб­щения, ему нуж­но сов­местить их на обе­их сет­ках.

Две сет­ки с нанесен­ными дан­ными из пакетов

Ес­ли наложить сет­ки с получен­ным коор­дината­ми друг на дру­га, в точ­ке сов­падения и будет находить­ся иско­мый объ­ект.

Вы­чис­ление пол­ных коор­динат
Вы­чис­ление пол­ных коор­динат

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

Способы приема ADS-B. Ре­аль­ная сет­ка
Ре­аль­ная сет­ка

Простой способ принять ADS-B

Те­перь, ког­да мы зна­ем устрой­ство всех основных час­тей про­токо­ла, мож­но поп­робовать при­нять реаль­ный сиг­нал. Для при­ема любого подоб­ного сиг­нала пот­ребу­ются три базовые вещи: антенна, при­емник и ПК.

Антенна

Нач­нем с самого важ­ного пред­мета, без которо­го не обхо­дит­ся никакая ради­освязь, — антенны. Выбор антенны зависит от мно­жес­тва фак­торов, вклю­чая час­тоту, нап­равлен­ность сиг­нала, сре­ду его про­хож­дения. Наш сиг­нал переда­ется на час­тоте 1090 МГц, и при­нимать мы его будем на откры­том воз­духе. Самый прос­той вари­ант (но не самый эффектив­ный) — это обыч­ная шты­ревая антенна. Такую антенну мож­но сде­лать из кус­ка про­вода или про­воло­ки, глав­ное здесь — пра­виль­но рас­счи­тать ее дли­ну. Дли­на антенны зависит от дли­ны вол­ны, которую мы хотим на эту антенну при­нимать. Дли­на вол­ны — это рас­сто­яние меж­ду дву­мя сосед­ними «гор­бами» сиг­нала (на рисун­ке сни­зу).

Дли­на вол­ны — это λ
Дли­на вол­ны — это λ

Лям­бда — это и есть дли­на вол­ны, а получить ее из час­тоты мож­но по фор­муле λ = C/f, где С — ско­рость све­та, а f — час­тота сиг­нала. Для 1090 МГц она будет при­мер­но рав­на 27,5 см. Если взять метал­личес­кий штырь такой дли­ны, то у тебя получит­ся так называ­емая пол­новол­новая антенна, которую мож­но спо­кой­но уко­ротить вдвое или даже в четыре раза, что­бы получить полувол­новую или чет­верть­вол­новую антенну соот­ветс­твен­но. Раз­ница в чувс­тви­тель­нос­ти этих антенн, конеч­но, будет, так что советую исполь­зовать полувол­новую антенну, дли­на которой сос­тавит при­мер­но 13,75 см.

Ес­ли хотите покол­хозить по пол­ной, то в сети можно найти гайды, как сде­лать диполь­ную антенну для работы с ADS-B из проб­ки и про­воло­ки.

Де­лать свою антенну я не буду — это не самое прос­тое занятие, да и нуж­ная антенна у меня уже была. Тебе могут подой­ти, нап­ример, антенны для раций, если при­нимать на откры­том прос­транс­тве и вок­руг не слиш­ком мно­го шумов. Я исполь­зую обыч­ную шты­ревую coil-loaded-антенну, которая, по сути, работа­ет как шты­ревая, но за счет катуш­ки име­ет мень­шую дли­ну.

Моя антенна
Моя антенна

Ос­новные харак­терис­тики антенны мож­но изме­рить спе­циаль­ным век­торным ана­лиза­тором, который генери­рует раз­ные час­тоты и про­веря­ет реак­цию антенны на них.

Век­торный ана­лиза­тор NanoVNA
Век­торный ана­лиза­тор NanoVNA

Вы­вод ана­лиза­тора кажет­ся слож­ным на пер­вый взгляд, но на самом деле все доволь­но прос­то. Что­бы узнать, годит­ся ли антенна для какой‑то кон­крет­ной час­тоты, дос­таточ­но пос­мотреть на жел­тую линию SWR, которая по‑рус­ски называ­ется КСВ (коэф­фици­ент сто­ячей вол­ны). Этот коэф­фици­ент показы­вает, какую часть сиг­нала антенна переда­ла в эфир, а какая вер­нулась. Чем мень­ше сиг­нала вер­нулось, тем луч­ше антенна работа­ет на кон­крет­ной час­тоте.

На при­боре вид­но, что на мет­ке 1 (я выс­тавил ее на час­тоту 1090 МГц) SWR равен 1,73, что очень даже неп­лохо. Обыч­но хорошей антенной счи­тает­ся та, у которой КСВ око­ло 1 (не боль­ше 2).

Приемник

В качес­тве при­емни­ка мы будем исполь­зовать SDR-донгл. Он пред­став­ляет собой обык­новен­ное радио, которое управля­ется с помощью спе­циаль­ных прог­рамм, а не кру­тил­кой с делени­ями, как на дедов­ских при­емни­ках. Для при­ема ADS-B подой­дет любой SDR-адап­тер, начиная с самого дешево­го RTL-SDR и закан­чивая дороги­ми BladeRF и ему подоб­ными. Цена дешевых вари­антов начина­ется от 30 дол­ларов, так что при­общить­ся может каж­дый.

Я буду исполь­зовать BladeRF micro — он под­держи­вает боль­шой диапа­зон час­тот и име­ет боль­шую час­тоту выбор­ки, о которой погово­рим поз­же.

Прием ADS-B BladeRF
Прием ADS-B. BladeRF

Ес­ли у вас еще нет SDR — не беда, RTL-SDR сто­ит все­го око­ло 30 дол­ларов и про­дает­ся во мно­гих интернет‑магази­нах. Вот толь­ко имейте в виду, что этот при­бор уме­ет толь­ко при­нимать сиг­налы, но не уме­ет переда­вать их.

Собираем всё вместе

Те­перь, ког­да у тебя есть антенна и SDR, нуж­но най­ти сво­бод­ное от помех и пре­пятс­твий мес­то — я прос­то выехал за город километ­ров на десять. Сиг­налы око­ло 1 ГГц (к которым отно­сит­ся и наш ADS-B) поч­ти не рас­простра­няют­ся за горизонт, так что, если ты не живешь око­ло аэро­пор­та и вок­руг есть пре­пятс­твия, мож­но не пой­мать вооб­ще ничего.

Как улучшить прием

Меж­ду антенной и SDR мож­но добавить филь­тр, который отсе­чет часть шумов. Сущес­тву­ют спе­циаль­ные филь­тры для ADS-B, заказать из Китая мож­но за 10–15 дол­ларов.

Для изу­чения эфи­ра я буду исполь­зовать GQRX, эта прог­рамма дос­тупна для Linux и macOS. Если у тебя Windows, рекомен­дую SDR#. В Ubuntu GQRX уста­нав­лива­ется из штат­ных репози­тори­ев:

Даль­ше дела­ем звук пог­ромче, выбира­ем источни­ком наш SDR и нажима­ем на боль­шую кноп­ку «Старт». Если все сде­лано пра­виль­но, из динами­ков нач­нет шипеть так, что ты под­прыг­нешь на сту­ле, пос­ле чего отклю­чишь зву­ки кноп­кой Mute, рас­положен­ной в пра­вом ниж­нем углу.

Час­тоту при­ема мож­но выб­рать в вер­хней час­ти экра­на — нуж­но задать там зна­чение 1.090.000, что рав­но 1090 МГц. Пос­ле это­го ты уви­дишь что‑то похожее на скрин­шот вни­зу.

Прием ADS-B. Сиг­нал в GQRX
Прием ADS-B. Сиг­нал в GQRX

Ко­рот­кие полос­ки по цен­тру — это и есть сиг­нал ADS-B, который замет­но выделя­ется на фоне окру­жающе­го шума. Если у тебя их нет, поп­робуй изме­нить парамет­ры уси­ления на вклад­ке Input Controls спра­ва. Если и это не помог­ло, перей­ди на вклад­ку FFT Settings и нас­трой парамет­ры Plot и WF. Еще мож­но поп­робовать пок­рутить антенну или положить ее в раз­ных нап­равле­ниях.

Dump1090

Ког­да ты добь­ешься ста­биль­ного при­ема сиг­нала в GQRX, можешь перехо­дить к сле­дующе­му шагу.

В обыч­ных слу­чаях, если кто‑то хочет прос­то при­нять сиг­налы Mode S и декоди­ровать их, он исполь­зует уже готовую прог­рамму dump1090. Эта тул­за с исходным кодом уме­ет демоду­лиро­вать и декоди­ровать поч­ти все сиг­налы Mode S и даже выводит их в виде кра­сивой таб­лички. Что­бы про­верить, все ли у нас работа­ет кор­рек­тно, луч­ше начать с чего‑то заведо­мо рабоче­го, и нач­нем мы с dump1090.

Для уста­нов­ки нуж­но кло­ниро­вать репози­торий про­екта с GitHub и соб­рать бинар­ник. Дела­ется это про­ще прос­того:

Пос­ле это­го у тебя дол­жен появить­ся бинар­ник dump1090. Если у тебя RTL-SDR, можешь исполь­зовать dump1090 нап­рямую с ним, но у меня BladeRF, для под­дер­жки которо­го нуж­но нем­ного повозить­ся.

Во‑пер­вых, уста­нови драй­вер для сво­его SDR — их мож­но най­ти в репози­тори­ях прак­тичес­ки всех дис­три­бути­вов, погуг­лить.

Во‑вто­рых, нуж­но будет накатить на SDR спе­циаль­ную про­шив­ку. Для BladeRF эти про­шив­ки дос­тупны на сай­те Nuand, где нуж­но выб­рать соот­ветс­тву­ющий файл для сво­ей вер­сии BladeRF.

Даль­ше ска­чива­ем прог­рамму для декоди­рова­ния сооб­щений ADS-B и собира­ем ее:

Те­перь залива­ем про­шив­ку в BladeRF. Сде­лать это мож­но с помощью пакета bladerf-cli:
bladeRF-cli -l ~/Downloads/adsbxA4.rbf

Те­перь запус­каем в одном окне dump1090, а в дру­гом — bladeRF-adsb, который мы собира­ли парой шагов рань­ше:

Ес­ли все сде­лано вер­но, в окне с dump1090 ты уви­дишь кучу строк в шес­тнад­цатерич­ном виде. Это и есть сооб­щения Mode S, которые надо еще декоди­ровать и отфиль­тро­вать.

При­мер сырого вывода dump1090
При­мер сырого вывода dump1090

Ес­ли убрать —raw из аргу­мен­тов запус­ка dump1090, то сиг­налы будут авто­мати­чес­ки декоди­ровать­ся и выводить­ся в таб­лицу, как на скрин­шоте ниже.

Де­коди­рован­ные сиг­налы Mode S в dump1090
Де­коди­рован­ные сиг­налы Mode S в dump1090

В таб­лице мож­но най­ти уже декоди­рован­ные из CPR широту и дол­готу, позыв­ной самоле­та, его ско­рость, высоту и дру­гие дан­ные. Но это было бы слиш­ком прос­то, не прав­да ли? Давай декоди­ровать эти дан­ные самос­тоятель­но!

Сложный способ принять ADS-B

Что­бы при­нять сиг­нал самос­тоятель­но, нуж­но сна­чала демоду­лиро­вать его, а потом декоди­ровать то, что получит­ся.

Де­моду­ляция (детек­тирова­ние сиг­нала) — про­цесс, обратный модуля­ции колеба­ний, выделе­ние информа­цион­ного (модули­рующе­го) сиг­нала из модули­рован­ного колеба­ния высокой (несущей) час­тоты. Прос­тым язы­ком демоду­ляция — это выделе­ние сиг­нала из колеба­ний высокой час­тоты.

ADS-B работа­ет с PPM-модуля­цией, то есть, что­бы выделить полез­ный сиг­нал, нуж­но каж­дые 0,5 мкс опре­делять сос­тояние сиг­нала (0 или 1). План у нас будет сле­дующий:

  1. За­писать сиг­нал.
  2. Сде­лать выбор­ки каж­дые 0,5 мкс.
  3. Пре­обра­зовать их в бай­ты.
  4. Де­коди­ровать сооб­щения ADS-B.

Для удобс­тва будем исполь­зовать Python либо готовый набор инс­тру­мен­тов GNU Radio. На Ubuntu GNU Radio уста­нав­лива­ется сле­дующим обра­зом:

Ра­зуме­ется, для работы GNU Radio пот­ребу­ются и драй­веры для тво­ей SDR. При этом мы не будем исполь­зовать SDR как основной источник сиг­нала, что­бы мож­но было на заведо­мо оди­нако­вых дан­ных погонять раз­ные алго­рит­мы и срав­нить резуль­таты.

Запись сигнала

Пер­вое, что нуж­но сде­лать пос­ле запус­ка GNU Radio, — это соб­рать базовый пай­плайн. Выг­лядеть он будет, как на скрин­шоте ниже.

Прием ADS-B. Ба­зовый пай­плайн
Прием ADS-B. Ба­зовый пай­плайн

Все­го тут пять бло­ков, два из которых — опции и перемен­ная. В самом начале сто­ит osmocom Source, который отве­чает за получе­ние сырых дан­ных из SDR. Нас­тро­ек в нем мно­го, но для работы нуж­ны все­го пять (при­мер ниже — для BladeRF):

  1. Device Argument — аргу­мен­ты, которые будут переда­ны SDR. Тут впи­сыва­ем bladerf=0.
  2. Ch0 Freq — час­тота нулево­го канала. У BaldeRF их два, но нам нужен толь­ко один. Сюда впи­сыва­ем час­тоту ADS-B — это 1090 МГц или 1,09 ГГц.
  3. RF Gain — параметр, зада­ющий чувс­тви­тель­ность при­емни­ка. Я уста­новил его в 15 дБ. Не ставь слиш­ком боль­шую чувс­тви­тель­ность — мощ­ные сиг­налы могут пов­редить ради­отракт!
  4. Bandwidth — ширина канала при­ема, для ADS-B это 2 МГц.

Пя­тый параметр — Sample Rate, или час­тота дис­кре­тиза­ции. Прос­тым язы­ком это количес­тво выборок в секун­ду, которое дела­ет SDR для оциф­ровки сиг­нала. Что это и зачем? На вход SDR пос­тупа­ет ана­лого­вый сиг­нал, а для работы его нуж­но оциф­ровать. Для оциф­ровки сиг­нала нуж­но делать выбор­ки через некото­рый оди­нако­вый про­межу­ток вре­мени. Чем боль­ше выборок в секун­ду, тем луч­ше, но тем мощ­нее для это­го дол­жно быть устрой­ство. Наг­лядно про­цесс оциф­ровки показан на кар­тинке ниже.

Прием ADS-B. Как работа­ет оциф­ровка
Прием ADS-B. Как работа­ет оциф­ровка

Ко­личес­тво стол­биков на кар­тинке — это и есть количес­тво сем­плов, а SPS в скоб­ках в наз­вании это­го парамет­ра рас­шифро­выва­ется как Samples per Second, то есть количес­тво выборок в секун­ду. В парамет­ре samp_rate ввер­ху я задал час­тоту выбор­ки 4М SPS, и это нес­лучай­ное зна­чение, ведь оно как раз в четыре раза боль­ше час­тоты вход­ного сиг­нала, а по теоре­ме Най­квис­та нуж­на минимум в два раза боль­шая час­тота, чем час­тота сиг­нала. Для работы с ADS-B мож­но исполь­зовать и час­тоты 2 и 2,5 MSPS, но чем выше час­тота дис­кре­тиза­ции, тем луч­ше качес­тво оциф­ровки.

Те­оре­ма Най­квис­та (она же теоре­ма отсче­тов, теоре­ма Котель­никова) — фун­дамен­таль­ное утвер­жде­ние в области циф­ровой обра­бот­ки сиг­налов, свя­зыва­ющее неп­рерыв­ные и дис­крет­ные сиг­налы и гла­сящее, что «любую фун­кцию F(t), сос­тоящую из час­тот от 0 до f1, мож­но неп­рерыв­но переда­вать с любой точ­ностью при помощи чисел, сле­дующих друг за дру­гом менее чем через 1 / (2 * f1) с».

Те­перь, ког­да все нас­тро­ено, мож­но нажимать «Старт» на вер­хней панели GNU Radio. Если все сде­лано вер­но, ты уви­дишь спектр, похожий на тот, что пой­мал я.

Ви­зуали­зация спек­тра в GNU Radio
Ви­зуали­зация спек­тра в GNU Radio

Еле замет­ные полос­ки в вер­хней час­ти скрин­шота — это и есть сиг­налы, которые мы ищем. Мой BladeRF не отка­либ­рован, так что по бокам вид­ны завалы, но нашему экспе­римен­ту они не меша­ют. Нуж­но записать нес­коль­ко минут таких сиг­налов, пос­ле чего мож­но сво­рачи­вать обо­рудо­вание и идти домой — декоди­ровать!

Демодуляция

Для демоду­ляции я соб­рал в GNU Radio более слож­ную и инте­рес­ную схе­му.

Схе­ма демоду­ляции сиг­нала
Схе­ма демоду­ляции сиг­нала

Да­вай про­бежим­ся по каж­дому бло­ку схе­мы, что­бы ты понимал, что про­исхо­дит. На схе­ме часть вхо­дов и выходов име­ют раз­ные цве­та — эти цве­та озна­чают раз­ные типы дан­ных:

  • си­ний — ком­плексные чис­ла;
  • оран­жевый — чис­ла с пла­вающей точ­кой;
  • фи­оле­товые — бай­ты.

Те­перь перей­дем к самим бло­кам.

  1. File Source — источник сиг­нала в виде фай­ла. В этом бло­ке нуж­но выб­рать файл, который мы записа­ли, ког­да при­нима­ли сиг­нал. Этот блок заменя­ет реаль­ную SDR для наших экспе­римен­тов.
  2. Throttle — эле­мент, замед­ляющий подачу сиг­нала в нашу схе­му. Без это­го бло­ка вся обра­бот­ка выпол­нится слиш­ком быс­тро и будет ничего не вид­но.
  3. Waterfall — это визу­али­зация сиг­нала. Жел­то‑голубая каша из пик­селей на гра­фике — это как раз оно.
  4. QT GUI Time Sink рису­ет гра­фик зависи­мос­ти сиг­нала от вре­мени.
  5. Compex To Mag — блок пре­обра­зова­ния ком­плексных чисел в чис­ла с пла­вающей точ­кой. На вхо­де у него синие зна­чения, а на выходе оран­жевые.
  6. Threshold — самый важ­ный блок в нашей схе­ме демоду­ляции, он помога­ет отде­лить сиг­налы от осталь­ного шума. Я задал зна­чения low 13m и high 13m — это ампли­туды сиг­налов, которые я хочу отде­лить. Что­бы най­ти порог для тво­ей SDR, при­дет­ся соб­рать еще одну допол­нитель­ную схе­му. Спра­ва в поис­ке най­ти бло­ки Peak Detector и Time Sink. В бло­ке Time Sink нуж­но выс­тавить три вхо­да, а если у Peak Detector отсутс­тву­ет Debug port, то толь­ко два. Пос­ле сбор­ки схе­мы ты уви­дишь, на какой ампли­туде будут пики полез­ного сиг­нала.
  7. Symbol Sync — это еще один важ­ный блок син­хро­низа­ции сим­волов. Выше я уже говорил, что выб­рал час­тоту дис­кре­тиза­ции 4 MSPS, и нуж­но это как раз для работы бло­ка син­хро­низа­ции, пос­коль­ку его минималь­ный параметр Samples per Symbol равен 2, а воз­можно это, толь­ко если час­тота дис­кре­тиза­ции вход­ного сиг­нала не мень­ше 4 MSPS. Если у тебя не такой кру­той при­емник (нап­ример, RTL-SDR) — не беда, мож­но отклю­чить Symbol Sync и исполь­зовать блок Keep 1 in N (нарисо­ван серым на схе­ме выше). С бло­ком син­хро­низа­ции из сырой записи я в сво­ем тес­те получил 18 из 31 хороших пакетов, а без него — 11 из 29. Получа­ется, что, прос­то исполь­зуя нор­маль­ную син­хро­низа­цию, ты получишь зна­читель­но боль­ше валид­ных дан­ных.
  8. Float to Char — этот блок пре­обра­зует чис­ла с пла­вающей запятой в сим­волы и отправ­ляет в File Sink.
  9. File Sink сох­раня­ет бай­ты в файл для даль­нейше­го ана­лиза.

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

Прием ADS-B. Схе­ма демоду­ляции в дей­ствии
Прием ADS-B. Схе­ма демоду­ляции в дей­ствии

Са­мое пер­вое — это наш Waterfall, на нем удоб­но гла­зами искать сиг­нал. Даль­ше идет Time Sink пос­ле син­хро­низа­ции: тут два сиг­нала — крас­ный (сиг­нал ошиб­ки) и синий (исправ­ленный по вре­мени сиг­нал). Эти сиг­налы уже напоми­нают что‑то циф­ровое, но нас­тоящий циф­ровой сиг­нал отоб­ража­ется уже на треть­ем гра­фике (обра­ботан­ный бло­ком Threshold). Чет­вертый гра­фик — это тот же исходный сиг­нал, что на пер­вом гра­фике, но обра­ботан­ный бло­ком Threshold.

Анализ файла

Пос­ле демоду­ляции файл будет выг­лядеть так.

Да­вай теперь про­чита­ем файл и будем искать в этом потоке дан­ных пре­амбу­лу пакета Mode S. Я написал для это­го нес­коль­ко фун­кций на Python.

Пер­вая фун­кция прос­то чита­ет файл, а вто­рая ищет задан­ный пат­терн (нашу пре­амбу­лу). Но для поис­ка нуж­но сна­чала соб­рать двой­ные биты в оди­нар­ные (те самые пов­торения, из‑за которых бит по 0,5 мкс занима­ет 1 мкс). Сле­дующая фун­кция как раз это и дела­ет:

Чи­таем файл и находим все пре­амбу­лы:

Здесь pattern — это и есть иско­мая пре­амбу­ла. Можешь даже отлистать в начало статьи и срав­нить. Пос­коль­ку пре­амбу­ла озна­чает любой сиг­нал Mode S, а не толь­ко ADS-B, то могут попадать­ся сиг­налы дли­ной 56 бит. Их под­дер­жка тоже есть.

Про­читав код, ты заметишь, что я вытас­киваю ADS-B-пакеты и отправ­ляю их для декоди­рова­ния на сто­рон­ний сер­вис, что­бы не изоб­ретать собс­твен­ный пар­сер для всех типов пакетов. Этот же сайт мож­но открыть и прос­то в бра­узе­ре, что­бы полис­тать образцы пакетов и еще глуб­же оку­нуть­ся в мир Mode S и ADS-B.

При хорошем рас­кла­де ты уви­дишь при­мер­но такой вывод:

Я получил сиг­нал со ско­ростью самоле­та, но у тебя, конеч­но, будет их нам­ного боль­ше. DF у меня равен 17 (ADS-B), а ICAO-код тран­спон­дера — 896179.

На­деюсь, и тебе пон­равилось пог­ружение в инте­рес­ный мир ради­осиг­налов. При­ятных иссле­дова­ний!

Дима (Kozhuh)

Эксперт в кибербезопасности. Работал в ведущих компаниях занимающихся защитой и аналитикой компьютерных угроз.

Добавить комментарий