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