WiFi信号强度--SIGNAL_POLL

1. 信号强度算法

    WifiManager.java

[cpp] view plaincopy

  1. /** Anything worse than or equal to this will show 0 bars. */  

  2. private static final int MIN_RSSI = -100;  

  3.   

  4. /** Anything better than or equal to this will show the max bars. */  

  5. private static final int MAX_RSSI = -55;  

  6.   

  7. /** 

  8.  * Calculates the level of the signal. This should be used any time a signal 

  9.  * is being shown. 

  10.  * 

  11.  * @param rssi The power of the signal measured in RSSI. 

  12.  * @param numLevels The number of levels to consider in the calculated 

  13.  *            level. 

  14.  * @return A level of the signal, given in the range of 0 to numLevels-1 

  15.  *         (both inclusive). 

  16.  */  

  17. public static int calculateSignalLevel(int rssi, int numLevels) {  

  18.     /* in general, numLevels is 4  */  

  19.     if (rssi <= MIN_RSSI) {  

  20.         return 0;  

  21.     } else if (rssi >= MAX_RSSI) {  

  22.         return numLevels - 1;  

  23.     } else {  

  24.         float inputRange = (MAX_RSSI - MIN_RSSI);  

  25.         float outputRange = (numLevels - 1);  

  26.           

  27.         return (int)((float)(rssi - MIN_RSSI) * outputRange / inputRange);  

  28.     }  

  29. }  

 

2. WiFi Command流程

WiFi信号强度--SIGNAL_POLL_第1张图片

 

3. wpa_supplicant启动流程

WiFi信号强度--SIGNAL_POLL_第2张图片

4. WifiService启动流程

WiFi信号强度--SIGNAL_POLL_第3张图片

5. SIGNAL_POLL调用流程

[cpp] view plaincopy

  1. eloop_run->..  

  2. wpa_supplicant_ctrl_iface_receive-> //接收并处理来自framework的command  

  3. wpa_supplicant_ctrl_iface_process-> (SIGNAL_POLL)  

  4. wpa_supplicant_signal_poll->  

  5. wpa_drv_signal_poll  (struct wpa_supplicant *wpa_s,struct wpa_signal_info *si)->  

  6. wpa_driver_signal_poll  (void *priv, struct wpa_signal_info *si)->  

  7.     wpa_driver_wext_driver_cmd(priv, RSSI_CMD, buf, sizeof(buf))或  //driver_cmd_wext.c  

  8.     wpa_driver_wext_driver_cmd(priv, LINKSPEED_CMD, buf, sizeof(buf))->  

  9.         

  10.       struct iwreq iwr;  

  11.       iwr.u.data.pointer = buf;  

  12.       iwr.u.data.length = buf_len;  

  13.       ioctl(drv->ioctl_sock, SIOCSIWPRIV, &iwr);  

  14.       在Kernel中对应函数:  

  15.       cfg80211_wext_setpriv (wext-compat.c)  

  16.       RSSI_CMD:  

  17.       cfg80211_wireless_stats (获取当前已连接AP的信号强度等信息)  

  18.   

  19.      对于上面的LINKSPEED_CMD,如果ioctl不成功,则调用ioctl(drv->ioctl_sock, SIOCGIWRATE, &wrq)  

  20.      在Kernel中对应函数:  

  21.      cfg80211_wext_giwrate (获取当前已连接AP的发送速度)  

  22.   

  23.      //每个AP对应的信息       

  24.      struct station_info {  

  25.     u32 filled;  

  26.     u32 connected_time;  

  27.     u32 inactive_time;  

  28.     u32 rx_bytes;  

  29.     u32 tx_bytes;  

  30.     u16 llid;  

  31.     u16 plid;  

  32.     u8 plink_state;  

  33.     s8 signal;  //信号强度  

  34.     s8 signal_avg;  

  35.     struct rate_info txrate;  //发送速度  

  36.     struct rate_info rxrate;  

  37.     u32 rx_packets;  

  38.     u32 tx_packets;  

  39.     u32 tx_retries;  

  40.     u32 tx_failed;  

  41.     u32 rx_dropped_misc;  

  42.     struct sta_bss_parameters bss_param;  

  43.   

  44.     int generation;  

  45.     };  


 


你可能感兴趣的:(WiFi信号强度--SIGNAL_POLL)