NMEA라고 주로 불리는 NMEA 0183은 시간, 위치, 방위 등의 정보를 전송하기 위한 규격이다. NMEA 0183은 미국의 NMEA(The National Marine Electronics Association)에서 정의해 놓았다. 이 데이터들은 주로 자이로컴퍼스, GPS, 나침반, 관성항법장치(INS)에 사용된다. NMEA 0183은 ASCII코드로 직렬 방식의 통신을 사용한다.
NMEA 0183은 3가지 레이어로 구성되어 있으며, 이것은 각각 물리 계층, 데이터링크 계층, 애플리케이션 계층이다. 물리 계층은 RS-232, RS-422 등의 전기적인 전송 규격을 뜻한다. 데이터링크 계층은 Baud rate, Data bit, Parity bit, Stop bit 등을 정해 놓는다. Application Layer는 데이터를 전송하는 Sentence에 대한 규약이이며 GPS등에서 표준프로토콜이다.
애플리케이션 레이어에서의 문장 구조의 형식 및 특징은 다음과 같다.
주로 사용되는 문장에 대한 예시와 설명은 다음과 같다.
$ELEXTECH, Inc G1800s
$HW Version 1.6
$SW Version 231.000.100
$Startup 4
$TOW: 0
$WK: 1192
$POS: 6378137 0 0
$Baud rate: 9600 System clock: 24.553MHz
$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48
$GPGSA,A,2,19,25,15,,,,,,,,,,21.5,7.9,20.0*32
$GPGSV,3,1,10,03,86,244,00,19,51,218,38,16,51,057,00,07,40,048,00*77
$GPGSV,3,2,10,13,34,279,00,23,33,236,00,15,29,076,40,25,25,143,38*71
$GPGSV,3,3,10,21,18,051,,27,12,315,*77
$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A
GPGGA Global Positioning System Fix Data라고 한다. 여기에서 주로 알 수 있는 것은 시간, 위도, 경도, 고도 등이다.
$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48
GPGSV GPS Satellites in View는 현재 GPS Module이 수신할 수 있는 모든 위성의 정보이다. 모든 위성을 계산에 사용하지는 않는다.
$GPGSV,3,1,10,03,86,244,00,19,51,218,38,16,51,057,00,07,40,048,00*77
$GPGSV,3,2,10,13,34,279,00,23,33,236,00,15,29,076,40,25,25,143,38*71
$GPGSV,3,3,10,21,18,051,,27,12,315,*77
최대 4개의 위성이 하나의 Sentence에 들어갈 수 있다.
GPRMC Recommended Minimum data는 추천되는 최소한의 데이터들이다.
$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A
GSA는 GNSS DOP and Active Satellite를 의미한다. 데이타를 제공하는 위성을 나열하는 GSA 레코드에는 위성 번호에 대한 12개의 필드가 포함되어 있지만 8개의 위성 만 고려되므로 4개의 필드는 비어 있다.GSA는 단독으로 쓰이기 보다는 GSV와 상호참조로 위성상태를 확인하거나 시각적 분석을 위한 GLONASS 인공위성 및 이들의 자료등을 활용할 수 있다. 이 GSA 문장의 각각에는 대화자 ID GN가 있어야한다. 인공위성은 조합된 솔루션에 사용되며 각각의 위치 데이타에 사용된 결합 위성은 PDOP(축위오차), HDOP(수평오차) 및 VDOP(수직오차)를가지고있다.
$--GSA,a,x,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,xx,x.x,x.x,x.x*hh<CR><LF>
자바 버전
char checkSum(String nmeaStr) {
char check = 0; // iterate over the string, XOR each byte with the total sum;
for (int c = 0; c < theseChars.length(); c++) {
check = char(check ^ theseChars.charAt(c));
} // return the result return check;
}