Как постоянно получать RSSI без подключения к устройству BLE?

Моему приложению необходимо постоянно получать значение RSSI устройства bluetooth для приближения к расстоянию rssi, без подключения. Однако метод обратного вызова BluetoothAdapter получает RSSI только один раз, когда устройство сканируется.

// Device scan callback
private BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() {
    @Override
    public void onLeScan(final BluetoothDevice device, final int rssi, byte[] scanRecord) {
        runOnUiThread(new Runnable() {
            public void run() {
                ...
            }
        });     
    }   
};

В качестве решения я создал два объекта Runnable. Один для запуска, другой - для остановки процесса сканирования. Эти два объекта постоянно нажимают друг на друга, пока я не получу желаемое значение RSSI. После этого мой Handler удаляет их из очереди сообщений.

private Runnable startScan = new Runnable() {       
    @Override
    public void run() {
        bluetoothAdapter.startLeScan(leScanCallback);
        scanHandler.postDelayed(stopScan, SCAN_INTERVAL);
    }               
};

private Runnable stopScan = new Runnable() {        
    @Override
    public void run() {         
        bluetoothAdapter.stopLeScan(leScanCallback);                                            
        scanHandler.postDelayed(startScan, STOP_INTERVAL);          
    }
};

Кажется, что это работает, но я хочу знать, есть ли более эффективный вариант для этого, не подключаясь.

Ответ 1

Если беспроводной маяк является рекламой и не подключается, onLeScan называется непрерывным. Если беспроводной маяк подключается, функция зависит от устройства.