Wifi信号強度を品質(通常は0%から100%)からRSSI値(通常は負のdBm数値(つまり、-96db
)?
Microsoftは、Wifi信号品質を WLAN_ASSOCIATION_ATTRIBUTES 構造で次のように定義しています。
wlanSignalQuality:
ネットワークの信号品質を表すパーセンテージ値。 WLAN_SIGNAL_QUALITYのタイプはULONGです。このメンバーには、0〜100の値が含まれます。値0は、実際のRSSI信号強度が-100 dbmであることを意味します。値100は、実際のRSSI信号強度が-50 dbmであることを意味します。線形補間を使用して、1〜99のwlanSignalQuality値のRSSI信号強度値を計算できます。
RSSI(または「Radio(Received)Signal Strength Indicator」)は、「dB」(デシベル)または同様の「dBm」(ミリワットあたりのdB)単位です(参照 dB vs. dBm )より小さい大きさの負の数が最高の信号強度または品質を持ちます。
したがって、quality
(パーセント)とdBm
の間の変換は次のとおりです。
quality = 2 * (dBm + 100) where dBm: [-100 to -50]
dBm = (quality / 2) - 100 where quality: [0 to 100]
疑似コード(クランプの例付き):
// 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;
注:
計算に使用しているQuality
の定義を注意深く確認してください。 dB
(またはdBm
)の範囲も確認してください。制限は異なる場合があります。
例:
Medium quality: 50% -> -75dBm = (50 / 2) - 100 Low quality: -96dBm -> 8% = 2 * (-96 + 100)
JSでは、次のようなことをすることを好みます。
Math.min(Math.max(2 * (x + 100), 0), 100)
私の個人的な意見では、if
を使用する代わりに、よりエレガントな方法で記述します。
この投稿を見つけてうれしいです。dbmをパーセンテージに変換する方法を探していました。 Davidの投稿を使用して、品質のパーセンテージを計算するためのpythonの簡単なスクリプトを作成しました。
#!/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")
コンピューターのある場所から最高のWi-Fi品質を得るために、最高の品質が得られるまでアンテナを移動/回転させました。リアルタイムの品質を確認するために、以下を使用して上記のスクリプトを実行しました。
watch -n0.1 "python getwifiquality.py"
経験から:
以下は、Appleデバイスには十分ではありません
から RSSI vs RSS :
RSSI-受信信号強度インジケータRSS-受信信号強度
RSSIは指標であり、RSSは真の価値です。さて、インジケータとはどういう意味ですか、インジケータは相対値であり、RSSIは常に正の値であり、RSSIの単位がないことを意味します。
RSSIは一般の人が理解できるものであると言えます。 RF値は常にdBmで伝えられ、ほとんどの場合値は負の値です。人々が理解しやすいように、これらの負の値はスケーリングによって正の値に変換されます。
たとえば、最大信号強度が
0 dBm
および最小値は-100 dBm
。説明したようにスケーリングできます。0 dBm
など(RSS)として100
RSSI(つまり、最大RSSI)および-100 dBm
(またはそれ以下)0 RSSI
(最小RSS)。
私はこれが遅れるかもしれないことを知っていますが、これは将来誰かを助けるかもしれません。
RSSIのdBm 30-90の値を取得し、100-0%に関連付けました。
基本的な線形方程式を使用して答えを得ました。
y = mx + b
DBmのx値は30および90として認識されます。%のy値は100および0として認識されます。
斜面を見つけるだけです。したがって、線形にすることができます。
m = 100-0/30-90
= 100/-60
= -5/3
b = y - mx
= 0 + 5/3*90
= 150
RSSI値がわかっているときにコードに追加する最終的な方程式。
% = 150 - (5/3) * RSSI
注通常は負のRSSI値を取り、絶対値を掛けて正の数を取得しました。
quality = abs(RSSI)
% = 150 - (5/3) * quality
わかりました。私は同意します...しかしなぜそうですか:
Quality=29/100 Signal level=-78 dBm
Quality=89/100 Signal level=-55 dBm
Quality=100/100 Signal level=-21 dBm
これは、パーセンテージ= quality/2-100の式と一致しません。
言及された擬似コードは、すべての範囲、範囲の例(-80dBmから0、および-40dBmから100)で機能しません。
任意の範囲を0〜100にマッピングするための一般的な単純なロジック。以下のコードの使用例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;
}
この記事は、mW、dBm、およびRSSIの詳細な説明です。
http://madwifi-project.org/attachment/wiki/UserDocs/RSSI/Converting_Signal_Strength.pdf?format=raw
それによると、RSSIにはユニットがありません。 802.11標準で定義され、nicカードによって計算され、OSに送信される値です。 nicカードのベンダーは、dBm-RSSI値のマッピングテーブルを提供する必要があります。
直接リンクで申し訳ありませんが、ファイルリンクの元のページが見つかりません。
また、dBmをパーセンテージに変換するこのBash関数の逆を試すこともできます。
#!/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
}
使用法:
echo $(dbmtoperc -48)% # returns 81%