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)?

 28
Author: Irving, 2013-04-03

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)
 70
Author: David Manpearl,
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)

Moja osobista opinia jest taka, że jest to bardziej elegancki sposób, aby go napisać, zamiast używać if ' s.
 14
Author: Thodoris Greasidis,
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:

  1. mniej niż-50dB (-40, -30 i -20) = 100% siły sygnału
  2. od -51 do-55db= 90%
  3. od -56 do-62dB=80%
  4. od -63 do-65dB=75%

    Poniżej nie jest wystarczająco dobry dla urządzeń Apple

  5. od -66 do 68dB=70%
  6. od -69 do 74dB= 60%
  7. od -75 do 79db= 50%
  8. od -80 do-83db=30%
    Laptopy Windows mogą działać dobrze na - 80dB jednak wolniej prędkości
 11
Author: Raja,
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"
 6
Author: SomeGuyOnAComputer,
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) jako 100 RSSI (tj. maksymalny RSSI) i -100 dBm (lub mniej) jako 0 RSSI (minimalny RSS).

 4
Author: Dino Mycle,
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
 2
Author: Brooks Nelson,
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.

 0
Author: Sulisu,
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;
}
 0
Author: Rakesh Eluvan,
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.

 0
Author: Zibri,
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%
 0
Author: F8ER,
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;
}
 0
Author: Abdul Wasey,
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