Cách diễn giải mẫu dữ liệu AIS thô


9

Tôi đã tìm thấy một tệp chứa khoảng 85.000 tin nhắn (nguồn cấp dữ liệu AISHub trực tiếp 3 phút), nhưng tôi không thể tạo ra đầu hoặc đuôi của nó.

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

Có một lược đồ ở đâu đó không?


Tôi không sử dụng ngôn ngữ lập trình nào mà bạn thường sử dụng, nhưng tôi sẽ khuyên bạn nên sử dụng thư viện để giải mã nó. Đây là mục yêu thích của tôi: github.com/bcl/aisparser
bjornasm

1
Tôi có thể giới thiệu thư viện Ruby của riêng mình để giải mã AIS , dựa trên trang web catb.org mà những người khác đã đề cập.
Ian

Câu trả lời:


7

Có một kho lưu trữ github tốt của Kurt Schwehr , người làm việc tại Trung tâm lập bản đồ vùng biển và đại dương (để theo dõi các hoạt động của cá voi chẳng hạn). Ở đó, bạn sẽ tìm thấy một bộ giải mã và tài liệu để hiểu các thông điệp nmea (chủ yếu là các liên kết được đăng bởi các bài đăng của @ianmayo và @GID Dev). Đây là một cách nhỏ để chạy dưới LINUXpython 2.7.

Để có được một số mã đang chạy, bạn cần gitmột C++trình biên dịch python setup environment, cmake. Tải xuống dữ liệu từ

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

và làm theo hướng dẫn cài đặt trên / tại trang github hoặc chạy

$ 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

Sau tất cả, bạn nên có các thư viện trong pythonmôi trường của bạn .

 $ 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

Dưới đây là một số mã nhanh và bẩn trong một tập lệnh được gọi test-ais.pyđể lấy unix like head& tailbehavior. Tôi sử dụng jsonnhư một "máy in đẹp văn bản rõ ràng".

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

Giả sử rằng các nmea-samplestập tin nằm trong một datathư mục, bạn có thể lọc ra dòng bạn muốn hiển thị cat, headtail...

$ 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
 }

Bắt đầu từ mã json, thật dễ dàng để tiếp tục với các định dạng và lưu trữ công cụ hơn nữa.


5

Các AIVDM / AIVDO giao thức giải mã trang web chứa các câu trả lời nhưng có rất nhiều để sift thông qua đó. Để trả lời câu hỏi được đặt ra, đây là từ trang web nói trên theo định dạng đó:

Đây là gói dữ liệu AIVDM điển hình:

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

Và đây là ý nghĩa của các trường:

Trường 1 ,! AIVDM, xác định đây là gói AIVDM.

Trường 2 (1 trong ví dụ này) là số lượng các đoạn trong thông báo hiện đang tích lũy. Kích thước tải trọng của mỗi câu bị giới hạn bởi tối đa 82 ký tự của NMEA 0183, do đó, đôi khi cần phải chia một tải trọng trên một số câu phân đoạn.

Trường 3 (1 trong ví dụ này) là số phân đoạn của câu này. Nó sẽ là một dựa trên. Một câu có số lượng phân đoạn là 1 và số phân đoạn là 1 đã hoàn thành.

Trường 4 (trống trong ví dụ này) là ID tin nhắn tuần tự cho các tin nhắn nhiều câu.

Trường 5 (B trong ví dụ này) là mã kênh radio. AIS sử dụng mặt cao của song công từ hai kênh radio VHF: Kênh AIS A là 161.975Mhz (87B); Kênh AIS B là 162.025Mhz (88B). Trong tự nhiên, mã kênh 1 và 2 cũng có thể gặp phải; các tiêu chuẩn không quy định cách giải thích về những điều này nhưng nó đủ rõ ràng ..

Trường 6 (177KQJ5000G? TO`K> RA1wUbN0TKH trong ví dụ này) là tải trọng dữ liệu. Chúng tôi sẽ mô tả cách giải mã điều này trong các phần sau.

Trường 7 (0) là số bit điền yêu cầu để đệm tải trọng dữ liệu đến ranh giới 6 bit, từ 0 đến 5. Tương đương, trừ 5 từ đây cho biết có bao nhiêu bit có ý nghĩa nhỏ nhất của nibble 6 bit cuối cùng trong tải trọng dữ liệu nên được bỏ qua. Lưu ý rằng byte pad này có tương tác phức tạp với yêu cầu <[ITU-1371]> để căn chỉnh byte trong các thông điệp AIS không dây; xem thảo luận chi tiết về độ dài và căn chỉnh tin nhắn trong phần sau.

Hậu tố * phân tách ( 5C) là tổng kiểm tra tính toàn vẹn dữ liệu của NMEA 0183 cho câu, đứng trước " ". Nó được tính toán trên toàn bộ câu bao gồm thẻ AIVDM nhưng không bao gồm dấu "!" Hàng đầu.

Hơn nữa, phần quan trọng ở đây thực sự là trường 6, vì vậy nếu bạn chọn thêm trang web, bạn sẽ nhận được câu trả lời: tải trọng dữ liệu của trường 6 đó chứa một tấn (không thực sự là một tấn!) Của các trường khác nhau trong đó. Vì vậy, bạn có thể viết mã của riêng mình để phân tích mã hoặc sử dụng repo github được đăng trong câu trả lời khác có chứa nhiều SDK / API khác nhau có thể có những gì bạn cần (tùy thuộc vào nơi bạn có dữ liệu AIS của mình): https: / /github.com/bcl/aisparser


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.