定位技术有
两种,一种是基于 GPS 的定位,一种是基于移动运营网的基站的定位。
基于移动运营网基站定位服务又叫做移动位置服务(LBS——Location Based
Service ),它是通过电信移动运营商的网络(如 GSM 网)获取移动终端用户的位置信息
(经纬度坐标),在电子地图平台的支持下,为用户提供相应服务的一种增值业务[1],
在手机上不需要增加任何功能,向运营商开通相关服务就可以实现。
本文所说的基站定位,是采用 google 的数据,在功能手机上实现的定位功能(另
一种方法是:内置基站位置信息,然后查询。这需要购买第三方的数据库,并且由于运营
商的网络优化,数据会变得不准确。当然,在智能手机的实现那就更简单了)。这方面的
文章网上也有不少,大多偏向于理论,将它转化成代码,还是有些内容需要自己恩考。
本文尽量将自己实现代码的过程及注意点写下来,目的是:看了本文,就知道该如何
写代码了(如果还看不懂,就先查看网上原理性的东东,呵呵)。
其基本原理是:1、调用手机协议栈函数,获取当前服务小区和邻近小区的 CellID,
mnc,mcc,lac,rssi 值,至少需要要 3 组。2、通过手机的 HTTP 协议,将上述小区信
息传到 Google Gelocation Server 获取相对应小区的经纬度。3、根据无线电传播路径损
耗理论公式,将 RSSI 值转化成相对应的距离。4、运用三角形质心算法,采用3 组小区的
坐标信息和距离,得出手机当前的位置信息。下面具体描述实现过程。
一、获取服务小区和邻近小区的相关信息。由于手机平台的不同,调用的协议栈函数不
同。但必须获得以下的数据:小区 ID 号:CellID,移动网络号码(用于识别移动客户所
属的移动网络):mnc;移动国家号码(用于唯一地标识移动客户属于的国家):mcc;位
置区码(用于标识不同的位置区):lac;接收的信号强度指示:RSSI。根据三角形算法的需
要,至少要 3 组小区信息。在展讯平台中,一般情况下能够获得 6 组小区信息,这给挑选可
信任度较高的数据,提供了便利。
二、通过手机的 HTTP 协议,将上述小区信息传到 Google Gelocation Server 获取相
对应小区的经纬度。获取位置信息时,必须遵照网络位置提供者协议(Network Location
Provider Protocol),详细的协议在 google 的网站上做了说明。其要点有:
1、使用 HTTP POST,请求和响应的格式都是JSON ,请求的内容示例如下:
{
"version": "1.1.0",
"host": "maps.google.com",
"home_mobile_country_code": 310,
"home_mobile_network_code": 410,
"radio_type": "gsm",
"carrier": "Vodafone",
"request_address": true,
"address_language": "en_GB",
"location": {
"latitude": 51.0,
"longitude": -0.1
},
"cell_towers": [
{
"cell_id": "42",
"location_area_code": 415,
"mobile_country_code": 310,
"mobile_network_code": 410,
"age": 0,
"signal_strength": -60,
"timing_advance": 5555
},
{
"cell_id": "88",
"location_area_code": 415,
"mobile_country_code": 310,
"mobile_network_code": 580,
"age": 0,
"signal_strength": -70,
"timing_advance": 7777
}
],
"wifi_towers": [
{
"mac_address": "01-23-45-67-89-ab",
"signal_strength": 8,
"age": 0
},
{
"mac_address": "01-23-45-67-89-ac",
"signal_strength": 4,
"age": 0
} [2]
]
}
其中,"version"和"host"字段是必须有的,当然,里面要求的信息尽可能全面提供。
响应的示例如下:
{
"location": {
"latitude": 51.0,
"longitude": -0.1,
"altitude": 30.1,
"accuracy": 1200.1,
"altitude_accuracy": 10.1,
"address": {
"street_number": "100",
"street": "Amphibian Walkway",
"postal_code": "94043",
"city": "Mountain View",
"county": "Mountain View County",
"region": "California",
"country": "United States of America",
"country_code": "US"
}
}
} [2]
如果请求的数据格式不正确,服务器返回 HTTP 的状态为 400,并在响应的文本中
有详细描述。如果请求的数据格式正确,服务器返回 HTTP 的状态为 200。如果定位成
功,就有返回经纬度信息;如果定位不成功,经纬度信息就为空。
2、POST 时,URL 地址是:http://www.google.com/loc/json。
3、HTTP 发送时,对应的 IP 就是解析www.google.com 得到的“74.125.71.105”,端口:
80
4、将上述请求的数据组织成 HTTP 数据包格式,才能发送成功。如果手机软件本身已
经集成了 HTTP 协议的相关代码,这一步就省了。由于是在展讯 modem 版本的软件上实现
此功能,HTTP 协议没有被集成,因此必须自己组织 HTTP 数据包。HTTP 数据包包含以下几
个字段:
"POST /loc/json HTTP/1.1"
"Host:www.google.com"
"Content‐Type: application/requestJson"
"User Agent: user name" "Content‐Length: " + 内容的长度
每个字段间都要加上回车换行符,实际内容与上述字段间要加 2 个回车换行符。这些数
据组织完成,再调用 socket API 发送出去就行了。
三、根据无线电传播路径损耗理论公式,将 RSSI 值转化成相对应的距离。自由空间
无线电传播路径损耗模型为:
式中,d 为距信源的距离,单位为km;f 为频率,单位为 MHz;k 为路径衰减因子,范围在
2~5 之间。对数一常态分布模型,其路径损耗的计算公式为:
式中,Xσ是平均值为 O 的高斯分布随机变数,其标准差范围为 4~10;PL(d0),是式(1)
取 d=1 时,算出的 Loss值。根据式(1)和式(2),得出信号强度为:
RSSI=发射功率(Pt)+天线增益(Pf)一路径损耗(PL(d))
根据上面的理论公式,推算出距离与 RSSI 的关系公式:
D = 10^((Pt+Pf-RSSI-PL(d0)-X0)/(10*K))
PL(d0) = 32.44 + 10*K*log10 (f) ,根据发射频率算出 PL(d0)。
令 A = Pt + Pf –X0,则A 是一常数,距离 D 的公式变成:
D = 10^((A-PL(d0))/(10*K)) [计算中,K 取中间值 3]
四、计算前的单位转换。
由于经纬度信息单位度与根据 RSSI 算出的距离公里,是不同的单位,不能直接计算,
必须转换成统一的单位。方法是:找出离目标最近的一点作为参考点(原点),其它点参考
原点换算出相对的经纬度差值,再将该差值根据刻度与实际距离的关系,换算成公里数,就
得到其它点相对原点的坐标值,单位也统一成公里。地球的子午线总长度大约 40008km,平
均:纬度 1度 = 大约 111km,纬度 1分 = 大约 1.85km,纬度1 秒 = 大约30.9m[4]。我们
知道,地球的半径大概是 6378.137公里,那么经度与距离的关系如下式进行换算:
经度 1 度 = 2*pi *6378.137*cos(当前的纬度) km
五、找出可信度相对较高的三组数据。
由于距离越远,根据RSSI 算出的距离误会越大,我们认为可信度较高的数据就是距离
最小的数据。据此,选出距离最小的三组数据作为下面三角形质心算法的数据。
六、运用三角形质心算法,得出手机当前的位置信息。三角形质心定位算法的基本思想是:计算三圆交叠区域的 3 个特征点的坐标,以这三个点为三角形的顶点,未知点即为三
角形质心。特征点为 E,F,G,特征点E 点的计算方法为[3]:
同理,可计算出 F,G,此时未知点的坐标为。但是二次
方程,求解过程计算量较大,将式(3)中的方程式两两相减,则分别得到每条交线的直线
方程,特征点 E 的坐标则可以通过这些直线方程求解,如下三个直线方程式:
1: 2(Xb-Xa)Xe+2(Yb-Ya)Ye=ra*ra-rb*rb-Xa*Xa+Xb*Xb-Ya*Ya+Yb*Yb
2: 2(Xb-Xc)Xe+2(Yb-Yc)Ye=rc*rc-rb*rb-Xc*Xc+Xb*Xb-Yc*Yc+Yb*Yb
3: 2(Xa-Xc)Xe+2(Ya-Yc)Ye=rc*rc-ra*ra-Xc*Xc+Xa*Xa-Yc*Yc+Ya*Ya
根据上面算出的未知点的坐标是相对于原点的公里数,先将公里数转化成经纬度,然后再
与原点的经纬度相加,就得到了手机的位置信息。
基于 GPS 的定位方式是利用手机上的 GPS 定位模块将自己的位置信号发送到定位
后台来实现定位的,精度比较高,在空旷的地方表现优越;而在大厦内部,由于
信号微弱,无法实现定位功能。基站定位则是利用基站对手机的距离的测算距离来确
定手机位置的,不需要手机具有 GPS 定位能力,但是精度很大程度依赖于基站的分布
及覆盖范围的大小,本文实现的基站定位误差在 200m 之内,在一定程度上弥补了 GPS
信号无法覆盖区域的定位缺憾。