如何将Wifi信号强度从质量(百分比)转换为RSSI(dBm)?

31

我该如何将Wifi信号强度从百分比质量(通常为0%至100%)转换为RSSI值,通常为负的dBm数值(即-96db)?

13个回答

85

Wifi信号强度百分比转换为RSSI dBm

微软在他们的WLAN_ASSOCIATION_ATTRIBUTES结构中定义了Wifi信号质量:

wlanSignalQuality:

一个表示网络信号质量的百分比值。WLAN_SIGNAL_QUALITY的类型为ULONG。该成员包含0到100之间的值。值为0意味着实际RSSI信号强度为-100 dbm。值为100表示实际RSSI信号强度为-50 dbm。您可以使用线性插值计算wlanSignalQuality值在1和99之间的RSSI信号强度值。

RSSI(或“无线电(接收)信号强度指示器”)以“dB”(分贝)或类似的“dBm”(每毫瓦分贝)为单位(请参见dB vs. dBm),其中较小幅度的负数具有最高的信号强度或质量。


因此,quality(百分比)和dBm之间的转换如下:

    quality = 2 * (dBm + 100)  where dBm: [-100 to -50]

    dBm = (quality / 2) - 100  where quality: [0 to 100]

伪代码(包括截取示例):

    // dBm to Quality:
    if(dBm <= -100)
        quality = 0;
    else if(dBm >= -50)
        quality = 100;
    else
        quality = 2 * (dBm + 100);

    // Quality to dBm:
    if(quality <= 0)
        dBm = -100;
    else if(quality >= 100)
        dBm = -50;
    else
        dBm = (quality / 2) - 100;

注意:

仔细检查您用于计算的质量的定义。还要检查dB(或dBm)的范围。这些限制可能会有所不同。

示例:

Medium quality:   50%      ->   -75dBm   = (50 / 2) - 100
Low quality:      -96dBm   ->   8%       = 2 * (-96 + 100)

16

在JS中,我更喜欢这样写:

Math.min(Math.max(2 * (x + 100), 0), 100)

我的个人观点是,这种写法更加优雅,而不是使用if语句。


12

根据经验:

  1. 小于-50dB(-40、-30和-20)=信号强度的100%
  2. -51到-55dB= 90%
  3. -56到-62dB=80%
  4. -63到-65dB=75%
  5. 以下对于Apple设备不够好

  6. -66到68dB=70%
  7. -69到74dB=60%
  8. -75到79dB=50%
  9. -80到-83dB=30%
    Windows笔记本电脑在-80dB上可以正常工作,但速度较慢


4
你是如何得到这些数值的? - ladytoky0

6

我很高兴找到了这篇文章,因为我一直在寻找将dbm转换成百分比的方法。借鉴David的帖子,我用Python写了一个快速脚本来计算质量百分比。

#!/usr/bin/env python3
import os
import platform

system = platform.system()
if system == 'Linux':
    cmd = "iwconfig wlan0 | grep Signal | /usr/bin/awk '{print $4}' | /usr/bin/cut -d'=' -f2"
elif system == 'Darwin':
    cmd = "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | grep CtlRSSI | awk '{ print $NF; }"
else:
    print("Unsupported os: {}".format(system))

dbm = os.popen(cmd).read()
if dbm:
    dbm_num = int(dbm)
    quality = 2 * (dbm_num + 100)
    print("{0} dbm_num = {1}%".format(dbm_num, quality))
else:
    print("Wifi router connection signal strength not found")

为了获得我的电脑所在位置最高的无线网络质量,我移动/旋转了我的天线直到接收到最好的信号质量。为了实时查看信号质量,我使用了上面的脚本运行:
watch -n0.1 "python getwifiquality.py"

你能帮我吗? dbm_num = int(x) ValueError: 无效的字面值,无法转换为十进制整数:'77/100\n' - Redhwan

4

我知道现在可能有些晚了,但这对未来的某个人可能有所帮助。

我将dBm 30-90的值与100-0%相关联以获得RSSI。

我使用基本的线性方程式来得到答案。

y = mx + b

我们知道以dBm为x值时,其取值为30和90。 我们知道以%为y值时,其取值为100和0。
我们只需要找到斜率。这样我们可以将其线性化。
m = 100-0/30-90

  = 100/-60

  = -5/3

b = y - mx

 = 0 + 5/3*90
 = 150

当您了解RSSI值时,在代码中使用的最终方程式。

% = 150 - (5/3) * RSSI

注意:我已经将通常为负数的RSSI值乘以其绝对值以获得正数。

quality = abs(RSSI)
% = 150 - (5/3) * quality

3

来自RSSI vs RSS

RSSI - 接收信号强度指示器 RSS - 接收信号强度

RSSI是一个指示器,而RSS是实际值。什么是指示器呢?指示器意味着它可以是相对值,并且RSSI始终是正值,RSS没有单位。

我们可以说RSSI是普通人理解的。无线电频率值通常以dBm为单位,并且大多数情况下是负值。为了使人们容易理解,这些负值通过缩放转换为正值。

例如,如果最大信号强度是0 dBm,最小值为-100 dBm。我们可以按照上述方法进行缩放。我们可以将0 dBm及以上(RSS)设置为100 RSSI(即最大RSSI),并将-100 dBm或更低级别设置为0 RSSI(最小RSS)。


0

上述的伪代码无法适用于所有范围,例如范围 (-80dBm 到 0 和 -40dBm 到 100)。

通用的简单逻辑可将任何范围映射到 0 到 100。 使用示例,对于下面的代码 ConvertRangeToPercentage(-80,-40,-50)

int ConvertRangeToPercentage (int a_value_map_to_zero, int a_value_map_to_100, int a_value_to_convert)
{

   int percentage = 0;

   if (a_value_map_to_zero < a_value_map_to_100)
   {
      if (a_value_to_convert <= a_value_map_to_zero)
      {
         percentage = 0;
      }
      else if (a_value_to_convert >= a_value_map_to_100)
      {
         percentage = 100;
      }
      else
      {
         percentage = (a_value_to_convert - a_value_map_to_zero) * 100 / (a_value_map_to_100 - a_value_map_to_zero);
      }
   }
   else if (a_value_map_to_zero > a_value_map_to_100)
   {
      if (a_value_to_convert >= a_value_map_to_zero)
      {
         percentage = 0;
      }
      else if (a_value_to_convert <= a_value_map_to_100)
      {
         percentage = 100;
      }
      else
      {
         percentage = (a_value_to_convert - a_value_map_to_zero) * 100 / (a_value_map_to_100 - a_value_map_to_zero);
      }
   }
   else
   {
      percentage = 0;
   }

   return percentage;
}

0

0

好的..我同意...但为什么呢:

 Quality=29/100  Signal level=-78 dBm
 Quality=89/100  Signal level=-55 dBm
 Quality=100/100 Signal level=-21 dBm

这与公式percentage=quality/2 - 100不符。


1
“质量”一词并没有普遍认可的定义。微软有一个定义,如接受的答案所述,但其他软件可能不使用此定义。例如,WiFi Explorer表示-20 dBm为100%,甚至指出“其他工具显示的信号强度百分比值与WiFi Explorer中看到的相差甚远。” - bitinerant

0
这是我已经完成的内容:
long rssi = WiFi.RSSI();
rssi=-rssi;
int WiFiperct;
if (rssi<27){
WiFiperct =100;
}
else if(rssi>=27&&rssi<33){
  WiFiperct=150-(5/2.7)*rssi;
}
else if(rssi>=33&&rssi<36){
  WiFiperct=150-(5/3)*rssi;
}
else if(rssi>=36&&rssi<40){
  WiFiperct=150-(5/3.3)*rssi;
}
else if(rssi>=40&&rssi<80){
  WiFiperct=150-(5/3.5)*rssi;
}
else if(rssi>=80&&rssi<90){
  WiFiperct=150-(5/3.4)*rssi;
}
else if(rssi>=90&&rssi<99){
  WiFiperct=150-(5/3.3)*rssi;
}
else{
  WiFiperct=0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接