Из SDK это единственный способ получить RSSI. Это немного неудобно, так как бесполезно, если вы хотите только периодически контролировать уровень сигнала сопряженного устройства.
Однако есть выход, но из SDK. Вы можете использовать собственный API (посредством NDK) и вызывать функции, предоставляемые Bluez API , базовым фреймворком Bluetooth в Android (и почти в любой Linux-системе). Рассматриваемая функция hci_read_rssi()
предоставляется libbluetooth.so
(часть стека Bluez). Чтобы узнать, как его использовать, вы можете взглянуть на источники инструментов Hcidump (которые поставляются с Bluez). Вы можете написать код-обертку JNI для своей функции, чтобы получить уровень сигнала сопряженного устройства.
Есть два недостатка использования этого метода:
- Чтобы измерить RSSI, вы должны сначала подключиться к удаленному устройству , по крайней мере, на низком уровне (аутентификация для этого соединения не требуется) и прервать соединение после вызова
hci_read_rssi()
. Это медленнее, чем просто измерение RSSI от маяков, как обеспечивают другие средства беспроводной связи (GSM или WIFI)
- Низкоуровневое подключение к удаленным устройствам Bluetooth для Android требуется права суперпользователя . Так что забудьте о написании и приложениях, которые можно запускать на не взломанных телефонах (обычно они не имеют root-доступа, а некоторые, такие как Motorola Droid / Milestone, даже лишают гарантии, если вы пытаетесь его получить).