Como interpretar uma amostra de dados Raw AIS


9

Encontrei um arquivo que contém cerca de 85.000 mensagens (3 minutos de feed AISHub ao vivo), mas não consigo entender o que é isso.

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

Existe um esquema em algum lugar?


Não sei qual linguagem de programação você costuma usar, mas recomendo o uso de uma biblioteca para decodificá-la. Este é o meu favorito: github.com/bcl/aisparser
bjornasm

11
Posso recomendar minha própria biblioteca Ruby para decodificar o AIS , que é baseado no site catb.org mencionado por outros.
Ian Ian

Respostas:


7

Existe um bom repositório no Github de Kurt Schwehr, que trabalha no Centro de Mapeamento Costeiro e Oceânico (para rastrear atividades de baleias, por exemplo). Lá você encontrará um decodificador e documentos para entender as mensagens nmea (principalmente links mencionados pelas postagens de @ianmayo e @GID Dev). Aqui está um pequeno howto executando sob LINUXe python 2.7.

Para obter algum código em execução, você precisa de gitum C++compilador, o python setup environment, cmake. Baixe os dados de

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

e siga as instruções de instalação na / na página do github ou execute

$ 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

Afinal, você deve ter as bibliotecas em seu 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

Aqui está um código rápido e sujo em um script chamado test-ais.pypara obter o unix como head& tailbehavoir. Eu uso jsoncomo uma "impressora bonita de texto não criptografado".

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

Supondo que o nmea-samplesarquivo está em um datadiretório, você pode filtrar a linha que deseja mostrar 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 partir do código json, deve ser fácil continuar com a formatação e o armazenamento de outras coisas.


5

O site de decodificação do protocolo AIVDM / AIVDO contém a resposta, mas há muito o que analisar. Para responder à pergunta feita, é do site mencionado nesse formato:

Aqui está um pacote de dados AIVDM típico:

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

E aqui está o que os campos significam:

O campo 1,! AIVDM, identifica isso como um pacote AIVDM.

O campo 2 (1 neste exemplo) é a contagem de fragmentos na mensagem acumulada no momento. O tamanho da carga útil de cada sentença é limitado pelo máximo de 82 caracteres do NMEA 0183, portanto, às vezes, é necessário dividir uma carga útil em várias sentenças de fragmento.

O campo 3 (1 neste exemplo) é o número do fragmento desta sentença. Será baseado em um. Uma sentença com uma contagem de fragmentos de 1 e um número de fragmento de 1 é completa em si mesma.

O campo 4 (vazio neste exemplo) é um ID de mensagem seqüencial para mensagens com várias frases.

O campo 5 (B neste exemplo) é um código de canal de rádio. O AIS usa o lado alto do duplex de dois canais de rádio VHF: o canal AIS A é 161.975Mhz (87B); O canal AIS B é de 162,025 MHz (88B). Na natureza, os códigos de canal 1 e 2 também podem ser encontrados; os padrões não prescrevem uma interpretação deles, mas é óbvio o suficiente ..

O campo 6 (177KQJ5000G? TO`K> RA1wUbN0TKH neste exemplo) é a carga útil dos dados. Descreveremos como decodificar isso nas próximas seções.

O campo 7 (0) é o número de bits de preenchimento necessário para preencher a carga útil dos dados até um limite de 6 bits, variando de 0 a 5. Equivalentemente, subtrair 5 disso indica quantos bits menos significativos do último petisco de 6 bits no carga útil de dados deve ser ignorada. Observe que este byte de pad possui uma interação complicada com o requisito <[ITU-1371]> para alinhamento de bytes em mensagens AIS aéreas; consulte a discussão detalhada sobre o comprimento e o alinhamento das mensagens em uma seção posterior.

O sufixo separado por * ( 5C) é a soma de verificação de integridade de dados NMEA 0183 da sentença, precedida por " ". É calculado em toda a frase, incluindo a etiqueta AIVDM, mas excluindo o "!" Inicial.

Além disso, a parte importante aqui é, na verdade, o campo 6, portanto, se você examinar o site um pouco mais, obterá a resposta: essa carga útil de dados do campo 6 contém uma tonelada (na verdade, uma tonelada!) De vários campos dentro dele. Portanto, você pode escrever seu próprio código para analisá-lo ou, em alternativa, usar o repositório do github publicado na outra resposta, que contém vários SDKs / APIs que provavelmente devem ter o que você precisa (dependendo de onde você obteve seus dados AIS): https: / /github.com/bcl/aisparser


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.