web-dev-qa-db-fra.com

Comment convertir la force du signal Wifi de Qualité (pourcent) en RSSI (dBm)?

Comment convertir la force du signal Wifi d’un pourcentage de qualité, généralement compris entre 0% et 100%, en une valeur RSSI, généralement un nombre négatif en dBm (c.-à-d. -96db)?

24
Irving

Puissance du signal Wifi en RSSI dBm

Microsoft définit la qualité du signal Wifi dans la structure WLAN_ASSOCIATION_ATTRIBUTES comme suit:

wlanSignalQuality:

Un pourcentage représentant la qualité du signal du réseau. WLAN_SIGNAL_QUALITY est de type ULONG. Ce membre contient une valeur entre 0 et 100. Une valeur de 0 implique la force réelle du signal RSSI de -100 dbm. Une valeur de 100 implique une force de signal RSSI réelle de -50 dbm. Vous pouvez calculer la valeur de l'intensité du signal RSSI pour wlanSignalQuality valeurs comprises entre 1 et 99 en utilisant une interpolation linéaire. 

RSSI (ou "indicateur d'intensité du signal radio") sont en unités de 'dB' (décibel) ou d'un 'dBm' similaire (dB par milliwatt) (Voir dB vs. dBm ) dans laquelle les nombres négatifs de plus petite magnitude ont la force ou la qualité du signal la plus élevée.


Par conséquent, la conversion entre quality (pourcentage) et dBm est la suivante:

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

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

Pseudo Code (avec exemple de blocage):

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

Remarque:

Vérifiez la définition de Quality que vous utilisez pour vos calculs avec soin. Vérifiez également la plage de dB (ou dBm). Les limites peuvent varier.

Exemples:

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

Je suis heureux d’avoir trouvé cet article car je cherchais un moyen de convertir le DBM en pourcentage. En utilisant le post de David, j'ai écrit un script rapide en python pour calculer le pourcentage de qualité.

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

Afin d’obtenir la qualité Wi-Fi la plus élevée à partir de l’emplacement de mon ordinateur, j'ai déplacé/pivoté mon antenne jusqu’à ce que la qualité soit optimale. Pour voir la qualité en temps réel, j'ai exécuté le script ci-dessus en utilisant:

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

Par expérience:

  1. Moins de -50 dB (-40, -30 et -20) = 100% de la puissance du signal
  2. De -51 à -55dB = 90% 
  3. De -56 à -62dB = 80% 
  4. De -63 à -65dB = 75% </ p>

    Ce qui suit n’est pas suffisant pour les appareils Apple</ li>

  5. De -66 à 68dB = 70% 
  6. De -69 à 74dB = 60%
  7. De -75 à 79dB = 50% 
  8. De -80 à -83dB = 30%
    Les ordinateurs portables Windows peuvent fonctionner correctement à -80 dB, mais avec des vitesses plus lentes
  9. </ ol>

4
Raja

De RSSI vs RSS :

RSSI - Indicateur de puissance du signal reçu RSS - Puissance du signal reçu

RSSI est un indicateur et RSS est la valeur réelle. Ok, maintenant que voulez-vous dire par indicateur, indicateur signifie qu'il peut s'agir d'une valeur relative et que RSSI est toujours une valeur positive et qu'il n'y a pas d'unité pour le RSSI.

Nous pouvons dire que RSSI est pour l'homme du commun à comprendre. Les valeurs RF sont toujours exprimées en dBm et les valeurs sont négatives la plupart du temps. Pour faciliter la compréhension des personnes, ces valeurs négatives sont converties en valeurs positives par la mise à l'échelle.

Disons par exemple, si la force maximale du signal est 0 dBm et la valeur minimale est -100 dBm. Nous pouvons le redimensionner comme expliqué. On peut mettre 0 dBm et plus (RSS) comme 100 RSSI (c'est-à-dire RSSI maximum) et -100 dBm (ou moins) comme 0 RSSI (RSS minimum). 

3
Dino

Je sais que cela peut être tard mais que cela peut aider quelqu'un à l'avenir.

J'ai pris la valeur de dBm 30-90 pour RSSI et l'ai corrélée à 100-0%.

J'ai utilisé l'équation linéaire de base pour obtenir la réponse.

y = mx + b

Nous connaissons nos valeurs x pour dBm comme 30 et 90 ..__ Nous connaissons nos valeurs y pour% comme 100 et 0.

Nous avons juste besoin de trouver la pente. Nous pouvons donc le rendre linéaire.

m = 100-0/30-90

  = 100/-60

  = -5/3

b = y - mx

 = 0 + 5/3*90
 = 150

Équation finale à mettre en code lorsque vous connaissez la valeur RSSI.

% = 150 - (5/3) * RSSI

Note J'ai pris la valeur RSSI qui est normalement négative et multipliée par la valeur absolue pour obtenir des nombres positifs.

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

Ok .. Je suis d'accord ... mais pourquoi alors:

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

cela ne correspond pas à la formule pourcentage = qualité/2 - 100.

0
Zibri

Le pseudocode mentionné ne fonctionnera pas dans toutes les gammes, les exemples étant les suivants (-80 dBm à 0, et -40 dBm à 100).

Logique simple générique pour mapper toute plage de 0 à 100. Exemple d'utilisation, pour le code ci-dessous 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

Cet article est une explication plus détaillée de mW, dBm et RSSI

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

Selon lui, RSSI n'a pas d'unité. C'est une valeur définie dans la norme 802.11 et calculée par carte nic et envoyée au système d'exploitation. Le fournisseur de la carte nic doit fournir un tableau de correspondance des valeurs dBm-RSSI.

Désolé pour le lien direct, mais je ne trouve pas la page d'origine du lien de fichier.

0
Sulisu

Vous pouvez également essayer d’inverser cette fonction Bash qui convertit dBm en pourcentage:

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

Usage:

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