要解决这个问题首先要满足的几个条件:
1、对方一定使用的是智能操作系统手机,比如:andorid、wm、iphone等等。
2、对方的手机上一定要有一个软件可以通过GSM/CDMA/GPS获取当前手机所在位置。该软件就是本文要介绍的。
这里本人用ANDROID2.1的系统举例,怎样构造一个获取对方物理位置信息的程序。
首先,需要搞清楚在手机上获取坐标的方法,通过最近一段时间的学习和总结,一共发现有三种方法:
1、如果手机上有GPS功能,并且一直开启,并且手机已经能够联系上4颗通讯卫星,那么可以使用GPS功能直接获取到坐标。
2、如果手机上没有GPS功能,那么通过无线基站的定位服务也可以获取到坐标。
3、如果基站不提供这种服务,我们可以通过手机获取其所在的物理位置区域编号,并使用google提供的Geolocation APINetwork Protocol来查询手机所在区域位置。
从准确性上将从方法1到3以此递减。其次要考虑的问题是通过什么方式获取对方手机信息,首先想到的是通过GPRS连接建立TCP/IP通信方式,但这种方式需要对方实时连接2G或3G网络,对于现在大多数人来说资费是个问题,不太可能实时的开启数据网络。另外一种方式就是通过短信方式,即,给对方手机发送一条特殊的短信,短信中携带一个特殊的标识,当对方手机收到这个标识时,启动定位程序,定位程序通过上述3种方式的其中一种获取位置信息,并再次通过短信方式将结果发回本端手机。
程序模型如下:
发送端手机 -----> 短信请求 -----> 接收端手机------> 对方手机处理短信并进行定位 ----->短信回复 -----> 发送端手机 ----->解析坐标数据并查地图软件显示
对方手机处理短信并进行定位,流程如下:
2.1 通过GPS定位,如果成功,则回复位置短消息,如果失败,则进入2.2
2.2通过无线基站定位,如果成功,则回复位置短消息,如果失败,则进入2.3
2.3 通过手机所在cell区域码,用json向google服务器请求定位
整个模型如图所示:
在andorid2.1上开发的几个重要步骤:
1、配置开发环境:http://www.hzlitai.com.cn/article/ARM11/SYSTEM/android.html
2、发送端只需要人为直接发送短信,暂时不需要开发。
3、接收端中的使用到的几个ANDROID API:
a>短信拦截和读取
b>gpsprovider坐标信息receiver的注册
c>networkprovider坐标信息receiver的注册
d>android.telephony.gsm.GsmCellLocation获取cell位置的方法
e>通过googleGeolocation API Network Protocol参考:http://code.google.com/intl/zh-CN/apis/gears/geolocation_network_protocol.html查询cell物理位置坐标方法
4、本端手机拿到坐标之后,查询google map得到地图位置。
为了实验的简单性,本人将第4步省略,直接使用短信中的坐标在PC上打开google map手工查询。
以下是实现代码实现中的一些设计说明:
1、LocateTest类,主程序入口,负责其他类实例的初始化和析构,是整个程序的驱动。
2、ReceiverDemo类,用于接收短消息,并解析定位标识,回送带有坐标信息的短信。来源:http://blog.csdn.net/duchunchao/archive/2010/12/23/6093776.aspx
3、MyLocationManager类,完成订阅GPS发来的位置信息、处理和保存,另外还完成基站提供的位置信息订阅、处理和保存。来源:http://veright.blog.163.com/blog/static/28345389201062211719890/
4、JsonLocation类,通过获取手机中保存的基站位置编号,通过发送json请求从google服务器获取位置信息。
实验效果:
由于本人的手机在房间里,GPS需要4颗卫星才能够定位,所以程序尝试第一次使用GPS定位会失败,然而不知道为什么移动的基站也不能正确提供定位信息,所以第二次尝试也失败了,最后一次使用手机所在的cell区域信息,发送了一个json请求给google服务器,获得了响应,这里本人使用了#w做为请求标识,手机收到之后回复了以下短信:
{"location":{"latitude":40.071562,"longitude":116.321943,"address":{"country":"China","country_code":"CN","region":"Beijing","city":"Beijing","street":"Longxi3rdSt"},"accuracy":594.0},"access_token":"2:GTwWburFjSG2tX9k:e9nVRO7o1by6-E9p"}
通过纬度40.071562和经度116.32194,查google地图,结果如下:
本人是在红色圈地点做的实验,而这个经纬度在地图上标识的是绿色箭头位置,相距有500m左右(直线距离),看来通过基站区域定位无法精确定位到手机位置。
此程序有一个缺陷,就是在使用json定位时,直接使用的是gsm类获取cell位置信息,所以改程序暂不支持json方式查询CDMA手机位置。有兴趣的朋友可以完善一下。
程序改进点:通过上图可以发现,其实接收端在通过json进行定位时,对端手机还是需要通过GPRS网络访问google服务器,所以这对对端手机有能够上网的假设。而如果将cell编码直接传回本端手机,然后由本端手机向google服务器请求位置成功率将大大提高。不过这样就省不了在本端手机开发代码的问题。