我正在尝试使用有关相邻单元格的移动信息,可通过TelephonyManager
类及其getNeighboringCellInfo
方法在Android上获得。下面我发布了一部分代码(主要来自公开可用的源代码),它完成了这项工作,以及此代码生成的输出示例(如附带的屏幕截图所示)。代码和图像按“原样”放置,没有任何更改,因此将一个与另一个相关联应该相对容易,并确保它应该正常工作(当然,可能存在我忽略的错误)。
问题是相邻单元格列表通常包含“不正确”(据我所知)数据的元素,例如:
NeighboringCellInfo
包含所有属性 - lac
,cid
,psc
- 设置为-1,只有rssi
字段似乎有意义; NeighboringCellInfo
lac
等于0;这是否意味着lac
与当前活动单元格相同?NeighboringCellInfo
rssi
值超出范围[0,31]而非UNKNOWN_RSSI
;这些值可以是正数(33,如屏幕截图所示),为负数(它们看起来像一个正确的原始rssi值,无需转换asu
); 这是否意味着移动技术的正常运行,某种可能的省电优化,或特定设备的缺陷(在我的情况下是LG Optimus One)?
如果可能的话,请建议如何从Android上的手机环境中获取一致的读数。
GsmCellLocation cellLocation = (GsmCellLocation)telephonyManager.getCellLocation();
String networkOperator = telephonyManager.getNetworkOperator();
int type = telephonyManager.getNetworkType();
String mcc = networkOperator.substring(0, 3);
String mnc = networkOperator.substring(3);
textMCC.setText("mcc: " + mcc + " mnc: " + mnc);
textMNC.setText("operator: " + networkOperator);
int cid = cellLocation.getCid();
int lac = cellLocation.getLac();
int psc = cellLocation.getPsc();
textGsmCellLocation.setText(cellLocation.toString());
textCID.setText("lac: " + String.valueOf(lac) + " cid: " + String.valueOf(cid) + " psc: " + String.valueOf(psc) + " type: " + String.valueOf(type) + " rssi: " + String.valueOf(currentCellRSSI));
TextView Neighboring = (TextView)findViewById(R.id.neighboring);
List<NeighboringCellInfo> NeighboringList = telephonyManager.getNeighboringCellInfo();
String stringNeighboring = "Neighboring List - Lac : Cid : Psc : type : RSSI\n";
for(int i = 0; i < NeighboringList.size(); i++)
{
String dBm;
int rssi = NeighboringList.get(i).getRssi();
if(rssi == NeighboringCellInfo.UNKNOWN_RSSI)
{
dBm = "Unknown RSSI";
}
else
{
if(rssi >= 0 && rssi < 32)
{
dBm = String.valueOf(-113 + 2 * rssi) + " dBm";
}
else
{
dBm = "Unknown value:" + Integer.toString(rssi);
}
}
stringNeighboring = stringNeighboring
+ String.valueOf(NeighboringList.get(i).getLac()) + " : "
+ String.valueOf(NeighboringList.get(i).getCid()) + " : "
+ String.valueOf(NeighboringList.get(i).getPsc()) + " : "
+ String.valueOf(NeighboringList.get(i).getNetworkType()) + " : "
+ dBm + "\n";
}
Neighboring.setText(stringNeighboring);
答案 0 :(得分:3)
以两种不同的方式报告相邻细胞:
在GSM / GPRS上(您拍摄屏幕截图时似乎是您所在的网络),您应该获得相邻小区的MCC / MNC / LAC / CID元组。我看到你获得了有效的CID值。如果您使用的是GSM(2.xG)网络,PSC将始终为-1,因为PSC在GSM上没有意义(PSC是CDMA参数,GSM是基于TDMA的)。
在UMTS上,情况有所不同:对于相邻单元格,仅报告PSC,除非连接到它们,否则不会找到其他参数。
LTE原则上类似于UMTS,但名称略有不同:代替LAC和CID,您有TAC(跟踪区域代码)和CI(小区标识);而不是PSC,你有一个PCI(物理小区ID)。但是,它们与UMTS对应物基本相同。但请注意,不同设备之间的实施情况差异很大:有些手机即使在3G网络上也不会报告PSC,有些手机也不会报告相邻小区。 Nexus S(与大多数三星制造的设备一样)都没有报告。
不确定LAC = 0。它可能意味着“与当前单元格相同的LAC”,在这种情况下,从位置区域的边界看到输出将是有趣的,其中电话可以拾取具有多个LAC的单元。 (我们会看到来自两个LA的细胞吗?还是仅仅来自“我们的”LA?来自邻近洛杉矶的细胞会报告什么LAC?)
答案 1 :(得分:0)
移动设备应该知道相邻小区,以便在必要时可以切换到更好的小区。在任何情况下,你已经告诉它获取有关相邻单元格的信息,这就是它应该做的事情。您的结果似乎与Android文档中描述的内容不匹配。 我会将此问题作为固件错误报告给设备供应商。
我可以想象一种情况,你会看到一个信号较强的相邻小区,例如小区是GSM,而设备更喜欢信号较弱的UMTS小区,但这应该从网络类型字段中显而易见。