Как преобразовать силу сигнала Wi-Fi из качества (в процентах) в RSSI (дБм)?
Как мне преобразовать силу сигнала Wi-Fi из качества в процентах, обычно от 0% до 100%, в значение RSSI, обычно отрицательное число в дБм (т. Е. -96db )?
12 ответов
Отношение мощности сигнала Wi-Fi к RSSI дБм
Microsoft определяет качество сигнала Wi-Fi в своих WLAN_ASSOCIATION_ATTRIBUTES структура следующим образом:
wlanSignalQuality :
Процентное значение, представляющее качество сигнала в сети. WLAN_SIGNAL_QUALITY имеет тип ULONG. Этот член содержит значение от 0 до 100. Значение 0 означает фактическую мощность сигнала RSSI -100 дБм. Значение 100 означает фактическую мощность сигнала RSSI -50 дБм. Вы можете рассчитать значение мощности сигнала RSSI для значений wlanSignalQuality от 1 до 99, используя линейную интерполяцию.
RSSI (или « индикатор мощности радиосигнала (полученного) ») выражается в единицах «дБ» (децибел) или аналогичных «дБм» (дБ на милливатт) (см. дБ по сравнению с дБм ), в которых отрицательные числа меньшей амплитуды имеют наивысшую мощность или качество сигнала.
Следовательно, преобразование между 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 = -50) quality = 100; else quality = 2 * (dBm + 100); // Quality to dBm: 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 .
- Менее -50 дБ (-40, -30 и -20) = 100% мощности сигнала
- От -51 до -55 дБ = 90%
- От -56 до -62 дБ = 80%
- От -63 до -65 дБ = 75%
Я рад, что нашел этот пост, потому что искал способ конвертировать dbm в проценты. Используя пост Дэвида, я написал быстрый скрипт на python для расчета процента качества.
#!/usr/bin/env python3 import os import platform system = platform.system() if system == 'Linux': cmd = "iwconfig wlan0 | grep Signal | /usr/bin/awk '' | /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(" dbm_num = %".format(dbm_num, quality)) else: print("Wifi router connection signal strength not found")
Чтобы получить наивысшее качество Wi-Fi от того места, где находится мой компьютер, я перемещал / поворачивал антенну, пока не получил наивысшее качество. Чтобы увидеть качество в реальном времени, я запустил приведенный выше сценарий, используя:
watch -n0.1 "python getwifiquality.py"
Вы можете помочь мне? dbm_num = int(x) ValueError: неверный литерал для int() с основанием 10: ’77/100\n’
RSSI — индикатор мощности полученного сигнала RSS — мощность полученного сигнала
RSSI — это индикатор, а RSS — реальное значение. Хорошо, теперь, что вы подразумеваете под индикатором, индикатор означает, что это может быть относительное значение, а RSSI всегда является положительным значением, и для RSSI нет единицы измерения.
Можно сказать, что RSSI для понимания обычного человека. Значения RF всегда указываются в дБм, и значения в большинстве случаев являются отрицательными. Чтобы людям было легче понять, эти отрицательные значения преобразуются в положительные значения посредством масштабирования.
Скажем, например, если максимальная мощность сигнала равна 0 dBm , а минимальная — -100 dBm . Мы можем масштабировать его, как описано. Мы можем указать 0 dBm и другие (RSS) как 100 RSSI (т.е. максимальный RSSI) и -100 dBm (или меньше) как 0 RSSI (минимальный RSS).
Я знаю, что это может быть поздно, но это может помочь кому-то в будущем.
Я взял значение 30-90 дБм для RSSI и коррелировал его со 100-0%.
Чтобы получить ответ, я использовал основное линейное уравнение.
Мы знаем наши значения x для дБм как 30 и 90. Мы знаем наши значения y для% как 100 и 0.
Нам просто нужно найти уклон. Так что мы можем сделать его линейным.
m = 100-0/30-90 = 100/-60 = -5/3 b = y - mx = 0 + 5/3*90 = 150
Окончательное уравнение, которое нужно ввести в код, когда вы знаете значение RSSI.
Примечание . Я взял значение RSSI, которое обычно является отрицательным, и умножил его на абсолютное значение, чтобы получить положительные числа.
quality = abs(RSSI) % = 150 - (5/3) * quality
Эта статья является более подробным объяснением mW, dBm и RSSI.
По нему у RSSI нет подразделения. Это значение, определенное в стандарте 802.11, рассчитывается картой nic и отправляется в ОС. Поставщик карт nic должен предоставить таблицу соответствия значений dBm-RSSI.
Извините за прямую ссылку, но я не могу найти исходную страницу для ссылки на файл.
Упомянутый псевдокод не будет работать во всех диапазонах, пример диапазонов (от -80 дБм до 0 и от -40 дБм до 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 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 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; >
Ладно .. согласен . но почему тогда:
Quality=29/100 Signal level=-78 dBm Quality=89/100 Signal level=-55 dBm Quality=100/100 Signal level=-21 dBm
Это не согласуется с формулой процент = качество / 2 — 100.
Общепризнанного значения термина «качество» не существует. У Microsoft есть одно определение, описанное в принятом ответе, но другое программное обеспечение может не использовать это определение. Например, WiFi Explorer говорит, что -20 дБм соответствует 100%, и даже указывает на что «другие инструменты показывают процентные значения мощности сигнала, которые далеки от того, что вы видите в WiFi Explorer».
Кроме того, вы можете попробовать инвертировать эту функцию 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" =~ 8+$ ]]; then if ((1
echo $(dbmtoperc -48)% # returns 81%
Статья, на которую вы указываете, ошибочна, потому что дБм уже является нелинейным логарифмическим представлением мВт. Таким образом, это решение является логарифмом логарифма. Так что у нас "качество сигнала равно двойному логарифму мощности сигнала" - это бред.
Я предпочитаю использовать решение, предложенное Дэвидом Манперлом. Это простое линейное преобразование, оно дает только четные значения процентов, но я думаю, что мы не можем сделать что-то лучше, потому что у нас есть только целое значение dbm в качестве источника.
long rssi = WiFi.RSSI(); rssi=-rssi; int WiFiperct; if (rssi <27)< WiFiperct =100; >else if(rssi>=27&&rssi <33)< WiFiperct=150-(5/2.7)*rssi; >else if(rssi>=33&&rssi <36)< WiFiperct=150-(5/3)*rssi; >else if(rssi>=36&&rssi <40)< WiFiperct=150-(5/3.3)*rssi; >else if(rssi>=40&&rssi <80)< WiFiperct=150-(5/3.5)*rssi; >else if(rssi>=80&&rssi <90)< WiFiperct=150-(5/3.4)*rssi; >else if(rssi>=90&&rssi <99)< WiFiperct=150-(5/3.3)*rssi; >else
Airodump RXQ действительно полезен в реальных условиях. «Качество приема, измеряемое процентом пакетов (управление и кадры данных), успешно полученных за последние 10 секунд». «Он измеряется по всем кадрам управления и данных. Полученные кадры содержат порядковый номер, который добавляется отправляющей точкой доступа. RXQ = 100 означает, что все пакеты были получены от точки доступа в числовая последовательность, и ни один из них не пропущен. Это подсказка, это позволяет вам считывать больше вещей из этого значения. Допустим, вы получили 100-процентный RXQ и все 10 (или сколько угодно) маяков в секунду. Теперь внезапно RXQ падает ниже 90, но вы по-прежнему захватываете все отправленные маяки Таким образом, вы знаете, что точка доступа отправляет кадры клиенту, но вы не можете слышать ни клиента, ни точку доступа, отправляющую клиенту (нужно подойти ближе )".