30 Days of .NET [Windows Mobile Applications] – Day 03: GPS Compass(GPS指南針)

來源:互聯網
上載者:User

原文見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 部落格園 -- 精簡開發 無線生活

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.