原文見Day 03: GPS Compass
需求
使用GPS資訊顯示指南針。
實現
GPS指南針就是在UI上顯示當前位置的方位(azimuth),GPS receiver輸出的NMEA裡就包含了這個資訊。存放在GPRMC的第八個欄位。
$GPRMC,015834,A,3749.8448,S,14459.6697,E,000.0,136.8,120908,011.7,E*63
上述例子中136.8為方位角。基於NMEA的分析,我寫過一篇文章.NET Compact Framework下的GPS NMEA data資料分析。
作者提出進行GPS的開發有三種選擇,1.直接使用串口串連GPS receiver。2.使用OpenNETCF GPS Library。3.使用GPS Intermediate Driver。
作者最終選擇了GPS Intermediate Driver,這個庫支援Windows Mobile 5以上系統。MS宣稱GPS Intermediate Driver可以屏蔽所有硬體的差異,說實在,屏蔽了所有硬體的差異意味著這個庫只是支援通用的NMEA,廠商的NMEA就不能解析出來了。凡事都是有優缺點,技術選型主要取決於需求。對這個指南針的需求比較簡單,只是需要取出方位角資訊,使用GPS Intermediate Driver可以提高開發效率。
進行GPS Intermediate Driver的開發,可以從參考Windows Mobile 6的案例代碼C:\Program Files\Windows Mobile 6 SDK\Samples\PocketPC\CS\GPS。MS把GPS Intermediate Driver封裝到Microsoft.WindowsMobile.Samples.Location裡面,進行Compatct Framework的開發,我們只需要使用Microsoft.WindowsMobile.Samples.Location就可以了。
GpsDeviceState device = null;
GpsPosition position = null;
Gps gps = new Gps();
private void Form1_Load(object sender, System.EventArgs e)
{
gps.DeviceStateChanged += new DeviceStateChangedEventHandler(gps_DeviceStateChanged);
gps.LocationChanged += new LocationChangedEventHandler(gps_LocationChanged);
}
private void startGpsMenuItem_Click(object sender, EventArgs e)
{
if (!gps.Opened)
{
gps.Open();
}
}
private void stopGpsMenuItem_Click(object sender, EventArgs e)
{
if (gps.Opened)
{
gps.Close();
}
}
上面是使用Microsoft.WindowsMobile.Samples.Location的核心代碼,GpsDeviceState device定義GPS裝置的狀態,裝置的具體狀態可以參考GpsDeviceState.cs裡面的enum定義
public enum GpsServiceState : int
{
Off = 0,
On = 1,
StartingUp = 2,
ShuttingDown = 3,
Unloading = 4,
Uninitialized = 5,
Unknown = -1
}
GpsPosition position定義了位置資訊,其實這個類是大而全的類,把通用的NMEA可以分析的資訊全部放到這個類裡面。
有類圖定義可見,我們不僅僅可以得到方位角資訊,而且可以在這個類裡面得到經緯度,海拔,UTC時間,速度,衛星狀態,誤差值等等。
Gps對象表示一台Gps的裝置,gps.Open();為開啟裝置,開始接受GPS資訊,gps.Close();為關閉該裝置。gps.DeviceStateChanged += new DeviceStateChangedEventHandler(gps_DeviceStateChanged);和gps.LocationChanged += new LocationChangedEventHandler(gps_LocationChanged);表示訂閱裝置狀態變化資訊和位置變化資訊。從GpsPosition的類定義知道,當位置發生變化,也就是回調gps_LocationChanged的時候,可以取出經緯度,海拔等多方面的資訊。因此只要訂閱該訊息就可以完成幾乎所有的GPS開發。
使用假GPS(FakeGPS)裝置測試程式
作者提供了一個測試方法,使得沒有GPS receiver的裝置也可以進行測試,FakeGPS 可以在C:\Program Files\Windows Mobile 6 SDK\Tools\GPS找到。FakeGPS可以參考 施炯 同學的 A Windows Mobile GPS Application Sample – Using Fake GPS
設定Share Folder。
安裝FakeGPS.CAB。
配置FakeGPS。
使用FakeGPS測試GpsCompass,請在Window Mobile 6 Professional下測試,我在Window Mobile 6 Classic下測試,開啟GPS裝置失敗。
安裝程式: gpsCompass.cab
原始碼: gpsCompass.zip
.NET Compact Framework, WinCE, Windows Mobile開發系列
Jake's Blog in 部落格園 -- 精簡開發 無線生活