目前移动设备定位基本使用GPS的定位方式,使用基站定位的比较少,但是有些设备对定位要求不是很高或者需要节省掉gps芯片带来的成本,那么就可以考虑使用基站定位了。
基站定位的原理很简单:就是访问Google服务器,告诉它我们的基站信息,服务器就会返回经纬度信息实现定位。那么我们只要知道基站信息是由什么组成的、如何组织Google服务器需要的基站信息,然后发送给Google服务器就好了。
基站信息简单的说是由LAI(Location Area Identification) + CID(Cell Identity)组成的, LAI由(MCC +MNC+LAC)组成其中MCC全名Mobile Country Code,移动国家码,三位数,如中国为460。MNC全名Mobile Network Code,移动网络号,两位数。LAC全名Location Area Code,是一个2个字节长的十六进制BCD码(不包括0000和FFFE)。Cell Identity 小区码,同样是2个字节长的十六进制BCD码。我们只需要知道LAC和CID就可以完成定位。
组消息发送给Google服务器时应注意要使用POST的方式向www.google.com/glm/mmap 提交请求内容,内容类型必须是Binary,其次内容格式是必须按照google规定的方式填充没什么好说的,注意网络字节序即可。
在获取Google服务器返回的内容时,offset=7后的4个字节是latitude,offset=11后4个字节是longitude。
下面是用C语言实现只依赖于C库很方便移植,本人在ARM平台及X86 linux下均测可用,同样可用于Android JNI。
/*
* Copyright(c) 2010-2015 Beck. All rights reserved.
*
* Function : get latitude and longitude using cell identity and location area code
* Author : Beck <becklc@163.com>
*
*/
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <errno.h>
#include <sys/socket.