WiFi信号强度--SIGNAL_POLL(wifi上层到下层的调用关系)

本文介绍了Wi-Fi信号处理中的关键算法,包括信号强度的计算方法,并详细解析了信号轮询(SIGNAL_POLL)的调用流程。通过这些内容,读者可以了解如何评估Wi-Fi信号质量及其实现机制。

1. 信号强度算法

    WifiManager.java

[cpp]  view plain copy
  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流程

 

3. wpa_supplicant启动流程

4. WifiService启动流程

5. SIGNAL_POLL调用流程

[cpp]  view plain copy
  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.     };  
%%{init:{'themeVariables':{'fontSize':'22px'}}}%% graph TD %% ===== 客户端流程 ===== subgraph 客户端流程 start_client[客户端] --> init_event[cs_client_event_init<br>事件初始化模块] init_event --> create_udp[socket_server_dgram_create<br>创建UDP快速响应socket] init_event --> connect_tcp[cs_client_event_connect_server<br>TCP连接服务端] init_event --> create_thread[创建事件线程<br>l_tidClientEvent] create_thread --> poll_event[cs_client_poll_event_proc<br>轮询服务器事件] start_client --> init_order[cs_client_order_init<br>订单初始化] start_client --> main_loop[cs_client_order_enter<br>主业务循环] main_loop --> get_input[获取用户输入] get_input --> parse_cmd[解析命令] parse_cmd -->|exit/quit/e/q| exit[设置退出标志] parse_cmd -->|server/exit/quit/e/q 命令| send_server[通过TCP发送至服务端] parse_cmd -->|client/help/?命令| local_exec[client本地执行命令] parse_cmd --> print_cmd_result[通过client打印执行结果到屏幕] end %% ===== 服务端流程 ===== subgraph 服务端流程 start_server --> init_event_srv[cs_server_event_init] init_event_srv --> open_dev[打开设备文件 /dev/csmsimple] open_dev --> create_event_thread[创建事件轮询线程] create_event_thread --> poll_dev[轮询设备事件] start_server[服务端启动] --> init_cmd[cs_server_cmd_init] init_cmd --> create_udp_resp[socket_client_dgram_create<br>创建UDP快速响应socket] init_cmd --> create_tcp[socket_server_stream_create<br>创建TCP监听socket] init_cmd --> accept_thread[创建连接线程 l_tidAcceptCmd] init_cmd --> exec_thread[创建命令线程 l_tidExecCmd] start_server --> main_loop_srv[主循环] main_loop_srv --> sleep_20[sleep(20)保活] accept_thread --> accept_conn[接受客户端连接] exec_thread --> process_cmd[处理客户端命令] end %% ===== 内核模块流程 ===== subgraph 内核模块 insmod[加载驱动] --> init_driver[csm_simple_init] init_driver --> create_dev[创建设备号] create_dev --> reg_cdev[注册字符设备] open_dev -->|用户空间调用| driver_open[驱动open操作] driver_open -->|触发| ioctl_call[ioctl操作] ioctl_call --> handle_ioctl[csm_simple_ioctl] handle_ioctl -->|CSM_SIMPLE_GET_VERSION| get_version[返回驱动版本] end %% ===== 跨模块交互 ===== connect_tcp --> accept_conn send_server --> process_cmd open_dev --> driver_open %% poll_dev -->|读取事件| driver_read[csm_simple_read] 怎么调整三个子框的graph
最新发布
08-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值