如何解释原始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
我可以推荐我自己的Ruby库来解码AIS,该基于其他人提到的catb.org网站
伊恩

Answers:


7

Kurt Schwehr有一个很好的github存储库,他在沿海和海洋测绘中心工作(例如,跟踪鲸鱼活动)。在那里,您将找到一个解码器和文档,以了解nmea消息(大多数链接由@ianmayo和@GID Dev提及)。这是在LINUX和下运行的一个小方法python 2.7

要运行某些代码,您需要git一个C++编译器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以获取类似headtailbehavoir 的unix 。我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使用来自两个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位半字节中有多少个最低有效位数据有效载荷应被忽略。注意,该填充字节与<[ITU-1371]>空中AIS消息中字节对齐的要求存在棘手的交互;请参阅后面的部分中有关消息长度和对齐方式的详细讨论。

*分隔的后缀(5C)是句子的NMEA 0183数据完整性校验和,其后带有“ ”。它是在包括AIVDM标签但不包括前导“!”的整个句子上计算的。

此外,这里的重要部分实际上是字段6,因此,如果您在站点中进行更多筛选,您将得到答案:字段6的数据有效负载中包含大量(实际上不是一吨!)的内容。因此,您可以编写自己的代码以将其解析,或者使用另一个答案中发布的github存储库,其中包含各种SDK / API,这些SDK / API可能应该满足您的需求(取决于您获取AIS数据的位置): https:// /github.com/bcl/aisparser


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.