2016-05-25 16 views
2

Ich entwickle gerade eine Android-Anwendung für meine Universität Forschungsprojekt. Diese App sollte in der Lage sein, die RSSI-Level der in der Nähe befindlichen GSM-Basisstationen zu lesen. Ich habe die folgende Funktion codiert, die die RSSI-Level der nahegelegenen Zellen erfolgreich liest. Ich rufe diese Funktion alle 200 ms auf, aber die RSSI-Werte ändern sich im Laufe der Zeit fast nicht. Ich vermute, dass der Basisband-Prozessor diese Werte nur alle x s aktualisiert, aber ich kann nichts über die Aktualisierungsrate finden. Weiß jemand, wie schnell die Info in getAllCellInfo() aktualisiert wird? Der Grund, warum ich das wissen möchte, ist, dass das Timing für mein Setup wirklich wichtig ist. Im Labor aktivieren und deaktivieren wir einen Störsender bei einer bestimmten Frequenz (größer als 1 Hz). Wenn der Störsender aktiviert ist, fällt der RSSI-Wert ab. Also würde ich gerne wissen, wie schnell der RSSI aufgefrischt werden kann, um diese Signalabfälle zu erkennen, wenn der Störsender beispielsweise bei 10 Hz aktiviert und deaktiviert wird.Android TelephonyManager GetAllCellInfo() Aktualisierungsrate 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; 
} 

Bei dieser Bildwiederholfrequenz ist gerätespezifisch ich auf einem Nexus bin 5 android 6.0.1

Antwort

2

Ich glaube, Sie einen besseren Ansatz auf dieser Implementierung verwenden können.

Anstatt ein definiertes Intervall zu verwenden, um die Zelleninformationen abzurufen, können Sie einen Listener registrieren, der jedes Mal aufgerufen wird, wenn sich eine Zelleninfo ändert.

Auf diese Weise brauchen Sie sich keine Gedanken über einen idealen Wert zu machen, und Sie verschwenden auch keine Ressourcen, um eine Information zu überprüfen, die möglicherweise noch nicht geändert wurde.

Sie können einen PhoneStateListener verwenden. Sie erstellen es und registrieren es, um Änderungen an Zellinformationen zu empfangen. Wenn es nicht mehr benötigt wird (Aktivität im Hintergrund oder zerstört), müssen Sie die Registrierung aufheben.

Unten ist ein Beispiel. Ich habe nicht getestet. Aber es kann dir helfen, die Idee zu bekommen.

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

Ich hoffe, ich könnte Ihnen helfen.

+0

Hallo @GuilhermeP danke für Ihre Antwort. Leider ist das Timing für mein Setup sehr wichtig. Im Labor aktivieren und deaktivieren wir einen Störsender bei einer bestimmten Frequenz (größer als 1 Hz). Wenn der Störsender aktiviert ist, fällt der RSSI-Wert ab. Also würde ich gerne wissen, wie schnell der RSSI aufgefrischt werden kann, um diese Signalabfälle zu erkennen, wenn der Störsender beispielsweise bei 10 Hz aktiviert und deaktiviert wird. – mvanderreek

+1

@mvanderreek Anfangs glaube ich, dass RSSI nicht so schnell aktualisiert wird. Normalerweise würde CP (Modem) die AP-Seite (Android) keine RSSI-Fluktuation mitteilen. Dies kann den Stromverbrauch drastisch reduzieren und die Batterielebensdauer verringern. Die obige Implementierung benachrichtigt Sie, sobald der RSSI-Wert aktualisiert wurde. Jedes rssi-Überprüfen vor einer neuen Benachrichtigung sollte denselben Status zurückgeben. Vielleicht sollten Sie herausfinden, wie Sie eine RSSI-Aktualisierung über eine RIL-Anfrage auf CP-Seite erzwingen können. Ich hoffe, Sie finden eine bessere Lösung. – W0rmH0le

Verwandte Themen