NMEA Formatı
Denizcilikte kullanılan bir çok cihaz NMEA 0183 formatında veri gönderir.
Denizcilikte kullanılan bir çok cihaz NMEA 0183 formatında veri gönderir.
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 parserSentenceFactory 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 {@Overridepublic void readingPaused() {...}@Overridepublic void readingStarted() {...}@Overridepublic void readingStopped() {...}@Overridepublic 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 streamInputStream stream = new FileInputStream(file);SentenceReader reader = new SentenceReader(stream);// register self as a listener for GGA sentencesreader.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
3. Veri Alanları$GPVTG : Velocity$GPGLL : Position$GPZDA : Date Time
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ı
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
Magnetic Compass Mesajları yazısına taşıdım
Speed Log (Parakete)
GyroCompass Mesajları yazısına taşıdım
Navtex
Navtex Mesajları yazısına taşıdım
Hiç yorum yok:
Yorum Gönder