2016-05-25 128 views
2

我目前正在爲我的大學研究項目開發一個Android應用程序。這個應用程序應該能夠讀取附近GSM基站的RSSI電平。我編碼了以下函數,它可以成功讀取附近單元的RSSI電平。我每200毫秒調用一次該函數,但RSSI值幾乎不會隨時間變化。我懷疑基帶處理器每次只更新這些值,但我找不到有關刷新率的任何信息。有誰知道getAllCellInfo()中的信息刷新速度有多快?我想知道這一點的原因是因爲時間對我的設置非常重要。在實驗室中,我們啓用和禁用特定頻率(大於1 Hz)的干擾信號。干擾器啓用時,RSSI值將下降。所以我想知道如果在例如10赫茲啓用和禁用干擾器時RSSI可以刷新多快來檢測這個信號下降。Android TelephonyManager getAllCellInfo()刷新率RSSI

public HashMap<Integer,Integer> RSSI_values() { 

    HashMap<Integer,Integer> result = new HashMap<Integer,Integer>(); 

    TelephonyManager telephonyManager = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE); 
    telephonyManager.getNetworkType(); 
    List<CellInfo> CellInfo_list = telephonyManager.getAllCellInfo(); 
    if(telephonyManager.getNetworkType() == TelephonyManager.NETWORK_TYPE_EDGE) { 
     for (int i = 0; i < CellInfo_list.size(); i++) { 
      CellInfoGsm cellinfogsm = (CellInfoGsm) CellInfo_list.get(i); 

      int cid = cellinfogsm.getCellIdentity().getCid(); 

      CellSignalStrengthGsm cellSignalStrengthGsm = cellinfogsm.getCellSignalStrength(); 
      int rssi = cellSignalStrengthGsm.getDbm(); 

      result.put(cid,rssi); 
     } 
    } 
    return result; 
} 

在這種情況下,刷新率爲特定設備,我在Nexus 5的Android 6.0.1

回答

2

我認爲你可以使用更好的方法在此實現。

而不是使用定義的時間間隔諮詢單元信息,您可以註冊一個監聽器,每次單元信息更改時都會調用該監聽器。

這樣,您不必擔心理想的價值,而且您也不會浪費資源來檢查可能尚未更改的信息。

您可以使用PhoneStateListener。您創建它並註冊它以接收單元格信息更改。當它不再需要時(在後臺活動或被銷燬),你必須註銷它。

下面是一個例子。我沒有測試。但它可以幫助你明白這個想法。

public class MainActivity extends Activity { 

    private PhoneStateListener mPhoneStateListener = new PhoneStateListener() { 
     @Override 
     public void onCellInfoChanged(List<CellInfo> cellInfoList) { 
      // This callback method will be called automatically by Android OS 
      // Every time a cell info changed (if you are registered) 
      // Here, you will receive a cellInfoList.... 
      // Same list that you will receive in RSSI_values() method that you created 
      // You can maybe move your whole code to here.... 
     } 
    }; 

    @Override 
    public void onStart() { 
     super.onStart(); 

     // Code below register your mPhoneStateListener will start to be called everytime cell info changed. 
     // If you update any UI element, be sure that they were created already (since they are created during "onCreate".. and not at onStart) 
     // I added LISTEN_CELL_LOCATION.. But I think that PhoneStateListener.LISTEN_CELL_INFO is enough 
     TelephonyManager mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
     mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CELL_LOCATION | PhoneStateListener.LISTEN_CELL_INFO); 
    } 

    @Override 
    public void onStop() { 
     // Code below unregister your listener... You will not receive any cell info change notification anymore 
     TelephonyManager mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
     mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); 
     super.onStop(); 
    } 
} 

希望我可以幫助你。

+0

嗨@GuilhermeP感謝您的回覆。 不幸的是,時機對我的設置非常重要。在實驗室中,我們啓用和禁用特定頻率(大於1 Hz)的干擾信號。干擾器啓用時,RSSI值將下降。所以我想知道如果在例如10赫茲啓用和禁用干擾器時RSSI可以刷新多快來檢測這個信號下降。 – mvanderreek

+1

@mvanderreek最初,我認爲RSSI沒有更新得那麼快。通常情況下,CP(調制解調器)不會通知AP側(Android)任何RSSI波動。這可能會嚴重影響電流消耗並降低電池壽命。上面的實施在RSSI值更新後立即通知您。新通知之前的任何rssi檢查都應返回相同的狀態。也許,你應該搜索如何通過一些RIL請求強制RSSI更新到CP端。我希望你找到更好的解決方案。 – W0rmH0le