Comment interpréter un échantillon de données AIS brutes


9

J'ai trouvé un fichier qui contient environ 85 000 messages (flux AISHub en direct de 3 minutes), mais je ne peux pas en faire la tête ou la queue.

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

Y a-t-il un schéma quelque part?


Je ne sais pas quel langage de programmation vous utilisez couramment, mais je recommanderais d'utiliser une bibliothèque pour le décoder. Ceci est mon préféré: github.com/bcl/aisparser
bjornasm

1
Je peux recommander ma propre bibliothèque Ruby pour décoder AIS , qui est basée sur le site catb.org que d'autres ont mentionné.
Ian

Réponses:


7

Il existe un bon référentiel github de Kurt Schwehr qui travaille au Center for Coastal and Ocean Mapping (pour suivre les activités des baleines par exemple). Vous y trouverez un décodeur et des documents pour comprendre les messages nmea (principalement des liens mentionnés par les articles de @ianmayo et @GID Dev). Voici un petit guide d'utilisation sous LINUXet python 2.7.

Pour obtenir un peu en cours d'exécution du code, vous avez besoin d' gitun C++compilateur, le python setup environment, cmake. Téléchargez les données de

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

et suivez les instructions d'installation sur / sur la page github ou exécutez

$ 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

Après tout, vous devriez avoir les bibliothèques dans votre pythonenvironnement.

 $ 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

Voici du code rapide et sale dans un script appelé test-ais.pypour obtenir le comportement head& unix tail. J'utilise jsoncomme "jolie imprimante en texte clair".

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

En supposant que le nmea-samplesfichier se trouve dans un datarépertoire, vous pouvez filtrer la ligne que vous souhaitez afficher cat, headet 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
 }

En partant du code json, il devrait être facile de continuer avec un formatage et un stockage supplémentaires.


5

Le site de décodage du protocole AIVDM / AIVDO contient la réponse, mais il y a beaucoup à filtrer. Pour répondre à la question posée, celle-ci provient du site précité dans ce format:

Voici un paquet de données AIVDM typique:

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

Et voici ce que les champs signifient:

Le champ 1,! AIVDM, l'identifie comme un paquet AIVDM.

Le champ 2 (1 dans cet exemple) est le nombre de fragments dans le message en cours d'accumulation. La taille de la charge utile de chaque phrase est limitée par le maximum de 82 caractères de NMEA 0183, il est donc parfois nécessaire de fractionner une charge utile sur plusieurs phrases fragmentées.

Le champ 3 (1 dans cet exemple) est le numéro de fragment de cette phrase. Ce sera à base unique. Une phrase avec un nombre de fragments de 1 et un nombre de fragments de 1 est complète en soi.

Le champ 4 (vide dans cet exemple) est un ID de message séquentiel pour les messages à plusieurs phrases.

Le champ 5 (B dans cet exemple) est un code de canal radio. AIS utilise le côté haut du duplex de deux canaux radio VHF: le canal AIS A est de 161,975 MHz (87B); Le canal B AIS est de 162,025 MHz (88B). Dans la nature, les codes de canal 1 et 2 peuvent également être rencontrés; les normes ne prescrivent pas une interprétation de celles-ci mais c'est assez évident ..

Le champ 6 (177KQJ5000G? TO`K> RA1wUbN0TKH dans cet exemple) est la charge utile des données. Nous décrirons comment décoder cela dans les sections suivantes.

Le champ 7 (0) est le nombre de bits de remplissage requis pour remplir la charge utile de données à une limite de 6 bits, allant de 0 à 5. De manière équivalente, la soustraction de 5 indique le nombre de bits les moins significatifs du dernier quartet de 6 bits du la charge utile des données doit être ignorée. Notez que cet octet de pavé a une interaction délicate avec l'exigence <[UIT-1371]> pour l'alignement des octets dans les messages AIS en direct; voir la discussion détaillée de la longueur et de l'alignement des messages dans une section ultérieure.

Le suffixe * ( 5C) est la somme de contrôle d'intégrité des données NMEA 0183 pour la phrase, précédée de " ". Il est calculé sur la totalité de la phrase, y compris la balise AIVDM mais à l'exclusion du premier "!".

De plus, la partie importante ici est en fait le champ 6, donc si vous parcourez un peu plus le site, vous obtiendrez la réponse: cette charge utile de données du champ 6 contient une tonne (pas vraiment, une tonne!) De divers champs en son sein. Vous pouvez donc écrire votre propre code pour l'analyser, ou utiliser le référentiel github publié dans l'autre réponse qui contient divers SDK / API qui devraient probablement avoir ce dont vous avez besoin (selon l'endroit où vous avez obtenu vos données AIS): https: / /github.com/bcl/aisparser


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.