12 Mayıs 2016 Perşembe

National Maritime Electronics Association - NMEA

NMEA Formatı
Denizcilikte kullanılan bir çok cihaz NMEA 0183 formatında veri gönderir.

Bazı mesajlar NMEA dokümanında tanımlıdır, bazı cihazlarsa kendi özelleştirilmiş mesajlarını gönderirler.

NMEA Dokümanı Mesaj Alanları
Mesaj alanları için bazı karakterler kullanılıyor. 

Table 3 Character Symbol Table 
Bunları listeliyor. Noktalı virgül ile ayrılıyorsa A veya B olabilir demek
a: Alphabet character variable A through Z or a through z. Alfabe karakteri, c yani Valid character kümesinden küçüktir. Rakam ve bazı işaretleri içermez
c : Valid character;Calculating
h : Hours;HEX Number. Yani Hours veya HEX olaiblir.
m : Minutes;message
s : Seconds;Six bit numer
x : Numeric character variable

Table 6 Field Type Summary
aa : İki tane alfabe karakteri
c--c : Değişken uzunlukta string. Bazen string'in uzunluğu belirtiliyor.
hhmmss.ss : Time içindir. hhmmss alanı sabittir. Noktadan gelen ss alanı değişken sayıda basamaklıdır
x.x : Değişken uzunlukta integer veya floating sayı içindir. Başında 0 olabilir/olmayabilir

Maven
Şu satırı dahil ederiz
<dependency>
  <groupId>net.sf.marineapi</groupId>
  <artifactId>marineapi<artifactId>
  <version>0.11.0</version>
</dependency>
Örnek - Mesaj Parse Etme
Şöyle yaparız
import net.sf.marineapi.nmea.parser.SentenceFactory;
import net.sf.marineapi.nmea.sentence.GSASentence;

String nmea = "$GPGSA,A,3,03,05,07,08,10,15,18,19,21,28,,,1.4,0.9,1.1*3A";
SentenceFactory sf = SentenceFactory.getInstance();
GSASentence gsa = (GSASentence) sf.createParser(nmea);
Örnek - Mesajı String'e Çevirme
Şöyle yaparız
import net.sf.marineapi.nmea.parser.SentenceFactory;
import net.sf.marineapi.nmea.sentence.MWVSentence;
import net.sf.marineapi.nmea.sentence.TalkerId;
import net.sf.marineapi.nmea.util.DataStatus;
import net.sf.marineapi.nmea.util.Units;

// Create a fresh MWV parser
SentenceFactory sf = SentenceFactory.getInstance();
MWVSentence mwv = (MWVSentence) sf.createParser(TalkerId.II, "MWV");
// should output "$IIMWV,,,,,V*36"
System.out.println(mwv.toSentence());
// Be sure to set all needed values correctly. For instance, in this
// example setAngle() and setTrue() have mutual dependency. Likewise,
// pay attention to set units correctly.
mwv.setAngle(43.7);
mwv.setTrue(true);
mwv.setSpeed(4.54);
mwv.setSpeedUnit(Units.METER);
mwv.setStatus(DataStatus.ACTIVE);
// should output "$IIMWV,043.7,T,4.5,M,A*39"
System.out.println(mwv.toSentence());
Örnek - SentenceReader + SentenceListener
Şöyle yaparız
import net.sf.marineapi.nmea.event.SentenceEvent;
import net.sf.marineapi.nmea.event.SentenceListener;
import net.sf.marineapi.nmea.io.SentenceReader;
import net.sf.marineapi.nmea.sentence.GGASentence;
import net.sf.marineapi.nmea.sentence.SentenceId;

public class SentenceListenerExample implements SentenceListener {

  @Override
  public void readingPaused() {...}
  @Override
  public void readingStarted() {...}
  @Override
  public void readingStopped() {...}
  @Override
  public void sentenceRead(SentenceEvent event) {
    // Safe to cast as we are registered only for GGA updates. Could
    // also cast to PositionSentence if interested only in position data.
    // When receiving all sentences without filtering, you should check the
    // sentence type before casting (e.g. with Sentence.getSentenceId()).
    GGASentence s = (GGASentence) event.getSentence();

    // Do something with sentence data..
    System.out.println(s.getPosition());
  }
}

// create sentence reader and provide input stream
InputStream stream = new FileInputStream(file);
SentenceReader reader = new SentenceReader(stream);

// register self as a listener for GGA sentences
reader.addSentenceListener(new SentenceListenerExample (), SentenceId.GGA);
reader.start();
Örnek 
Şöyle yaparız
class GGAListener extends AbstractSentenceListener<GGASentence> {
@Override public void sentenceRead(GGASentence gga) { Position pos = gga.getPosition(); // .. your code } } File file = new File("/var/log/nmea.log"); SentenceReader reader = new SentenceReader(new FileInputStream(file)); reader.addSentenceListener(new GGAListener()); reader.start();

1. TalkerID Alanı
Cümleler $ işareti ile başlar. Daha sonra hangi cihazdan geldiğini belirtmek için 2 harflik bir alan gelir. Bu 2 harfe TalkerID de deniliyor. Mesela  GPS alıcısından geldiğini belirtmek için GP harfi eklenir. 

2. SentenceID Alanı
Sonraki 3  harf ise cümlenin amacını belirtir. Buna da SentenceID deniliyor. Bazı örnekler şöyle
$GPVTG : Velocity
$GPGLL : Position
$GPZDA : Date Time
3. Veri Alanları
Alanlar virgül ayracı ile ayrılır. Her mesajına göre değişken sayıda olabilir.

4. Checksum Alanı
Mesajın sonundaki "*" karakterinden sonra gelen sayıdır. Açıklaması şöyle
The final part is an optional two-digit checksum - optional, but all good equipment will include this to help safe-guard the data in the sentence. The checksum is preceded by the ‘*’ character and is calculated by taking the 8-bit exclusive-OR of all characters in the sentence, including ‘,’ delimiters, between but not including the ‘$’ / ’!’ and ‘*’ delimiters.
National Maritime Electronics Association - NMEA ve Hızlı Arayüzler
NMEA çok yavaş bir mesajlaşma protokolü olduğu için hızlı arayüzler gerektiren cihazlarda kullanmak için uygun değil. Örneğin bir elektro-optik sistemin NMEA kullanması beklenemez.


GPS Mesajları
GPS Mesajları yazısına taşıdım


GN Mesajları
Bazı mesajlar şöyle
GNGGA
GNGSV
GNGST
GNGSA
Wind Instrument Mesajlar
Weather Instrument Mesajları yazısına taşıdım

Seyir Radarı (Navigation Radar) Mesajlar
Seyir Radarı Mesajları yazısına taşıdım

Echo Sounder (İskandil) Mesajlar
Echo Sounder Mesajları yazısına taşıdım

Magnetic Compass (Pusula)
Magnetic Compass Mesajları yazısına taşıdım

Speed Log (Parakete)
SpeedLog Mesajları yazısına taşıdım

GyroCompass
GyroCompass Mesajları yazısına taşıdım

Navtex
Navtex Mesajları yazısına taşıdım

Hiç yorum yok:

Yorum Gönder