Jak przekonwertować siłę sygnału Wifi z jakości (procent) na RSSI (dBm)?
Jak przeliczyć siłę sygnału Wifi z jakości w procentach, Zwykle 0% do 100% na wartość RSSI, Zwykle ujemną liczbę dBm (tj. -96db
)?
11 answers
Procent siły sygnału Wifi do RSSI dBm
[10]}Microsoft definiuje jakość sygnału Wifi w swojej strukturze wlan_association_attributes w następujący sposób:WlanSignalQuality :
Wartość procentowa, która reprezentuje jakość sygnału sieci. WLAN_SIGNAL_QUALITY jest typu ULONG. Ten element zawiera wartość od 0 do 100. Wartość 0 oznacza rzeczywistą siłę sygnału RSSI -100 dbm. Wartość 100 oznacza rzeczywista siła sygnału RSSI -50 dbm. Można obliczyć wartość siły sygnału RSSI dla wartości jakości wlansignal od 1 do 99 przy użyciu interpolacji liniowej.
RSSI (lub " Radio (Received) Signal Strength Indicator") są w jednostkach " dB "(decybel) lub podobnych " dBm " (dB na miliwat) (Patrz dB vs.dBm), w których mniejsze liczby ujemne wielkości mają najwyższą siłę sygnału lub jakość.
Dlatego konwersja pomiędzy quality
(procent) i dBm
jest następująca:
quality = 2 * (dBm + 100) where dBm: [-100 to -50]
dBm = (quality / 2) - 100 where quality: [0 to 100]
Pseudo kod (z przykładowym zaciskiem):
// 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;
Uwaga :
Dokładnie sprawdź definicję Quality
, której używasz do swoich obliczeń. Sprawdź również zakres dB
(lub dBm
). Limity mogą się różnić.
Przykłady :
Medium quality: 50% -> -75dBm = (50 / 2) - 100 Low quality: -96dBm -> 8% = 2 * (-96 + 100)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-03 20:59:54
W JS wolę robić coś takiego:
Math.min(Math.max(2 * (x + 100), 0), 100)
if
' s.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-06 09:54:40
Z doświadczenia:
- mniej niż-50dB (-40, -30 i -20) = 100% siły sygnału
- od -51 do-55db= 90%
- od -56 do-62dB=80%
- od -63 do-65dB=75%
Poniżej nie jest wystarczająco dobry dla urządzeń Apple
- od -66 do 68dB=70%
- od -69 do 74dB= 60%
- od -75 do 79db= 50%
- od -80 do-83db=30%
Laptopy Windows mogą działać dobrze na - 80dB jednak wolniej prędkości
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-01 11:56:39
Cieszę się, że znalazłem ten post, ponieważ szukałem sposobu na konwersję dbm na procent. Korzystając z postu Davida, napisałem szybki skrypt w Pythonie, aby obliczyć procent jakości.
#!/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")
Aby uzyskać najwyższą jakość wifi z miejsca, w którym znajduje się mój komputer, przesuwałem / obracałem antenę, dopóki nie otrzymałem najwyższej jakości. Aby zobaczyć jakość czasu rzeczywistego, uruchomiłem powyższy skrypt używając:
watch -n0.1 "python getwifiquality.py"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-29 20:33:08
From RSSI vs RSS :
RSSI-wskaźnik siły sygnału odbieranego RSS-odbierana siła sygnału
RSSI jest wskaźnikiem, a RSS jest rzeczywistą wartością. Ok, teraz co masz na myśli przez wskaźnik, wskaźnik oznacza, że może to być wartość względna i RSSI jest zawsze dodatnia wartość i nie ma jednostki dla RSSI.
Możemy powiedzieć, że RSSI jest dla zwykłego człowieka do zrozumienia. Wartości RF są zawsze podawane w dBm i przez większość czasu są wartościami ujemnymi. Aby ułatwić ludziom zrozumienie tych wartości ujemnych, są konwertowane na wartości dodatnie poprzez skalowanie.Na przykład, jeśli maksymalna siła sygnału wynosi
0 dBm
, a minimalna wynosi-100 dBm
. Możemy to skalować jak wyjaśniono. Możemy umieścić0 dBm
i więcej (RSS) jako100
RSSI (tj. maksymalny RSSI) i-100 dBm
(lub mniej) jako0 RSSI
(minimalny RSS).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-24 18:51:40
Wiem, że to może być późno, ale to może komuś pomóc w przyszłości.
Wziąłem wartość dBm 30-90 dla RSSI i skorelowałem ją do 100-0%.
Użyłem podstawowego równania liniowego, aby uzyskać odpowiedź.
y = mx + b
Znamy nasze wartości x dla dBm jako 30 i 90. Znamy nasze wartości y dla % jako 100 i 0.
Musimy tylko znaleźć stok. Więc możemy zrobić to liniowo.m = 100-0/30-90
= 100/-60
= -5/3
b = y - mx
= 0 + 5/3*90
= 150
Ostateczne równanie do umieszczenia w kodzie, gdy znasz wartość RSSI.
% = 150 - (5/3) * RSSI
Uwaga Wziąłem wartość RSSI, która jest zwykle ujemna i pomnożona przez wartość bezwzględną, aby uzyskać liczby dodatnie.
quality = abs(RSSI)
% = 150 - (5/3) * quality
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-21 16:52:06
Ten artykuł jest bardziej szczegółowym wyjaśnieniem mW, dBm i RSSI
Http://madwifi-project.org/attachment/wiki/UserDocs/RSSI/Converting_Signal_Strength.pdf?format=raw
Zgodnie z nim RSSI nie mają jednostki. Jest to wartość zdefiniowana w standardzie 802.11 i obliczona za pomocą karty nic i wysłana do systemu operacyjnego. Dostawca karty nic powinien dostarczyć tabelę mapowania wartości dBm-RSSI.
Przepraszam za bezpośredni link, ale nie mogę znaleźć oryginalnej strony dla linku do pliku.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-22 02:05:55
Wspomniany pseudokod nie będzie działał we wszystkich zakresach, przykład zakresów (- 80dBm do 0 i - 40dBm do 100).
Ogólna prosta logika odwzorowująca dowolny zakres od 0 do 100. Przykład użycia, dla poniższego kodu 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;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-08 06:58:29
Ok.. Zgadzam się...ale dlaczego jest wtedy:
Quality=29/100 Signal level=-78 dBm
Quality=89/100 Signal level=-55 dBm
Quality=100/100 Signal level=-21 dBm
Nie zgadza się to ze wzorem procent = jakość / 2 - 100.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-29 20:36:54
Możesz również spróbować odwrócić tę funkcję Bash, która konwertuje dBm na procent:
#!/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
}
Użycie:
echo $(dbmtoperc -48)% # returns 81%
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-12 12:08:17
Oto co zrobiłem:
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;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-27 17:15:18