Як інтерпретувати зразок даних із сировини AIS


9

Я знайшов файл, який містить близько 85000 повідомлень (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 Kurt Schwehr, який працює в Центрі прибережної та океанічної карти (наприклад, для відстеження діяльності китів ). Там ви знайдете декодер та документи для розуміння 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& tailbehavoir. Я використовую 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, слід легко продовжувати подальше форматування та зберігання матеріалів.


5

Сайт декодування протоколу AIVDM / AIVDO містить відповідь, але є багато, що потрібно просіяти там. Щоб відповісти на поставлене запитання, це з вищезгаданого сайту у такому форматі:

Ось типовий пакет даних 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 використовує високу сторону дуплексу з двох радіоканалів УКХ: AIS-канал A становить 161,975 МГц (87B); Канал B AIS становить 162,025 МГц (88B). У дикій природі також можуть зустрічатися коди каналів 1 і 2; стандарти не передбачають їх тлумачення, але це досить очевидно.

Поле 6 (177KQJ5000G? TO`K> RA1wUbN0TKH у цьому прикладі) є корисним навантаженням даних. Ми розповімо, як розшифрувати це в наступних розділах.

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

Суфікс * -поділений ( 5C) - це контрольна сума цілісності даних NMEA 0183 для речення, перед якою " ". Він обчислюється для всього речення, включаючи тег AIVDM, але виключаючи провідне "!".

Крім того, тут важливою частиною є поле 6, тому якщо ви просієте ще якийсь сайт, ви отримаєте відповідь: корисне навантаження даних 6-го поля містить тонну (ні, насправді, тонну) різних полів всередині нього. Таким чином, ви можете написати власний код, щоб проаналізувати його, або ж використати github repo, розміщений в іншій відповіді, який містить різні SDK / API, які, ймовірно, повинні мати те, що вам потрібно (залежно від того, де ви отримали свої дані AIS): https: / /github.com/bcl/aisparser


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.