简介
LAC/CI值常用作基站定位,基站定位是指手机发射基站根据与手机的距离来计算手机坐标地理位置的一种功能,基站定位一般应用于手机用户。
LAC:location area code 位置区码 (移动通信系统中),是为寻呼而设置的一个区域,覆盖一片地理区域,初期一般按行政区域划分(一个县或一个区),现在很灵活了,按寻呼量划分。当一个LAC下的寻呼量达到一个预警门限,就必须拆分。 为了确定移动台的位置,每个GSMPLMN的覆盖区都被划分成许多位置区,位置区码(LAC)则用于标识不同的位置区。一个位置区可以包含一个或多个小区,小区即为CI。
手机基站定位服务又叫做移动位置服务(LBS服务),它是通过电信移动运营商的网络(如GSM网)获取移动终端用户的位置信息(经纬度坐标),在电子地图平台的支持下,为用户提供相应服务的一种增值业务。
不同型号的硬件,查询基站定位功能发送的AT指令也是不一样。
发送AT指令:@DTU:0000:GPS?
返回的坐标值:@DTU:0000:GPS?
+GPS: Lac:0x3910,CellId:0xEC7D
其中的0X3910为LAC(小区号),0XEC7D为CID(基站号)。
把座标值输入到网站 www.cellid.cn,可以自动输出经纬度、地址名称。
当然也可以通过Webservice请求到相应的地图网站(高德地图、百度地图均可),然后网站会自动返回带有经纬度的信息。
要使用基站定位接口,须在网络上找一个解析。定位精度最终取决于当地基站的密度。城市大概50到150米,城郊大概100到300米,乡村大概200到2000米,偏远地区由于基站的密度太少,所以就会很差。
开始
权限
了解了其中的作用,就开始使用。第一步就是添加权限。因为主要用于定位。所以所需要的权限也都类属与定位权限。首先在AndroidManifest.xml文件里添加权限。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
获取
因为各个运营商之间采用的技术不尽相同,所以获取方式也不太一样。国内三大运营商的获取方式如下:
移动,联通:
TelephonyManager tel = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
CellLocation cel = tel.getCellLocation();
int nPhoneType = tel.getPhoneType();
//移动联通 GsmCellLocation
if (nPhoneType == 2 && cel instanceof GsmCellLocation) {
GsmCellLocation gsmCellLocation = (GsmCellLocation) cel;
int nGSMCID = gsmCellLocation.getCid();
if (nGSMCID > 0) {
if (nGSMCID != 65535) {
this.cell = nGSMCID;
this.lac = gsmCellLocation.getLac();
}
}
}
电信获取方式:
TelephonyManager tel = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
CellLocation cel = tel.getCellLocation();
int nPhoneType = tel.getPhoneType();
//电信 CdmaCellLocation
if (nPhoneType == 2 && cel instanceof CdmaCellLocation) {
Log.e("电信", "-----------------》电信");
CdmaCellLocation cdmaCellLocation = (CdmaCellLocation) cel;
sid=cdmaCellLocation.getSystemId();
nid=cdmaCellLocation.getNetworkId();
bid=cdmaCellLocation.getBaseStationId();
}
扩展
知识扩展
在andorid上面要获取手机网络信息一般要调用TelephonyManagerl类来获取相关信息。
- MCC,Mobile Country Code,移动国家代码(中国的为460);
- MNC,Mobile Network Code,移动网络号码(中国移动为0,中国联通为1,中国电信为2);
- LAC,Location Area Code,位置区域码;
- CID,Cell Identity,基站编号;
- BSSS,Base station signal strength,基站信号强度。
eNB E-UTRAN Node B 为LTE系统中E-UTRAN的组成部分
计算eNB的方式是 ci = eNB*256+cid
代码
获取TelephonyManager + 获取小区信息
telephonymanager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
// 先获取小区信息
// This method was deprecated in API level 23.
// Use (@link getAllCellInfo} which returns a superset of the information from NeighboringCellInfo.
StringBuilder str = new StringBuilder();
//获取小区信息
List<CellInfo> cellInfoList = telephonymanager.getAllCellInfo();
str.append("小区信息:"+"\n");
int index = 0;
for (CellInfo cellInfo : cellInfoList)
{
//获取所有Lte网络信息
if (cellInfo instanceof CellInfoLte)
{
str.append("["+index+"]==CellInfoLte"+"\n");
if(cellInfo.isRegistered()){
str.append("isRegistered=YES"+"\n");
}
str.append("TimeStamp:"+cellInfo.getTimeStamp()+"\n");
str.append(((CellInfoLte)cellInfo).getCellIdentity().toString()+"\n");
str.append(((CellInfoLte)cellInfo).getCellSignalStrength().toString()+"\n");
}
//获取所有的cdma网络信息
if(cellInfo instanceof CellInfoCdma){
str.append("["+index+"]==CellInfoCdma"+"\n");
if(cellInfo.isRegistered()){
str.append("isRegistered=YES"+"\n");
}
str.append("TimeStamp:"+cellInfo.getTimeStamp()+"\n");
str.append(((CellInfoCdma)cellInfo).getCellIdentity().toString()+"\n");
str.append(((CellInfoCdma)cellInfo).getCellSignalStrength().toString()+"\n");
}
//获取所有的Gsm网络
if(cellInfo instanceof CellInfoGsm){
str.append("["+index+"]==CellInfoGsm"+"\n");
if(cellInfo.isRegistered()){
str.append("isRegistered=YES"+"\n");
}
str.append("TimeStamp:"+cellInfo.getTimeStamp()+"\n");
str.append(((CellInfoGsm)cellInfo).getCellIdentity().toString()+"\n");
str.append(((CellInfoGsm)cellInfo).getCellSignalStrength().toString()+"\n");
}
//获取所有的Wcdma网络
if(cellInfo instanceof CellInfoWcdma){
str.append("["+index+"]==CellInfoWcdma"+"\n");
if(cellInfo.isRegistered()){
str.append("isRegistered=YES"+"\n");
}
str.append("TimeStamp:"+cellInfo.getTimeStamp()+"\n");
str.append(((CellInfoWcdma)cellInfo).getCellIdentity().toString()+"\n");
str.append(((CellInfoWcdma)cellInfo).getCellSignalStrength().toString()+"\n");
}
index++;
}
获取手机的位置,实现定位
CellLocation location = telephonymanager.getCellLocation();
if (location != null && location instanceof GsmCellLocation) {
GsmCellLocation l1 = (GsmCellLocation) location;
str.append("使用网络:" + "Gsm" + "\n");
str.append("cid"+l1.getCid()+ "\n");
str.append("lac"+l1.getLac()+ "\n");
str.append("Psc"+l1.getPsc()+ "\n");
} else if(location != null && location instanceof CdmaCellLocation){
CdmaCellLocation l2 = (CdmaCellLocation) location;
str.append(l2.toString() + "\n");
}
注意:getNeighboringCellInfo ()已经被谷歌弃用