BLE читают ненадежные значения RSSI - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь правильно прочитать RSSI устройства BLE, к которому я подключен, чтобы отправить его на вышестоящий сервер.

Я обнаружил, что RSSI, возвращаемый BluetoothGatt.readRemoteRssi(), имеет много "скачков". Я начал делать скользящее среднее (за последние 10 секунд), чтобы получить более плавное значение. Это не помогло, поскольку у значения было много всплесков.

Я обнаружил, что выполнение mBluetoothAdapter.startLeScan(null); делает значения более плавными. Я знаю, что официальная документация препятствует сканированию при подключении к устройству, но на практике - на устройствах LG и Samsung это работает.

Далее - если я передам null в качестве обратного вызова, этот метод ничего не должен делать (см. https://github.com/aosp-mirror/platform_frameworks_base/blob/master/core/java/android/bluetooth/BluetoothAdapter.java#L2833).. Это наводит меня на мысль, что Samsung и LG действительно сильно изменяют стек Bluetooth Android.

Может кто-нибудь объяснить, что я вижу? Кто-нибудь может предложить лучшее решение для чтения "реальных" значений RSSI?


редактирование:

Я обнаружил, что onCharasteristicWritten() вызывается несколько (?) Раз с одним и тем же значением, даже если HW отправил его только один раз. Мы фильтруем эти значения вручную прямо сейчас. Также onRssiRead() вызывается несколько раз.

Это может быть причиной, по которой в документации Android не рекомендуется выполнять сканирование при подключении к устройству BT.

1 Ответ

0 голосов
/ 07 мая 2018

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

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

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

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

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

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

...