未加工の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

回答:


7

Center for Coastal and Ocean Mapping(たとえば、クジラの活動追跡するために)で作業するKurt Schwehrの優れたgithubリポジトリがあります。そこには、nmeaメッセージ(主に@ianmayoおよび@GID Devの投稿に言及されているリンク)を理解するためのデコーダーとドキュメントがあります。以下は、とで実行する小さなハウツーです。LINUXpython 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、Unixのようなheadtailbehavoir を取得するために呼び出されるスクリプト内のいくつかの迅速で汚いコードです。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ディレクトリ、あなたが表示したい行をフィルタリングすることができcatheadそして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)は、データペイロードを6ビット境界に埋め込むために必要なフィルビットの数で、0から5の範囲です。同等に、これから5を引くと、最後の6ビットニブルの最下位ビットの数がわかります。データペイロードは無視する必要があります。このパッドバイトには、無線AISメッセージのバイトアライメントに関する<[ITU-1371]>要件とのやり取りが難しいことに注意してください。後のセクションで、メッセージの長さと配置の詳細な説明を参照してください。

*で区切られたサフィックス(5C)は、文のNMEA 0183データ整合性チェックサムであり、先頭に「」が付きます。AIVDMタグを含む文全体で計算されますが、先頭の "!"は除外されます。

さらに、ここで重要な部分は実際にはフィールド6であるため、サイトをさらに調べれば、答えがわかります。そのフィールド6のデータペイロードには、さまざまなフィールドのトン(実際には、トンではありません)が含まれています。したがって、独自のコードを記述して解析するか、または他の回答に投稿されたgithubリポジトリを使用することができます。この中には、おそらくAISデータを取得した場所に応じて、必要なものがあるはずのさまざまなSDK / APIが含まれています 。https:/ /github.com/bcl/aisparser


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.