我该如何将Wifi信号强度从百分比质量(通常为0%至100%)转换为RSSI值,通常为负的dBm数值(即-96db
)?
我该如何将Wifi信号强度从百分比质量(通常为0%至100%)转换为RSSI值,通常为负的dBm数值(即-96db
)?
微软在他们的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)
在JS中,我更喜欢这样写:
Math.min(Math.max(2 * (x + 100), 0), 100)
我的个人观点是,这种写法更加优雅,而不是使用if
语句。
根据经验:
以下对于Apple设备不够好
- -66到68dB=70%
- -69到74dB=60%
- -75到79dB=50%
- -80到-83dB=30%
Windows笔记本电脑在-80dB上可以正常工作,但速度较慢
我很高兴找到了这篇文章,因为我一直在寻找将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 30-90的值与100-0%相关联以获得RSSI。
我使用基本的线性方程式来得到答案。
y = mx + b
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
来自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)。
上述的伪代码无法适用于所有范围,例如范围 (-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;
}
本文是关于mW、dBm和RSSI更详细的解释。
http://madwifi-project.org/attachment/wiki/UserDocs/RSSI/Converting_Signal_Strength.pdf?format=raw
根据它的RSSI,它没有单位。这是在802.11标准中定义的值,由nic卡计算并发送给操作系统。nic卡供应商应该提供一个dBm-RSSI值的映射表。
对于直接链接我很抱歉,但我找不到文件链接的原始页面。
好的..我同意...但为什么呢:
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不符。
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;
}