Я пытаюсь правильно прочитать RSSI устройства BLE, к которому я подключен, чтобы отправить его на вышестоящий сервер.
Я обнаружил, что RSSI, возвращаемый BluetoothGatt.readRemoteRssi()
, имеет много «скачков». Я начал делать скользящее среднее (за последние 10 секунд), чтобы получить более плавное значение. Это не помогло, так как значение имело много скачков.
Я обнаружил, что выполнение mBluetoothAdapter.startLeScan(null);
делает значения более плавными. Я знаю, что официальная документация не рекомендует сканировать при подключении к устройству, но на практике на устройствах LG и Samsung это работает.
Далее - если я передам null
в качестве обратного вызова, этот метод ничего не должен делать (см. .java#L2833" rel="nofollow noreferrer">https://github.com/aosp-mirror/platform_frameworks_base/blob/master/core/java/android/bluetooth/BluetoothAdapter.java#L2833). Это наводит меня на мысль, что Samsung и LG сильно модифицируют стек Android Bluetooth.
Кто-нибудь может объяснить, что я вижу? Может ли кто-нибудь предложить лучшее решение для чтения «реальных» значений RSSI?
редактировать:
Я обнаружил, что onCharasteristicWritten()
вызывается несколько (?) раз с одним и тем же значением, даже несмотря на то, что HW отправил его только один раз. Мы фильтруем эти значения вручную прямо сейчас. Также onRssiRead()
вызывается несколько раз.
Это может быть причиной того, что в документации Android не рекомендуется сканировать при подключении к BT-устройству.