相邻小区信息不准确

我正在尝试使用有关相邻单元格的移动信息,可通过TelephonyManager类及其getNeighboringCellInfo方法在Android上getNeighboringCellInfo 。 下面我发布了一部分代码(主要来自公开可用的源代码),它完成了这项工作,以及此代码生成的一个输出示例(如附带的屏幕截图所示)。 代码和图像按“原样”放置而没有任何更改,因此将一个与另一个相关联应该相对容易,并确保它应该正常工作(当然,可能存在我忽略的错误)。

问题是相邻单元格列表通常包含“不正确”(据我所知)数据的元素,例如:

  1. 具有所有属性的NeighboringCellInfolaccidpsc – 设置为-1,并且只有rssi字段看起来有意义;
  2. 一个lac等于0的NeighboringCellInfo ; 这是否意味着lac与当前的活跃细胞相同?
  3. 一个NeighboringCellInfo ,其rssi值超出范围[ rssi ]而不是UNKNOWN_RSSI ; 这样的值可以是正数(33,如屏幕截图所示),为负数(它们看起来像一个正确的原始rssi值,即无需从asu转换);
  4. 在同一地理位置中获得的列表元素并不像我期望的那样表现出一致性,即在两次连续扫描中,每一个都可以在另一个中省略一个元素,并且省略元素的rssi级别不是最低的列表中的级别(实际上它们的rssi可能比当前使用的单元格大); 我承认如果每个细胞信号都非常不稳定,这可能是正确的行为,但我不确定它是否适用于GSM和/或UMTS网络。 当前单元始终具有良好定义的所有字段,但其rssi可在30 dBm(例如-60至-90)的范围内快速变化。
  5. 与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 NeighboringList = telephonyManager.getNeighboringCellInfo(); String stringNeighboring = "Neighboring List - Lac : Cid : Psc : type : RSSI\n"; for(int i = 0; i = 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(小区标识); 而不是PSC,你有一个PCI(物理小区ID)。 但是,它们与UMTS对应物基本相同。

但请注意,不同设备之间的实施情况差异很大:有些手机即使在3G网络上也不会报告PSC,有些手机也不会报告相邻小区。 Nexus S(大多数三星制造的设备)都没有报告。

但是不确定LAC = 0。 它可能意味着“与当前单元相同的LAC”,在这种情况下,从位置区域的边界看到输出将是有趣的,其中电话可以拾取具有多个LAC的单元。 (我们会看到来自两个LA的细胞吗?还是仅仅来自“我们的”LA?来自邻近洛杉矶的细胞会报告什么LAC?)

移动设备应该知道相邻小区,以便在必要时可以切换到更好的小区。 无论如何,你已经告诉它获取有关相邻单元的信息,这就是它应该做的事情。 您的结果似乎与Android文档中描述的内容不匹配。 我会将此问题作为固件错误报告给设备供应商。

我可以想象一种情况,你会看到一个信号较强的相邻小区,例如小区是GSM,而设备更喜欢信号较弱的UMTS小区,但这应该从网络类型字段中显而易见。