Raw AIS 데이터 샘플을 해석하는 방법


9

약 85,000 개의 메시지 (3 분 라이브 AISHub 피드)가 포함 된 파일을 찾았지만 제목이나 꼬리를 만들 수 없습니다.

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

어딘가에 스키마가 있습니까?


일반적으로 사용하는 프로그래밍 언어는 없지만 라이브러리를 사용하여 디코딩하는 것이 좋습니다. : 이것은 내 좋아하는 github.com/bcl/aisparser
bjornasm

1
다른 사람이 언급 한 catb.org 사이트 를 기반으로 AIS 디코딩을 위해 자체 루비 라이브러리를 추천 할 수 있습니다 .
Ian

답변:


7

Kurt Schwehr 의 좋은 github 저장소가 있으며 해안 및 해양 매핑 센터 ( 예 : 고래 활동 추적) 에서 근무합니다 . 여기에는 nmea 메시지 (주로 @ianmayo 및 @GID Dev의 게시물이 언급 한 링크)를 이해하기위한 디코더와 문서가 있습니다. 여기에서 실행되는 작은 하우투이다 LINUX하고 python 2.7.

일부 코드의 실행을 얻으려면, 당신은 필요 컴파일러는 , . 데이터 다운로드gitC++python setup environmentcmake

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

그리고 github 페이지의 설치 지침을 따르거나 실행하십시오.

$ 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

결국 python환경에 라이브러리가 있어야 합니다.

 $ 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

다음은 test-ais.py유닉스와 같은 head& tailbehavoir 를 얻기 위해 호출 된 스크립트의 빠르고 더러운 코드입니다 . 나는 json"일반 텍스트 예쁜 프린터"로 사용합니다.

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

가정하면 nmea-samples파일이있는 data디렉토리, 당신은 당신이 보여주고 싶은 줄을 필터링 할 수 있습니다 cat, head그리고 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
 }

json 코드에서 시작하여 추가 형식화 및 저장을 쉽게 수행 할 수 있어야합니다.


5

디코딩 AIVDM / AIVDO 프로토콜 사이트는 대답이 포함되어 있지만,이 가려하는 많은있다. 제기 된 질문에 대답하기 위해, 이것은 앞서 언급 한 사이트의 형식입니다.

일반적인 AIVDM 데이터 패킷은 다음과 같습니다.

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

그리고이 필드의 의미는 다음과 같습니다.

필드 1,! AIVDM은이를 AIVDM 패킷으로 식별합니다.

필드 2 (이 예에서는 1)는 현재 누적되는 메시지의 조각 수입니다. 각 문장의 페이로드 크기는 NMEA 0183의 최대 82 자로 제한되므로 페이로드를 여러 조각 문장으로 분할해야하는 경우가 있습니다.

필드 3 (이 예에서 1)은이 문장의 조각 번호입니다. 하나의 기반이 될 것입니다. 조각 개수가 1이고 조각 번호가 1 인 문장 자체가 완성됩니다.

필드 4 (이 예에서는 비어 있음)는 다중 문장 메시지의 순차적 메시지 ID입니다.

필드 5 (이 예에서 B)는 라디오 채널 코드입니다. AIS는 2 개의 VHF 무선 채널에서 듀플렉스의 하이 사이드를 사용합니다. AIS 채널 A는 161.975Mhz (87B)입니다. AIS 채널 B는 162.025Mhz (88B)입니다. 야생에서는 채널 코드 1과 2도 발생할 수 있습니다. 표준은 이것들에 대한 해석을 규정하지 않지만 충분합니다.

필드 6 (이 예에서는 177KQJ5000G? tO`K> RA1wUbN0TKH)은 데이터 페이로드입니다. 이후 섹션에서이를 디코딩하는 방법에 대해 설명합니다.

필드 7 (0)은 0에서 5 범위의 6 비트 경계까지 데이터 페이로드를 채우는 데 필요한 채우기 비트의 수입니다. 이와 동등하게 5를 빼면 마지막 6 비트 니블의 최하위 비트 수가 데이터 페이로드는 무시해야합니다. 이 패드 바이트는 무선 AIS 메시지에서 바이트 정렬에 대한 <[ITU-1371]> 요구 사항과 교묘 한 상호 작용을합니다. 메시지 길이 및 정렬에 대한 자세한 내용은 다음 섹션을 참조하십시오.

*로 구분 된 접미사 ( 5C)는 " "가 앞에 오는 문장의 NMEA 0183 데이터 무결성 체크섬입니다 . AIVDM 태그를 포함하여 전체 문장에서 계산되지만 선행 "!"는 제외됩니다.

또한 여기서 중요한 부분은 실제로 필드 6이므로 사이트를 더 자세히 살펴보면 답을 얻을 수 있습니다. 해당 필드 6 데이터 페이로드에는 다양한 필드가 포함되어 있습니다 (실제로는 톤이 아닙니다!). 당신이 당신의 자신의 코드를 작성할 수 있습니다 그래서 그것을 구문 분석, 또는 대안 아마 당신이 (당신이 당신의 AIS 데이터를 가지고 위치에 따라) 필요가 무엇을해야 다양한 SDK를 / API를 포함하는 다른 대답에 게시 된 github에의 REPO 사용 : HTTPS를 : /을 /github.com/bcl/aisparser


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.