[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