杨 帆
(陕西科技大学电气与信息工程学院, 陕西 西安 710021)
随着社会的发展和技术的进步,基于位置的信息服务开始备受关注,物流监控、学生监护、老弱病残追踪管理、司法监视以及企业移动工作队伍管理等方面也出现了巨大的技术需求.目前位置信息的服务系统大多基于GPS定位与专业地图标定的方法,致使成本居高不下,而且由于GPS技术的原因,在室内、林荫道、地下室等多种环境下无法接收信号,使其定位服务功能受到一定影响.近年来基于GSM通信网络基站的定位技术开始崭露头角,GSM基站定位不受环境限制,相比GPS定位技术费用极低,同时Google公司推出的免费地图Google Map使得传统的定位与地图标注业务现在只需要很小的代价就可以实现.本文使用Google Map和GSM Modem给出了一个快速实现定位与地图标注的实验系统.定位与地图标注仅仅是基于位置服务的信息系统的基本功能,但是一旦和其他应用领域结合则可能带来巨大的商机,这也正是本文研究的意义.
众所周知,GSM网络的基础结构是由一系列的蜂窝基站构成的,这些蜂窝基站把整个通信区域划分成一个个蜂窝小区.这些小区小则几十米,大则几千米.利用移动通信终端在GSM网络中通信,实际上就是通过某一个蜂窝基站接入GSM网络,然后通过GSM网络进行数据(语音数据、文本数据、多媒体数据等)传输的.也就是说在GSM中通信时,总是需要和某一个蜂窝基站连接的,或者说是处于某一个蜂窝小区中.
GSM无线通信网的每一个蜂窝小区都有位置区识别码(LAC,Location Area Code),小区内基站都有全球唯一的编号(CELLID,Cell IDentification).GSM基站定位技术就是通过获取通信终端接入基站的CELLID和LAC,查询基站的CELLID和LAC和基站经纬度等地理位置信息的关联关系,获取基站的经纬度数据、所在位置描述,从而大致确定目标所在的位置,这种由网络侧采集用户当前所在的基站信息以获取用户当前位置,其精度取决于移动基站的分布及覆盖范围的大小,一般在城市区域,由于基站覆盖密度比较大,定位误差大跃在150~200 m之间.这种定位技术投资极小,在精度要求不是很高的应用场合可以发挥积极的作用.
应用Google Map和GSM Modem实现定位与地图标定的实验系统由计算机、GSM通信网络和GSM Modem 3部分构成,其组成结构示意图如图1所示.
图1 定位与地图标定实验系统构成
定位和地图标注时,计算机通过AT指令控制GSM Modem,获取GSM Modem中SIM卡在移动通信网络中注册信息,从而得到距离最近的基站编号CELLID和所在小区LAC,根据获取的CELLID和LAC与基站的关联关系,获取基站实际经纬度、地理位置描述等位置信息,借助Google Map API实现地图显示和实际位置在地图上的标定.
应用Google Map和GSM Modem实现定位与地图标定,关键在于基于GSM Modem能否及时获取距离最近的基站的CELLID和LAC,并以所提取的CELLID和LAC数据查询基站信息数据库,获取监视目标距离最近的基站的经纬度数据、所在地点名称,有了当前位置的经纬度数据,就可以借助Google Map API实现电子地图以及地图标注、显示监视目标位置,因此系统的关键技术就是定位信息的采集、定位信息的查询以及电子地图显示.
定位需要的基站CELLID、LAC信息的采集通过控制与计算机相连的GSM Modem获取,按照本文的设计思路只需要获取距离最近的移动基站的LAC和CELLID即可,AT指令集中AT+CREG指令恰恰可以得到这样的数据.AT+CREG指令用于网络注册及状态查询,其基本使用格式如下:
命令格式:AT+CREG=MODE
如果输入 AT+CREG?
其中:
在VB.NET2005中借助MSCOMM控件实现通过串口连接的GSM Modem AT指令发送与接收串口返回数据的关键代码如下:
End With
With MSCOM
.Settings = (“115200,N,8,1”)
.CommPort = 4
.InputMode = MSCommLib.InputModeConstants.comInputModeText ,设定为字符传输模式
.InputLen = 0 ,设定每一次从缓冲区提取的字符个数,即为一次取走全部的数据
.OutBufferCount = 0,发送缓冲区清空
.InBufferCount = 0,接收缓冲区清空
.RThreshold = 1,触发oncomm事件
.PortOpen = True
.RTSEnable = True
.DTREnable = True
End WIth
MSCOM.Output = “AT+CREG=2” + vbCr,发出提取基站编码的AT指令
Thread.Sleep(500) ,延时,以便串口接收到所有数据
Dim str As String = MSCOM.Input
If InStr(str, “+CREG”) > 0 Then ,仅仅处理基站编码查询指令,以便加快系统处理速度
Dim strtmp() As String = Split(str, ControlChars.Quote)
Dim tmp As String = CELLID2GPS(strtmp(1), strtmp(3)) ′strtmp(1)是LAC;strtmp(3)是CELLID,
Dim tmpstr() As String = Split(tmp, “,”)
Dim lat As String = tmpstr(0)
Dim lng As String = tmpstr(1)
WebBrowser1.Document.InvokeScript(“GotoPosition”, New Object() {lat, lng})
End If
基站的CELLID和LAC只不过是一个16进制的编码,究竟代表什么地理位置,这些关联的数据都在移动公司内部数据,外部的应用系统设计与开发很难获取这些数据.小规模区域应用可以采取事先采集区域内部不同位置处的基站LAC和CELLID,建立专有数据库,摆脱通信运营商的束缚.但是大规模应用环境下依赖自行建立数据库显然不可行,不过由于GSM基站定位技术在业内引起了广泛关注,因特网上也出现了一些颇具影响力的基站信息查询服务网站,只需要输入查询基站的CELLID和LAC,即可返回该基站的经纬度数据、附近典型建筑物以及与典型建筑物的距离等位置名称信息.实验环境下可利用的典型查询网站有:http://www.fm906.com/other/cellid/、http://www.anttna.com/cell2gps/index.php以及中国GSM基站定位组织网站http://www.gsmdw.cn/.
为了实现程序的自动查询,实验VB.NET设计函数,利用GSM Modem获取的LAC和CELLID的16进制编码字符作为参数,实现应用程序向定位查询网站的数据自动提交和查询结果获取.具体实现代码如下(以http://www.anttna.com/cell2gps/index.php网站查询为例):
Function CELLID2GPS(ByVal lac As String, ByVal cellid As String) As String
Dim req As HttpWebRequest
req = HttpWebRequest.Create(“http://www.anttna.com/cell2gps/cell2gps.php?lac=” + CStr(Val(“&H” + lac)) + “&cellid=” + CStr(Val(“&H” + cellid)))
req.UserAgent = “MSIE7.0”
req.Method = “GET”
Dim wr As WebResponse
Try
wr = req.GetResponse()
Catch ex As WebException
wr = CType(ex.Response, HttpWebResponse)
End Try
Dim sr As New IO.StreamReader(wr.GetResponseStream(), System.Text.Encoding.GetEncoding(“gb2312”))
CELLID2GPS = sr.ReadToEnd,输出格式:纬度,经度;省,市,区,县;位置描述
End Function
Google Maps API是一种易于使用的JavaScript API,它能够把交互式地图直接嵌入到应用程序的web页面内部.本文使用webbrowser控件调用加载Google Map的本地网页,将Google Map嵌入VB.NET桌面应用程序,利用VB.NET桌面应用程序和GSM Modem通信,获取基站编号,查询得到基站的经纬度和地理位置描述信息,由桌面程序和WebBrowser加载的本地页面文件内的JavaScript脚本交互,实现桌面应用程序调用Google Map api,达到动态定位于标注当前位置的目的.限于篇幅,这里仅仅以动态标注为例,Web页面内部添加如下JavaScript脚本,实现根据经纬度参数使得地图中心显示位置移至当前位置,并且在给定经纬度参数的地理位置上添加标注:
图2 定位与地图标定实验效果图
function GotoPosition(lat,lng)
{ Remove();//首先删除所有标记
//alert(“ remove a marker”);
var point=new GLatLng(lat,lng);map.panTo(point);
map.setCenter(new GLatLng(lat,lng),16) ;
map.addOverlay(new GMarker(point));//新位置处添加标注
}
桌面程序通过WebBrowser方法Document.InvokeScript(脚本函数名称,参数),调用JavaScript脚本,实现GoogleMap当前位置的居中显示和动态标注:
Dim str() As String = Split(CELLID2GPS(lac, cellid), “,”)
WebBrowser1.Document.InvokeScript(“GotoPosition”, New Object() { str(0), str(1)})
返回的数据查询基站信息数据库,可以得到详细的地理位置信息——经纬度值:34.380 390,108.968 796;目标所在地名称:陕西省西安市未央区,陕西科技大学(西安校区) 北环西北100米(与实际位置误差不足百米).
图2为实验环境下由程序控制GSM Modem采集距离其最近基站的LAC和CELLID,分别为“20E3”,“6136”,并使用上述方法获取基站经纬度数据和位置名称信息,在Google Map中显示当前位置的实际效果.图中Google典型标记为基站定位结果,红色小圆圈是测试时的实际位置.
基于GSM基站定位技术仅仅能够获取测试的大体位置,但考虑到目前我国GSM网络基站密度较高,在大城市的主城区,测试结果表明定位精度可以达到100~150 m左右,同时Google Map API又提供了一种性价比极高的地图应用程序开发方案,综合使用GSM Modem和Google Map API可以快速构建电子地图上当前位置的标定.这种技术略作改动即可在定位服务精度要求不高的应用领域,诸如跟踪定位系统、物流监控、学生监护、老弱病残追踪管理等方面均可发挥积极的作用.
参考文献
[1] 黄作维,周 明,张喜梅. GPS/GPRS支持下嵌入式车载终端的实现[J]. 计算机测量与控制, 2009, 17(11):2 205-2 209.
[2] 江 宽. Google API开发详解[M]. 北京: 电子工业出版社, 2008:51-98.
[3] 刘 涛,肖 汉. 基于目标定位的低功耗无线传感器网络节点设计[J].计算机测量与控制,2009,17(11):2 342-2 344.
[4] 李寿林, 张 鹰, 李秀萍. 利用GSM无线模块收发短消息[J]. 计算机与数字工程, 2005,33(7): 79-81.