我正在尝试利用有关相邻小区的移动信息,该信息可在 Android 上通过TelephonyManager
类及其getNeighboringCellInfo
方法。下面我发布了完成这项工作的一部分代码(主要取自公开来源),以及该代码产生的输出的一个示例(如所附屏幕截图所示)。代码和图像“按原样”放置,没有任何更改,因此应该相对容易将两者关联起来并确保其正常工作(当然,可能存在我忽略的错误)。
问题在于,相邻单元格的列表通常包含具有“不正确”(据我理解)数据的元素,例如:
- a
NeighboringCellInfo
具有所有属性 -lac
, cid
, psc
- 设置为-1,并且仅rssi
字段似乎有意义;
- a
NeighboringCellInfo
with lac
等于0;这是否意味着lac
与当前活动单元格相同吗?
- a
NeighboringCellInfo
with rssi
值超出范围 [0, 31] 并且不UNKNOWN_RSSI
;这些值可以是正数(33,如屏幕截图所示),也可以是负数(它们看起来像一个正确的原始 RSSI 值,即不需要从asu
);
- 在同一地理位置获得的列表元素并没有像我期望的那样表现出一致性,即在两次连续扫描中,每个扫描都可以在另一个扫描中省略一个元素,并且省略元素的 rssi 级别不是最低的列表中的级别(事实上,它们的 RSSI 可能大于当前使用的小区);我承认如果每个细胞信号都趋于一致,这可能是正确的行为very不稳定,但我不确定 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);
相邻小区以两种不同的方式报告:
在 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(小区标识);您拥有的是 PCI(物理单元 ID)而不是 PSC。然而,它们的功能本质上与 UMTS 同类产品相同。
但请注意,设备之间的实现差异很大:有些手机即使在 3G 网络上也不会报告 PSC,有些手机永远不会报告相邻小区。 Nexus S(大多数三星制造的设备)都没有报告。
但不确定 LAC=0。它可能意味着“与当前小区相同的 LAC”,在这种情况下,查看位置区域边界的输出会很有趣,其中电话可以拾取具有多个 LAC 的小区。 (我们会看到来自两个 LA 的小区吗?或者只是来自“我们的”LA?对于来自邻近 LA 的小区会报告什么 LAC?)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)