65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows Mobile 的 GPS 保活实用程序和测试器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (14投票s)

2008年7月18日

CPOL

6分钟阅读

viewsIcon

115313

downloadIcon

1622

保持 Windows Mobile 的 GPS 处于活动状态,从而能够即时、准确地确定位置。同时还介绍了如何用几乎零代码访问 GPS 数据的教程。

GPSController

引言

大多数新的 Windows Mobile 设备都将 GPS 接收器作为标准配置的一部分。然而,一个问题是反复的“冷启动”。据推测是为了节省电池寿命,GPS 接收器在不使用时会被关闭。与标准 GPS 设备不同,移动 GPS 芯片组在断电时不会保存数据,每次使用都需要“冷启动”。这意味着需要保持手机静止长达 10 分钟,直到它锁定到卫星。Windows Mobile 5 和 6 标准/智能手机版本不提供用户可访问的配置选项来更改此设置。

然而,如果 GPS 保持开启状态,即使在失去信号后(例如,进入室内),它也能够在有信号的区域内几秒钟内重新获取位置。此外,一旦锁定信号,接收器即使在进入无法从冷启动锁定信号的区域时也能保持信号。

我最初通过一直让 Google Maps 在后台运行来解决这个烦恼。这个解决方案并不完美,因为它占用了大量内存和 CPU,并且需要从互联网下载数据来更新地图,这在许多移动设备上都非常昂贵。我转而设计了这个实用程序,让它在后台运行,保持 GPS 打开,并以用户定义的间隔轮询其状态。

如果您想快速测试 GPS 以确保其配置正确和/或有信号,此程序也很有用。

背景

如何使用 Microsoft 中间 GPS 驱动程序

此应用中使用的库是 Windows Mobile 6 标准 SDK 免费提供的开源示例。它封装了 API 钩子,允许使用 C# 托管代码快速轻松地访问手机的 GPS。

我已经包含了该库的必要源代码;如果您拥有 Windows Mobile 6 标准 SDK,您也可以在“\program files\Windows Mobile 6 SDK\Samples\Smartphone\CS\GPS”找到这些文件。

将整个文件夹添加到您的项目中(不包括演示应用程序),然后添加...

using Microsoft.WindowsMobile.Samples.Location;

...(或 VB 等效代码)到需要 GPS 访问的类中。

重要提示:Microsoft .NET Compact GPS 库的已知问题

此处及其他地方发布了不必要的复杂解决方案的原因之一是,Windows Mobile 6 SDK 库在 Windows Mobile 6 模拟器中无法正常工作。但它在实际手机上工作得非常好。 SDK 中包含大量 NMEA 文件用于在模拟器中模拟导航……当与“FakeGPS”驱动程序(用于在模拟器中测试 GPS 应用)一起使用时,纬度和经度交替无效或荒谬(靠近南极)。MSDN 博客上对此有所道歉,并提供了一个可能的解决方法(一个将十进制度转换为标准纬度/经度的方程,但这完全没有解决问题。)

话虽如此,请使用该库。正如您将在下面的代码中看到的,它使获取 GPS 数据比打开文本文件更容易。问题出在模拟器上。我的建议是,在模拟器中,以您认为合适的方式(例如,值数组、文本文件等)测试模拟的纬度和经度,然后将您的位置获取方法连接到库,并部署到实际的 GPS 设备上。它将按预期运行。

本文附带的项目虽然小而简单,但演示了在构建 GPS 应用程序时您将实际使用的核心方法的用法。

  • 启动 GPS

    Gps g = new Gps(); Gps.Open(); 
  • 确定 GPS 是否准备就绪并已知其位置

    if (g.GetPosition().LatitudeValid)
    { //Has position: do something with the data } 
  • 获取纬度/经度

    double latitude = g.GetPosition().Latitude;
    double longitude = g.GetPosition().Longitude; 
  • 停止 GPS

    gps.Close(); 

了解所有这些之后,就可以在 4 小时内轻松构建一个适合普通用户进行 Beta 测试的不错应用程序。

Using the Code

此应用程序的代码包含在“form1.cs”及其相关文件中。项目捆绑的其他源代码文件是 Microsoft 提供的 GPS 对象。

它非常简单,简直就是小菜一碟——整个应用程序运行在 form1(主窗口)的代码隐藏中。

程序启动时,用户可以选择开启 GPS 并以固定间隔开始轮询。设备在此处停止和启动的方式如下。

public bool isTurnedOn = false; //tracks state
public int pollInterval = 5; //keep-alive interval
public Gps gps; //the phone's internal GPS

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
    gps = new Gps(); //Create the handle, but don't turn it on yet.
}

private void mnuTurnOn_Click(object sender, EventArgs e)
{
    if (!isTurnedOn) //Turn on GPS
    {
        try
        {
            isTurnedOn = true;
            mnuTurnOn.Text = "Turn Off";
            gps.Open();
            timer1.Interval = pollInterval * 60 * 1000;
            UpdateStatus();
            timer1.Enabled = true;                    
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: could not find GPS device");
        }
    }
    else //Turn off GPS
    {
        isTurnedOn = false;
        gps.Close();
        UpdateStatus();
        mnuTurnOn.Text = "Turn On";
        timer1.Enabled = false;                
    }
}

访问 GPS 位置数据几乎太容易了。这是 UpdateStatus() 方法,它是程序的核心,用于检查 GPS 是否锁定了足够数量的卫星,然后获取其纬度和经度。

private void UpdateStatus()
{
    if (!isTurnedOn)
    {
        lblState.Text = "GPS Turned Off";
        label1.Visible = label2.Visible = lblStatus.Visible = 
        lblLastFix.Visible = lblLastUpdate.Visible = false;
    }
    else
    {
        lblState.Text = "GPS is turned on.";
        label1.Visible = label2.Visible = lblStatus.Visible = 
        lblLastFix.Visible = lblLastUpdate.Visible = true;
        lblLastUpdate.Text = DateTime.Now.ToString();
        if (gps.GetPosition().LatitudeValid)
            lblLastFix.Text = "Locked on to satellites: 
                "+gps.GetPosition().Latitude.ToString()+ 
                " - "+gps.GetPosition().Longitude.ToString();
        else
            lblLastFix.Text = "No signal";
    }
}

如何在模拟器中测试

鉴于“FakeGPS”模拟不起作用,任何使用这些库构建的应用程序都应尽早进行设备上测试。在这里构建我发布的下载应用程序会生成一个 EXE 和一个 DLL。将两者放在移动设备上的同一个文件夹中,您应该就可以使用了。

不幸的是,大多数设备出厂时都没有较新版本的 .NET Compact Framework。如果您有 Windows Mobile SDK,将为每种不同的处理器提供一个 CAB 文件。不用担心选择错误的设备会损坏您的手机——它只会拒绝安装。您也可以从 Microsoft 单独下载框架。

部署到设备

该项目目前设置为使用 Windows Mobile 6 标准版构建目标(如 Motorola Q9H 或 Samsung Jack II 等智能手机。它也将为 Windows Mobile 6 Professional 版(触摸屏 PDA / PocketPC)构建。

它已经在 Motorola Q9H 上以标准配置进行了实际测试,但只要存在并配置了 GPS 芯片组,它应该适用于上述任何设备类别。

Windows Mobile 5 设备也应该接受此功能以及使用中间 GPS 驱动程序和其他应用程序。在 Visual Studio 中切换构建目标,并在编译时注意警告:如果您使用的是 5.0 不允许的组件(主要是 UI 组件)(例如,可由宿主应用程序操作的嵌入式 Web 浏览器控件),编译时会收到通知,您可以进行适当的(次要)更改。

显然,要使用 .NET CF 创建生产级的 GPS 应用程序,您需要创建一个设置和部署项目,并明确指定 .NET Compact Framework 2.0 或 3.5 将随其一起包含,而不是让用户单独下载。当前的构建配置是针对 3.5 的,但它也能完美构建到 2.0 目标,无需修改。

历史

  • 2008 年 7 月 18 日:首次发布
© . All rights reserved.