Подтвердить что ты не робот

Как преобразовать силу сигнала Wifi из качества (в процентах) в RSSI (дБм)?

Как мне преобразовать силу сигнала Wifi из качества в процентах, обычно от 0% до 100% в значение RSSI, обычно отрицательное число дБм (т.е. -96db)?

4b9b3361

Ответ 1

Прочность сигнала Wifi в процентах к RSSI дБм

Microsoft определяет качество сигнала Wifi в структуре WLAN_ASSOCIATION_ATTRIBUTES следующим образом:

wlanSignalQuality

Процентное значение, которое представляет качество сигнала в сети. WLAN_SIGNAL_QUALITY имеет тип ULONG. Этот член содержит значение между 0 и 100. Значение 0 означает фактическую силу сигнала RSSI от -100 дБм. Значение 100 означает фактическую силу сигнала RSSI для -50 дБм. Вы можете рассчитать значение силы сигнала RSSI для Значение wlanSignalQuality от 1 до 99 с использованием линейной интерполяции.

RSSI (или "Сигнал прочности сигнала радиосигнала (принятый сигнал)" ) находятся в единицах "дБ" (децибел) или аналогичном "дБм" (дБ на милливатт) (см. дБ против 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)

Ответ 2

В JS я предпочитаю делать что-то вроде:

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

Мое личное мнение заключается в том, что это более элегантный способ написать его, вместо использования if.

Ответ 3

Из опыта:

  • Менее -50 дБ (-40, -30 и -20) = 100% от уровня сигнала
  • От -51 до -55dB = 90%
  • От -56 до -62 дБ = 80%
  • От -63 до -65dB = 75%

    Ниже недостаточно для устройств Apple.

  • От -66 до 68 дБ = 70%
  • От -69 до 74 дБ = 60%
  • От -75 до 79 дБ = 50%
  • От -80 до -83 дБ = 30%
    Ноутбуки Windows могут отлично работать на -80 дБ, но с более медленными скоростями.

Ответ 4

Я рад, что нашел этот пост, потому что я искал способ конвертировать dbm в процентах. Используя сообщение Дэвида, я написал быстрый скрипт на 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

Из RSSI против RSS:

RSSI - показатель силы полученного сигнала RSS - Сила полученного сигнала

RSSI - это индикатор, а RSS - это реальная ценность. Хорошо, теперь, что вы подразумеваете под индикатором, индикатор означает, что он может быть относительным значением, а RSSI всегда является положительным значением, и для RSSI нет единицы измерения.

Мы можем сказать, что RSSI для простого человека, чтобы понять. Значения RF всегда указываются в дБм, а значения в большинстве случаев являются отрицательными значениями. Чтобы людям было легче понять, что эти отрицательные значения преобразуются в положительные значения путем масштабирования.

Скажем, например, если максимальный уровень сигнала равен 0 dBm, а минимальный - -100 dBm. Мы можем масштабировать это как объяснено. Мы можем указать 0 dBm и более (RSS) как 100 RSSI (т.е. максимальный RSSI) и -100 dBm (или менее) как 0 RSSI (минимальный RSS).

Ответ 6

Я знаю, что это может быть поздно, но это может помочь кому-то в будущем.

Я взял значение RSS- 30-90 дБм и скорректировал его до 100-0%.

Я использовал основное линейное уравнение, чтобы получить ответ.

y = mx + b

Мы знаем наши значения 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

Ответ 7

Эта статья является более подробным объяснением mW, dBm и RSSI

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

В соответствии с этим у RSSI нет единицы. Это значение, определенное в стандарте 802.11 и рассчитанное с помощью карточки nic и отправленное в ОС. Поставщик карт-карт должен предоставить таблицу сопоставления значений dBm-RSSI.

Извините за прямую ссылку, но я не могу найти исходную страницу для ссылки на файл.

Ответ 8

Упомянутый псевдокод не будет работать со всеми диапазонами, примерным диапазоном (от -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;
}

Ответ 9

Хорошо.. Я согласен... но почему тогда:

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

это не соответствует формуле процент = качество /2 - 100.

Ответ 10

Кроме того, вы можете попробовать инвертировать эту функцию 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%