WiFi信号强度--SIGNAL_POLL

1. 信号强度算法

    WifiManager.java

    /** Anything worse than or equal to this will show 0 bars. */
    private static final int MIN_RSSI = -100;

    /** Anything better than or equal to this will show the max bars. */
    private static final int MAX_RSSI = -55;

    /**
     * Calculates the level of the signal. This should be used any time a signal
     * is being shown.
     *
     * @param rssi The power of the signal measured in RSSI.
     * @param numLevels The number of levels to consider in the calculated
     *            level.
     * @return A level of the signal, given in the range of 0 to numLevels-1
     *         (both inclusive).
     */
    public static int calculateSignalLevel(int rssi, int numLevels) {
        /* in general, numLevels is 4  */
        if (rssi <= MIN_RSSI) {
            return 0;
        } else if (rssi >= MAX_RSSI) {
            return numLevels - 1;
        } else {
            float inputRange = (MAX_RSSI - MIN_RSSI);
            float outputRange = (numLevels - 1);
            
            return (int)((float)(rssi - MIN_RSSI) * outputRange / inputRange);
        }
    }

 

2. WiFi Command流程

 

3. wpa_supplicant启动流程

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

4. WifiService启动流程

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

5. SIGNAL_POLL调用流程

eloop_run->..
wpa_supplicant_ctrl_iface_receive-> //接收并处理来自framework的command
wpa_supplicant_ctrl_iface_process-> (SIGNAL_POLL)
wpa_supplicant_signal_poll->
wpa_drv_signal_poll  (struct wpa_supplicant *wpa_s,struct wpa_signal_info *si)->
wpa_driver_signal_poll  (void *priv, struct wpa_signal_info *si)->
    wpa_driver_wext_driver_cmd(priv, RSSI_CMD, buf, sizeof(buf))或  //driver_cmd_wext.c
    wpa_driver_wext_driver_cmd(priv, LINKSPEED_CMD, buf, sizeof(buf))->
      
      struct iwreq iwr;
      iwr.u.data.pointer = buf;
      iwr.u.data.length = buf_len;
      ioctl(drv->ioctl_sock, SIOCSIWPRIV, &iwr);
      在Kernel中对应函数:
      cfg80211_wext_setpriv (wext-compat.c)
      RSSI_CMD:
      cfg80211_wireless_stats (获取当前已连接AP的信号强度等信息)

     对于上面的LINKSPEED_CMD,如果ioctl不成功,则调用ioctl(drv->ioctl_sock, SIOCGIWRATE, &wrq)
     在Kernel中对应函数:
     cfg80211_wext_giwrate (获取当前已连接AP的发送速度)

     //每个AP对应的信息     
     struct station_info {
	u32 filled;
	u32 connected_time;
	u32 inactive_time;
	u32 rx_bytes;
	u32 tx_bytes;
	u16 llid;
	u16 plid;
	u8 plink_state;
	s8 signal;  //信号强度
	s8 signal_avg;
	struct rate_info txrate;  //发送速度
	struct rate_info rxrate;
	u32 rx_packets;
	u32 tx_packets;
	u32 tx_retries;
	u32 tx_failed;
	u32 rx_dropped_misc;
	struct sta_bss_parameters bss_param;

	int generation;
    };


 

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