2

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

问题是相邻单元格的列表确实经常包含具有“不正确”(据我理解)数据的元素,例如:

  1. aNeighboringCellInfo所有属性 - lac, cid, psc- 设置为 -1,并且只有rssi字段似乎有意义;
  2. a等于 0 NeighboringCellInfolac这是否意味着lac与当前活动单元格相同?
  3. aNeighboringCellInforssi在 [0, 31] 范围之外且 not 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<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);

在此处输入图像描述

4

2 回答 2

3

相邻单元格以两种不同的方式报告:

在 GSM/GPRS(这似乎是您截取屏幕截图时所在的网络)上,您应该获得相邻小区的 MCC/MNC/LAC/CID 元组。我看到你得到了有效的 CID 值。如果您在 GSM (2.xG) 网络上,PSC 将始终为 -1,因为 PSC 在 GSM 上没有任何意义(PSC 是 CDMA 参数,而 GSM 是基于 TDMA 的)。

在 UMTS 上情况有所不同:对于相邻小区,仅报告 PSC,除非您连接到它们,否则您不会发现它们的其他参数。

LTE 原则上类似于 UMTS,但名称略有不同:您使用 TAC(跟踪区域代码)和 CI(小区标识)代替 LAC 和 CID;而不是 PSC,您有 PCI(物理单元 ID)。但是,它们的功能与 UMTS 对应物基本相同。

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

不过,不确定 LAC=0。这可能意味着“与当前小区相同的 LAC”,在这种情况下,从位置区域的边界查看输出会很有趣,手机可以在该区域中拾取具有多个 LAC 的小区。(我们会看到来自两个 LA 的小区吗?或者只是来自“我们的”LA?对于来自相邻 LA 的小区会报告什么 LAC?)

于 2014-08-03T17:16:50.177 回答
0

The mobile device should be aware of the neighbouring cells, so that it can hand over to a better cell if necessary. In any case, you've told it to get information about neighbouring cells, so that's what it should do. Your results don't seem to match up to what is described in the Android documentation either. I would report this problem to the device vendor as a firmware bug.

I can imagine a situation where you would see a neighbouring cell with a stronger signal if for example the cell was GSM, and the device preferred a UMTS cell with a weaker signal, but this should be obvious from the network type field.

于 2012-11-03T20:09:10.893 回答