GPS-M1zz 바이너리 데이터의 해석: 아는 사람만이 알아본다

[목차(도우미)]
GPS기기를 카네비게이션으로 실용화 시킨 것은 일본의 파이오니어(Pioneer)사라고 한다. 음향기기 회사로 시작한 회사인데 GPS 를 군사 목적 이외에 민간 목적으로 풀렸을 때 카 네비게이션 기기로 실용화시킨 것은 이 회사의 야심이었다고 한다.
출처: http://ja.wikipedia.org/wiki/パイオニア

한편 파이오니어사의 GPS-M1ZZ기기는 공장 출하 상태는 파이오니어 모드로 불리우는 바이너리 데이터를 취급하도록 되어 있다. 딥 스위치(DIP switch)를 바꾸면 NMEA 형식으로도 위치 정보를 취득할 수 있지만 통신 속도는 바이너리 데이터가 빠른 것으로 되어있다.

NMEA 형식에 대해서는 http://ko.wikipedia.org/wiki/NMEA 등을 참조하면 유용한 정보를 알수 있다.

그런 이유에서 파이오니어 모드를 해석해서 위치정보를 파악할 수 있다. request-response 형식에 대해서는 제품 매뉴얼에 상세히 나오므로 여기서의 상술은 생략한다. 다만 프로그램을 개발하기 위하여 독특한 점, 주의점에 대해서만 설명을 남겨두고자 한다.

인터넷상에는 VB6(Visual Basic 6)로 프로그램을 하려면 어떻게 하는지에 대한 포럼 질문 응답이 발견된다. 그러나 바이너리 데이터를 해석하고자 하는 목적의 GPS를 취득하려는 사람이라면 오히려 Linux GNU C++로 프로그램을 개발하려는 사람이 더 많을 것으로 생각한다.

기본적인 바이너리 응답 형식은
<DLE><ID> data <CS><DLE><ETX>
DLE: data link end, 0x10
ETX: end of text, 0x03
그러므로 데이터에 만일 DLE에 해당하는 0x10 데이터가 발생하면 0x10을 두번 발생시켜서 응답한다. CS(Checksum)이 0x10일 경우에도 두번 0x10을 발생시킨다. 그렇게해서 <DLE> 인지 단순히 데이터인지를 구별짓는다.
예를 들어 10월이라는 날짜가 들어가는 경우, ID75의 응답은
10 75 ... 10 10 ...10 03 이 된다.문제는 어디까지 읽어야 하는가, 즉 <DLE><ETX>가 어디까지인가에 귀착된다.

판단 로직
  • 데이터를 1바이트씩 읽다가 S[K] = 0x10을 만나면 이는 <DLE>가 될 가능성이 있다.
  • S[K] = DLE 다음에 S[K] = 0x03이 나오면 이는 <DLE><ETX>의 가능성이 있다.
  • 하지만 "... 10 10 03" 이라면 이는 단순한 데이터이다. 10 03이 끝이라면 앞의 10은 체크섬인데 체크섬은 단독으로 10이 될 수 없기 때문이다.
  • 만일 "10 10 10 03" 이라면 이는 데이터의 <DLE><ETX>로 확정 가능하다.
  • 물론 "... ... 10 03" 이라면 당연히 데이터의 <DLE><ETX>로 확정 가능하다.
각각의 데이터가 의미하는 값은 구조체(typedef struct)를 이용하면 간단히 메모리 복사(memcpy)로 값을 읽어낼 수 있다.
by 금메달.아빠 on 2011. 10. 18. 00:51