Android Wi-Fi 信号强度--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启动流程

4. WifiService启动流程

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;
        };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值