it-swarm.com.de

Wie konvertiert man die WLAN-Signalstärke von Qualität (Prozent) in RSSI (dBm)?

Wie kann ich die WLAN-Signalstärke von einer Qualität in Prozent, normalerweise 0% bis 100%, in einen RSSI-Wert umwandeln, normalerweise eine negative dBm-Zahl (d. H. -96db)?

24
Irving

Prozentsatz der Wifi-Signalstärke in RSSI-dBm

Microsoft definiert die Wifi-Signalqualität in der Struktur WLAN_ASSOCIATION_ATTRIBUTES wie folgt:

wlanSignalQuality :

Ein Prozentwert, der die Signalqualität des Netzwerks darstellt. WLAN_SIGNAL_QUALITY ist vom Typ ULONG. Dieser Member enthält einen Wert zwischen 0 und 100. Ein Wert von 0 impliziert eine tatsächliche RSSI-Signalstärke von -100 dbm. Ein Wert von 100 impliziert eine tatsächliche RSSI-Signalstärke von -50 dbm. Sie können den RSSI-Signalstärkewert für wlanSignalQuality-Werte zwischen 1 und 99 durch lineare Interpolation berechnen.

RSSI (oder " Radio (Received) Signal Strength Indicator ") sind Einheiten von "dB" (Dezibel) oder ähnlichen "dBm" (dB pro Milliwatt) (siehe - dB vs. dBm ) wobei die negativen Zahlen mit kleinerer Stärke die höchste Signalstärke oder -qualität haben.


Daher lautet die Umrechnung zwischen quality (Prozentsatz) und dBm wie folgt:

    quality = 2 * (dBm + 100)  where dBm: [-100 to -50]

    dBm = (quality / 2) - 100  where quality: [0 to 100]

Pseudocode (mit Beispielklemmung):

    // 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;

Hinweis :

Überprüfen Sie die Definition von Quality, die Sie für Ihre Berechnungen verwenden, sorgfältig. Überprüfen Sie auch den Bereich von dB (oder dBm). Die Grenzen können variieren.

Beispiele :

Medium quality:   50%      ->   -75dBm   = (50 / 2) - 100
Low quality:      -96dBm   ->   8%       = 2 * (-96 + 100)
59
David Manpearl

In JS mache ich lieber etwas wie:

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

Meine persönliche Meinung ist, dass es eleganter ist, es zu schreiben, anstatt if zu verwenden.

12

Ich bin froh, dass ich diesen Beitrag gefunden habe, weil ich nach einem Weg gesucht habe, den DBM in Prozent umzuwandeln. Mit Davids Post habe ich ein kurzes Skript in Python geschrieben, um den Qualitätsprozentsatz zu berechnen.

#!/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")

Um die beste WLAN-Qualität von meinem Computer aus zu erhalten, habe ich meine Antenne bewegt/gedreht, bis ich die höchste Qualität erhalten habe. Um die Echtzeitqualität zu sehen, habe ich das obige Skript mit folgendem Befehl ausgeführt:

watch -n0.1 "python getwifiquality.py"
4

Aus Erfahrung:

  1. Weniger als -50 dB (-40, -30 und -20) = 100% der Signalstärke
  2. Von -51 bis -55dB = 90% 
  3. Von -56 bis -62dB = 80% 
  4. Von -63 bis -65dB = 75% </ p>

    Das Folgende ist nicht gut genug für Apple-Geräte</ li>

  5. Von -66 bis 68 dB = 70% 
  6. Von -69 bis 74dB = 60%
  7. Von -75 bis 79dB = 50% 
  8. Von -80 bis -83dB = 30%
    Windows-Laptops können mit -80dB problemlos arbeiten, jedoch mit niedrigeren Geschwindigkeiten
  9. </ ol>

4
Raja

Von RSSI vs RSS :

RSSI - Anzeige der Signalstärke empfangen RSS - Empfangene Signalstärke

RSSI ist ein Indikator und RSS ist der tatsächliche Wert. Nun, was meinen Sie mit Indikator, Indikator bedeutet, dass es sich um einen relativen Wert handeln kann und dass RSSI immer ein positiver Wert ist und dass keine Einheit für RSSI vorhanden ist.

Wir können sagen, RSSI ist für den gewöhnlichen Menschen verständlich. RF -Werte werden immer in dBm angegeben und die Werte sind meistens negative Werte. Um den Menschen das Verständnis zu erleichtern, werden diese negativen Werte durch Skalierung in positive Werte umgewandelt.

Sagen Sie zum Beispiel, wenn die maximale Signalstärke 0 dBm und das Minimum -100 dBm ist. Wir können es wie beschrieben skalieren. Wir können 0 dBm und mehr (RSS) als 100 RSSI (d. H. Maximales RSSI) und -100 dBm (oder weniger) als 0 RSSI (Mindest-RSS) setzen. 

3
Dino

Ich weiß, dass dies zu spät sein kann, aber dies kann in der Zukunft jemandem helfen.

Ich nahm den Wert von dBm 30-90 für RSSI und korrelierte ihn mit 100-0%.

Ich habe die grundlegende lineare Gleichung verwendet, um die Antwort zu erhalten.

y = mx + b

Wir kennen unsere x-Werte für dBm als 30 und 90 ... Wir kennen unsere y-Werte für% als 100 und 0.

Wir müssen nur die Piste finden. Also können wir es linear machen.

m = 100-0/30-90

  = 100/-60

  = -5/3

b = y - mx

 = 0 + 5/3*90
 = 150

Abschließende Gleichung zum Einfügen, wenn Sie den RSSI-Wert kennen.

% = 150 - (5/3) * RSSI

Hinweis Ich habe den RSSI-Wert verwendet, der normalerweise negativ ist und mit dem absoluten Wert multipliziert wird, um positive Zahlen zu erhalten.

quality = abs(RSSI)
% = 150 - (5/3) * quality
1
Brooks Nelson

Ok .. ich stimme zu ... aber warum ist dann:

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

dies stimmt nicht mit der Formel überein. Prozentsatz = Qualität/2 - 100.

0
Zibri

Der erwähnte Pseudocode funktioniert nicht für alle Bereiche, beispielsweise für die Bereiche (-80dBm bis 0 und -40dBm bis 100).

Einfache Logik, um jeden Bereich zwischen 0 und 100 abzubilden. Verwendungsbeispiel für den folgenden 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)
   {
      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
Rakesh Eluvan

Dieser Artikel enthält eine detailliertere Erklärung von mW, dBm und RSSI

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

Demnach haben RSSI keine Einheit. Es ist ein Wert, der im 802.11-Standard definiert und von nic card berechnet und an das Betriebssystem gesendet wird. Der Hersteller der nic-Karte sollte eine Zuordnungstabelle der dBm-RSSI-Werte bereitstellen.

Sorry für den direkten Link, aber ich kann die Originalseite für den Dateilink nicht finden.

0
Sulisu

Sie können auch versuchen, diese Bash-Funktion umzukehren, die dBm in Prozent umwandelt:

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

Verwendungszweck:

echo $(dbmtoperc -48)% # returns 81%
0
V.7