[Windows Mobile .NET CF] Hello GPS – Day6

[Windows Mobile .NET CF] Hello GPS – Day6

Hello ~~~ Hello ~~~
又到了快快樂樂學 Hello 系列…

今天要說的是 Hello GPS (Global Positioning System) , GPS 可是近幾年 Mobile Device 的當紅項目.
學會 GPS Programming, 非常有助於在 Mobile Device 上面發展 Location based service application.
這也是我認為將來很有錢途的方向之一呢.

在以前要在 Windows Mobile 上面寫 GPS programming, 都是用 serial COM port 連線,
然後解析 NMEA , 但自從 Windows Mobile 5.0 SDK 以來 , 微軟就推出了 GPSID (GPS Intermediate Driver).
透過 GPSID , 解決了以往在 Windows Mobile 上面使用 GPS 的幾個缺點:

1. 原本需要使用者輸入 COM port , 或是程式要自動讀取猜測某個  COM port 是否為 GPS , 但 GPSID 不用.
2. 因為透過 COM port, 沒辦法同時多個軟體一起使用 GPS , 而 GPSID 可以讓大家共享 GPS 資訊.
3. 透過 COM port , 只能取得 NMEA raw data, 還要一點點文字處理才能得到一般程式需要的經緯度資訊, 而 GPSID 已經幫你準備好了.

雖說 GPSID 好棒好棒…但是微軟就是沒有在 .NET CF 上面提供 GPSID 相關函式…
唉, 這 .NET CF 總是讓人感覺缺東缺西的 (好在 Android, IPhone, Palm Pre 通通浮上檯面, 相信微軟會緊張一下吧…呵)
.NET CF 只好透過 pinvoke 技術來使用 GPSID 囉…
不過也別太灰心, 微軟還是有點良心的, 在 Windows Mobile SDK  6.0 裡面提供了 .NET CF 使用 GPSID 的範例.
 

基於 Hello 系列講到 pinvoke 也有點過火,
我們直接用 SDK 裡面提供的 Microsoft.WindowsMobile.Samples.Location.dll 就好了.
有興趣的人可以在 SDK 安裝目錄下的 Samples\PocketPC\CS\GPS\GpsSample 找到範例原始碼
(一般而言 SDK 是裝在 C:\Program Files\Windows Mobile 6 SDK\ 下面)

以上是鋪梗的廢話.
以下是敲打一些簡單的程式

1. 初始化的動作

public Form1()
{
    InitializeComponent();
    gps = new Gps();
}

2. 啟動 GPS 的方法

{
    if (gps.Opened == false)
        gps.Open();
}

3.關閉 GPS 的方法

{
    if (gps.Opened == true)
        gps.Close();
}

 

4. 讀取 GPS 狀態以及資訊的方法, 這是主要的程式碼
(我用 timer 每一秒讀一次)

{
    GpsDeviceState state = gps.GetDeviceState();

    StringBuilder msg = new StringBuilder();
    msg.AppendLine("gps "+state.FriendlyName+" 服務狀態:" + state.ServiceState + ",裝置狀態:" + state.DeviceState);

    if (gps.Opened == true)
    {
        GpsPosition pos = gps.GetPosition();
        if (pos.SatellitesInSolutionValid &&
            pos.SatellitesInViewValid &&
            pos.SatelliteCountValid)
        {
            msg.AppendLine("定位衛星數:" + pos.GetSatellitesInSolution().Length +
                ", 可視衛星數:" +pos.GetSatellitesInView().Length);
        }
        if (pos.LatitudeValid)
            msg.AppendLine("經度:"+
                ((pos.Latitude > 0) ? "東經 ":"西經 ")+
                pos.LatitudeInDegreesMinutesSeconds);
        if (pos.LongitudeValid)
            msg.AppendLine("緯度:"+
                ((pos.Longitude > 0) ? "北緯 ":"南緯 ")+
                pos.LongitudeInDegreesMinutesSeconds);
        if (pos.TimeValid)
            msg.AppendLine("時間:"+pos.Time.ToString());
    }

    lbMsg.Text = msg.ToString();          
}

嗯…看完這樣的 code .
相較於直接呼叫 GPSID , 或是更刻苦耐勞的去使用 COM port 讀取 NMEA …
.NET CF 若是有人提供好 GPSID 的介面, 可是相當地簡單易用呢!

原始碼下載 : HelloGPS.zip