Cómo interpretar una muestra de datos AIS sin procesar


9

Encontré un archivo que contiene alrededor de 85,000 mensajes (3 minutos de transmisión en vivo de AISHub), pero no puedo entenderlo.

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

¿Hay un esquema en alguna parte?


No sé qué lenguaje de programación usa habitualmente, pero recomendaría usar una biblioteca para decodificarlo. Este es mi favorito: github.com/bcl/aisparser
bjornasm

1
Puedo recomendar mi propia biblioteca Ruby para decodificar AIS , que se basa en el sitio catb.org que otros han mencionado.
Ian

Respuestas:


7

Hay un buen repositorio github de Kurt Schwehr que trabaja en el Centro de Mapeo de Costas y Océanos (para rastrear las actividades de las ballenas, por ejemplo). Allí encontrará un decodificador y documentos para comprender los mensajes nmea (en su mayoría enlaces mencionados en las publicaciones de @ianmayo y @GID Dev). Aquí hay un pequeño tutorial sobre cómo correr bajo LINUXy python 2.7.

Para conseguir un poco de código en ejecución, es necesario gitun C++compilador, la python setup environment, cmake. Descargar los datos de

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

y siga las instrucciones de instalación en / en la página de github o ejecute

$ 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

Después de todo, debe tener las bibliotecas en su pythonentorno.

 $ 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

Aquí hay un código rápido y sucio en un script llamado test-ais.pypara obtener el Unix like head& tailbehavoir. Lo uso jsoncomo "impresora bonita de texto claro".

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

Suponiendo que el nmea-samplesarchivo está en un datadirectorio, puede filtrar la línea que desea mostrar cat, heady 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 partir del código json, debería ser fácil continuar con más formateo y almacenamiento de cosas.


5

El sitio de decodificación del protocolo AIVDM / AIVDO contiene la respuesta, pero hay mucho para analizar. Para responder a la pregunta planteada, esto es del sitio mencionado anteriormente en ese formato:

Aquí hay un paquete de datos AIVDM típico:

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

Y esto es lo que significan los campos:

El campo 1,! AIVDM, identifica esto como un paquete AIVDM.

El campo 2 (1 en este ejemplo) es el recuento de fragmentos en el mensaje que se acumula actualmente. El tamaño de la carga útil de cada oración está limitado por el máximo de 82 caracteres de NMEA 0183, por lo que a veces se requiere dividir una carga útil en varias oraciones fragmentarias.

El campo 3 (1 en este ejemplo) es el número de fragmento de esta oración. Será de una sola base. Una oración con un recuento de fragmentos de 1 y un número de fragmento de 1 está completa en sí misma.

El campo 4 (vacío en este ejemplo) es una ID de mensaje secuencial para mensajes de múltiples oraciones.

El campo 5 (B en este ejemplo) es un código de canal de radio. AIS utiliza el lado alto del dúplex de dos canales de radio VHF: el canal AIS A es de 161.975Mhz (87B); El canal AIS B es 162.025Mhz (88B). En la naturaleza, también se pueden encontrar los códigos de canal 1 y 2; los estándares no prescriben una interpretación de estos, pero es bastante obvio.

El campo 6 (177KQJ5000G? TO`K> RA1wUbN0TKH en este ejemplo) es la carga útil de datos. Describiremos cómo decodificar esto en secciones posteriores.

El campo 7 (0) es el número de bits de relleno necesarios para rellenar la carga útil de datos a un límite de 6 bits, que va de 0 a 5. De manera equivalente, restando 5 de esto indica cuántos bits menos significativos del último mordisco de 6 bits en el la carga útil de datos debe ser ignorada. Tenga en cuenta que este byte de pad tiene una interacción complicada con el requisito <[ITU-1371]> para la alineación de bytes en mensajes AIS por aire; vea la discusión detallada de las longitudes y la alineación del mensaje en una sección posterior.

El sufijo separado * ( 5C) es la suma de comprobación de integridad de datos NMEA 0183 para la oración, precedida por " ". Se calcula en toda la oración, incluida la etiqueta AIVDM pero excluyendo el "!" Inicial.

Además, la parte importante aquí es en realidad el campo 6, por lo que si examina el sitio un poco más, obtendrá la respuesta: esa carga útil de datos del campo 6 contiene una tonelada (¡en realidad no, una tonelada!) De varios campos dentro de él. Por lo tanto, puede escribir su propio código para analizarlo o, alternativamente, usar el repositorio de github publicado en la otra respuesta que contiene varios SDK / API que probablemente deberían tener lo que necesita (dependiendo de dónde obtuvo sus datos AIS): https: / /github.com/bcl/aisparser


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.