วิธีการตีความตัวอย่างข้อมูล Raw AIS


9

ฉันพบไฟล์ที่มีข้อความประมาณ 85,000 ข้อความ (ฟีด AISHub แบบสด 3 นาที) แต่ฉันไม่สามารถสร้างหัวหรือก้อยได้

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ที่คนอื่นพูดถึง
เอียน

คำตอบ:


7

มีพื้นที่เก็บข้อมูล GitHub ที่ดีของKurt Schwehrที่ทำงานที่ศูนย์การทำแผนที่ชายฝั่งและมหาสมุทร (เพื่อติดตามกิจกรรมของวาฬเป็นต้น) ที่นั่นคุณจะพบตัวถอดรหัสและเอกสารเพื่อทำความเข้าใจข้อความ nmea (ส่วนใหญ่เชื่อมโยงที่กำหนดโดยโพสต์ของ @ianmayo และ @GID Dev) นี่เป็นวิธีการ to ขนาดเล็กที่ทำงานภายใต้และ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 like 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 ในตัวอย่างนี้) คือจำนวนแฟรกเมนต์ในข้อความที่สะสมในปัจจุบัน ขนาดของข้อมูลบรรจุของแต่ละประโยคถูก จำกัด ด้วยความยาวสูงสุด 82 อักขระของ NMEA 0183 ดังนั้นบางครั้งจำเป็นต้องแบ่งส่วนของข้อมูลออกเป็นประโยคต่าง ๆ

ฟิลด์ 3 (1 ในตัวอย่างนี้) คือหมายเลขแฟรกเมนต์ของประโยคนี้ มันจะเป็นหนึ่งเดียว ประโยคที่มีการนับแฟรกเมนต์ 1 และหมายเลขแฟรกเมนต์ 1 จะเสร็จสมบูรณ์ในตัวเอง

ฟิลด์ 4 (ว่างเปล่าในตัวอย่างนี้) เป็น ID ข้อความตามลำดับสำหรับข้อความที่มีหลายประโยค

ฟิลด์ 5 (B ในตัวอย่างนี้) คือรหัสช่องสัญญาณวิทยุ AIS ใช้ด้านสูงของดูเพล็กซ์จากสถานีวิทยุ VHF สองช่อง: AIS Channel A คือ 161.975Mhz (87B); AIS Channel B คือ 162.025Mhz (88B) ในไวด์การ์ดอาจพบช่องรหัส 1 และ 2 เช่นกัน มาตรฐานไม่ได้กำหนดการตีความสิ่งเหล่านี้ แต่ก็ชัดเจนเพียงพอ ..

ฟิลด์ 6 (177KQJJ000G? tO`K> RA1wUbN0TKH ในตัวอย่างนี้) เป็นส่วนของข้อมูล เราจะอธิบายวิธีการถอดรหัสในส่วนต่อไป

Field 7 (0) คือจำนวนบิตการเติมที่ต้องการเพื่อแพ็ตข้อมูลเพย์โหลดลงในขอบเขต 6 บิตตั้งแต่ 0 ถึง 5 เท่ากันการลบ 5 จากนี้จะบอกว่าบิตที่มีนัยสำคัญน้อยที่สุดของการตอด 6 บิตสุดท้ายใน ปริมาณข้อมูลที่ควรละเว้น โปรดทราบว่าแผ่นอิเล็กโทรดนี้มีปฏิสัมพันธ์ที่ซับซ้อนกับข้อกำหนด <[ITU-1371]> สำหรับการจัดตำแหน่งไบต์ในข้อความ AIS แบบ over-the-air; ดูการสนทนาโดยละเอียดเกี่ยวกับความยาวของข้อความและการจัดแนวในส่วนหลัง

ส่วนต่อท้าย * -separated ( 5C) คือการตรวจสอบความสมบูรณ์ของข้อมูล NMEA 0183 สำหรับประโยคนำหน้าด้วย " " มันถูกคำนวณในประโยคทั้งหมดรวมถึงแท็ก AIVDM แต่ไม่รวมส่วนนำ "!"

ยิ่งไปกว่านั้นส่วนสำคัญที่นี่คือฟิลด์ 6 ดังนั้นถ้าคุณกลั่นกรองผ่านไซต์อีกต่อไปคุณจะได้รับคำตอบนั่นคือฟิลด์ที่บรรจุข้อมูล 6 ประกอบด้วยตัน (ไม่จริง ๆ ตัน!) ของเขตข้อมูลต่างๆภายใน ดังนั้นคุณสามารถเขียนรหัสของคุณเองเพื่อแยกวิเคราะห์หรือใช้ gitub repo ที่โพสต์ในคำตอบอื่น ๆ ซึ่งมี SDK / APIs ต่าง ๆ ที่น่าจะมีสิ่งที่คุณต้องการ (ขึ้นอยู่กับตำแหน่งที่คุณได้รับข้อมูล AIS): https: / /github.com/bcl/aisparser


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.