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

31

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

13个回答

0
这是一个快速的Python脚本,用于将RSSi转换为信号强度...
import sys

def convert_rssi_to_quality(rssi):
    dbm_num = int(rssi)
    quality = 2 * (dbm_num + 100)
    print("{0} dbm_num = {1}%".format(dbm_num, quality))


if __name__ == "__main__":
    if len(sys.argv) != 2:
        rssi_value = input("Please enter an RSSI value: ")
    else:
        rssi_value = sys.argv[1]

    convert_rssi_to_quality(rssi_value)

-1

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

#!/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%

2
你所指的文章是错误的,因为dBm已经是mW的非线性对数表示。因此,这个解决方案是对数的对数。所以我们得到了“信号质量是信号功率的双重对数”- 这是无意义的。 - imbearr
@imbearr 你可能是对的,但这些值是根据实际情况计算出来的。那么你有什么解决方案呢? - Artfaith
我更喜欢使用David Manpearl提出的解决方案。这是一个简单的线性转换,它只产生百分比的偶数值,但我认为我们无法做得更好,因为我们只有整数dbm值作为源。 - imbearr

-1

Airodump RXQ在实际世界条件下非常有用... “成功接收过去10秒内的管理和数据帧的百分比,即所谓的‘接收质量’。” “它是所有管理和数据帧的接收结果。接收到的帧包含由发送接入点添加的序列号。RXQ = 100意味着所有数据包都按数字顺序从接入点接收,并且没有遗漏。这就是关键,因为这使您可以从此值中读取更多信息。假设您的RXQ达到了100%,每秒钟有10个(或任何速率)信标进入。现在突然之间,RXQ掉到了90以下,但您仍然捕获了所有已发送的信标。因此,您知道AP正在向客户端发送帧,但您无法听到客户端或AP是否向客户端发送(需要靠近一些)。"


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