Информация о соседних ячейках является неточной

Я пытаюсь использовать мобильную информацию о соседних ячейках, доступную на Android через TelephonyManager класс и его getNeighboringCellInfo метод. Ниже я публикую часть кода (в основном взятую из общедоступных источников), которая выполняет эту работу, и один пример вывода, который генерирует этот код (показан на прикрепленном скриншоте). Код и изображение размещаются "как есть" без каких-либо изменений, поэтому должно быть относительно легко связать одно с другим и убедиться, что оно работает правильно (конечно, могут быть ошибки, которые я пропустил).

Проблема в том, что список соседних ячеек часто содержит элементы с "неправильными" (на мой взгляд) данными, такими как:

  1. NeighboringCellInfo со всеми свойствами - lac, cid, psc - установить -1, и только rssi поле кажется значимым;
  2. NeighboringCellInfo с lac равно 0; это значит, что lac такое же, как текущая активная ячейка?
  3. NeighboringCellInfo с rssi значение вне диапазона [0, 31], а не UNKNOWN_RSSI; такие значения могут быть как положительными (33, как показано на скриншоте), так и отрицательными (они выглядят как правильное необработанное значение rssi, то есть без необходимости преобразования из asu);
  4. элементы списка, полученные в одной и той же геолокации, не демонстрируют согласованность настолько, насколько я ожидал, то есть в двух последовательных сканированиях каждый может иметь элемент, опущенный в другом, и уровни rssi пропущенных элементов не являются самыми низкими уровень в списке (на самом деле их rssi могут быть больше, чем для используемой в данный момент ячейки); Я допускаю, что это может быть правильным поведением, если сигнал каждой ячейки имеет тенденцию быть очень нестабильным, но я не уверен, верно ли это в целом для сетей GSM и / или UMTS. В текущей ячейке всегда все поля определены четко, но ее rssi может очень быстро изменяться в диапазоне 30 дБм (скажем, от -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);

2 ответа

Соседние клетки сообщаются двумя разными способами:

В сети GSM/GPRS (которая, по-видимому, является сетью, в которой вы были, когда делали снимок экрана), вы должны получить кортеж MCC/MNC/LAC/CID для соседних ячеек. Я вижу, вы получаете действительные значения CID. PSC всегда будет равен -1, если вы находитесь в сети GSM (2.xG), так как PSC не имеет значения для GSM (PSC - это параметр CDMA, а GSM - на основе TDMA).

В UMTS все иначе: для соседних ячеек сообщается только PSC, и вы не узнаете их другие параметры, если не подключитесь к ним.

LTE в принципе похож на UMTS, но с немного другими именами: вместо LAC и CID у вас есть TAC (код зоны слежения) и CI (идентификация ячейки); вместо PSC у вас есть PCI (физический идентификатор ячейки). Тем не менее, они делают то же самое, что и их коллеги UMTS.

Однако обратите внимание, что реализация сильно различается в зависимости от устройства: некоторые телефоны не будут сообщать о PSC даже в сетях 3G, а некоторые никогда не будут сообщать о соседних сотах. Nexus S (как большинство устройств Samsung) не сообщает ни того, ни другого.

Не уверен насчет LAC=0, хотя. Это может означать "тот же LAC, что и текущая ячейка", и в этом случае было бы интересно увидеть выходные данные от границы области местоположения, где телефон может собирать ячейки с несколькими LAC. (Будем ли мы видеть клетки из обоих Лос-Анджелесов? Или просто из "нашего" Лос-Анджелеса? Какой LAC будет сообщаться для клеток из соседнего Лос-Анджелеса?)

Мобильное устройство должно знать соседние ячейки, чтобы при необходимости оно могло передать лучшую ячейку. В любом случае, вы сказали ему, чтобы получить информацию о соседних ячейках, вот что он должен делать. Ваши результаты, похоже, не соответствуют тому, что описано в документации Android. Я бы сообщил об этой проблеме поставщику устройства как об ошибке прошивки.

Я могу представить ситуацию, когда вы увидите соседнюю ячейку с более сильным сигналом, если, например, ячейка была GSM, и устройство предпочло ячейку UMTS с более слабым сигналом, но это должно быть очевидно из поля типа сети.

Другие вопросы по тегам