2012-11-03 59 views
2

我想通過TelephonyManager類及其getNeighboringCellInfo方法利用有關相鄰小區的移動信息,可在Android上使用。下面我發佈了一部分代碼(大部分來自公開可用的源代碼),它完成了這項工作,以及這個代碼產生的輸出的一個例子(在附圖中顯示)。代碼和圖像是按原樣放置的,沒有任何變化,所以將一個和另一個關聯起來應該相對容易,並確保它能夠正常工作(當然,可能會出現我忽略的錯誤)。相鄰小區信息不準確

的問題是相鄰小區的列表並常常包含有「不正確」的元素(我的理解)的數據,如:

  1. 一個NeighboringCellInfo所有特性 - laccidpsc - 集到-1,只有rssi字段看起來有意義;
  2. a NeighboringCellInfolac等於0;這是否意味着lac與當前活動單元格相同?
  3. a NeighboringCellInforssi值超出範圍[0,31]而不是UNKNOWN_RSSI;這些值可以是正值(33,如屏幕截圖所示),爲負值(它們看起來像一個適當的原始rssi值,不需要從asu轉換);
  4. 在同一地理定位中獲得的列表元素沒有像我期望的那樣表現出一致性,即在兩次連續掃描中,每個人都可以在另一個元素中省略元素,而省略元素的rssi級別不是列表中最低級別(實際上它們的rssi可以大於當前使用的單元);我承認這可能是正確的行爲,如果每個單元信號往往是不穩定的,但我不確定一般GSM和/或UMTS網絡是否是真的。當前電池總是有所有的字段定義好,但其rssi可以在30 dBm的範圍內快速變化(比如從-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); 

enter image description here

回答

0

移動設備應該知道相鄰小區的,所以它可以在必要時移交到更好的小區。無論如何,你已經告訴它獲取關於鄰近單元的信息,所以這就是它應該做的。您的結果看起來與Android文檔中描述的內容不匹配。 我會將此問題報告給設備供應商,作爲固件錯誤。

我可以想象一種情況,如果例如該小區是GSM,並且該設備首選具有較弱信號的UMTS小區,您將看到具有較強信號的相鄰小區,但這應該從網絡類型字段中顯而易見。

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會從鄰近洛杉磯報道的細胞?)

+0

我是正確的,你的答案基本上意味着,關於相鄰小區的信息只是在Android中不可靠,不能用於跨設備的穩定位置檢測? – Stan

+0

不一定。問題在於一些設備報告的數據非常少(不超過服務小區),而其他設備則報告更多。正如我們所看到的,一些報告在相鄰小區中的虛假數據。如果您想使用相鄰單元進行位置檢測,則需要一些邏輯來處理相鄰單元數據:不要指望它可用,識別不完整的記錄並猜測丟失的信息或丟棄不能記錄的記錄可靠地完成。 – user149408