Частота обновления Android TelephonyManager getAllCellInfo() RSSI

В настоящее время я разрабатываю приложение для Android для своего университетского исследовательского проекта. Это приложение должно иметь возможность считывать уровни RSSI ближайших базовых станций GSM. Я написал следующую функцию, которая успешно считывает уровни RSSI соседних ячеек. Я вызываю эту функцию каждые 200 мс, но значения RSSI почти не меняются со временем. Я подозреваю, что процессор основной полосы частот обновляет эти значения только каждые x s, но я ничего не могу найти о частоте обновления. Кто-нибудь знает, как быстро обновляется информация в getAllCellInfo()? Причина, по которой я хочу это знать, заключается в том, что время очень важно для моей установки. В лаборатории мы включаем и отключаем глушилку на определенной частоте (более 1 Гц). Когда помеха включена, значение RSSI упадет. Поэтому я хотел бы знать, как быстро можно обновить RSSI, чтобы обнаружить падение этого сигнала, если глушитель включен и отключен, например, на частоте 10 Гц.

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.


person mvanderreek    schedule 25.05.2016    source источник


Ответы (1)


Я думаю, что вы можете использовать лучший подход к этой реализации.

Вместо использования определенного интервала для просмотра информации о ячейке вы можете зарегистрировать прослушиватель, который будет вызываться каждый раз при изменении информации о ячейке.

Таким образом, вам не нужно беспокоиться об идеальном значении, а также вы не тратите ресурсы на проверку информации, которая еще не может быть изменена.

Вы можете использовать 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();
    }
}

Надеюсь, я смог вам помочь.

person W0rmH0le    schedule 25.05.2016
comment
Привет @GuilhermeP, спасибо за ваш ответ. К сожалению, время очень важно для моей установки. В лаборатории мы включаем и отключаем глушилку на определенной частоте (более 1 Гц). Когда помеха включена, значение RSSI упадет. Поэтому я хотел бы знать, как быстро можно обновить RSSI, чтобы обнаружить падение этого сигнала, если глушитель включен и отключен, например, на частоте 10 Гц. - person mvanderreek; 27.05.2016
comment
@mvanderreek Изначально я полагал, что RSSI не обновляется так быстро. Обычно CP (модем) не информирует сторону AP (Android) о любых колебаниях RSSI. Это может резко повлиять на потребление тока и сократить срок службы батареи. Реализация выше уведомляет вас, как только значение RSSI обновляется. Любая проверка rssi перед новым уведомлением должна возвращать тот же статус. Возможно, вам следует поискать, как принудительно обновить RSSI через какой-либо запрос RIL на сторону CP. Надеюсь, вы найдете лучшее решение. - person W0rmH0le; 27.05.2016