我正试图利用android上通过TelephonyManager类及其getNeighboringCellInfo方法提供的有关相邻小区的移动信息。下面我将发布一部分代码(大部分来自公共资源)来完成这项工作,以及这段代码生成的输出示例(如所附截图所示)。代码和图像按原样放置,没有任何更改,因此应该相对容易地将一个与另一个关联起来,并确保它正常工作(当然,可能会有我忽略的错误)。
问题是,相邻单元格的列表通常包含具有“不正确”(据我所知)数据的元素,例如:
aNeighboringCellInfo所有属性-laccidpsc-设置为-1,并且只有rssi字段才有意义;
aNeighboringCellInfolac等于0;这是否意味着lac与当前活动细胞相同?
aNeighboringCellInfo值超出范围[0,31]且不rssi;这些值可以是正的(33,如屏幕截图所示),也可以是负的(它们看起来像一个适当的原始rssi值,即不需要从UNKNOWN_RSSI转换);
在同一地理位置获得的列表元素并不像我预期的那样显示一致性,即在两次连续扫描中,每个元素都可以在另一个元素中省略一个元素,并且省略的元素的rssi级别在列表中不是最低的级别(事实上,它们的rssi可以大于当前使用的单元格);我承认,如果每个蜂窝信号都非常不稳定,这可能是正确的行为,但我不确定它是否适用于GSM和/或UMTS网络。当前单元格总是定义了所有字段,但是它的rssi在30dbm(比如从-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(小区标识);不是psc,而是pci(物理小区标识)。然而,他们做的基本上与他们的umts同行相同。
不过,请注意,不同设备之间的实现差异很大:有些手机甚至在3g网络上也不会报告psc,而有些手机则永远不会报告相邻的手机。NexusS(三星生产的大多数设备)也没有报告。
但不确定LAC=0。这可能意味着“与当前手机相同的LAC”,在这种情况下,从一个位置区域的边界看到输出会很有趣,在这个位置区域,手机可以拾取具有多个LAC的手机。(我们会看到两个LAS的细胞吗?或者只是从洛杉矶来的?从邻近的洛杉矶来的细胞会报告什么lac?)

关于java - 相邻小区信息不正确,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13208236/

10-09 09:34