How to convert Wifi signal strength from Quality (percent) to RSSI (dBm)?

后端 未结 11 924
故里飘歌
故里飘歌 2020-12-04 12:42

How should I convert Wifi signal strength from a Quality in percentage, usually 0% to 100% into an RSSI value, usually a negative dBm number (i.e. -96db)?

相关标签:
11条回答
  • 2020-12-04 13:21

    Wifi Signal Strength Percentage to RSSI dBm

    Microsoft defines Wifi signal quality in their WLAN_ASSOCIATION_ATTRIBUTES structure as follows:

    wlanSignalQuality:

    A percentage value that represents the signal quality of the network. WLAN_SIGNAL_QUALITY is of type ULONG. This member contains a value between 0 and 100. A value of 0 implies an actual RSSI signal strength of -100 dbm. A value of 100 implies an actual RSSI signal strength of -50 dbm. You can calculate the RSSI signal strength value for wlanSignalQuality values between 1 and 99 using linear interpolation.

    RSSI (or "Radio (Received) Signal Strength Indicator") are in units of 'dB' (decibel) or the similar 'dBm' (dB per milliwatt) (See dB vs. dBm) in which the smaller magnitude negative numbers have the highest signal strength, or quality.


    Therefore, the conversion between quality (percentage) and dBm is as follows:

        quality = 2 * (dBm + 100)  where dBm: [-100 to -50]
    
        dBm = (quality / 2) - 100  where quality: [0 to 100]
    

    Pseudo Code (with example clamping):

        // 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;
    

    Note:

    Check the definition of Quality that you are using for your calculations carefully. Also check the range of dB (or dBm). The limits may vary.

    Examples:

    Medium quality:   50%      ->   -75dBm   = (50 / 2) - 100
    Low quality:      -96dBm   ->   8%       = 2 * (-96 + 100)
    
    0 讨论(0)
  • 2020-12-04 13:23

    Ok.. I agree...but why is then:

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

    this does not agree with the formula percentage=quality/2 - 100.

    0 讨论(0)
  • 2020-12-04 13:23

    This is what i have done :

    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{
      WiFiperct=0;
    }
    
    0 讨论(0)
  • 2020-12-04 13:24

    Mentioned pseudocode will not work all the ranges, the ranges example (-80dBm to 0, and -40dBm to 100).

    Generic simple logic to map any range to 0 to 100. Usage example, for below code 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 讨论(0)
  • 2020-12-04 13:25

    Im glad I found this post cause I was looking for a way to convert the dbm to percentage. Using David's post, I wrote up a quick script in python to calculate the quality percentage.

    #!/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")
    

    In order to get the highest wifi quality from where my computer is located, I moved/rotated my antenna until I received the highest quality. To see real time quality, I ran the above script using:

    watch -n0.1 "python getwifiquality.py"
    
    0 讨论(0)
提交回复
热议问题