How should I convert Wifi signal strength from a Quality in percentage, usually 0% to 100% into an RSSI value, usually a negative dBm number (i.e. -96db
)?
问题:
回答1:
Wifi Signal Strength Percentage to RSSI dBm
Microsoft defines Wifi signal quality in their WLAN_ASSOCIATION_ATTRIBUTES structure as follows:
wlanSignalQuality:
A percentage value that represents the signal quality of the network. WLAN_SIGNAL_QUALITY is of type ULONG. This member contains a value between 0 and 100. A value of 0 implies an actual RSSI signal strength of -100 dbm. A value of 100 implies an actual RSSI signal strength of -50 dbm. You can calculate the RSSI signal strength value for wlanSignalQuality values between 1 and 99 using linear interpolation.
RSSI (or "Radio (Received) Signal Strength Indicator") are in units of 'dB' (decibel) or the similar 'dBm' (dB per milliwatt) (See dB vs. dBm) in which the smaller magnitude negative numbers have the highest signal strength, or quality.
Therefore, the conversion between quality
(percentage) and dBm
is as follows:
quality = 2 * (dBm + 100) where dBm: [-100 to -50] dBm = (quality / 2) - 100 where quality: [0 to 100]
Pseudo Code (with example clamping):
// 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;
Note:
Check the definition of Quality
that you are using for your calculations carefully. Also check the range of dB
(or dBm
). The limits may vary.
Examples:
Medium quality: 50% -> -75dBm = (50 / 2) - 100 Low quality: -96dBm -> 8% = 2 * (-96 + 100)
回答2:
In JS I prefer doing something like:
Math.min(Math.max(2 * (x + 100), 0), 100)
My personal opinion is that it's more elegant way to write it, instead of using if
's.
回答3:
Im glad I found this post cause I was looking for a way to convert the dbm to percentage. Using David's post, I wrote up a quick script in python to calculate the quality percentage.
#!/usr/bin/python import os cmd = "iwconfig wlan0 | grep Signal | /usr/bin/awk '{print $4}' | /usr/bin/cut -d'=' -f2" strDbm = os.popen(cmd).read() if strDbm: dbm = int(strDbm) quality = 2 * (dbm + 100) print("{0} dbm = {1}%".format(dbm, quality)) else: print("Wifi router connection signal strength not found")
In order to get the highest wifi quality from where my computer is located, I moved/rotated my antenna until I received the highest quality. To see real time quality, I ran the above script using:
watch -n0.1 "python getwifiquality.py"
回答4:
From experience:
- Less than -50dB (-40, -30 and -20) = 100% of signal strength
- From -51 to -55dB= 90%
- From -56 to -62dB=80%
- From -63 to -65dB=75%
The below is not good enough for Apple devices
- From -66 to 68dB=70%
- From -69 to 74dB= 60%
- From -75 to 79dB= 50%
- From -80 to -83dB=30%
Windows laptops can work fine on -80dB however with slower speeds
回答5:
please read the link for some more info RSSI vs RSS
RSSI is an indicator and RSS is the real value. Ok, now what do you mean by indicator, indicator mean it can be a relative value and RSSI is always a positive value and there is no unit for the RSSI.
回答6:
This article is a more detailed explanation of mW, dBm and RSSI
http://madwifi-project.org/attachment/wiki/UserDocs/RSSI/Converting_Signal_Strength.pdf?format=raw
According to it RSSI do not have a unit. It's a value defined in 802.11 standard and calculated by nic card and sent to OS. The nic card vendor should provide a mapping table of dBm-RSSI values.
Sorry for the direct link, but I can not found the original page for the file link.
回答7:
Mentioned pseudocode will not work all the ranges, the ranges example (-80dBm to 0, and -40dBm to 100).
Generic simple logic to map any range to 0 to 100. Usage example, for below code 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