Interpretieren eines AIS-Rohdatenbeispiels


9

Ich habe eine Datei gefunden, die ungefähr 85.000 Nachrichten enthält (3 Minuten Live-AISHub-Feed), aber ich kann weder Kopf noch Zahl daraus machen.

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

Gibt es irgendwo ein Schema?


Ich weiß nicht, welche Programmiersprache Sie normalerweise verwenden, aber ich würde empfehlen, eine Bibliothek zum Dekodieren zu verwenden. Dies ist mein Favorit: github.com/bcl/aisparser
bjornasm

1
Ich kann meine eigene Ruby-Bibliothek zum Dekodieren von AIS empfehlen , die auf der von anderen erwähnten Website catb.org basiert .
Ian

Antworten:


7

Es gibt ein gutes Github-Repository von Kurt Schwehr, der im Zentrum für Küsten- und Ozeankartierung arbeitet ( um beispielsweise Walaktivitäten zu verfolgen ). Dort finden Sie einen Decoder und Dokumente, um die nmea-Nachrichten zu verstehen (meistens Links, die in den Posts von @ianmayo und @GID Dev aufgeführt sind). Hier ist ein kleines Howto, das unter LINUXund läuft python 2.7.

Um Code zum Laufen zu bringen, benötigen Sie giteinen C++Compiler, den python setup environment, cmake. Laden Sie die Daten von herunter

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

und befolgen Sie die Installationsanweisungen auf / auf der Github-Seite oder führen Sie sie aus

$ 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

Schließlich sollten Sie die Bibliotheken in Ihrer pythonUmgebung haben.

 $ 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

Hier ist ein schneller und schmutziger Code in einem Skript, der aufgerufen wird test-ais.py, um das Unix like head& tailbehavoir zu erhalten. Ich benutze jsonals "Klartext hübscher Drucker".

#!/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

Unter der Annahme , dass die nmea-samplesDatei in einem ist dataVerzeichnis, können Sie die Zeile , die Sie zeigen wollen herausfiltern cat, headund 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
 }

Ausgehend vom JSON-Code sollte es einfach sein, mit der weiteren Formatierung und Speicherung fortzufahren.


5

Die AIVDM / AIVDO-Protokolldecodierungsstelle enthält die Antwort, aber es gibt dort viel zu sichten. Um die gestellte Frage zu beantworten, ist dies von der oben genannten Seite in diesem Format:

Hier ist ein typisches AIVDM-Datenpaket:

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

Und hier ist, was die Felder bedeuten:

Feld 1 ,! AIVDM, identifiziert dies als AIVDM-Paket.

Feld 2 (in diesem Beispiel 1) gibt die Anzahl der Fragmente in der aktuell akkumulierten Nachricht an. Die Nutzlastgröße jedes Satzes ist durch das 82-Zeichen-Maximum von NMEA 0183 begrenzt, sodass es manchmal erforderlich ist, eine Nutzlast auf mehrere Fragmentsätze aufzuteilen.

Feld 3 (1 in diesem Beispiel) ist die Fragmentnummer dieses Satzes. Es wird einsbasiert sein. Ein Satz mit einer Fragmentanzahl von 1 und einer Fragmentnummer von 1 ist an sich vollständig.

Feld 4 (in diesem Beispiel leer) ist eine sequentielle Nachrichten-ID für Nachrichten mit mehreren Sätzen.

Feld 5 (in diesem Beispiel B) ist ein Funkkanalcode. AIS verwendet die hohe Seite des Duplex von zwei UKW-Funkkanälen: AIS-Kanal A ist 161,975 MHz (87B); AIS-Kanal B ist 162,025 MHz (88B). In freier Wildbahn können auch die Kanalcodes 1 und 2 angetroffen werden. Die Standards schreiben keine Interpretation dieser vor, aber es ist offensichtlich genug.

Feld 6 (in diesem Beispiel 177KQJ5000G? TO`K> RA1wUbN0TKH) ist die Datennutzlast. Wir werden in späteren Abschnitten beschreiben, wie dies dekodiert wird.

Feld 7 (0) ist die Anzahl der Füllbits, die erforderlich sind, um die Datennutzlast auf eine 6-Bit-Grenze zwischen 0 und 5 aufzufüllen. Entsprechend wird durch Subtrahieren von 5 davon angegeben, wie viele niedrigstwertige Bits des letzten 6-Bit-Halbbytes im Datennutzdaten sollten ignoriert werden. Beachten Sie, dass dieses Pad-Byte eine schwierige Interaktion mit der <[ITU-1371]> -Anforderung für die Byte-Ausrichtung in drahtlosen AIS-Nachrichten aufweist. Weitere Informationen zu Nachrichtenlängen und -ausrichtung finden Sie in einem späteren Abschnitt.

Das * -getrennte Suffix ( 5C) ist die NMEA 0183-Datenintegritätsprüfsumme für den Satz, dem " " vorangestellt ist . Es wird für den gesamten Satz einschließlich des AIVDM-Tags berechnet, jedoch ohne das führende "!".

Darüber hinaus ist der wichtige Teil hier tatsächlich Feld 6. Wenn Sie also die Site noch einmal durchsehen, erhalten Sie die Antwort: Diese Datennutzlast von Feld 6 enthält eine Tonne (nicht wirklich eine Tonne!) Verschiedene Felder. Sie können also Ihren eigenen Code schreiben, um ihn zu analysieren, oder alternativ das in der anderen Antwort angegebene Github-Repo verwenden, das verschiedene SDKs / APIs enthält, die wahrscheinlich das haben sollten, was Sie benötigen (je nachdem, woher Sie Ihre AIS-Daten haben): https: / /github.com/bcl/aisparser


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.