BLE считывает значения RSSI ненадежно

Я пытаюсь правильно прочитать 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-устройству.


person elcuco    schedule 06.05.2018    source источник


Ответы (1)


Метод readRemoteRssi возвращает значение rssi для подключенного устройства, измеренное контроллером Bluetooth. Обратите внимание, что соединение BLE работает на 37 каналах и переключается при каждом событии соединения.

Значения rssi, которые вы получаете при сканировании, являются значениями rssi для каждого рекламного пакета. Реклама бывает только на трех каналах.

Стек Bluetooth на стороне хоста, т. е. программное обеспечение Android, работающее на основном процессоре, не изменяет значение rssi, измеренное контроллером Bluetooth.

Таким образом, единственная причина, по которой я вижу ваши разные результаты, заключается в том, что разные радиоканалы имеют разный шум/качество или что-то подобное. И, как вы, наверное, много читали в сети, так это то, что rssi будет сильно различаться, и это именно то, с чем нам приходится жить. См. https://www.google.com/search?q=ble+channels для получения подробной информации о различных радиоканалах.

Также обратите внимание, что далеко не все периферийные устройства продолжают рекламировать, когда они уже к чему-то подключены.

Если вы считаете, что передача null ничего не делает, возможно, вы могли бы проверить logcat и посмотреть, напечатано ли ожидаемое сообщение об ошибке? Однако я не могу объяснить, как сканирование изменит значения, возвращаемые readRemoteRssi для уже подключенного устройства, поскольку это не имеет смысла. Если вы думаете, что это черная магия, вам нужно обратиться к компании, производящей контроллер Bluetooth;)

person Emil    schedule 06.05.2018