Informacje o sąsiednich komórkach są niedokładne

Próbuję wykorzystać mobilną informację o sąsiednich komórkach, dostępną na Androida przezTelephonyManager klasa i jejgetNeighboringCellInfo metoda. Poniżej zamieszczam część kodu (w większości pobraną z publicznie dostępnych źródeł), która wykonuje zadanie, oraz jeden przykład danych wyjściowych generowanych przez ten kod (pokazany na załączonym zrzucie ekranu). Kod i obraz są umieszczane „tak jak są” bez żadnych zmian, więc powinno być stosunkowo łatwo skojarzyć je ze sobą i upewnić się, że działa poprawnie (oczywiście mogą być błędy, które przeoczyłem).

Problem polega na tym, że lista sąsiadujących komórek często zawiera elementy z „niepoprawnymi” (według mnie) danymi, takimi jak:

a NeighboringCellInfo ze wszystkimi właściwościami -lac, cid, psc - ustaw na -1 i tylkorssi pole wydaje się sensowne;a NeighboringCellInfo zlac równa 0; czy to oznacza, żelac jest taki sam jak bieżąca aktywna komórka?a NeighboringCellInfo zrssi wartość spoza zakresu [0, 31] i nieUNKNOWN_RSSI; takie wartości mogą być tak pozytywne (33, jak pokazano na zrzucie ekranu), jako negatywne (wyglądają jak właściwa surowa wartość rssi, to znaczy bez potrzeby konwersji zasu);elementy listy uzyskane w tej samej geolokalizacji nie wykazują spójności tak, jak oczekiwałem, to znaczy w dwóch kolejnych skanach każdy może mieć element pominięty w drugim, a poziomy rssi pominiętych elementów nie są najniższe poziom na liście (w rzeczywistości ich rssi mogą być większe niż dla aktualnie używanej komórki); Przyznaję, że może to być właściwe zachowanie, jeśli każdy sygnał komórki ma tendencjębardzo niestabilny, ale nie jestem pewien, czy ogólnie jest to prawda dla sieci GSM i / lub UMTS. Bieżąca komórka ma zawsze dobrze zdefiniowane wszystkie pola, ale jej rssi może zmieniać się bardzo szybko w zakresie 30 dBm (powiedzmy od -60 do -90).Tak samo jak 4, ale o spójności z dnia na dzień. W wysoce zurbanizowanym i dojrzałym środowisku spodziewałbym się zobaczyć tę samą listę komórek każdego dnia, ale różnią się one w taki sposób, że pewnego dnia nawet nie widzę wzmianki o komórce, która była aktywna w poprzednim dzień.

Czy to wszystko oznacza normalne funkcjonowanie technologii mobilnej, jakieś możliwe optymalizacje oszczędzania energii lub wadę konkretnego urządzenia (w moim przypadku LG Optimus One)?

Proszę zasugerować, jak można uzyskać spójne odczyty ze środowiska komórkowego na Androidzie, jeśli jest to możliwe.

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);

questionAnswers(2)

yourAnswerToTheQuestion