C#_NMEA-0183 프로토콜

Today Jeeho Learned·2022년 11월 30일
0

C#

목록 보기
14/17

INTRO

GPS 데이터를 수신하고, 데이터에서 필요한 정보를 빼내야한다! 이러한 GPS데이터와 관련하여 NMEA프로토콜에 대해서 알아야한다.

NMEA 개요

NMEA는 'National Marine Electronics Association'의 앞글자를 딴 약자이다.
해양 전자공학 산업의 발달과 교육을 위해 모인 비영리 단체를 지칭한다.
그리고 NMEA 표준은 ”해양 전자 장비 기자재들 간의 통신을 위해 정의된 전기적 인터페이스 및 데이터 프로토콜” 이라고 정의할 수 있다.

해양 전자 장비 기자재들 간의 통신을 위해 정의된 전기적 인터페이스 및 데이터 프로토콜

NMEA에서는 몇가지 프로토콜을 정의 했는데, 현재 GPS통신에서는 'NMEA-0183'을 표준 프로토콜로 사용하고 있다. 표준을 관리하는 NMEA의 웹사이트는 http://www.nmea.org 이니 알아두도록 하자.

NMEA 들여다보기

어떤 모양인지 보자

$GPGGA,141113.999,3730.0308,N,12655.2369,E,1,06,1.7,98.9,M,,,,0000*3E

$GPGSA,A,3,02,07,01,20,04,13,,,,,,,3.7,1.7,3.2*31 

$GPRMC,141113.999,A,3730.0308,N,12655.2369,E,19.77,195.23,101200,,*3C

$GPGGA,141114.999,3730.0264,N,12655.2351,E,1,07,1.2,98.8,M,,,,0000*3C 

$GPGSA,A,3,02,07,01,20,24,04,13,,,,,,2.3,1.2,1.9*3E

$GPRMC,141114.999,A,3730.0264,N,12655.2351,E,15.51,202.12,101200,,*3C 

$GPGGA,141115.999,3730.0231,N,12655.2345,E,1,07,1.2,98.7,M,,,,0000*37

$GPGSA,A,3,02,07,01,20,24,04,13,,,,,,2.3,1.2,1.9*3E

$GPGSV,2,1,07,07,84,025,47,04,51,289,48,20,40,048,47,02,32,203,46*74

$GPGSV,2,2,07,01,23,101,47,13,20,131,32,24,19,268,40*49

$GPRMC,141115.999,A,3730.0231,N,12655.2345,E,12.14,194.75,101200,,*33

$GPGGA,141116.999,3730.0210,N,12655.2330,E,1,07,1.2,98.5,M,,,,0000*37

$GPGSA,A,3,02,07,01,20,24,04,13,,,,,,2.3,1.2,1.9*3E

$GPRMC,141116.999,A,3730.0210,N,12655.2330,E,8.01,194.65,101200,,*0F

$GPGGA,141117.998,3730.0199,N,12655.2320,E,1,06,1.3,98.2,M,,,,0000*33

$GPGSA,A,3,02,07,01,20,24,04,,,,,,,2.4,1.3,2.0*30

이런 형태로 되어있다. GNSS에서는 언제 NMEA-0183을 사용하는가?

위성신호를 해석해낸 GPS수신기가 해석한 정보를 외부에 알리는데 사용하는 방법이다.
GPS측위가 시작되면 GPS위성으로부터의 반송파에 실려오는 데이터를 GPS수신기는 해석을 할텐데, 해석되는 내용을 알려주는 방식이라고 이해하면 쉽다. GPS수신기는 이와 같은 내용을 1초 ~ 수초마다 Serial 출력의 형태로 내보낸다. 위의 예를 보면 '$' 라는 문자로 시작되는데, 이렇게 $로 시작되는 각각의 한줄을 'NMEA Sentence' 혹은 'NMEA 문장' 이라고 부른다.

NMEA Sentence 구성요소

$ - 문장의 시작을 의미함

Linefeed - 문장의 끝을 의미함, 줄바꿈 문자 <CR>/<LF> 를 말한다.

Device ID - 장치를 구분하는 용도다. 현재 이 데이터를 말하는 장치의 ID라는 의미로 'Talker ID'라고도 부른다. '$' 바로 다음에 오는 문자 2개. 예를 들면 'GP' 와 같은 것.

Sentence ID - 문장을 구분하는 용도다. Sentence Name이라고도 한다. Device ID 다음에 오는 문자 3개. 예를 들면 'RMC' 와 같은 것.

콤마 - 각 필드를 구분하는 용도이다.

$GPRMC,141114.999,A,3730.0264,N,12655.2351,E,15.51,202.12,101200,,*3C

이 문장을 다시 보고 분류해보자

  • 문장의 시작은 $이고,
  • GP라는 Device ID(Talker ID)를 가지고 있으며,
  • RMC라는 Sentence ID를 가지고 있다.
  • '3C'는 checksum 값이다. 두자리 16진수이고, 데이터가 올바르게 전달 되었는지 확인하는 용도

이제 뒤에 부분을 어떻게 읽으면 되는지 알아보자, 어떻게 읽는지는 Sentence ID에 따라서 달라진다.
참고로 통상적인 GPS 수신기에서는 몇가지 Device ID만 제한적으로 출력된다.

GP - Global Positioning System receive
LC - Loran-C receive
OM - Omega Navigation receive

NMEA checksum 계산방법 및 예제코드

지금까지 예제로 보여준 NMEA sentence들을 살펴보면 알겠지만, checksum은 뒤에 16진수 두자리로 표시한다. checksum의 계산은 $, 의 사이에 있는 각 문자를 exclusive-or (XOR) 연산한 값을 표시한다.
어떤 NMEA sentence가 주어지면, "*" 뒤에 있는 16진수 두자리의 checksum과 직접 XOR연산한 값이 일치하는지를 검사해야 한다. 일치하지 않는다면, 그 sentence는 통신상의 문제 등의 이유로, 결함이 있는 것으로 간주해야 하며, 사용하면 안된다.

예를 들어보자

$GPRMC,155123.000,A,4043.8432,N,07359.7653,W,0.15,83.25,200407,,*28

이와같은 NMEA sentence가 주어졌을때, checksum계산을 위한 XOR연산을 아래 각 문자들에 대해서 수행하면 된다.

GPRMC,155123.000,A,4043.8432,N,07359.7653,W,0.15,83.25,200407,,

https://techlog.gurucat.net/305 해당블로그를 참조하자

profile
기록해야 (살아)남는다 !

0개의 댓글