29

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

4

12 回答 12

79

Wifi 信号强度百分比到 RSSI dBm

Microsoft 在其WLAN_ASSOCIATION_ATTRIBUTES结构中定义 Wifi 信号质量如下:

wlanSignalQuality :

代表网络信号质量的百分比值。WLAN_SIGNAL_QUALITY 是 ULONG 类型。该成员包含一个介于 0 和 100 之间的值。值 0 表示实际 RSSI 信号强度为 -100 dbm。值 100 表示实际 RSSI 信号强度为 -50 dbm。您可以使用线性插值计算介于 1 和 99 之间的 wlanSignalQuality 值的 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;

注意

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

例子

Medium quality:   50%      ->   -75dBm   = (50 / 2) - 100
Low quality:      -96dBm   ->   8%       = 2 * (-96 + 100)
于 2013-04-03T20:59:54.077 回答
14

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

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

我个人的看法是写它的方式比使用if's 更优雅。

于 2015-08-06T09:54:40.280 回答
11

根据经验:

  1. 小于 -50dB(-40、-30 和 -20)= 100% 的信号强度
  2. 从 -51 到 -55dB= 90%
  3. 从 -56 到 -62dB=80%
  4. 从 -63 到 -65dB=75%

    以下内容对于 Apple 设备来说还不够好

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

于 2014-08-01T11:56:39.810 回答
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")

为了从我的计算机所在的位置获得最高的 wifi 质量,我移动/旋转了我的天线,直到我收到最高质量。为了查看实时质量,我使用以下脚本运行了上述脚本:

watch -n0.1 "python getwifiquality.py"
于 2015-06-02T01:02:15.130 回答
4

RSSI与RSS

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

RSSI 是一个指标,RSS 是实际值。好的,现在您所说的指标是什么意思,指标意味着它可以是一个相对值,而 RSSI 始终是一个正值,并且 RSSI 没有单位。

可以说RSSI是普通人可以理解的。RF 值始终以 dBm 为单位,并且这些值大部分时间都是负值。为了让人们更容易理解这些负值通过缩放转换为正值。

例如,如果最大信号强度为0 dBm,最小为-100 dBm。我们可以像解释的那样缩放它。我们可以把0 dBm和多(RSS)作为100RSSI(即最大RSSI)和-100 dBm(或更少)作为0 RSSI(最小RSS)。

于 2013-11-07T01:19:42.937 回答
2

我知道这可能会迟到,但这可能会对将来的某人有所帮助。

我为 RSSI 取了 dBm 30-90 的值,并将其与 100-0 % 相关联。

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

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
于 2018-03-19T19:20:03.350 回答
0

本文对mW、dBm和RSSI进行了更详细的解释

http://madwifi-project.org/attachment/wiki/UserDocs/RSSI/Converting_Signal_Strength.pdf?format=raw

根据它RSSI没有一个单位。它是一个在 802.11 标准中定义并由网卡计算并发送到操作系统的值。网卡供应商应提供 dBm-RSSI 值的映射表。

很抱歉直接链接,但我找不到文件链接的原始页面。

于 2016-05-22T01:48:27.730 回答
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;
}
于 2016-07-08T06:15:21.270 回答
0

好的..我同意...但是为什么会这样:

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

这与公式百分比=质量/2 - 100 不一致。

于 2018-04-29T20:36:54.407 回答
0

此外,您可以尝试反转这个将 dBm 转换为百分比的 Bash 函数:

#!/bin/bash

function dbmtoperc { # Convert dBm to percentage (based on https://www.adriangranados.com/blog/dbm-to-percent-conversion)
  dbmtoperc_d=$(echo "$1" | tr -d -)
  dbmtoperc_r=0
  if [[ "$dbmtoperc_d" =~ [0-9]+$ ]]; then
    if ((1<=$dbmtoperc_d && $dbmtoperc_d<=20)); then dbmtoperc_r=100
    elif ((21<=$dbmtoperc_d && $dbmtoperc_d<=23)); then dbmtoperc_r=99
    elif ((24<=$dbmtoperc_d && $dbmtoperc_d<=26)); then dbmtoperc_r=98
    elif ((27<=$dbmtoperc_d && $dbmtoperc_d<=28)); then dbmtoperc_r=97
    elif ((29<=$dbmtoperc_d && $dbmtoperc_d<=30)); then dbmtoperc_r=96
    elif ((31<=$dbmtoperc_d && $dbmtoperc_d<=32)); then dbmtoperc_r=95
    elif ((33==$dbmtoperc_d)); then dbmtoperc_r=94
    elif ((34<=$dbmtoperc_d && $dbmtoperc_d<=35)); then dbmtoperc_r=93
    elif ((36<=$dbmtoperc_d && $dbmtoperc_d<=38)); then dbmtoperc_r=$((92-($dbmtoperc_d-36)))
    elif ((39<=$dbmtoperc_d && $dbmtoperc_d<=51)); then dbmtoperc_r=$((90-($dbmtoperc_d-39)))
    elif ((52<=$dbmtoperc_d && $dbmtoperc_d<=55)); then dbmtoperc_r=$((76-($dbmtoperc_d-52)))
    elif ((56<=$dbmtoperc_d && $dbmtoperc_d<=58)); then dbmtoperc_r=$((71-($dbmtoperc_d-56)))
    elif ((59<=$dbmtoperc_d && $dbmtoperc_d<=60)); then dbmtoperc_r=$((67-($dbmtoperc_d-59)))
    elif ((61<=$dbmtoperc_d && $dbmtoperc_d<=62)); then dbmtoperc_r=$((64-($dbmtoperc_d-61)))
    elif ((63<=$dbmtoperc_d && $dbmtoperc_d<=64)); then dbmtoperc_r=$((61-($dbmtoperc_d-63)))
    elif ((65==$dbmtoperc_d)); then dbmtoperc_r=58
    elif ((66<=$dbmtoperc_d && $dbmtoperc_d<=67)); then dbmtoperc_r=$((56-($dbmtoperc_d-66)))
    elif ((68==$dbmtoperc_d)); then dbmtoperc_r=53
    elif ((69==$dbmtoperc_d)); then dbmtoperc_r=51
    elif ((70<=$dbmtoperc_d && $dbmtoperc_d<=85)); then dbmtoperc_r=$((50-($dbmtoperc_d-70)*2))
    elif ((86<=$dbmtoperc_d && $dbmtoperc_d<=88)); then dbmtoperc_r=$((17-($dbmtoperc_d-86)*2))
    elif ((89<=$dbmtoperc_d && $dbmtoperc_d<=91)); then dbmtoperc_r=$((10-($dbmtoperc_d-89)*2))
    elif ((92==$dbmtoperc_d)); then dbmtoperc_r=3
    elif ((93<=$dbmtoperc_d)); then dbmtoperc_r=1; fi
  fi
  echo $dbmtoperc_r
}

用法:

echo $(dbmtoperc -48)% # returns 81%
于 2018-10-12T12:08:17.297 回答
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;
}
于 2020-06-27T07:02:09.760 回答
0

Airodump RXQ 在现实世界的条件下非常有用......“接收质量以过去 10 秒内成功接收的数据(管理和数据帧)的百分比来衡量。” “它在所有管理和数据帧上测量。接收到的帧包含一个由发送接入点添加的序列号。RXQ = 100表示所有数据包都是按数字顺序从接入点接收的,没有一个丢失. 这就是线索,这使您可以从该值中读取更多内容。假设您获得了 100% 的 RXQ 和每秒所有 10 个(或任何速率)信标。现在突然间 RXQ 降至 90 以下,但您仍然捕获所有发送的信标。因此,您知道 AP 正在向客户端发送帧,但您听不到客户端或 AP 向客户端发送的声音(需要靠近一点)。”

于 2022-02-16T18:48:21.943 回答