使用Windows Mobile 5.0+进行GPS跟踪(译文)
By S.F.
本文链接 https://www.kyfws.com/news/gps-tracking-with-windows-mobile-5-0/
版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 7 分钟阅读 - 3374 个词 阅读量 0使用Windows Mobile 5.0+进行GPS跟踪(译文)
原文地址:https://www.codeproject.com/Articles/20031/GPS-Tracking-with-Windows-Mobile-5-0
原文作者:Joel Ivory Johnson
译文由本站翻译
前言
将Windows Mobile Professional手机与GPS接收器一起使用,以创建基于SMS的简单位置跟踪程序.
下载安装程序-84.6 KB下载源代码-103 KB下载GPS图标恢复程序-1.58 KB
介绍
该程序是我计划构建的较大系统的概念证明.最终,我希望拥有一个系统,该系统允许用户选择加入和退出,以告知其位置.位置信息将通过在Windows Mobile 5.0(或更高版本)设备上运行的应用程序获取.这样的系统具有商业应用程序(知道送货或服务人员的位置)和个人应用程序(例如:您正前往朋友的房子,而朋友想知道您有多远).在这个原型中,我的目标是接触系统的一些基础技术. 对于此概念证明,我希望能够从GPS中间驱动程序获取GPS信息,并希望有一种方法让手机根据手机所有者的要求或所有者的联系方式之一发送此信息.因此,此处使用的基本技术是:
必备工具
若要运行此代码,您将需要安装Visual Studio 2005,并安装Windows Mobile 5.0 SDK和Windows Mobile 6 Professional SDK.需要5.0 SDK,因为我已将该项目设置为以5.0设备为目标.用于访问GPS设备的代码是6.0 SDK的一部分(尽管在5.0设备上可以正常运行).我在项目中包含了GPS包装器的编译程序集,但没有包含源代码.要查看此包装的源代码,您必须具有Windows Mobile Professional 6.0 SDK. 我还建议您使用Windows Mobile 5.0设备来测试应用程序.您可以使用仿真器来测试程序.该程序利用SMS消息传递.根据您与电话公司的服务计划,您可能必须为发送和接收的每条消息付费.我属于这一类,因为在当前时间点上,美国这里的可用运营商不允许许多电话与具有无限数据订阅的电话在同一条电话线上具有无限的文本消息订阅.因此,对于程序的初始测试,仿真器可能更可取.您可以将仿真的Windows Mobile设备的COM端口重定向到连接到PC的外部GPS接收器,也可以使用Windows Mobile 6.0 SDK中提供的" FakeGPS"程序来仿真GPS接收器.
缺少GPS设置图标
在装有Windows Mobile 5 Professional和更高版本的手机(带有触摸屏的手机)上,“设置"菜单中有一个图标,该图标允许您设置其GPS接收器进行通信的硬件端口.在一些比较流行的Windows Mobile手机上,此图标丢失.它不会被删除.相反,一些OEM认为适合隐藏该图标.可以通过删除注册表项[HKEY_LOCAL_MAHINE \ ControlPanel \ Settings \ GPS Settings \ Hide]和[HKEY_LOCAL_MAHINE \ ControlPanel \ Settings \ GPS Settings \ Redirect]来恢复图标.如果没有注册表编辑器,则可以通过运行本文所附的GPS图标还原程序来删除这些注册表项.只需将其复制到您的手机并运行即可.它将显示一个消息框,通知您该操作成功或这些键不存在.运行此程序后,您可能需要重置手机,以使更改生效.
该程序如何运作
最初运行时,手机的所有者可以输入用于识别位置请求消息的密码.收到SMS消息时,如果其中包含用户选择的PIN,则该程序将启动(如果尚未运行),则该消息将传递给该程序.所有其他消息将照常在电话上处理.收到消息后,程序将从手机读取当前的GPS坐标,并通过指向local.live.com上显示手机所有者当前位置的地图的链接响应发件人.
使用消息拦截器类捕获SMS消息
顾名思义,MessageInterceptor
类用于捕获传入的SMS消息,并允许您的代码在接收到该消息时起作用.您不必为自己感兴趣的消息类型设置一条消息规则,而无需自己手动检查所有消息.在此程序中,该类中只有我们感兴趣的一个属性:MessageCondition
.
MessageCondition成员是同名MessageCondition的类. MessageCondition允许您指定将在消息中搜索的字符串.您可以指定字符串必须在消息的开头,结尾或任何位置,并且可以指定搜索是否区分大小写.对于此程序,我将” MessageCondition"类设置为仅在消息正文中搜索消息中任何位置是否存在您的密码.
_messageInterceptor.MessageCondition = new MessageCondition();
_messageInterceptor.MessageCondition.CaseSensitive = false;
_messageInterceptor.MessageCondition.ComparisonType =
MessagePropertyComparisonType.Contains;
_messageInterceptor.MessageCondition.ComparisonValue = this.txtPin.Text;
_messageInterceptor.MessageCondition.Property = MessageProperty.Body;
设置条件后,只需启用" MessageInterceptor",并且必须为其提供事件处理程序:
_messageInterceptor.EnableApplicationLauncher(ruleName);
_messageInterceptor.MessageReceived += _messageInterceptorEventHandler;
自创建" MessageInterceptor"以来,用户可能已退出程序.如果退出程序后收到消息,并且用户将程序置于启用状态,则程序将自动启动.为了捕获导致程序启动的消息,我们必须在程序的" Load"事件中创建" MessageInterceptor"类.在加载过程中,程序将检查是否已注册该应用程序以自动加载消息.在这种情况下,程序将创建一个新的MessageInterceptor并为其提供事件处理程序.然后,应用程序将通过事件处理程序接收该消息的通知.
if (MessageInterceptor.IsApplicationLauncherEnabled(ruleName))
{
_messageInterceptor = new MessageInterceptor(ruleName);
_messageInterceptor.MessageReceived +=
new MessageInterceptorEventHandler(_messageInterceptor_MessageReceived);
txtPin.Text = _messageInterceptor.MessageCondition.ComparisonValue;
this.chkFindMeEnabled.Checked = true;
}
else
{
this.chkFindMeEnabled.Checked = false;
}
获取当前位置
中级GPS驱动程序为我们处理与GPS硬件接口的详细信息.我正在使用Windows Mobile 6 SDK中包含的包装程序,该包装程序可简化驱动程序的使用.该代码运行良好且易于使用,因此我鼓励您考虑使用它,而不是创建自己的GPS读取代码.可以通过以下几行代码来初始化GPS对象:
gps = new Gps();
gps.LocationChanged +=
new LocationChangedEventHandler(gps_LocationChanged);
gps.Open();
从LocationChanged事件接收到的EventArgs包含比您从GPS接收器可能需要的更多详细信息.我只保存了EventArgs中的Position成员并更新了_currentLocation对象.
void gps_LocationChanged(object sender, LocationChangedEventArgs args)
{
if (args.Position.LatitudeValid && args.Position.LongitudeValid)
{
currentPosition = args.Position;
UpdatePosition();
}
}
当程序不再需要使用GPS接收器时,将调用Gps.Close()
以结束对象的工作线程.不这样做可能导致程序永不终止.
发送信息
发送消息很简单.对于SMS消息,将创建一个新的" SMSMessage"对象,将接收者的号码和消息文本作为其构造函数参数.然后,调用对象的Send()
方法来传递消息.由于SMS消息的长度不能超过160个字符,因此SMS消息中发送的链接仅包含用户的坐标和图钉.
在电话上接收包含地图链接的SMS消息不切实际,因此您可能想知道为什么该程序具有此功能.您必须记住,计算机还可以通过其他应用程序(例如Live Messenger)或通过内置硬件(例如GMS调制解调器或CDMA调制解调器)发送SMS消息.
public void SmsSendCoordinates(string to,GpsPosition pos)
{
string message = String.Format(responseTemplate,
pos.Latitude, pos.Longitude);
SmsMessage sms = new SmsMessage(to, message);
sms.Send();
this.eventLog.Add(DateTime.Now, to, pos);
}
发送电子邮件非常简单.创建一个新的电子邮件对象,填充主题和正文,将地址添加到"收件人"集合中,然后调用其" Send()“方法.电子邮件的” Send()“方法需要一个SMS不需要的参数.该参数是要使用的邮件帐户的名称.在我的手机上,可用帐户名为” ActiveSync"和" MMS".自然,我不想使用MMS,因为我的电话服务提供商会收取我认为通过MMS发送消息的高额费用. 由于不能对电子邮件使用160个字符的限制,因此我可以自由地在链接中放置更多信息.因此,在发送电子邮件时,程序(取决于用户选择的选项)可能包括自定义文本和用于表示用户的图像.
public void EmailSendCoordinates(string emailAddress, GpsPosition pos)
{
string avatarUrl = string.Empty;
string displayName = string.Empty;
string customMessage=string.Empty;
if(((_Settings.OptionFlags&OptionChangedFlags.Avatar)==
OptionChangedFlags.Avatar)&& (_Settings.Avatar.Length>0)
)
avatarUrl=_Settings.Avatar;
displayName = optionsUI.DisplayName;
customMessage = optionsUI.CustomMessage;
string message = String.Format(detailedResponseTemplate,
pos.Latitude, pos.Longitude,
Utility.UrlEncode(avatarUrl), Utility.UrlEncode
(displayName), Utility.UrlEncode(customMessage));
EmailAccount account =
(new OutlookSession()).EmailAccounts[_Settings.EmailAccount];
EmailMessage msg = new EmailMessage();
msg.To.Add(new Recipient(emailAddress));
msg.Subject = "My location";
msg.BodyText = message;
msg.Send(account);
this.eventLog.Add(DateTime.Now, emailAddress, pos);
}
下一步是什么
我想在此程序中添加很多功能.在下一个修订版中,我计划添加一个映射控件,以便用户可以从手机中看到彼此的位置.我可能还会添加对Windows Mobile 5 Standard Edition(不带触摸屏的设备)的支持.为此,需要存在一个Web服务器.一旦这两部分都可以使用,我计划使用Windows Live Search和MapPoint API提供查找感兴趣的点并获得指向它们的方向的功能,以便用户彼此见面.
历史
许可
本文以及所有相关的源代码和文件均已获得The Code Project Open License (CPOL)的许可。
.NET2.0 VS2005 C#2.0 WinMobile5 C++ C# Windows WinMobile .NETCF .NET Visual-Studio Dev Intermediate WinMobile6 新闻 翻译