Отобразить значение Android getGsmSignalStrength () в процентах - PullRequest
4 голосов
/ 16 октября 2011

В соответствии с соответствующими значениями в дБм getGsmSignalStrength () масштаб представляется линейным.(См. Значения дБм здесь ).Но я заметил, что почти во всех приложениях эта шкала не используется как линейная шкала.

Например, рассмотрим src StatusBarPolicy :: updateSignalStrength

signal strength = 0 or 99 -> no signal
signal strength >= 12 -> very good signal
signal strength >= 8 -> good signal
signal strength >= 5 -> poor signal
signal strength <5 -> very poor signal

Может ли кто-нибудь помочь мне узнать шкалу, с помощью которой я могу отображать силу сигнала в процентах.

Ответы [ 2 ]

5 голосов
/ 16 октября 2011

По предоставленной вами ссылке:

0 -113 дБм или менее
1 -111 дБм
2 ... 30 -109 ... -53 дБм
31 -51 дБм или более

99 неизвестно или не обнаружено

Это будет означать, что у вас есть диапазон или от -113 до -51, или -62dBm. Чтобы преобразовать это в процент, вы можете взять полученное вами значение (0-31,99), выяснить, что такое соответствующий дБм, а затем найти разницу с -113 и разделить на 62.

Например, 0 = -113dBm. Разница с -113 = 0. 0/62 = 0%. 1 = -111dBm. Разница с -113 = 2. 2/62 ~ 3%. 30 = -53dBm. Разница с -113 = 60. 60/62 ~ 97%.

Единственный особый случай, который вам нужен, это 99, который должен обрабатываться как 0.

1 голос
/ 19 декабря 2018

Значение уровня сигнала представлено в дБм. Это означает, что это в логарифмическом масштабе. Логарифмически разрешено представление очень больших, а также очень маленьких значений. Логарифмическая шкала означает, что: Увеличение мощности на 100 Вт даст вам 20 дБм; но увеличение мощности на 1000 Вт даст не 200 дБм, а 30 дБм. Если вы конвертируете логарифмическую шкалу в линейную шкалу, вы потеряете способность представлять широкий диапазон значений. Но если вы хотите сделать это, вот алгоритм:

    final double pMax = Math.pow(10d, 31/10d);
    if (gsmSignalStrength == 99) {
        return -1;
    }
    double r = Math.pow(10d, gsmSignalStrength/10d) / pMax; // value <0,1>
    return (float) r;

Справочный документ: https://www.etsi.org/deliver/etsi_ts/127000_127099/127007/08.05.00_60/ts_127007v080500p.pdf стр. 82

...