【背景】
android平台中,已经可以通过蓝牙设备扫描,获得每个蓝牙设备的RSSI。
但是得到的值,基本都是负的,比如:
-89, -51, -95, -94
现在希望将此RSSI的值,转换为信号百分比,即从1到100的值。
【折腾过程】
1.找了半天:
osx – RSSI value of wifi connection – how to interpret? – Super User
信号强度从百分比到分贝的转换 – ※一路风尘※ – ITeye技术网站
但是都没有很好的解决办法。
2.参考:
How to calculate the percentage of signal strength level from dBm
有提到:
“RSSI – 95 = dBm
RSSI_MAX for Atheros chips is 60. So, -35 dBm is equivalent to > 100%, and -95 dBm to 0%”
但是也只是针对该特例的公式,没有普适性。
3.最后参考:
Received signal strength indication – Wikipedia, the free encyclopedia
可知:
各个厂商各自为政,比如:
(1)Cisco:
RSSI范围是0到100,但是有时候也会返回101
(2)Atheros
某个无线网卡信号强度返回值从:
0到128,共128个等级
所以,对于想要找个统一的公式去计算如何从RSSI转换为信号强度百分比的事情,结论只能是:
没有统一的公式,你自己看着办。
并且也提到了:
更好的检测信号强度的标准是RCPI
【总结】
最终我暂时的做法是:
既然没有准的公式,那么就根据此处的实际情况:
基本都是在-100以上的值,所以,暂时就简单起见,把RSSI直接加上100,得到0到100的信号强度。
相关代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
// signal strength==RSSI=Received signal strength indication
//-89, -51, -95, -94
private
int
rssi;
//private int signalStrength;
public
void
setRssi(
int
rssi) {
this
.rssi = rssi;
}
public
int
getRssi() {
return
rssi;
}
// public void setSignalStrength(int signalStrength) {
// this.signalStrength = signalStrength;
// }
public
int
getSignalStrength() {
//return signalStrength;
int
signalStrength = rssi +
100
;
if
(signalStrength <
0
){
signalStrength =
0
;
}
else
if
(signalStrength >
100
) {
signalStrength =
100
;
}
return
signalStrength;
}
|
仅供参考。