【基本解决】蓝牙的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的信号强度。

相关代码如下:

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

仅供参考。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量