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
)?
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)
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"
Par expérience:
Ce qui suit n’est pas suffisant pour les appareils Apple</ li>
- De -66 à 68dB = 70%
- De -69 à 74dB = 60%
- De -75 à 79dB = 50%
- De -80 à -83dB = 30%
</ ol>
Les ordinateurs portables Windows peuvent fonctionner correctement à -80 dB, mais avec des vitesses plus lentes
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 mettre0 dBm
et plus (RSS) comme100
RSSI (c'est-à-dire RSSI maximum) et-100 dBm
(ou moins) comme0 RSSI
(RSS minimum).
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
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.
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;
}
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.
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%