蓝牙的RSSI转换为信号强度百分百

【背景】

android平台中,已经可以通过蓝牙设备扫描,获得每个蓝牙设备的RSSI。

但是得到的值,基本都是负的,比如:

-89, -51, -95, -94

现在希望将此RSSI的值,转换为信号百分比,即从1到100的值。

【折腾过程】

1.找了半天:

osx – RSSI value of wifi connection – how to interpret? – Super User

信号强度从百分比到分贝的转换 – ※一路风尘※ – ITeye技术网站

rssi为什么是负值 – 问通信专家

rssi值如何转换成dbm – 问通信专家

但是都没有很好的解决办法。

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;
  }
    

仅供参考。

你可能感兴趣的:(Bluetooth)