http://blog.sina.com.cn/s/blog_a6559d920101kcp7.html
1. 信号强度算法
-
- private
static final int MIN_RSSI = -100; -
-
- private
static final int MAX_RSSI = -55; -
-
- public
static int calculateSignalLevel(int rssi, int numLevels) { -
-
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; -
};