相邻的小区信息不准确

时间:2012-11-03 10:23:43

标签: java android gsm umts

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

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

  1. NeighboringCellInfo包含所有属性 - laccidpsc - 设置为-1,只有rssi字段似乎有意义;
  2. NeighboringCellInfo lac等于0;这是否意味着lac与当前活动单元格相同?
  3. NeighboringCellInfo rssi值超出范围[0,31]而非UNKNOWN_RSSI;这些值可以是正数(33,如屏幕截图所示),为负数(它们看起来像一个正确的原始rssi值,无需转换asu);
  4. 在同一地理位置中获得的列表元素不会像我期望的那样显示一致性,即在两个连续扫描中,每个可以在另一个中省略元素,并且省略元素的rssi级别不是列表中最低级别(实际上它们的rssi可能比当前使用的单元格大);我承认如果每个细胞信号都非常不稳定,这可能是正确的行为,但我不确定它是否适用于GSM和/或UMTS网络。当前单元始终定义好所有字段,但其rssi可以在30 dBm范围内变化很快(例如从-60到-90)。
  5. 与4相同,但关于从一天到另一天的一致性。在一个高度城市化和成熟的环境中,我希望每天都能看到相同的细胞列表,但它们会以这样的方式变化,有一天我甚至没有看到有关细胞活跃细胞的提及一天。
  6. 这是否意味着移动技术的正常运行,某种可能的省电优化,或特定设备的缺陷(在我的情况下是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);
    

    enter image description here

2 个答案:

答案 0 :(得分:3)

以两种不同的方式报告相邻细胞:

在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?)

答案 1 :(得分:0)

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

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