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.     };  
<think> 我们正在分析一个Makefile中的COPTS赋值语句: COPTS = -DHAVE_UBUS -DHAVE_POLL_H $(if $(CONFIG_IPV6),,-DNO_IPV6) 这个语句定义了一个变量COPTS,它用于设置编译选项(通常是C/C++编译器的选项)。下面我们逐步分解: 1. **固定选项**: - `-DHAVE_UBUS`:定义一个名为`HAVE_UBUS`的宏,通常表示代码将支持UBus(OpenWrt中的进程间通信机制)。 - `-DHAVE_POLL_H`:定义一个名为`HAVE_POLL_H`的宏,表示系统存在`<poll.h>`头文件,代码可以使用`poll()`系统调用。 2. **条件选项**: - `$(if $(CONFIG_IPV6),,-DNO_IPV6)`:这是一个Make的条件函数。它的语法是`$(if condition, then-part, else-part)`。 - 条件部分:`$(CONFIG_IPV6)`,如果变量`CONFIG_IPV6`被定义且非空,则条件为真,否则为假。 - 当条件为真(即`CONFIG_IPV6`有定义且非空)时,返回`then-part`(这里为空,所以不添加任何选项)。 - 当条件为假(即`CONFIG_IPV6`未定义或为空)时,返回`else-part`(即`-DNO_IPV6`),这样就会添加一个宏定义`NO_IPV6`,表示不支持IPv6。 因此,整个语句的含义是: - 始终定义`HAVE_UBUS`和`HAVE_POLL_H`宏。 - 如果`CONFIG_IPV6`没有被设置(即没有启用IPv6),则额外定义`NO_IPV6`宏。 在代码中,这些宏可能被用于条件编译,例如: ```c #ifdef HAVE_UBUS // 包含UBus相关的代码 #endif #ifdef NO_IPV6 // 在没有IPv6支持的情况下,使用替代代码或禁用某些功能 #else // 支持IPv6的代码 #endif ``` **总结**:该COPTS变量用于根据配置(特别是IPv6的启用状态)来设置预处理器宏,从而控制代码的编译选项。 --- §§相关问题§§ 1. Makefile中的条件函数`$(if ...)`还有哪些常见用法? 2. 在OpenWrt的Makefile中,`CONFIG_IPV6`变量通常是如何设置的? 3. 如何查看编译时实际使用的COPTS值? </think> ### Makefile 语句解析:`COPTS = -DHAVE_UBUS -DHAVE_POLL_H $(if $(CONFIG_IPV6),,-DNO_IPV6)` 此语句定义了编译选项变量 `COPTS`,用于控制 C/C++ 代码的预处理器宏定义。下面逐步分析其含义: #### 1. **基础结构** ```makefile COPTS = [固定选项] [条件选项] ``` - `COPTS`:编译选项变量(Compiler Options),通常传递给 `gcc`/`clang` 的 `CFLAGS` - `-D`:预处理器宏定义标志(类似代码中的 `#define`) --- #### 2. **固定选项分析** ```makefile -DHAVE_UBUS -DHAVE_POLL_H ``` | 宏定义 | 作用 | |---------------------|----------------------------------------------------------------------| | `-DHAVE_UBUS` | 启用 **UBus 支持**(OpenWrt 的进程间通信总线)[^1] | | `-DHAVE_POLL_H` | 声明系统提供 **`<poll.h>` 头文件**,支持 `poll()` 网络事件监听机制 | 代码中可能存在的条件编译: ```c #ifdef HAVE_UBUS ubus_register_service(); // 注册 UBus 服务 #endif #ifdef HAVE_POLL_H #include <poll.h> // 使用 poll() 代替 select() #endif ``` --- #### 3. **条件选项分析** ```makefile $(if $(CONFIG_IPV6), , -DNO_IPV6) ``` - **Makefile 条件函数**:`$(if condition, then-part, else-part)` - **逻辑解析**: ```makefile 如果 $(CONFIG_IPV6) 已定义且非空 → 返回空字符串(不添加选项) 否则 → 返回 -DNO_IPV6 ``` - **实际效果**: - 当 `CONFIG_IPV6=y`(启用 IPv6)时:**不定义 `NO_IPV6`**,代码保留 IPv6 功能 - 当 `CONFIG_IPV6` 未设置时:**定义 `NO_IPV6`**,禁用 IPv6 相关代码 代码中的典型应用: ```c #ifndef NO_IPV6 bind_ipv6_socket(); // 启用 IPv6 套接字 #else log("IPv6 support disabled"); #endif ``` --- #### 4. **完整逻辑总结** | 配置状态 | 最终宏定义 | 代码行为 | |-------------------|-------------------------------------|----------------------------| | `CONFIG_IPV6=y` | `-DHAVE_UBUS -DHAVE_POLL_H` | 启用 UBus/poll/IPv6 | | `CONFIG_IPV6`未设置 | `-DHAVE_UBUS -DHAVE_POLL_H -DNO_IPV6` | 启用 UBus/poll,**禁用 IPv6** | --- #### 5. **在 OpenWrt 中的意义** 1. **模块化控制** 通过 `CONFIG_IPV6` 实现 **IPv6 功能的按需编译**,减少固件体积(对资源受限的路由器设备关键) 2. **平台兼容性** `-DHAVE_POLL_H` 确保代码适配不同 libc 实现(如 uClibc/musl) 3. **服务集成** `-DHAVE_UBUS` 支持 OpenWrt 服务管理总线,例如 DHCP 服务通过 UBus 暴露 API: ```bash ubus call dhcp get_leases # 查询 DHCP 租约 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值