Come interpretare un campione di dati AIS non elaborati


9

Ho trovato un file che contiene circa 85.000 messaggi (feed AISHub live di 3 minuti), ma non riesco a crearne uno.

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

C'è uno schema da qualche parte?


Non so quale linguaggio di programmazione usi comunemente, ma consiglierei di usare una libreria per decodificarlo. Questo è il mio preferito: github.com/bcl/aisparser
bjornasm,

1
Posso consigliare la mia libreria Ruby per la decodifica di AIS , che si basa sul sito catb.org che altri hanno menzionato.
Ian,

Risposte:


7

C'è un buon repository github di Kurt Schwehr che lavora al Center for Coastal and Ocean Mapping (per tenere traccia delle attività delle balene, ad esempio). Lì troverai un decodificatore e documenti per comprendere i messaggi di nmea (per lo più collegamenti menzionati dai post di @ianmayo e @GID Dev). Ecco un piccolo howto in esecuzione sotto LINUXe python 2.7.

Per ottenere un codice in esecuzione, è necessario gitun C++compilatore, il python setup environment, cmake. Scarica i dati da

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

e segui le istruzioni di installazione sulla / nella pagina github o esegui

$ 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

Dopotutto dovresti avere le librerie nel tuo pythonambiente.

 $ 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

Ecco un po 'di codice rapido e sporco in uno script chiamato test-ais.pyper ottenere l'unix like head& tailbehavoir. Uso jsoncome "stampante per testo trasparente".

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

Supponendo che il nmea-samplesfile è in una datadirectory, è possibile filtrare la linea che si desidera visualizzare cat, heade 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
 }

A partire dal codice json, dovrebbe essere facile procedere con ulteriori formattazioni e memorizzazione di cose.


5

Il sito di decodifica del protocollo AIVDM / AIVDO contiene la risposta, ma c'è molto da setacciare lì. Per rispondere alla domanda posta, questo proviene dal sito summenzionato in quel formato:

Ecco un tipico pacchetto di dati AIVDM:

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

Ed ecco cosa significano i campi:

Il campo 1,! AIVDM, identifica questo come un pacchetto AIVDM.

Il campo 2 (1 in questo esempio) è il conteggio dei frammenti nel messaggio attualmente accumulato. La dimensione del payload di ogni frase è limitata dal massimo di 82 caratteri di NMEA 0183, quindi a volte è necessario suddividere un payload su più frasi frammentate.

Il campo 3 (1 in questo esempio) è il numero di frammento di questa frase. Sarà basato su uno. Una frase con un numero di frammenti di 1 e un numero di frammenti di 1 è completa in sé.

Il campo 4 (vuoto in questo esempio) è un ID sequenziale per i messaggi a più frasi.

Il campo 5 (B in questo esempio) è un codice canale radio. AIS utilizza il lato superiore del duplex da due canali radio VHF: il canale AIS A è 161,975 Mhz (87B); Il canale AIS B è 162.025Mhz (88B). In natura, si possono anche incontrare i codici canale 1 e 2; gli standard non prescrivono un'interpretazione di questi ma è abbastanza ovvio ..

Il campo 6 (177KQJ5000G? TO`K> RA1wUbN0TKH in questo esempio) è il payload dei dati. Descriveremo come decodificare questo nelle sezioni successive.

Il campo 7 (0) è il numero di bit di riempimento richiesti per riempire il payload di dati a un limite di 6 bit, compreso tra 0 e 5. Equivalentemente, sottraendo 5 da questo si dice quanti bit meno significativi dell'ultimo nibble a 6 bit nel il payload dei dati deve essere ignorato. Si noti che questo byte pad ha una delicata interazione con il requisito <[ITU-1371]> per l'allineamento dei byte nei messaggi AIS over-the-air; vedere la discussione dettagliata delle lunghezze dei messaggi e l'allineamento in una sezione successiva.

Il suffisso * -separated ( 5C) è il checksum di integrità dei dati NMEA 0183 per la frase, preceduto da " ". Viene calcolato sull'intera frase incluso il tag AIVDM ma escluso il "!" Iniziale.

Inoltre, la parte importante qui è in realtà il campo 6, quindi se si setaccia un po 'di più il sito, si otterrà la risposta: quel carico utile di dati del campo 6 contiene una tonnellata (no davvero, una tonnellata!) Di vari campi al suo interno. Quindi puoi scrivere il tuo codice per analizzarlo o in alternativa utilizzare il repository github pubblicato nell'altra risposta che contiene vari SDK / API che dovrebbero probabilmente avere ciò di cui hai bisogno (a seconda di dove hai ottenuto i tuoi dati AIS): https: / /github.com/bcl/aisparser


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.