Как постоянно получать 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 вызывается непрерывно. Если звуковой сигнал подключен, функция зависит от устройства.