我正在尝试利用有关相邻单元格的移动信息,可通过TelephonyManager
类及其getNeighboringCellInfo
方法在 Android 上获得。下面我发布了完成这项工作的一部分代码(主要取自公开可用的资源),以及该代码产生的一个输出示例(如所附屏幕截图所示)。代码和图像是“按原样”放置的,没有任何更改,因此将一个与另一个相关联并确保它应该正常工作应该相对容易(当然,可能会有我忽略的错误)。
问题是相邻单元格的列表确实经常包含具有“不正确”(据我理解)数据的元素,例如:
- a
NeighboringCellInfo
所有属性 -lac
,cid
,psc
- 设置为 -1,并且只有rssi
字段似乎有意义; - a等于 0
NeighboringCellInfo
;lac
这是否意味着lac
与当前活动单元格相同? - a
NeighboringCellInfo
值rssi
在 [0, 31] 范围之外且 notUNKNOWN_RSSI
;这些值可以是正数(33,如屏幕截图所示),也可以是负数(它们看起来像一个适当的原始 rssi 值,即不需要从 转换asu
); - 在同一地理位置获得的列表元素并没有像我预期的那样表现出一致性,也就是说,在两次连续扫描中,每个扫描都可以在另一个扫描中省略一个元素,并且被省略元素的 rssi 级别不是最低的列表中的级别(实际上它们的 rssi 可能大于当前使用的单元格);我承认如果每个小区信号都非常不稳定,这可能是正确的行为,但我不确定这对于 GSM 和/或 UMTS 网络是否普遍适用。当前单元始终具有良好定义的所有字段,但其 rssi 可以在 30 dBm 的范围内非常快速地变化(例如从 -60 到 -90)。
- 与 4 相同,但关于从一天到另一天的一致性。在高度城市化和成熟的环境中,我希望每天都能看到相同的细胞列表,但它们的变化方式却如此之大,以至于有一天我什至没有看到关于以前活跃细胞的提及天。
这一切是否意味着移动技术的正常运行、某种可能的节能优化,或特定设备(在我的情况下为 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);