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






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

引言
大多数新的 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 日:首次发布