web-dev-qa-db-ja.com

Wifi信号強度を品質(パーセント)からRSSI(dBm)に変換する方法は?

Wifi信号強度を品質(通常は0%から100%)からRSSI値(通常は負のdBm数値(つまり、-96db)?

25
Irving

RSSI dBmに対するWifi信号強度の割合

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)
59
David Manpearl

JSでは、次のようなことをすることを好みます。

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

私の個人的な意見では、ifを使用する代わりに、よりエレガントな方法で記述します。

12

この投稿を見つけてうれしいです。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"
5

経験から:

  1. -50dB未満(-40、-30、-20)= 100%の信号強度
  2. -51から-55dB = 90%
  3. -56から-62dB = 80%
  4. -63〜-65dB = 75%

    以下は、Appleデバイスには十分ではありません

  5. -66から68dB = 70%
  6. -69から74dB = 60%
  7. -75から79dB = 50%
  8. -80から-83dB = 30%
    Windowsラップトップは-80dBで正常に動作しますが、速度は遅くなります
5
Raja

から 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)。

4
Dino

私はこれが遅れるかもしれないことを知っていますが、これは将来誰かを助けるかもしれません。

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
1
Brooks Nelson

わかりました。私は同意します...しかしなぜそうですか:

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

これは、パーセンテージ= quality/2-100の式と一致しません。

0
Zibri

言及された擬似コードは、すべての範囲、範囲の例(-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;
}
0
Rakesh Eluvan

この記事は、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値のマッピングテーブルを提供する必要があります。

直接リンクで申し訳ありませんが、ファイルリンクの元のページが見つかりません。

0
Sulisu

また、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%
0
V.7