Пред­ставь, что сущес­тву­ет радар, на котором отме­чены все кораб­ли, их груз, ста­тус сис­тем, количес­тво человек на бор­ту и еще куча информа­ции. И такая сис­тема дей­стви­тель­но есть! Сегод­ня мы погово­рим про AIS — Automatic Identification System, которая пов­семес­тно исполь­зует­ся на море. Поп­робу­ем демоду­лиро­вать и декоди­ровать сиг­налы этой сис­темы.

Введение

AIS была соз­дана дав­но, и ее глав­ная цель — безопас­ное мореп­лавание. В нас­тоящий момент сис­тема выпол­няет сле­дующие фун­кции:

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

AIS поз­воля­ет общать­ся с дру­гими судами для обме­на важ­ной информа­цией. Такая тех­нология помога­ет избе­жать ава­рий. Это осо­бен­но акту­аль­но для боль­ших кораб­лей, которые не могут рез­ко поменять курс или оста­новить­ся.

Для реали­зации AIS нужен тран­спор­тер, работа­ющий в диапа­зоне VHF (134–174 МГц). Исполь­зуя спе­циаль­ную сис­тему раз­делен­ного дос­тупа к каналу, SOTDMA, AIS может переда­вать до 4500 отче­тов в минуту. Про SOTDMA мы погово­рим чуть поз­же.

В реаль­ных же усло­виях кораб­ли не всег­да находят­ся воз­ле берегов и назем­ные стан­ции не всег­да могут получить дан­ные о кораб­лях. Что­бы это испра­вить, в AIS добави­ли интегра­цию со спут­никовой связью. Эта сис­тема называ­ется SAT-AIS, она есть на всех боль­ших кораб­лях и сто­ит очень дорого, что дела­ет ее недос­тупной для обыч­ных судов. Что­бы испра­вить эту проб­лему, люди раз­работа­ли сис­тему, в которой суда без SAT-AIS могут исполь­зовать бли­жай­шие кораб­ли с SAT-AIS для переда­чи дан­ных о себе.

SAT-AIS и AIS
SAT-AIS и AIS

Типы сообщений AIS

В зависи­мос­ти от переда­ваемой информа­ции сооб­щения могут иметь раз­ную струк­туру. Что­бы не запутать­ся, в сис­тему внед­рили типы сооб­щений, пер­вые 6 бит показы­вают тип и, соот­ветс­твен­но, фор­мат даль­нейших дан­ных. Нем­ного углу­бим­ся в фор­маты сооб­щений и раз­берем­ся, какие дан­ные мож­но переда­вать и получать в AIS.

Все­го в AIS 21 основной тип сооб­щений, в будущем этот спи­сок может быть рас­ширен до 63. Сооб­щения име­ют раз­ные фор­маты вре­мен­ного дос­тупа к сис­теме, раз­ный при­ори­тет и наз­начение. Рас­смот­рим все сооб­щения, раз­делив их на клас­сы: сооб­щения передат­чиков клас­са А, сооб­щения передат­чиков клас­са Б, сооб­щения от ATON, бинар­ные сооб­щения AIS с адре­сом, бинар­ные сооб­щения AIS для всех при­емни­ков.

Сообщения передатчиков класса А

Позиция корабля

Со­обще­ния передат­чиков клас­са А с позици­ей переда­ются через рав­ные про­межут­ки вре­мени от 2 до 10 с авто­мати­чес­ки. Они содер­жат дан­ные о текущей позиции кораб­ля, его ско­рос­ти, нап­равле­нии, сос­тоянии инди­като­ров манев­ров, в слу­чае если корабль дела­ет раз­ворот или дру­гой слож­ный маневр. Раз­берем фор­мат сооб­щений типа 1, 2 и 3, которые отве­чают за переда­чу позиции.

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

Статические данные о корабле

Ста­тичес­кие дан­ные могут вклю­чать в себя позыв­ной, вер­сию AIS, иден­тифика­торы при­емни­ка и передат­чика, тип суд­на, тип гру­за и еще кучу важ­ных деталей. Эти сооб­щения отно­сят­ся к типу 5, рас­смот­рим их струк­туру.

Со­обще­ния со ста­тичес­кой информа­цией тран­сли­руют­ся каж­дые 6 мин.

Широковещательное сообщение

Со­обще­ние типа 27, которое исполь­зует­ся для переда­чи позиции (как в типах 1, 2 и 3), но име­ет мень­шее количес­тво битов — 96 бит вмес­то 168 в типах 1, 2 и 3. Это поз­воля­ет тран­сли­ровать сооб­щение на спут­ники или на более даль­ние рас­сто­яния без проб­лем.

Сообщения передатчиков класса Б

Со­обще­ния передат­чиков клас­са Б соот­ветс­тву­ют фор­матам, опи­сан­ным в клас­се А, но име­ют нем­ного дру­гую бинар­ную струк­туру переда­ваемых сооб­щений. В свя­зи с эти­ми раз­личи­ями сооб­щения этих передат­чиков выделя­ют в отдель­ные типы. За переда­чу позиции отве­чают сооб­щения типа 18 и 19, пос­леднее явля­ется сво­еоб­разным легаси. Сооб­щение типа 24 содер­жит ста­тичес­кую информа­цию о кораб­ле.

Сообщения ATON

Ос­тановим­ся на фор­мате сооб­щений ATON и про­ана­лизи­руем их более под­робно, потому что это доволь­но инте­рес­но. ATON име­ет толь­ко один тип сооб­щений — 27. Переда­ются эти сооб­щения авто­мати­чес­ки через опре­делен­ный про­межу­ток вре­мени.

Как видишь, в сооб­щении мно­го раз­ной инте­рес­ной информа­ции.

Бинарные сообщения

Би­нар­ные сооб­щения име­ют типы 6 для сооб­щений с получа­телем и 8 для широко­веща­тель­ных. Бинар­ные сооб­щения исполь­зуют­ся для переда­чи любой информа­ции, нап­ример сооб­щений дру­гим кораб­лям. Рас­смот­рим струк­туру бинар­ных сооб­щений типа 6, для типа 8 она похожа, прос­то отсутс­тву­ет поле наз­начения.

Типы AIS

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

Класс А

Это самые популяр­ные передат­чики для кораб­лей. Сиг­нал с позици­ей (тип 1, 2 и 3) авто­мати­чес­ки тран­сли­рует­ся каж­дые 2 с. Вре­мя переда­чи может менять­ся в зависи­мос­ти от кур­са и ско­рос­ти суд­на. Сиг­налы с допол­нитель­ной информа­цией, нап­ример с показа­ниями дат­чиков (тип 5), тран­сли­руют­ся каж­дые 6 мин тоже авто­мати­чес­ки. Передат­чики это­го типа поз­воля­ют кораб­лям обме­нивать­ся тек­сто­выми дан­ными. Так­же сис­темы клас­са А могут при­нимать информа­цию о погоде от назем­ных стан­ций. Боль­ше информа­ции мож­но най­ти в стан­дарте IEC 61993-2.

Класс Б

Стан­ции это­го типа нам­ного сла­бее стан­ций клас­са А, у них мень­ше и мощ­ность, и чис­ло воз­можнос­тей. Стан­ции точ­но так же авто­мати­чес­ки тран­сли­руют свое мес­тополо­жение, но с боль­шим интерва­лом и мень­шей мощ­ностью. Так­же они переда­ют допол­нитель­ную информа­цию, но количес­тво этой информа­ции на порядок мень­ше. Устрой­ства клас­са Б могут получать тек­сто­вые сооб­щения, но не могут их переда­вать. За под­робнос­тями обра­щай­ся к стан­дартам IEC 62287-1 и 62287-2.

Наземные станции

На­зем­ные стан­ции помога­ют син­хро­низи­ровать информа­цию из раз­ных источни­ков и вре­мя переда­чи, а так­же переда­вать судам тек­сто­вые сооб­щения, нап­ример о над­вига­ющем­ся штор­ме. Каж­дые 4 с назем­ная стан­ция отправ­ляет свой уни­каль­ный иден­тифика­тор (MMSI вида 00MIDXXXXX) и дан­ные о вре­мени. Назем­ные стан­ции так­же могут переда­вать дан­ные для сис­тем AIS ATON (AIS Aid to Navigation) и ASM (Application Specific Messages), которая переда­ет точ­ную информа­цию о прог­нозе погоды. Боль­ше информа­ции — в стан­дарте IEC 62320-1.

SART

По­иско­во‑спа­сатель­ные сис­темы, которые исполь­зуют­ся в экс­трен­ных ситу­ациях как маяк для спа­сения. Пос­ле акти­вации тран­сли­рует сооб­щения типа 14 и позицию передат­чика. Все­го переда­ется восемь сооб­щений в минуту. Передат­чики спа­сатель­ного типа мож­но опре­делить по MMSI, который начина­ется на 970, 972 или 974. Передат­чики SART тран­сли­руют по четыре сооб­щения на каж­дой из час­тот AIS, то есть четыре на 161,975 МГц и четыре на 162,025 МГц. Позиция передат­чика опре­деля­ется через встро­енный при­емник GNSS. Под­робнее — в стан­дарте IEC 61097-14.

ATON

На­вига­цион­ная сис­тема AIS Aid to Navigation поз­воля­ет кораб­лям, которые исполь­зуют AIS, получать информа­цию о физичес­ких объ­ектах в водах, нап­ример ска­лах или мел­ководье. Сущес­тву­ет три основных ATON. Пер­вый из них — физичес­кий объ­ект, который тран­сли­рует информа­цию о бли­жай­ших физичес­ких объ­ектах. Вто­рой — син­тетичес­кий, который не тран­сли­рует AIS, а прос­то с помощью све­та показы­вает мес­тонахож­дение объ­ектов. Обыч­но дан­ные о син­тетичес­ких ATON переда­ются с назем­ных стан­ций. Тре­тий тип — вир­туаль­ный, в дан­ном типе информа­ция об объ­ектах переда­ется толь­ко через назем­ные стан­ции или спут­ники. Сис­темы ATON мож­но обна­ружить по MMSI, который начина­ется на 993XXXXX. Под­робнос­ти — в стан­дарте IEC 62320-2.

Система ATON
Сис­тема ATON

Подводим итоги

Как вид­но, в AIS мно­го под­систем, которые отве­чают за раз­ные фун­кции — начиная от переда­чи дан­ных меж­ду кораб­лями и закан­чивая спа­сатель­ными объ­екта­ми. Все они переда­ют дан­ные по незащи­щен­ному каналу, кро­ме, конеч­но, Blue Force Tracking, воен­ной сис­темы США и НАТО, которую они исполь­зуют в зашиф­рован­ном виде через спут­ники. Ата­кующий может лег­ко передать дан­ные, нап­ример ATON, и зас­тавить кораб­ли раз­вернуть­ся или запус­тить еще один корабль, который будет идти пря­мо на цель. Все это воз­можно сде­лать с прос­тым SDR-передат­чиком за 200–300 дол­ларов. В этой статье мы не будем углублять­ся в ата­ки на AIS, а толь­ко поп­робу­ем пол­ностью разоб­рать­ся в переда­че, модуля­ции и кодиро­вании.

warning

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

От­метим основные пун­кты:

Изу­чить, как выг­лядит AIS, мож­но на офи­циаль­ном сай­те сис­темы.

MarineTraffic
MarineTraffic

Демодуляция

Пе­рей­дем к более инте­рес­ной сос­тавля­ющей статьи. В этом раз­деле изу­чим модуля­цию сиг­нала и основные фор­маты дан­ных.

Частота

AIS работа­ет на двух основных час­тотах. В некото­рых источни­ках их называ­ют канала­ми. Это 161,975 МГц и 162,025 МГц, каналы же соот­ветс­твен­но называ­ются 87b и 88b. Все это находит­ся в диапа­зоне VHF, который вклю­чает в себя мет­ровые вол­ны от 1 до 10 м. Ради­освязь на этом диапа­зоне, как пра­вило, воз­можна на рас­сто­яние до нес­коль­ких десят­ков километ­ров, а при сов­падении фак­торов иони­зации и отра­жения и до тысяч километ­ров — при наличии мощ­ного передат­чика. VHF отлично под­ходит для свя­зи в городе и на мес­тнос­тях с пря­мой видимостью, какой воды и явля­ются.

Модуляция

Для модуля­ции исполь­зует­ся GMSK — это один из видов час­тотной модуля­ции, который переда­ет дан­ные, изме­няя час­тоту при изме­нении бита. Нап­ример, если 1 — это 10 Гц, а 0 — 20 Гц, то в зависи­мос­ти от исходных дан­ных сиг­нал будет иметь раз­ные час­тоты в раз­ных вре­мен­ных про­межут­ках.

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

В осно­ве такой модуля­ции лежит гаус­сов­ский филь­тр ниж­них час­тот, а индекс модуля­ции, который зада­ет раз­ницу меж­ду час­тотами для 0 и 1, минима­лен (0,5). Все это поз­воля­ет получить минималь­ную ширину спек­тра. Если хочешь под­робнее изу­чить, как работа­ет GMSK, можешь начать с мо­их ста­тей про FSK, MSK и CPFSK.

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

GMSK

Рас­смот­рим нес­коль­ко при­меров работы GMSK-модуля­ции. Нач­нем с прос­того — с того, как модули­рует­ся сиг­нал. Нач­нем с FSK. Это самая прос­тая час­тотная модуля­ция, которая без какой‑либо обра­бот­ки перек­люча­ет час­тоты в зависи­мос­ти от вход­ного сиг­нала. Обыч­но в схе­ме модуля­ции FSK есть два генера­тора с раз­ными час­тотами и ключ.

На ключ пода­ется либо 1, либо 0, в зависи­мос­ти от переда­ваемых дан­ных. На выходе получа­ется сиг­нал с раз­ными час­тотами. Дли­тель­ность каж­дого бита выбира­ется исхо­дя из тре­бова­ний к ско­рос­ти переда­чи, но бес­конеч­но умень­шать дли­тель­ность сиг­нала не получит­ся из‑за осо­бен­ностей FSK.

FSK-модуляция
FSK-модуля­ция

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

Что такое фаза

Фа­за — это положе­ние текуще­го зна­чения сиг­нала в пре­делах одно­го пери­ода отно­ситель­но опре­делен­ной началь­ной точ­ки.

Фаза
Фа­за

CPFSK-модуля­торы учи­тыва­ют фазу прош­лого сиг­нала и начина­ют перек­лючение без скач­ка фазы.

CPFSK и FSK
CPFSK и FSK

Как вид­но на двух пос­ледних гра­фиках, у CPFSK нет скач­кооб­разно­го перехо­да, что поз­воля­ет сущес­твен­но сни­зить количес­тво боковых гар­моник. Если изу­чить спектр двух модули­рован­ных сиг­налов — FSK и CPFSK, то раз­ница ста­новит­ся еще оче­вид­нее.

Спектры FSK и CPFSK
Спек­тры FSK и CPFSK

За­мет­но, что в CPFSK боковых гар­моник поч­ти нет, но проб­лема ширины канала все еще оста­ется. Так как в час­тотной модуля­ции исполь­зует­ся две час­тоты, то меж­ду эти­ми час­тотами дол­жна быть какая‑то раз­ница, что­бы при при­еме сиг­нала и его демоду­ляции мож­но быть отли­чить, где 0, а где 1.

Раз­ница меж­ду час­тотами называ­ется деви­ацией час­тот. При умень­шении деви­ации мож­но дос­тигнуть порога, при котором сиг­нал уже нель­зя вос­ста­новить. Модуля­ция с минималь­ной деви­ацией, а точ­нее, с минималь­ным индексом час­тотной модуля­ции называ­ется MSK (Minimum Shift Key). Индекс модуля­ции в MSK сос­тавля­ет 0,5. Почему столь­ко и как его получить, я пи­сал у себя в бло­ге. При срав­нении спек­тров CPFSK и MSK раз­ница замет­на.

MSK и CPFSK
MSK и CPFSK

Те­перь, пос­ле того как изу­чены FSK, MSK и CPFSK, мож­но перей­ти непос­редс­твен­но к GMSK. Это час­тотная модуля­ция, по сути MSK, к которой при­мени­ли гаус­сов­ский филь­тр ниж­них час­тот, что поз­волило еще силь­нее умень­шить ширину спек­тра. Срав­нить MSK и GMSK мож­но на сле­дующем гра­фике спек­тра.

MSK и GMSK
MSK и GMSK

Демодуляция GMSK

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

При получе­нии сиг­нал s(t) переда­ется на два сме­сите­ля, где он умно­жает­ся на два орто­гональ­ных сиг­нала: cos(wc * t) и sin(wc * t), где wc — это угло­вая час­тота несущей. Пос­ле умно­жения получа­ется два сиг­нала:

Да­лее нуж­но отфиль­тро­вать ниж­ние час­тоты. Для это­го оба сиг­нала про­пус­кают­ся через филь­тры низ­ких час­тот ФНЧ, что­бы уда­лить высоко­час­тотные сос­тавля­ющие, оставляя толь­ко базовую полосу сиг­налов:

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

В GMSK информа­ция переда­ется через изме­нение час­тоты, а изме­нение час­тот при­водит к неп­рерыв­ным изме­нени­ям фазы. Сле­дова­тель­но, для демоду­ляции дан­ных дос­таточ­но вычис­лить фазы двух сиг­налов. Начать сто­ит с детек­ции мгно­вен­ной фазы, для это­го отде­лим мгно­вен­ную фазу сиг­нала r(t):

Те­перь мож­но получить час­тотную деви­ацию, которая и будет показы­вать изме­нения час­тоты, а точ­нее, фазы.

T — пери­од выбор­ки.

Из­менения раз­нос­тной фазы, которые мы получи­ли в кон­це, соот­ветс­тву­ют переда­ваемым дан­ным. Учи­тывая прош­лое зна­чение фазы, мож­но получить дан­ные о текущем сим­воле.

Хоть GMSK и изме­няет час­тоту, изме­нение час­тоты нап­рямую изме­няет фазу. Чис­тая час­тотная модуля­ция озна­чает, что мгно­вен­ная фаза изме­няет­ся со ско­ростью, про­пор­циональ­ной мгно­вен­ной час­тоте, сле­дова­тель­но, детек­тирова­ние изме­нений фазы поз­воля­ет вос­ста­новить информа­цию из сиг­нала.

Слоты

Нас­тало вре­мя погово­рить о вре­мен­ных сло­тах в AIS. Как бы мы ни ужи­мали ширину спек­тра при переда­че, канала все рав­но не будет хва­тать из‑за количес­тва кораб­лей. Что­бы испра­вить это, в AIS интегри­рова­ли сис­тему TDMA (Time Division Multiple Access), которая поз­воля­ет делить дос­туп к переда­че по вре­мени меж­ду судами. В AIS под­разуме­вает­ся огра­ничен­ное количес­тво сло­тов. Для каж­дого канала выведе­но 2250 сло­тов каж­дую минуту, то есть 4500 сло­тов на оба канала.

TDMA в AIS
TDMA в AIS

Каж­дая сис­тема AIS авто­мати­чес­ки адап­тиру­ется к количес­тву исполь­зуемых сло­тов в кон­крет­ном реги­оне, это поз­воля­ет сущес­твен­но сни­зить слож­ность при­ема. Быва­ет, все сло­ты перег­ружены, на этот слу­чай при­емни­ки AIS зап­рограм­мирова­ны таким обра­зом, что­бы при­нимать дан­ные от наибо­лее близ­ких кораб­лей. Это сде­лано для избе­жания стол­кно­вений.

Как и во всех сис­темах, у TDMA есть еще под­систе­мы, которые исполь­зуют­ся в раз­ных слу­чаях и в раз­ных устрой­ствах.

SOTDMA

Нач­нем с SOTDMA (Self Organised Time Division Multiple Access). Это самая слож­ная схе­ма TDMA для дос­тупа к AIS. В SOTDMA все стан­ции дол­жны иметь чет­кое и син­хро­низи­рован­ное вре­мя. Это реша­ется бла­года­ря син­хро­низа­ции по GNSS, что поз­воля­ет точ­но делить сло­ты во вре­мени.

При переда­че дан­ных SOTDMA в пакете содер­жится информа­ция о сле­дующих переда­чах, это поз­воля­ет дру­гим при­емни­кам сос­тавлять кар­ту сло­тов и эффектив­но выбирать для переда­чи сво­бод­ные. Соот­ветс­твен­но, важ­ная осо­бен­ность реали­зации передат­чиков — это воз­можность выбирать сво­бод­ный слот, что­бы не мешать дру­гим. И, как следс­твие, каж­дая стан­ция дол­жна уметь перес­тра­ивать свои сло­ты под реалии текуще­го реги­она. В одной точ­ке сво­бод­ны будут одни сло­ты, а при перехо­де в дру­гую будут уже совер­шенно дру­гие.

SOTDMA раз­работа­на с уче­том того, что нас­тупит момент, ког­да сво­бод­ных сло­тов не оста­нет­ся, тог­да вклю­чает­ся механизм пов­торно­го исполь­зования сло­та. При­емник в этом слу­чае обя­зан при­нимать толь­ко сиг­нал бли­жай­ших кораб­лей. Все эти тре­бова­ния так­же обо­рачи­вают­ся наличи­ем тре­бова­ний к обо­рудо­ванию, таких как опре­делен­ное количес­тво опе­ратив­ной памяти, мощ­ность про­цес­сора и дру­гие харак­терис­тики.

Под­робнее — в стан­дарте ITU-R M.1371-4.

RATDMA

RATDMA — Random Access Time Division Multiple Access. Как понят­но из наз­вания, этот вид TDMA исполь­зует­ся, ког­да нуж­но выб­рать слу­чай­ный слот. Этот метод нужен в основном сна­чала, ког­да передат­чик толь­ко вхо­дит в реги­он, или же для переда­чи непов­торя­ющих­ся сооб­щений, нап­ример тек­сто­вых дан­ных. Как и в SOTDMA, тре­бует­ся син­хро­низа­ция по вре­мени для всех устрой­ств TDMA. Для син­хро­низа­ции исполь­зует­ся GNSS.

Пе­редат­чик с RATDMA выбира­ет по сво­ей внут­ренней кар­те слу­чай­ный слот, который не исполь­зует­ся дру­гой стан­цией. Он не анон­сиру­ет задей­ство­вание это­го сло­та, прос­то отправ­ляет через него дан­ные. Глав­ное отли­чие RATDMA от SOTDMA — RA не анон­сиру­ет сле­дующие переда­чи и сло­ты, что не поз­воля­ет дру­гим стан­циям опре­делить занятые сло­ты. Из‑за этой осо­бен­ности RATDMA невоз­можно исполь­зовать для пери­оди­чес­кой переда­чи.

Под­робнее — в стан­дарте ITU-R M.1371-4.

ITDMA

ITDMA — Incremental Time Division Multiple Access. Вре­мя здесь все еще син­хро­низи­рует­ся по GNSS. Стан­ции, исполь­зующие ITDMA, опи­рают­ся на внут­реннюю кар­ту сло­тов и выбира­ют слу­чай­ный сво­бод­ный слот. Пос­ле выбора устрой­ство с ITDMA анон­сиру­ет переда­чу в выб­ранном сло­те. ITDMA исполь­зует­ся, ког­да стан­ции нуж­но передать изме­нение во вре­мени пери­оди­чес­ких передач или же анон­сировать непери­оди­чес­кое сооб­щение, нап­ример тек­сто­вое сооб­щение, свя­зан­ное с безопас­ностью. ITDMA не исполь­зует­ся как отдель­ная схе­ма для дос­тупа в сис­тему AIS, в основном она допол­няет SOTDMA. Глав­ное отли­чие от RATDMA — в анон­сирова­нии переда­чи.

Под­робнее — в стан­дарте ITU-R M.1371-4.

FATDMA

FATDMA — Fixed Access Time Division Multiple Access. Сис­тема похожа на обыч­ную SOTDMA, но отли­чает­ся тем, что дан­ные о сло­те заг­ружены нап­рямую в передат­чик, то есть сло­ты всег­да ста­тич­ны для любого слу­чая. Как и в прош­лых схе­мах, тре­бует­ся син­хро­низа­ция вре­мени по GNSS. При вхо­де в реги­он стан­ции FATDMA тран­сли­руют сооб­щение о сво­их сло­тах, что­бы дру­гие стан­ции мог­ли знать, какие из них заняты. Из‑за ста­тич­ных сло­тов исполь­зование FATDMA ста­рают­ся свес­ти к миниму­му, что­бы не мешать динами­чес­кой работе AIS.

Под­робнее — в стан­дарте ITU-R M.1371-4.

CSTDMA

CSTDMA — Carrier Sense Time Division Multiple Access. В дан­ном слу­чае син­хро­низа­ция с вре­менем выпол­няет­ся не по GNSS, так что сис­тема свя­зи с GNSS в CSTDMA не нуж­на. Стан­ции, исполь­зующие CSTDMA, неп­рерыв­но сле­дят за канала­ми AIS, что­бы находить сво­бод­ные сло­ты и исполь­зовать их. Если стан­ция CSTDMA видит, что ник­то не исполь­зует слот, она отправ­ляет дан­ные и отклю­чает переда­чу на 30 с, пос­ле это­го пов­торя­ет все шаги. Важ­но заметить, что стан­ции это­го типа не могут анон­сировать сло­ты. Они не тре­буют слож­ных ком­понен­тов и исполь­зуют­ся на малень­ких судах.

Под­робнее — в стан­дарте ITU-R M.1371-4.

PATDMA

PATDMA — модифи­циро­ван­ная вер­сия SOTDMA, раз­работан­ная спе­циаль­но для сис­тем, которые могут толь­ко тран­сли­ровать дан­ные, нап­ример SART. Вре­мя син­хро­низи­рует­ся по GNSS. Каж­дые 8 мин стан­ция выбира­ет слу­чай­ный слот для переда­чи, это дела­ется для того, что­бы уве­личить шан­сы быть услы­шан­ной. В самой переда­че восемь пакетов дан­ных, которые содер­жат раз­ные дан­ные.

Под­робнее — в стан­дарте ITU-R M.1371-4.

Устройства и их совместимость с типами TDMA

Пе­рей­дем к свя­зи типов и устрой­ств. Общую информа­цию мож­но получить, изу­чив кар­тинку ниже.

Типы TDMA и устройства, которые их используют
Ти­пы TDMA и устрой­ства, которые их исполь­зуют

Класс А

Ус­трой­ства клас­са А, как самые дорогие и тех­ничес­ки слож­ные, могут исполь­зовать три самые слож­ные схе­мы дос­тупа к сло­там: SOTDMA, RATDMA и ITDMA. SOTDMA исполь­зует­ся поч­ти для всех пери­оди­чес­ких сиг­налов, нап­ример дан­ных о позиции. RATDMA и ITDMA исполь­зуют­ся при вхо­де в новый реги­он для началь­ной переда­чи и резер­вации сло­тов. RATDMA так­же исполь­зует­ся для переда­чи корот­ких сооб­щений. ITDMA исполь­зует­ся для анон­сирова­ния изме­нений в переда­че.

Класс Б

В устрой­ствах клас­са Б мож­но заметить CS и SO, это два раз­ных типа, которые рас­шифро­выва­ются как Carrier Sense и Self Organising соот­ветс­твен­но. CS могут исполь­зовать толь­ко CSTDMA, а SO исполь­зуют схе­мы дос­тупа клас­са А, но с некото­рыми огра­ниче­ниями в мощ­ностях.

Наземные станции

На­зем­ные стан­ции исполь­зуют FATDMA и RATDMA. Сло­ты FATDMA нас­тра­ивают­ся отдель­но и переда­ются дру­гим при­емни­кам с помощью анон­сов. RATDMA исполь­зует­ся для переда­чи корот­ких непери­оди­чес­ких сооб­щений.

ATON

ATON работа­ют с FATDMA и RATDMA, в зависи­мос­ти от началь­ной кон­фигура­ции устрой­ства. ATON пер­вого типа работа­ют толь­ко с FATDMA. Такая схе­ма дос­тупа тре­бует наличия рядом назем­ной стан­ции, которая будет анон­сировать сло­ты для ATON. ATON треть­его типа может как при­нимать, так и переда­вать дан­ные, так что для переда­чи дан­ных подой­дет RATDMA или FATDMA.

SART

Спа­сатель­ные передат­чики SART исполь­зуют толь­ко PATDMA.

Форматы и кодирование сигналов

Про сло­ты мы уже погово­рили, теперь необ­ходимо опре­делить­ся с фор­матом и типами сооб­щений в AIS. Для начала отме­чу, что дли­тель­ность каж­дого сло­та в переда­че — 26,66 мс. Мож­но опре­делить мак­сималь­ную дли­ну сооб­щения для ско­рос­ти 9600 бит/с.

При округле­нии получа­ем ров­но 256 бит информа­ции на каж­дый слот. Но сооб­щения на самом деле могут быть длин­нее и занимать до пяти сло­тов, в таком слу­чае флаг окон­чания будет передан толь­ко через вре­мя, которое будет боль­ше 26,66. Перед отправ­кой такого боль­шого сооб­щения передат­чик дол­жен сооб­щить о нем.

Пе­рей­дем непос­редс­твен­но к фор­мату сооб­щения. Оно модули­рует­ся в GMSK, а зна­чит, при демоду­ляции мы получа­ем пос­ледова­тель­ность битовых дан­ных. Это не слу­чай­ная пос­ледова­тель­ность.

Формат сообщения AIS
Фор­мат сооб­щения AIS

Раз­берем поля основно­го сооб­щения и дан­ных.

Важ­но упо­мянуть, что AIS работа­ет с кад­рами про­токо­ла HDLC (High-Level Data Link Control). Это про­токол каналь­ного уров­ня сетевой модели OSI.

Фор­мат HDLC работа­ет с фла­гами «стоп» и «старт», и у них есть спе­циаль­ные пос­ледова­тель­нос­ти. Нап­ример, 01111110 — это сиг­налы «старт» и «стоп». Но что, если такая пос­ледова­тель­ность встре­тит­ся в самих дан­ных AIS? Что­бы это­го избе­жать, пос­ле пяти еди­ниц встав­ляют один ноль, что поз­воля­ет разор­вать такие пос­ледова­тель­нос­ти. Так как NRZI — это осно­ва переда­чи в AIS, раз­берем­ся с ним под­робнее.

NRZI

NRZI (Non Return to Zero Invertive) — спо­соб кодиро­вания дан­ных для переда­чи через канал. Битовая пос­ледова­тель­ность прев­раща­ется в код, в котором не будет длин­ных непере­ходя­щих сиг­налов, нап­ример десяти еди­ниц или нулей под­ряд. Это необ­ходимо для того, что­бы при­емник всег­да понимал, ког­да изме­няет­ся сиг­нал, и кор­рек­тно мог при­нять любое сооб­щение, не сби­ваясь. Как работа­ет NRZI, вид­но на сле­дующей кар­тинке.

Кодирование NRZI
Ко­диро­вание NRZI

Ес­ли обоб­щить кодиро­вание, то получа­ется сле­дующее пра­вило: логичес­кая еди­ница пред­став­ляет­ся изме­нени­ем уров­ня сиг­нала, а логичес­кий ноль пред­став­ляет­ся отсутс­тви­ем изме­нения уров­ня сиг­нала.

Возь­мем прос­той сиг­нал с кар­тинки: 0101. Для его кодиро­вания в NRZI необ­ходимо начать с самого начала. Пер­вый у нас 0, зна­чит, в NRZI-кодиро­вании это будет низ­кий уро­вень сиг­нала, так как изме­нения нет. Даль­ше идет 1, уро­вень сиг­нала NRZI уже высокий, так как про­изош­ло изме­нение. Затем идет 0, и уро­вень сиг­нала остался высоким, так как сле­дующий сим­вол ока­зал­ся 0, а изме­нения тре­бует толь­ко еди­ница. Ну и пос­ледний сим­вол — 1 тре­бует изме­нения сиг­нала, поэто­му в кон­це будет низ­кий уро­вень.

На при­мере кода 11111 вид­но, что сиг­нал всег­да изме­няет­ся, так как еди­ница всег­да тре­бует изме­нения сиг­нала. Декоди­ровать NRZI мож­но, срав­нивая прош­лое и текущее сос­тояние сиг­нала. Важ­но учесть, что перед отправ­лени­ем пакета AIS он весь кодиру­ется с помощью NRZI, даже пре­амбу­ла.

Ал­горитм декоди­рова­ния NRZI мож­но про­ана­лизи­ровать в коде GNU AIS, там показан самый при­митив­ный и эффектив­ный вари­ант.

for (i = 0; i < len; i++) {
out = filtered[i];
curr = (out > 0);
if ((curr ^ rx->prev) == 1) { // Детектирование пересечения нуля
if (rx->pll < (0x10000 / 2)) {
rx->pll += rx->pllinc / INC;
} else {
rx->pll -= rx->pllinc / INC;
}
}
rx->prev = curr;
rx->pll += rx->pllinc;
if (rx->pll > 0xffff) {
/* slice */
bit = (out > 0);
/* nrzi decode */
b = !(bit ^ rx->lastbit);
/* feed to the decoder */
protodec_decode(&b, 1, rx->decoder);
rx->lastbit = bit;
rx->pll &= 0xffff;
}
}

Ав­торы детек­тиру­ют пересе­чение нуля и декоди­руют сооб­щение на осно­ве прош­лых зна­чений. Так­же тут учте­но нес­коль­ко осо­бен­ностей. Если пересе­чение нуля про­исхо­дит рань­ше чем 1/2 пери­ода сим­вола, то пери­од в rx->pll рас­ширя­ется на 1/16 от пери­ода сем­пли­рова­ния, а если слу­чает­ся наобо­рот, то пери­од умень­шает­ся. Такой алго­ритм сам себя подс­тра­ивает, что доволь­но эффектив­но.

Bit stuffing

Итак, рань­ше упо­мина­лось, что при переда­че дан­ных в AIS могут встре­тить­ся сис­темные пос­ледова­тель­нос­ти. Нап­ример, в теле сооб­щения может появить­ся пос­ледова­тель­ность Stop Flag, которая озна­чает конец переда­чи, но на самом деле ею не явля­ется. Что­бы избе­жать таких проб­лем, была раз­работа­на сис­тема, которая добав­ляет нули в спе­циаль­ные мес­та сооб­щения, тем самым сби­вая пос­ледова­тель­нос­ти еди­ниц. Выг­лядит это сле­дующим обра­зом: если в битовом потоке будет боль­ше пяти еди­ниц, то пос­ле них дол­жен быть добав­лен ноль.

0011111101011 — исходные данные
0011111[0]101011 данные с bit stuffing

Как вид­но в при­мере, ноль разор­вал неп­рерыв­ные еди­ницы. Как работа­ют декоде­ры с bit stuffing, мож­но так­же изу­чить на при­мере исходно­го кода GNU AIS.

case ST_DATA:
if (d->bitstuff) {
if (in[i] == 1) {
d->state = ST_STOPSIGN;
d->ndata = 0;
DBG(printf("%d", in[i]));
d->bitstuff = 0;
} else {
d->ndata++;
d->last = in[i];
d->bitstuff = 0;
}
} else {
if (in[i] == d->last && in[i] == 1) {
d->antallenner++;
// Если на счетчике уже 4 (5), то выставляем bitstuff в 1
if (d->antallenner == 4) {
d->bitstuff = 1;
d->antallenner = 0;
}
} else
d->antallenner = 0;
DBG(printf("%d", in[i]));
d->buffer[d->bufferpos] = in[i];
d->bufferpos++;
d->ndata++;
if (d->bufferpos >= 449) {
protodec_reset(d);
}
}
break;

Тут обра­баты­вает­ся два вари­анта: в пер­вом слу­чае пос­ледова­тель­ность еди­ниц рас­ценива­ется как обыч­ные дан­ные, если пос­ле пяти еди­ниц идет ноль. В дру­гом вари­анте если пос­ле пяти еди­ниц идет еди­ница, то пос­ледова­тель­ность счи­тает­ся стоп‑фла­гом и чте­ние фрей­ма оста­нав­лива­ется.

NMEA и формат передачи

Сис­темы AIS могут переда­вать дан­ные как внут­ри кораб­ля, нап­ример от дат­чика к глав­ной сис­теме, так и меж­ду кораб­лями и дру­гими объ­екта­ми. Дан­ные от при­емни­ка AIS и от дат­чиков кораб­ля переда­ются в фор­мате NMEA 0183, это стан­дарт свя­зи для мор­ско­го обо­рудо­вания. Дан­ные в этом фор­мате мож­но получить, под­клю­чив­шись к тер­миналу AIS. Важ­но заметить, что этот фор­мат не исполь­зует­ся в переда­че, при при­еме при­емник кон­верти­рует бинар­ные дан­ные в NMEA.

Дан­ные в таком фор­мате выг­лядят сле­дующим обра­зом:

!AIVDM,1,1,,A,155uT`0000Su4vt>MGIUPH4d08<Q,0*02

Все сим­волы в сооб­щении всег­да дол­жны быть в чита­емом диапа­зоне. Раз­берем фор­мат NMEA.

Фор­мат сооб­щения NMEA понятен, но в самом сооб­щении NMEA есть и дру­гие свой­ства, такие как тип сооб­щения, иден­тифика­тор передат­чика, зарезер­вирован­ные под bit stuffing поля и сос­тояние репите­ра. Дли­на сооб­щения NMEA тоже может варь­иро­вать­ся. Что­бы ты луч­ше понял струк­туру сос­тавных сооб­щений, при­веду при­мер сооб­щений с раз­ными номера­ми, но отно­сящих­ся к одно­му пред­ложению.

!AIVDM,2,1,1,,59@>k542E5M@CH7?CC@aT4pG:2222222222222167P9785@e000c@@PPDp888,0*66
!AIVDM,2,2,1,,8888888880,2*5c

Как вид­но, у этих сооб­щений в поле «Количес­тво дан­ных» сто­ит 2, номер сооб­щений раз­ный, а иден­тифика­тор — один, так как они оба отно­сят­ся к одно­му сооб­щению.

По­гово­рим о том, как рас­шифро­вать сооб­щение NMEA для его обра­бот­ки. Выг­лядит сооб­щение как набор слу­чай­ных сим­волов, но на самом деле оно закоди­рова­но с исполь­зовани­ем AIS-ASCII6. AIS-ASCII6 — это таб­лица, где каж­дый сим­вол озна­чает опре­делен­ный набор битов.

Таблица ASCII6
Таб­лица ASCII6

Пер­вый шаг для декоди­рова­ния — перевод всех сим­волов в их бинар­ное пред­став­ление. Если мы возь­мем пер­вое сооб­щение, то 155 из его начала мож­но пред­ста­вить как 000001 000101 000101. Пер­вые 6 бит сооб­щения, то есть пер­вый сим­вол, показы­вают тип сооб­щения, в дан­ном слу­чае это 000001 — пер­вый тип. Все­го извес­тно 27 типов сооб­щения, все их перечис­лять нет смыс­ла, мож­но пос­мотреть в докумен­те на сай­те allaboutais.com (PDF). Основные типы — это 1, 2 и 3, которые отве­чают за авто­мати­чес­кую переда­чу позиции.

Сле­дом идут 2 бита типа пов­тора, то есть сколь­ко раз сооб­щение будет пов­торять­ся. 0 — обыч­ное интерваль­ное сооб­щение, 3 — сооб­щение боль­ше не будет пов­торять­ся. Сле­дом — номер MMSI, уни­каль­ный иден­тифика­тор обо­рудо­вания, по которо­му мож­но опре­делить тип передат­чика и дру­гие осо­бен­ности.

Это основные поля, которые всег­да есть во всех сооб­щени­ях. Осталь­ные поля могут менять­ся в зависи­мос­ти от типа сооб­щения, ты можешь изу­чить их в докумен­тах по AIS. В общем слу­чае переда­ча тран­спон­деров клас­са А с дан­ными о позиции име­ет струк­туру, опи­сан­ную в начале статьи. Эта струк­тура исполь­зует­ся при переда­че.

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

MSB и LSB

Пе­ред кодиро­вани­ем и демоду­ляци­ей погово­рим вот об этом пун­кте в докумен­тации:

When data is output on the VHF data link it should be grouped in bytes of 8 bits from top to bottom of the table associated with each message in accordance with ISO/IEC 13239:2002. Each byte should be output with least significant bit first. During the output process, data should be subject to bit-stuffing (see § 3.2.2) and NRZI coding (see § 2.6).

То есть при при­еме дан­ных с VHF необ­ходимо сгруп­пировать дан­ные по 8 бит в бай­ты и вывес­ти их, начиная с LSB. Раз­ница меж­ду LSB и MSB хорошо показа­на на сле­дующей кар­тинке.

LSB и MSB
LSB и MSB

Сле­дова­тель­но, нуж­но кон­верти­ровать вывод дан­ных из MSB в LSB пос­ле при­ема и, соот­ветс­твен­но, в MSB из LSB при переда­че. Это важ­но учи­тывать. Так­же мож­но най­ти инте­рес­ный код в GNU AIS, который авто­ры почему‑то обоз­начили как /* what is this? */. Этот код как раз и отве­чает за кон­верта­цию MSB в LSB перед про­вер­кой CRC.

/* what is this? */
buf = (unsigned char *) hmalloc(sizeof(*buf) * buflen);
for (j = 0; j < buflen; j++) {
tmp = 0;
for (i = 0; i < 8; i++)
tmp |= (((d->buffer[i + 8 * j]) << (i)));
printf("tmp: %d\n", tmp);
buf[j] = tmp;
}
/* ok, here’s the actual CRC calculation */
unsigned short crc = protodec_sdlc_crc(buf, buflen);
//DBG(printf("CRC: %04x\n",crc));
/* what is this? */
memset(d->rbuffer, 0, DEMOD_BUFFER_LEN);
for (j = 0; j < length_bytes; j++) {
for (i = 0; i < 8; i++) {
x = j * 8 + i;
if (x >= DEMOD_BUFFER_LEN) {
hlog(LOG_ERR, "protodec_calculate_crc: would run over rbuffer length");
hfree(buf);
return 0;
} else {
d->rbuffer[x] = (buf[j] >> (7 - i)) & 1;
}
}
}

Сна­чала в цик­ле все груп­пиру­ется в бай­ты, потом, пос­ле про­вер­ки CRC, обратно в биты уже в нуж­ном поряд­ке вывода. В мас­сиве rbuffer уже пра­виль­ная пос­ледова­тель­ность, которую мож­но пар­сить по струк­туре, опи­сан­ной выше.

Кодирование сигнала

Ос­тановим­ся на кодиро­вании сиг­нала, что­бы сис­темати­зиро­вать схе­му. Пер­воначаль­но у нас есть какая‑то информа­ция, далее кодиру­ем ее для переда­чи и декоди­руем пос­ле при­ема. Общая схе­ма кодиро­вания таких дан­ных для переда­чи AIS выг­лядит так: BIN → MSB/LSB → BIT STUFFING → NRZI → GMSK.

Схе­ма для при­ема будет сле­дующей: GMSK → NRZI → BIT STUFFING → LSB/MSB → BIN → NMEA.

Записываем сигнал

На­конец‑то пос­ле неболь­шого лик­беза, который, кста­ти, еще мож­но мно­го чем допол­нить, перехо­дим к прак­тике. Начать сто­ит с записи сиг­нала, который мы будем иссле­довать. Луч­ше все­го записы­вать сиг­нал где‑то в бли­жай­шем пор­ту, там мож­но получить дан­ные не толь­ко с кораб­лей, но и с назем­ных стан­ций. Для записи мож­но исполь­зовать раз­ные средс­тва, начиная от HackRF PortaPack и закан­чивая дороги­ми SDR. Я исполь­зую в сво­их экспе­римен­тах BladeRF, так что все дей­ствия будут в основном опи­саны для это­го SDR. Мой опыт ты можешь лег­ко спро­еци­ровать на HackRF и RTL-SDR. Давай соберем в GNU Radio схе­му для записи сиг­нала с двух каналов AIS в файл.

Схема GNU Radio для записи в файл
Схе­ма GNU Radio для записи в файл

Схе­ма сос­тоит из четырех основных эле­мен­тов, два из которых отве­чают за вывод информа­ции на экран. Начина­ется все с Osmocom Source, где в качес­тве аргу­мен­та переда­но bladerf=0, что дает бло­ку понять тип источни­ка, в дан­ном слу­чае это BladeRF. Час­тота на нулевом канале выс­тавле­на в 162 МГц, а ширина канала — в 200 кГц. Час­тота сем­пли­рова­ния (sample rate) в моем слу­чае 2 MSPS, минималь­ное же зна­чение для AIS находит­ся где‑то око­ло 48 тысяч, но советую брать 1 MSPS как стан­дар­тное зна­чение.

Та­кие нас­трой­ки поз­воля­ют записать сра­зу оба канала, в будущем мы раз­делим их на два отдель­ных фай­ла для ана­лиза. Блок File Sink отве­чает за сох­ранение дан­ных в файл. Два дру­гих бло­ка — Frequency Sink и Waterfall Sink — помога­ют понять, вер­но ли идет запись сиг­нала. При пра­виль­ной нас­трой­ке и хорошей антенне ты дол­жен находить сле­дующие сиг­налы на Waterfall.

Вид Waterfall при записи сигнала
Вид Waterfall при записи сиг­нала

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

Демодуляция

Для демоду­ляции и декоди­рова­ния AIS есть мно­жес­тво про­ектов на GitHub и на форумах, пос­вящен­ных радио. Все такие про­екты работа­ют доволь­но прос­то: нуж­но либо под­клю­чить твой SDR, либо запус­тить записан­ный файл. Все это не очень инте­рес­но. В этой статье мы поп­робу­ем сде­лать демоду­лятор в GNU Radio, кон­верти­ровать дан­ные из IQ-сиг­нала в IQ-файл для GNU AIS и изу­чим, как работа­ет SDRangel, на при­мере демоду­ляции и декоди­рова­ния AIS.

SDRangel

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

Интерфейс SDRangel
Ин­терфейс SDRangel

Преобразование IQ в WAV

Пе­ред изу­чени­ем нашей записи в SDRangel необ­ходимо пре­обра­зовать ее в фор­мат либо WAV, либо SDRIQ. SDRangel работа­ет толь­ко с эти­ми дву­мя фор­матами. Самый прос­той вари­ант — пре­обра­зовать исходный файл RAW IQ из GNU Radio в двух­каналь­ный WAV. В пер­вом канале будет реаль­ная часть ком­плексно­го чис­ла, а во вто­рой — мни­мая. IQ-файл сос­тоит толь­ко из ком­плексных чисел, так что перед сох­ранени­ем их нуж­но раз­делить.

Ис­поль­зуем сле­дующую схе­му для GNU Radio.

Преобразование RAW IQ в WAV
Пре­обра­зова­ние RAW IQ в WAV

Пос­ле запус­ка дол­жен появить­ся WAV-файл. В бло­ке Wav File Sink нуж­но выб­рать два канала, так как сох­ранять мы собира­емся имен­но в два канала. Блок Complex To Float пре­обра­зует ком­плексное чис­ло в re и im (реаль­ную и мни­мую час­ти) и переда­ет их в каналы WAV-фай­ла. Теперь мож­но перей­ти непос­редс­твен­но к SDRangel.

Демодуляция и декодирование AIS

Для начала работы мож­но исполь­зовать под­готов­ленный спе­циаль­но для AIS рабочий стол SDRangel. Най­ти его мож­но на вклад­ке Prefereneces → Configurations → AIS. Опять же это не очень весело и поз­наватель­но, поэто­му сде­лаем все с нуля. Для начала нуж­но добавить источник сиг­нала. Это дела­ется с помощью кноп­ки Add RX Device. Далее выбира­ем источник File Source и нажима­ем «Добавить».

Добавление источника в SDRangel
До­бав­ление источни­ка в SDRangel

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

Waterfall для источника в SDRangel
Waterfall для источни­ка в SDRangel

Те­перь к уже готово­му источни­ку мож­но под­клю­чить демоду­лято­ры для AIS. Так как у нас файл с дву­мя канала­ми, нам нуж­но добавить два демоду­лято­ра для двух раз­ных час­тот: один для –25 кГц, вто­рой — для +25 кГц. Сде­лать это мож­но, нажав кноп­ку Add Channels в бло­ке, где ты выбирал файл.

Да­лее в меню выбира­ем AIS Demodulator и так дела­ем два раза. На экра­не появят­ся два новых экра­на, которые мож­но раз­местить на рабочем прос­транс­тве как угод­но. Пос­ле добав­ления двух демоду­лято­ров нуж­но нас­тро­ить сдвиг час­тоты для каж­дого. У одно­го ста­вим -25000, а у вто­рого 25000. В ито­ге дол­жно получить­ся что‑то сле­дующе­го вида.

SDRangel — демодулятор и декодер AIS
SDRangel — демоду­лятор и декодер AIS

Как вид­но на скрин­шотах, SDRangel уже успешно демоду­лиро­вал и декоди­ровал нес­коль­ко сооб­щений AIS. Так как SDRangel не под­держи­вает все виды сооб­щений, не мешало бы получить их в сыром виде для даль­нейшей обра­бот­ки. Этим мы и зай­мем­ся с помощью GNU Radio.

GNU Radio

Са­мое инте­рес­ное, изю­мин­ка и жем­чужина статьи — демоду­ляция в GNU Radio. Без исполь­зования допол­нитель­ного прог­рам­мно­го обес­печения, без готовых демоду­лято­ров с GitHub и так далее. Толь­ко базовые бло­ки GNU Radio!

Исследуем сигнал

Вспом­ним, что в фай­ле записа­ны сра­зу два канала AIS, сле­дова­тель­но, если мы хотим демоду­лиро­вать их одновре­мен­но, нуж­но сдви­нуть демоду­лятор в две раз­ные сто­роны, желатель­но отфиль­тро­вать часть шумов. Для таких манипу­ляций в GNU Radio есть блок с наз­вани­ем Frequency Xlating FIR Filter, что мож­но перевес­ти как час­тотно‑сдви­гающий КИХ‑филь­тр (филь­тр с конеч­ной импуль­сной харак­терис­тикой). По наз­ванию понят­но, что этот вид филь­тров может и сдви­гать, и филь­тро­вать сиг­нал. Так­же этот блок может ресем­пли­ровать сиг­нал, нам это необ­ходимо.

Да­лее нуж­но еще более точ­но ресем­пли­ровать сиг­нал для точ­ной GMSK-демоду­ляции, дела­ем это с помощью бло­ка Rational Resampler. Нам нуж­ны оба бло­ка для ресем­пли­рова­ния, если мы хотим получить слож­ное чис­ло сем­плов для точ­ного GMSK-демоду­лиро­вания.

Пос­ле сдви­га и филь­тра­ции мож­но перехо­дить непос­редс­твен­но к демоду­ляции, в GNU Radio есть отдель­ный блок для GMSK — GMSK Demod, но для квад­ратур­ных модуля­ций мож­но исполь­зовать так­же Quadrature Demod. Так как пос­ле GMSK у нас будет код NRZI, его тоже мож­но сра­зу декоди­ровать в GNU Radio, это ста­ло воз­можно в недав­них вер­сиях.

Раз­берем теперь три основных бло­ка: FIR Filter, Rational Resampler и GMSK Demod.

Frequency Xlating FIR Filter
FIR Filter и его настройки в GNU Radio
FIR Filter и его нас­трой­ки в GNU Radio

В самом филь­тре есть пять основных парамет­ров:

Ес­ли мы хотим исполь­зовать этот филь­тр не толь­ко для сдви­га и децима­ции, необ­ходимо добавить век­тор пре­обра­зова­ния. Зна­чение в поле децима­ции исполь­зует­ся как зна­мена­тель для ресем­пли­рова­ния. Нап­ример, если исходная час­тота сем­пли­рова­ния была 2 000 000, то при зна­чении 20 на выходе мы получим 2 000 000/20 = 100 000. В при­мере нас­трой­ки на скрин­шоте цен­траль­ная час­тота сто­ит -25e3, что зна­чит –25 на 10 в сте­пени –3. Это сдвиг на пер­вый канал AIS.

Изу­чим taps и визу­аль­ный при­мер работы филь­тра.

Работа FIR-фильтра
Ра­бота FIR-филь­тра

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

firdes.low_pass(1, samp_rate, 15000, 20000, window.WIN_HAMMING, 1)

Это филь­тр ниж­них час­тот, который выг­лядит как вызов фун­кции. Для объ­ясне­ния его работы изу­чим его аргу­мен­ты. Пер­вым идет коэф­фици­ент уси­ления; так как уси­ливать ничего не нуж­но, он ука­зан как 1. Далее — час­тота сем­пли­рова­ния в виде перемен­ной. Два сле­дующих аргу­мен­та — час­тота сре­за и ширина переход­ной области, в дан­ном слу­чае час­тоты ниже 15 000 будут про­пус­кать­ся, а час­тоты выше — подав­лять­ся.

Ши­рина переход­ной области — это ширина области, в которой филь­тр перехо­дит от про­пус­кания к подав­лению. Далее идет окон­ная фун­кция, в нашем слу­чае это окно Хэм­минга. Пос­ледний аргу­мент не игра­ет роли для Хэм­минга, но отве­чает за фор­му окна для дру­гих окон­ных фун­кций. Окон­ные фун­кции исполь­зуют­ся для сгла­жива­ния спек­тров, за счет сгла­жива­ния кра­ев дан­ных при обра­бот­ке сиг­налов.

Rational Resampler
Блок Rational Resampler
Блок Rational Resampler

Сле­дующий важ­ный для ресем­пли­рова­ния блок — Rational Resampler. Что­бы получить более точ­ную час­тоту сем­пли­рова­ния, нап­ример если нуж­но целое чис­ло выборок на сим­вол (как в нашем слу­чае), прос­тым делени­ем иног­да не обой­тись. У Rational Resampler есть два парамет­ра: интерпо­ляция и децима­ция. При ресем­пли­рова­нии сиг­нала исходная час­тота сем­пли­рова­ния сна­чала умно­жает­ся на интерпо­ляцию, а потом делит­ся на децима­цию. Таким обра­зом мож­но вычис­лить и подог­нать час­тоту под наши нуж­ды.

GMSK Demod
Блок GMSK Demod
Блок GMSK Demod

Это глав­ный блок, который отве­чает непос­редс­твен­но за демоду­ляцию и син­хро­низа­цию сиг­нала. На самом деле этот блок сос­тоит из квад­ратур­ного демоду­лято­ра и син­хро­низа­ции сим­волов для вос­ста­нов­ления их пат­тернов. Квад­ратур­ную демоду­ляцию я рас­смот­рел выше, и мы еще о ней погово­рим при сос­тавле­нии схе­мы для GNU Radio.

Ос­новные парамет­ры это Samples/Symbol — количес­тво выборок на сим­вол, имен­но под этот параметр мы под­гоняли час­тоту сем­пли­рова­ния и параметр Gain Mu, который отве­чает за саму демоду­ляцию и под­бира­ется опыт­ным путем. Как вид­но, на вхо­де у это­го бло­ка ком­плексные чис­ла, а на выходе получа­ем уже демоду­лиро­ван­ные биты, которые мож­но либо сох­ранить в файл, либо обра­ботать.

Схема для GMSK Demod

Да­вай соберем прос­тую двух­каналь­ную схе­му для демоду­ляции AIS на осно­ве GMSK Demod.

Двухканальный демодулятор для AIS
Двух­каналь­ный демоду­лятор для AIS

Схе­ма чита­ется сле­ва нап­раво. Началь­ный блок File Source чита­ет дан­ные из ранее записан­ного фай­ла. В нас­трой­ках бло­ка я ука­зал Repeat: Yes, что­бы файл пов­торял­ся пос­ле кон­ца. Далее идет раз­деление на два канала, с помощью КИХ‑филь­тров. Пер­вый филь­тр дает сме­щение на –25 кГц, а вто­рой на +25 кГц. Добав­лю, что началь­ная час­тота сем­пли­рова­ния была 2 000 000 выборов в секун­ду, но пос­ле КИХ‑филь­тров с децима­тором 20 она рав­на 100 000, так как 2 000 000/20 = 100 000.

Да­лее идет ресем­плер, наша задача — получить более двух выборок на сим­вол в GMSK-демоду­лято­ре. Ско­рость переда­чи дан­ных в AIS — 9600 бит/с, то есть для минималь­ной работы GMSK-демоду­лято­ра нам нуж­но 9600 * 2 = 19 200 сем­плов в секун­ду. Для луч­шей работы я опи­рал­ся на 9600 * 4, то есть 38 400.

Что­бы получить такое ров­ное чис­ло на выходе, нуж­но най­ти решение урав­нения сле­дующе­го вида:

Под­став­ляя эти коэф­фици­енты, получим нуж­ное количес­тво сем­плов на сим­вол в GMSK Demod. Сам блок GMSK Demod я опыт­ным путем нас­тро­ил на зна­чение 500e-3 для Gain Mu. Если будешь собирать свою схе­му, поп­робуй зна­чения от 300e-3 до 500e-3, пока не нач­нет появ­лять­ся пре­амбу­ла и стар­товый флаг. Оба эти парамет­ра и методы отладки я опи­шу ниже.

Пос­ле бло­ка GMSK Demod в каж­дом канале добав­лен блок для сох­ранения дан­ных до декоди­рова­ния NRZI, потом идет блок декоди­рова­ния NRZI и опять сох­ранение фай­ла. Это было сде­лано для ана­лиза работы декоде­ра NRZI.

Ме­тоды отладки

Так как любая схе­ма тре­бует отладки, рас­смот­рим нас­трой­ку этой схе­мы с исполь­зовани­ем прос­того скрип­та на Python и любого тек­сто­вого редак­тора. Для отладки вни­матель­но перес­читыва­ем Sample Rate до GMSK Demod и про­веря­ем параметр выборок на сим­вол в GMSK Demod. Сле­дующий шаг — под­бор вер­ного зна­чения Gain Mu, для это­го нуж­но нес­коль­ко раз демоду­лиро­вать файл с раз­ными зна­чени­ями от 300e-3 до 500e-3 и изу­чить содер­жимое вывода. Так как на выходе получа­ется бинар­ный файл и искать по нему в тек­сто­вом докумен­те неудоб­но, я раз­работал скрипт, кон­верти­рующий файл в тек­сто­вый фор­мат.

#!/usr/bin/python3
import argparse
def read_bits_from_file(file_path):
with open(file_path, 'rb') as file:
byte = file.read(1)
while byte:
if byte == b'\x00':
yield 0
elif byte == b'\x01':
yield 1
else:
exit(1)
byte = file.read(1)
def main():
parser = argparse.ArgumentParser(description='Process a binary file')
parser.add_argument('file_path', type=str, help='Path to the binary file')
args = parser.parse_args()
bit_stream = read_bits_from_file(args.file_path)
with open('result_conversion', 'a') as f:
for bit in bit_stream:
f.write(str(bit))
if __name__ == '__main__':
main()

Пос­ле кон­верта­ции фай­ла с демоду­лиро­ван­ными зна­чени­ями важ­но вспом­нить струк­туру сооб­щений в AIS. Важ­ные ее ком­понен­ты — пре­амбу­ла и стар­товый флаг, которые всег­да рав­ны одно­му зна­чению. Я рекомен­дую исполь­зовать имен­но пре­амбу­лу и стар­товый флаг вмес­те. Из‑за того что пре­амбу­ла — это пос­ледова­тель­ность пов­торя­ющих­ся сим­волов, иног­да ее мож­но най­ти даже в шумах. Итак, пре­амбу­ла — это 24 бита, выг­лядят они вот так:

010101010101010101010101

Стар­товый флаг — 8 бит:

01111110

Ес­ли соеди­нить оба этих зна­чения, то получим сле­дующее зна­чение:

01010101010101010101010101111110

От­кры­ваем кон­верти­рован­ный файл и пыта­емся най­ти в поис­ке нашу пос­ледова­тель­ность. Если нашел, зна­чит, Gain Mu и дру­гие парамет­ры подоб­раны вер­но.

Демодулированные последовательности в файле
Де­моду­лиро­ван­ные пос­ледова­тель­нос­ти в фай­ле

Так­же ты можешь кон­верти­ровать зна­чения пре­амбу­лы из стар­тового фла­га в код NRZI онлайн и най­ти их в RAW-фай­ле, который был соз­дан до NRZI-декоди­рова­ния.

За­пус­каем

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

Пос­ле запус­ка дол­жна появить­ся сле­дующая кар­тинка и фай­лы с нашими дан­ными.

Водопад в схеме с GMSK Demod
Во­допад в схе­ме с GMSK Demod

Важ­но уточ­нить, что в этой схе­ме нет бло­ка Throttle, который замед­ляет обра­бот­ку. Без него сиг­нал обра­бота­ется нам­ного быс­трее того вре­мени, которое он дол­жен был бы идти, так что водопад может обор­вать­ся быс­трее, чем ты ожи­даешь. Что­бы это испра­вить, добавь блок Throttle пос­ле File Source. Схе­ма в дан­ном слу­чае уже отла­жена, и мы можем изу­чить вывод фай­ла, как это было показа­но в при­мере с отладкой.

Ты можешь поп­робовать рас­шифро­вать любой фрейм по опи­санию выше. Но для прос­той про­вер­ки мож­но исполь­зовать тип переда­ваемо­го сиг­нала, это пер­вые 6 бит пос­ле стар­тового фла­га. Даль­нейшее декоди­рова­ние воз­можно толь­ко пос­ле уда­ления bit stuffing, а имен­но одно­го нуля пос­ле пяти еди­ниц.

Нуж­но уби­рать нули до пос­ледова­тель­нос­ти кон­ца сиг­нала (она выг­лядит как стар­товый сиг­нал). При­мер уда­ления bit stuffing показан ниже.

Ис­ходный сиг­нал:

01010101010101010101010101111110001000011000111000101010111010010100000100000100000001111000000010111111011010101111110

Пре­амбу­ла:

010101010101010101010101

Стар­товый флаг:

01111110

Дан­ные и хеш‑сум­ма:

00110000000001011100100011110110100011110000001000000000000011101011111[0]11000010011110101011100001010111001000010011011111[0]101001011011000001000101100000011100010010110000011100110101100

Флаг окон­чания сооб­щения:

01111110

Вы­делим нули, встав­ленные с помощью bit stuffing:

00110000000001011100100011110110100011110000001000000000000011101011111[0]11000010011110101011100001010111001000010011011111[0]101001011011000001000101100000011100010010110000011100110101100

Уби­раем их:

0011000000000101110010001111011010001111000000100000000000001110101111111000010011110101011100001010111001000010011011111101001011011000001000101100000011100010010110000011100110101100

В конеч­ном сче­те получа­ем битовые дан­ные без bit stuffing, готовые к декоди­рова­нию. Не забыва­ем про LSB и MSB: кон­верти­руем толь­ко пер­вый байт в LSB, что­бы получить тип сооб­щения. Узна­ем тип сооб­щения, то есть пер­вые 6 бит:

00110000 -> [000011]00

При перево­де 000011 в десятич­ную сис­тему получа­ем 3, то есть тип сооб­щения 3, а это переда­ча позиции суд­на.

Схема для Quadrature Demod

Схе­ма с GMSK Demod име­ет неп­рият­ную осо­бен­ность: в ней нет пол­ного кон­тро­ля над демоду­ляци­ей. Так как это цель­ный блок, мы не можем отдель­но нас­тро­ить син­хро­низа­цию сим­волов и демоду­ляцию. Что­бы испра­вить это, мож­но перей­ти к более низ­коуров­невым бло­кам: Quadrature Demod и Symbol Sync. Оба этих бло­ка — часть GMSK Demod, но их исполь­зование поз­волит нам более деталь­но изу­чить про­цесс демоду­ляции.

Раз­берем сле­дующую схе­му.

Схема с Quadrature Demod
Схе­ма с Quadrature Demod

Схе­ма соз­дана толь­ко для одно­го канала, начало соот­ветс­тву­ет GMSK Demod, КИХ‑филь­тр и ресем­плер нас­тро­ены соот­ветс­тву­ющим обра­зом. Схе­ма выг­лядит ина­че, начиная с бло­ка Quadrature Demod, который отве­чает непос­редс­твен­но за квад­ратур­ную демоду­ляцию.

Бла­года­ря пол­ному кон­тро­лю над демоду­ляци­ей с помощью бло­ков Time Sink мы можем изу­чать, как выг­лядит сиг­нал пос­ле демоду­ляции и как он выг­лядит пос­ле син­хро­низа­ции сим­волов. Для это­го необ­ходимо вклю­чить в нас­трой­ках Time Sink панель управле­ния, что­бы мож­но было изме­нять харак­терис­тики бло­ка пря­мо во вре­мя его работы. Рас­смот­рим сиг­нал пос­ле демоду­ляции в бло­ке Quadrature Demod.

Сигнал после блока Quadrature Demod
Сиг­нал пос­ле бло­ка Quadrature Demod

Как вид­но, пос­ле демоду­ляции сиг­нал ста­новит­ся похожим на что‑то чита­емое и декоди­руемое. Для более точ­ной демоду­ляции необ­ходимо син­хро­низи­ровать начало и конец битов, для это­го исполь­зует­ся блок Symbol Sync. Давай гля­нем его вывод.

Сигнал после Symbol Sync
Сиг­нал пос­ле Symbol Sync

У сиг­нала пос­ле син­хро­низа­ции дру­гой вид, так как количес­тво выборов было умень­шено с 4 до 1, но со сво­ей задачей блок спра­вил­ся. Теперь сим­волы син­хро­низи­рова­ны по вре­мени и мож­но переда­вать вывод в блок Binary Slicer, который, исполь­зуя спе­циаль­ные алго­рит­мы, прев­ратит этот сиг­нал в битовую пос­ледова­тель­ность и сох­ранит в файл.

Ме­тоды отладки

Эту схе­му отла­дить тяжелее, чем с GMSK Demod, так как в ней боль­ше парамет­ров. Основной прин­цип отладки — изме­нение Gain у Quadrature Demod и изме­нение алго­рит­мов Symbol Sync. Это поз­волит нам получить пра­виль­ную син­хро­низа­цию.

За­пуск

Пос­ле запус­ка получа­ем файл 88_quadra, который кон­верти­руем в тек­сто­вый и методом из GMSK Demod про­веря­ем, есть ли там пре­амбу­лы со стар­товым фла­гом.

GNU AIS

Так как декоди­ровать руками биты — слож­ная задача, перей­дем к прог­раммам, которые могут сде­лать это за нас. GNU AIS — это сво­бод­ный софт, который поз­воля­ет декоди­ровать двух­каналь­ный AIS-сиг­нал из фай­лов или нап­рямую из источни­ков. Но преж­де чем исполь­зовать эту прог­рамму, необ­ходимо кон­верти­ровать наш файл RAW IQ.

Преобразование формата

Для пре­обра­зова­ния фор­мата я нашел схе­му для GNU Radio. В ней нуж­но будет перес­читать ресем­пле­ры, ты можешь сде­лать это по ана­логии с GMSK Demod. Автор схе­мы кон­верта­ции — Алек­сан­дру Чете.

Схема конвертации IQ-файла в формат, пригодный для GNU AIS
Схе­ма кон­верта­ции IQ-фай­ла в фор­мат, при­год­ный для GNU AIS

В работу схе­мы вда­вать­ся нет смыс­ла, так как все бло­ки и прин­ципы мы уже изу­чили. Пос­ле запус­ка сох­раня­ем файл aisfifo и перехо­дим к уста­нов­ке GNU AIS.

Установка

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

Пер­вое, что нуж­но сде­лать, — кло­ниро­вать GNU AIS и уста­новить MySQL. Уста­нов­ку MySQL я опи­сывать не буду, так как для это­го есть куча гай­дов. Оста­новим­ся на GNU AIS.

git clone https://github.com/rubund/gnuais
cd gnuais/

Пе­ред сбор­кой нуж­но нем­ного испра­вить код, а кон­крет­но файл ./src/out_mysql.h, в котором нуж­но заменить вот этот код:

struct mysql_state_t {

вот этим:

extern struct mysql_state_t {

Те­перь мож­но перехо­дить непос­редс­твен­но к сбор­ке про­екта.

apt install build-essential libasound-dev libcurl4-openssl-dev libmysqlclient-dev cmake pkg-config
cmake .
make

Как нас­тро­ить базу дан­ных, опи­сано в create_table.txt. Так­же необ­ходимо будет ука­зать логин и пароль для базы дан­ных в фай­ле gnuais.conf. Пос­ле сбор­ки появит­ся файл ./src/gnuais, который, собс­твен­но, нам и нужен.

Декодирование AIS

Ко­пиру­ем файл aisfifo куда‑нибудь, где он будет дос­тупен GNU AIS, и запус­каем сле­дующей коман­дой:

./src/gnuais -c ./gnuais.conf -l /root/aisfifo

Да­лее получа­ем деталь­ный вывод фрей­мов, которые уда­лось успешно декоди­ровать, нап­ример:

ch B type 3 mmsi 671407100: lat 25.267278 lon 55.297437 course 161 speed 0.7 rateofturn 64 navstat 1 heading 54 (!AIVDM,1,1,,A,3:0CKw50073u8Jt>MD;nBie40lLJ,0*60)

Как вид­но, GNU AIS авто­мати­чес­ки пре­обра­зовал его в фор­мат NMEA.

Безопасность

Пос­ле пол­ного изу­чения при­ема AIS мож­но сде­лать нес­коль­ко выводов о его безопас­ности. Понят­но, что про­токол не под­разуме­вает какого‑либо шиф­рования или под­твержде­ния источни­ка, а это дела­ет его уяз­вимым для спу­фин­га и дру­гих похожих атак. Так как это очень серь­езная проб­лема, в нулевых был раз­работан про­токол TESLA, который поз­воля­ет шиф­ровать сооб­щения, иду­щие друг за дру­гом, но из‑за сво­ей неп­рактич­ности он не нашел широко­го при­мене­ния. Воен­ные же выдели­ли себе и сво­им кораб­лям отдель­ный канал AIS, который уже пол­ностью зашиф­рован.

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

В целом сис­тема очень ста­рая, и накопи­лось при­лич­ное количес­тво методов для ана­лиза тра­фика, но даже сей­час, в мире, где есть ИИ и дру­гие инс­тру­мен­ты для ана­лиза, кораб­ли могут изме­нить нас­трой­ки сво­их передат­чиков и пла­вать сов­сем не там, где сооб­щают. Все эти ата­ки я раз­беру в сле­дующей статье, как и переда­чу сво­его сиг­нала AIS.