소년포비의 세계정복!!

[C#] SCH-M480 (미라지폰) GPS Control (제어) 본문

윈도우폰 세상/Windows Phone

[C#] SCH-M480 (미라지폰) GPS Control (제어)

소년포비 2009. 10. 30. 00:08

[출처] 〃C#, SCH-M480 (미라지폰) GPS Control (제어)|작성자 Chuls

 

GPS가 내장된 스마트폰에서 대중교통 이용과 관련된 서비스..
막연히 OS상에서 GPS관련 셋팅을 해주고, 내부적으로 연결된 Serial port로 RS232통신을 하면 무리없
이 GPS의 값을 받아 볼 수 있으리라 생각했었습니다.


대부분의 PDA나 스마트폰이 기본적으로 위와 같은 과정으로 GPS값을 수신해 볼 수 있기때문입니다.
그런데 이 녀석이 배신을 때리더군요. 삼성전자의 제품들이 워낙 다른 애플리케이션에게 인색한 면모가 있기는 하
지만, 이건 해도해도 너무 했습니다. 아무리 기다려도 제데로된 GPS값 수신을 할 수 없었지요. 아직 학생인지라..
dll을 요구해도 전혀 받아볼 수 없었구요.


그래서 찾아낸 녀석이 GSPAPI와 WM6.0에 들어있는 GPS Sample이라는 녀석입니다.
이 녀석들을 통하면 NMEA파싱 과정도 매우 간략화 되니 프로그래머 입장에서는 더욱 편리합니다.
신기하게도 GPSAPI를 사용하면 제데로된 동작이 이루어 지지 않습니다.
물론 제가 잘못한 걸 수도 있지만, 수신률이 50%에도 미치지 못하더군요.
반면 GPS Sample을 활용한 경우 수신률이 거의 90%를 상회하는 결과를 확인할 수 있었습니다.


그러면 이제부터 GPS Sample을 활용하여 내장GPS를 제어해보도록 하지요.

우선 WM6.0을 설치해야겠지요?


http://www.microsoft.com/downloads/details.aspx?familyid=06111A3A-A651-4745-88EF-3D48091A390B&displaylang=en

 

위 링크에서 WM6.0을 다운로드 후 설치하시면 되겠습니다.


설치가 끝나면.. 간단하게 기능을 이용할 수 있는데요.
경로를 특별히 변경하지 않고 설치했다면.. 아마도 아래 경로에 설치되어있을 겁니다.
C:₩Program Files₩Windows Mobile 6 SDK₩Samples₩Smartphone₩CS₩GPS
직접 이동해서 파일들을 확인해보시기 바랍니다.


그럼 이제 라이브러리를 구했으니.. 간단하게 사용법을 알아보도록 할까요?

위 샘플에서 제공되는 클래스는 아래와 같이 정리할 수 있습니다.

 

GPS 클래스

 

GpsDeviceState 클래스
DeviceStateChangedEventArgs 클래스 (EventArgs클래스를 상속받습니다.)

 

GpsPosition 클래스
LocationChangedEventArgs 클래스 (역시 EventArgs클래스를 상속받습니다.)

 

Utils 클래스
DegreesMinutesSeconds 클래스

 

GPS클래스가 다른 모든 클래스를 통합시켜, 실제로 GPS제어에 사용되는 클래스 입니다.
그외에 클래스들은 이름을 보시면 느낌이 오시겠죠.. GPS장치, 위치처리 등에 필요한 클래스와 그 이벤트들을 별
도로 만들어 처리할 수 있도록 만들어진 클래스들입니다.
실제로 사용하는 클래스는 GPS, GpsDeviceState, GpsPosition 클래스 정도입니다.
그럼.. 실제로 사용해보도록 할까요?

 

 

위와 같이 이벤트 핸들러를 하나 선언하도록 하구요. 언급했던 클래스들의 객체를 만들어줍니다.
그리고.. 이벤트 핸들러를 추가해 주어야 합니다. 생성자나, 로드 이벤트 등에 적절하게 넣어주시면 되겠습니다.
위에 선언한 객체들을 기반으로 아래와 같은 코드가 실행되면 되겠습니다.

 


위의 updateDataHandler 에 이벤트처리기 설정한 UpdateData() 에서 실제로 처리를 수행하게 됩니다. 말 그대로
이벤트 처리기입니다.
아래 2개의 이벤트 처리기는 무엇이고 하니, GPS상태와 위치가 변경되었을 때 GPS객체에 새롭게 갱신시켜주는
역활을 수행하는 이벤트처리기입니다. gps객체와 연결시키도록합니다.
이 작업이 끝나면 gps를 열어줍니다. gps객체 내부의 Open()메소드를 사용하시면 되겠습니다.
Open()이 있으니 Close()도 있겠죠? 프로그램 종료시에는 반드시 Close()해주도록 합니다.

 


그러면 간단하게 이벤트처리기를 구현해볼까요?
우선 장치상태/위치 변경과 관련된 gps_DeviceStateChanged와 gps_LocationChanged를 먼저 구현하도록 하지
요.

 


(이와 같이 Invoke를 사용하여 처리해줍니다.)

 


UpdateData에서 모든 데이터가 들어오고 출력이 이루어 집니다.
아래와 같은 형식으로 구현하면 되겠습니다.

 


데이터를 읽어올 때는 가장 처음에 선언했던 device와 position 객체를 사용하면 대부분 GPS와 관련된 정보를 받
아올 수 있습니다.

 

device.FriendlyName //GPS장치명
device.ServiceState //GPS서비스 상태(버전등 정보 포함)
device.DeviceState //GPS장치의 on/Off여부


position.Latitude //위도(DD)
position.LatitudeInDegreesMinutesSeconds //위도(D,M,S)
position.Longitude //경도(DD)
position.LongitudeInDegreesMinutesSeconds //경도(D,M,S)
position.GetSatellitesInSolution().Length //사용중인 위성 갯수
position.GetSatellitesInView().Length //탐지된 위성 갯수
position.Time //GPS로 받아본 국제표준시간


그리고 position을 사용할 떄는 다음과 같은 사항에 유의 하여야 합니다.
막연히 프로퍼티나 메소드를 호출하면 프로그램이 죽는 경우가 발생하므로, 해당 데이터가 활성 또는 존재하는가
검사 후 접근해야 하는데요. 다음과 같은 속성이 제공되므로 사용하시면 되겠습니다.
위의 속성 또는 메소드명 뒤에 Valid 만 붙여주면 사용가능 한지 여부를 판단해줍니다.
이를테면... 위도 정보가 읽어졌는지 확인하려면...


if(position.LatitudeValid)
{
//이 부분에서 실제로 position.Latitude에 접근하여 데이터를 읽어옴
}


이와 같은 형식으로 사용하시면 되겠습니다. 위에 기제된 position의 모든 속성에 대하여 Valid를 붙이면 사용가능
여부를 받아볼 수 잇으므로 반드시. 속성에 접근하기전 position.xxxxxValid를 호출 후 접근하시기 바랍니다.