技术开发 频道

WM--GPS开发

 【IT168技术文档】

 前几天,有朋友托我给他写个GPS程序,就取经纬度坐标,以及将之转换成高斯直角坐标。花了一些时间,给他做了个小程序。

 后来总结时,想起,很多网上朋友都会问及关于GPS开发的一些事。我这里先将我的程序解释下,然后再总结下,相关经验及个人看法。

 目前在一些移动设备中,都提供GPS功能,设备中都需要一个接收器,用来接收GPS信号。(类似于GPRS工作方式)。GPS一旦启动后,会自动连接卫星,接收信号,通过算法计算出位置等信息,然后以NMEA data的格式输出。GPS receiver就是接收卫星信号转换成NMEA data的设备。

 开发GPS有3种选择:

 1。直接使用串口连接GPS接收器

 2。GPS Intermediate Driver

 2。使用第三方类库(目前opennetcf提供相应类库)

 目前,WM5.0以上系统,都内置了GPS Intermediate Driver。通过它,我们能够很方便的取道GPS数据。

 关于GPS方面的文章可以参考:

 1。30 Days of .NET [Windows Mobile Applications] - Day 03: GPS Compass(GPS指南针)

 2。.NET Compact Framework下的GPS NMEA data数据分析

 虽然GPS Intermediate Driver提供了我们非常快捷的取得GPS信息,但同时也有一定的弊端。

 那下面我讲介绍我如何在该项目中使用GPS的。

 我使用GPS Intermediate Driver,它能够快速开发,MS也提供了很强大的例子来方便我们使用。

 在微软的WM SDK安装目录下有GPS工程。(Windows Mobile 6 SDK\Samples\PocketPC\CS\GPS)

 该Demo中

 GPS.cs:封装了GPS的操作类,比如Open(),Close(),Connect()。可以很快捷的使用。

 GpsDeviceState.cs:用于取得目前GPS设备的状态信息。

 GpsPosition.cs:每次GPS数据取得后,都会放入该类。

 LocationChangedEventArgs.cs:一旦位置改变,即可将新的GPSPosition取得到。

  public void Open()

 {

 if (!Opened)

 {

 // create handles for GPS events

 newLocationHandle = CreateEvent(IntPtr.Zero, 0, 0, null);

 deviceStateChangedHandle = CreateEvent(IntPtr.Zero, 0, 0, null);

 stopHandle = CreateEvent(IntPtr.Zero, 0, 0, null);

 gpsHandle = GPSOpenDevice(newLocationHandle, deviceStateChangedHandle, null, 0);

 // if events were hooked up before the device was opened, we'll need

 // to create the gps event thread.

 if (locationChanged != null || deviceStateChanged != null)

 {

 CreateGpsEventThread();

 }

 }

 }

 通过调用CreateEvent,创建handles,然后调用GPSOpenDevice API,将handle传入,取到gps设备的handle

 得到handle后,再创建一个线程来监听GPS数据及设备状态。通过调用CreateGpsEventThread方法。

  private void CreateGpsEventThread()

 {

 // we only want to create the thread if we don't have one created already

 // and we have opened the gps device

 if (gpsEventThread == null && gpsHandle != IntPtr.Zero)

 {

 // Create and start thread to listen for GPS events

 gpsEventThread = new System.Threading.Thread(new System.Threading.ThreadStart(WaitForGpsEvents));

 gpsEventThread.Start();

 }

 }

 在WaitForGpsEvents方法中,就while不听的监听。

 当deviceStateChanged,就调用deviceStateChanged事件,然后取得当前设备状态。

 当locationChanged,就调用locationChanged事件,取得当前坐标。

 这样一个基本的GPS数据取得流程就算完成了。

0
相关文章