Как постоянно получать 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);          
    }
};

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


person Alpha Carinae    schedule 18.11.2013    source источник
comment
Мне кажется, это правильный путь. Сканирование остановится автоматически, поэтому после сканирования просто запустите его снова...   -  person Jordi    schedule 19.11.2013
comment
Это правильный путь. Кстати, поведение сканирования ЗАВИСИТ от вашего устройства Android, например: Galaxy S4 непрерывно запускает обратный вызов сканирования для одного и того же периферийного устройства, в то время как Nexus 7 сообщает только один раз.   -  person reTs    schedule 19.11.2013
comment
Забудьте упомянуть, что в некоторых случаях даже на Nexus 7 обратный вызов сканирования будет срабатывать неоднократно. Это происходит только для определенных периферийных устройств, и я не знаю, почему они вызывают несколько обратных вызовов сканирования.   -  person reTs    schedule 19.11.2013
comment
Как справиться с этой ситуацией, описанное выше решение отлично работает с устройством Nexus, но не обнаруживается для Samsung Galaxy S3.   -  person mcd    schedule 23.01.2014


Ответы (1)


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

person Benoit    schedule 05.02.2014