Эквивалентен WifiManager.calculateSignalLevel для Bluetooth RSSI

Я хотел бы отображать мощность соединения Bluetooth в виде «полосок мощности сигнала» в моем пользовательском интерфейсе для устройства Bluetooth с низким энергопотреблением. Для этого мне нужно использовать значение RSSI из BluetoothGattCallback.onReadRemoteRssi. Однако этот метод возвращает RSSI в децибелах, а не на шкале столбцов. Мне нужен способ надежно преобразовать это значение в шкалу столбцов или процентное соотношение.

Просматривая документы Android в поисках ответа, я наткнулся на WifiManager.calculateSignalLevel(int rssi, int numLevels). Можно ли использовать этот метод для определения мощности сигнала Bluetooth? Если нет, как я могу это сделать?


person Mike Holler    schedule 09.10.2014    source источник
comment
Вы тем временем нашли для этого решение?   -  person Tohnmeister    schedule 12.08.2015
comment
К сожалению, до сих пор нет ...   -  person Mike Holler    schedule 12.08.2015


Ответы (1)


Для rssi в децибелах (отрицательное число) используйте:

int bars = WifiManager.calculateSignalLevel(rssi, 5);

чтобы получить полосы в обычном диапазоне от 0 до 4.

Код в WiFiManager (из GrepCode):

private static final int MIN_RSSI = -100;
private static final int MAX_RSSI = -55;
public static int calculateSignalLevel(int rssi, int numLevels) {
         if (rssi <= MIN_RSSI) {
            return 0;
        } else if (rssi >= MAX_RSSI) {
             return numLevels - 1;
         } else {
             float inputRange = (MAX_RSSI - MIN_RSSI);
             float outputRange = (numLevels - 1);
             return (int)((float)(rssi - MIN_RSSI) * outputRange / inputRange);
         }
     }
}

Я обнаружил, что на моем Galaxy S4 и Note 10.1 возвращаемый уровень не задается этим кодом. Это больше похоже на код с MAX_RSSI = -63, но не совсем. Я не знаю, как узнать, какой код на самом деле используется в этих устройствах Samsung.

Я обнаружил, что результат такой же, как и то, что телефон отображает для уровня сигнала. Однако я использую его для уровня сигнала Wi-Fi, а не Bluetooth. У меня нет опыта использования метода с Bluetooth.

person Kenneth Evans    schedule 15.04.2016
comment
Вы проверили, что полученный масштаб кажется разумным? - person Mike Holler; 15.04.2016
comment
Я отредактировал ответ, чтобы включить дополнительную информацию. Обратите внимание, что мой опыт связан с Wi-Fi, но я считаю, что он дает тот же результат, что и телефон для подключенной в настоящее время сети, хотя это не то, что может дать общедоступная версия WifiManager. Результаты кажутся разумными ИМХО. - person Kenneth Evans; 17.04.2016