Ham AIS veri örneği nasıl yorumlanır


9

Yaklaşık 85.000 mesaj içeren bir dosya buldum (3 dakikalık canlı AISHub beslemesi), ancak bunun başlarını veya kuyruklarını yapamıyorum.

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

Bir yerde bir şema var mı?


Hangi programlama dilini sık kullandığınızı bilmiyorum, ancak kodunu çözmek için bir kütüphane kullanmanızı öneririm. Bu benim favorim: github.com/bcl/aisparser
bjornasm

1
Ben tavsiye edebilir AIS kodunu çözmek için kendi Yakut kütüphane dayanmaktadır, catb.org sitesinde başkalarının sözü bildirildi.
Ian

Yanıtlar:


7

Kurt Schwehr'in Kıyı ve Okyanus Haritalama Merkezi'nde ( örneğin balina faaliyetlerini izlemek için) çalışan iyi bir github deposu var . Orada bir kod çözücü ve nmea mesajlarını anlamak için belgeler bulacaksınız (çoğunlukla @ianmayo ve @GID Dev'in gönderileri tarafından menioned bağlantılar). İşte LINUXve altında çalışan küçük bir howto python 2.7.

Bazı kodların çalışmasını sağlamak için, gitbir C++derleyiciye python setup environment,, cmake. Verileri şuradan indir:

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

ve github sayfasındaki / sayfasındaki kurulum talimatlarını izleyin veya çalıştırın

$ 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

Sonuçta pythonortamınızda kütüphanelere sahip olmalısınız .

 $ 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

İşte test-ais.pyunix gibi head& tailbehavoir almak için çağrılan bir komut dosyası bazı hızlı ve kirli kod . Kullandığım jsonbir "açık metin oldukça yazıcısı" olarak.

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

Varsayarsak nmea-samplesdosyası bir olduğunu datadizinde, göstermek istediğiniz çizgiyi filtreleyebilirsiniz cat, headve 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 kodundan başlayarak, daha fazla biçimlendirme ve depolama ile devam etmek kolay olmalıdır.


5

Deşifre AIVDM / AIVDO protokol sitesini cevap içerir ama orada incelemeniz gereken çok şey var. Sorulan soruyu cevaplamak için, bu yukarıda belirtilen siteden şu formattadır:

İşte tipik bir AIVDM veri paketi:

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

Ve işte alanlar şu anlama geliyor:

Alan 1,! AIVDM, bunu bir AIVDM paketi olarak tanımlar.

Alan 2 (bu örnekte 1) mevcut durumda biriken mesajdaki parçaların sayısıdır. Her cümlenin taşıma kapasitesi, NMEA 0183'ün maksimum 82 karakteriyle sınırlıdır, bu nedenle bazen bir taşıma yükünü birkaç parça cümleye bölmek gerekir.

Alan 3 (bu örnekte 1) bu cümlenin parça numarasıdır. Tek tabanlı olacak. Parça sayısı 1 ve parça sayısı 1 olan bir cümle kendi içinde tamamlanmıştır.

Alan 4 (bu örnekte boştur), çoklu cümle mesajları için sıralı bir mesaj kimliğidir.

Alan 5 (bu örnekte B) bir radyo kanalı kodudur. AIS, iki VHF radyo kanalından dubleksin yüksek tarafını kullanır: AIS Kanalı A 161.975Mhz (87B); AIS Kanalı B 162.025 Mhz'dir (88B). Doğada, kanal kodları 1 ve 2 ile de karşılaşılabilir; standartlar bunların yorumlanmasını önermez, ancak yeterince açıktır ..

Alan 6 (bu örnekte 177KQJ5000G? TO`K> RA1wUbN0TKH) veri yüküdür. Bunu daha sonraki bölümlerde nasıl çözeceğimizi anlatacağız.

Alan 7 (0), veri yükünü 0 ila 5 arasında değişen 6 bitlik bir sınıra doldurmak için gereken doldurma bitlerinin sayısıdır. Eşdeğer olarak, bundan 5'in çıkarılması, son 6 bitlik uçta en az kaç tane önemli bitin kaç olduğunu belirtir. veri yükü göz ardı edilmelidir. Bu ped baytının, havadan AIS mesajlarında <[ITU-1371]> bayt hizalama gereksinimi ile zor bir etkileşime sahip olduğunu unutmayın; sonraki bölümlerde mesaj uzunlukları ve hizalamanın ayrıntılı tartışmasına bakınız.

* İle ayrılmış sonek ( 5C), cümle için " " ile başlayan NMEA 0183 veri bütünlüğü sağlama toplamıdır . AIVDM etiketi de dahil olmak üzere, ancak baştaki "!" Hariç tüm cümle üzerinden hesaplanır.

Dahası, buradaki önemli kısım aslında alan 6'dır, bu yüzden siteyi biraz daha elerseniz, cevabı alırsınız: bu alan 6 veri yükü, içinde çeşitli alanların bir tonunu (gerçekten, bir ton!) İçerir. Bu nedenle, ayrıştırmak için kendi kodunuzu yazabilir veya alternatif olarak, muhtemelen ihtiyacınız olan şeylere sahip olması gereken (AIS verilerinizi nereden aldığınıza bağlı olarak) çeşitli SDK'ları / API'leri içeren diğer cevapta yayınlanan github repo'yu kullanabilirsiniz: https: / /github.com/bcl/aisparser


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.