Как интерпретировать образец необработанных данных AIS

9

Я нашел файл, который содержит около 85 000 сообщений (3-минутная прямая трансляция AISHub), но я не могу сделать из этого ни головы, ни хвоста.

http://www.aishub.net/nmea-sample.html

!AIVDM,1,1,,A,13aEOK?P00PD2wVMdLDRhgvL289?,0*26
!AIVDM,1,1,,B,16S`2cPP00a3UF6EKT@2:?vOr0S2,0*00
!AIVDM,2,1,9,B,53nFBv01SJ<thHp6220H4heHTf2222222222221?50:454o<`9QSlUDp,0*09
!AIVDM,2,2,9,B,888888888888880,2*2E

Где-то есть схема?

Филипп Сенн
источник
Я не знаю, какой язык программирования вы обычно используете, но я бы рекомендовал использовать библиотеку для его декодирования. Это мой любимый: github.com/bcl/aisparser
bjornasm
1
Я могу порекомендовать свою собственную библиотеку Ruby для декодирования AIS , которая основана на сайте catb.org , о котором упоминали другие.
Ян

Ответы:

7

Есть хороший репозиторий github Курта Швера, который работает в Центре картирования прибрежных зон и океанов (например, для отслеживания деятельности китов ). Там вы найдете декодер и документы для понимания сообщений nmea (в основном это ссылки, упомянутые в сообщениях @ianmayo и @GID Dev). Вот небольшая инструкция под LINUXи python 2.7.

Чтобы получить код работает, вам нужно gitв C++компилятор, python setup environment, cmake. Загрузите данные из

$ cd YOUR_BUILD_PATH
$ git clone https://github.com/schwehr/libais.git

и следуйте инструкциям по установке на / на странице github или запустите

$ cd YOUR_BUILD_PATH/libais
$ cmake .  # to bulid the Makefile 
$ make     # to build the libais C++
$ python setup.py build # to build the python stuff
$ sudo python setup.py install # to deploy it

В конце концов у вас должны быть библиотеки в вашей pythonсреде.

 $ ls /usr/local/lib/python2.7/dist-packages/
 easy-install.pth  libais-0.16-py2.7-linux-x86_64.egg

 $ ls /usr/local/lib/python2.7/dist-packages/libais-0.16-py2.7-linux-x86_64.egg
 ais  _ais.py  _ais.pyc  _ais.so  EGG-INFO  test

Вот некоторый быстрый и грязный код в скрипте, вызываемом test-ais.pyдля получения Unix, как head& tailповедениеvoir. Я использую jsonв качестве "довольно текстового принтера".

#!/usr/bin/python

# To supress the warning ...could be done better    
# FutureWarning: The stream module is deprecated and will be removed in 1.0
# https://github.com/schwehr/libais/blob/master/ais/stream/__init__.py
# coded in in __init__.py line 10-14
import warnings
warnings.filterwarnings("ignore")

# import json module for pretty print
import json

# import ais.stream module to decode
# a ais binary nmea message to json 
import ais.stream

# import sys module to read stuff from
# standard input STDIN
import sys

# decode a file or somthing form the STDIN
f = open(sys.argv[1]) if len(sys.argv) > 1 else sys.stdin

# Iterate over the messages 
for msg in ais.stream.decode(f):
    # make a json pretty print for each message
    print json.dumps(msg, indent=4, sort_keys=True)

# EOF

Предполагая, что nmea-samplesфайл находится в dataкаталоге, вы можете отфильтровать строку, которую вы хотите показать cat, headи tail...

$ tail -1 data/nmea-sample | ./test-ais.py
 {
    "day": 14, 
    "fix_type": 1, 
    "hour": 11, 
    "id": 4, 
    "minute": 33, 
    "mmsi": 2320717, 
    "month": 3, 
    "position_accuracy": 0, 
    "raim": false, 
    "repeat_indicator": 3, 
    "second": 30, 
    "slot_offset": 2250, 
    "slot_timeout": 0, 
    "spare": 0, 
    "sync_state": 0, 
    "transmission_ctl": 0, 
    "x": -5.782454967498779, 
    "y": 57.842193603515625, 
    "year": 2012
 }

Начиная с кода JSON, должно быть легко продолжить дальнейшее форматирование и хранение материала.

huckfinn
источник
5

/ AIVDO протокол AIVDM декодирование сайта содержит ответ , но есть много , чтобы просеивать там. Чтобы ответить на поставленный вопрос, это с вышеупомянутого сайта в таком формате:

Вот типичный пакет данных AIVDM:

! AIVDM, 1,1,, B, 177KQJ5000G? TO`K> RA1wUbN0TKH, 0 * 5C

И вот что означают поля:

Поле 1,! AIVDM, идентифицирует это как пакет AIVDM.

Поле 2 (1 в этом примере) - это количество фрагментов в текущем накапливающемся сообщении. Размер полезной нагрузки каждого предложения ограничен максимумом из 82 символов NMEA 0183, поэтому иногда требуется разделить полезную нагрузку на несколько фрагментированных предложений.

Поле 3 (1 в этом примере) является номером фрагмента этого предложения. Это будет один на основе. Предложение с числом фрагментов 1 и числом фрагментов 1 само по себе завершено.

Поле 4 (пустое в этом примере) является последовательным идентификатором сообщения для нескольких предложений.

Поле 5 (B в этом примере) является кодом радиоканала. AIS использует верхнюю сторону дуплекса из двух радиоканалов VHF: канал AIS A составляет 161,975 МГц (87 В); Канал AIS B составляет 162,025 МГц (88B). В дикой природе также могут встречаться канальные коды 1 и 2; стандарты не предписывают их толкование, но это достаточно очевидно ..

Поле 6 (177KQJ5000G? TO`K> RA1wUbN0TKH в этом примере) является полезной нагрузкой данных. Мы опишем, как декодировать это в следующих разделах.

Поле 7 (0) - это количество битов заполнения, необходимых для дополнения полезной нагрузки данных до 6-битной границы, в диапазоне от 0 до 5. Эквивалентно, вычитая 5 из этого, вы указываете, сколько младших значащих бит последнего 6-битного полубайта в данные должны быть проигнорированы. Обратите внимание, что этот дополнительный байт имеет сложное взаимодействие с требованием <[ITU-1371]> для выравнивания байтов в беспроводных сообщениях AIS; подробное обсуждение длин сообщений и выравнивания см. в следующем разделе.

* -Разделенный суффикс ( 5C) является контрольной суммой целостности данных NMEA 0183 для предложения, которому предшествует " ". Он рассчитывается по всему предложению, включая тег AIVDM, но исключая начальный «!».

Кроме того, важной частью здесь фактически является поле 6, поэтому, если вы еще раз просмотрите сайт, вы получите ответ: полезная нагрузка этого поля 6 содержит тонну (на самом деле, не тонну!) Различных полей внутри нее. Таким образом, вы можете написать свой собственный код для его анализа или использовать репозиторий github, опубликованный в другом ответе, который содержит различные SDK / API, которые, вероятно, должны иметь то, что вам нужно (в зависимости от того, где вы получили данные AIS): https: / /github.com/bcl/aisparser

GISD
источник