1. 从一份被忽视的配置文件说起如果你在Qualcomm平台上做过Wi-Fi相关的开发或调试大概率听说过WCNSS_qcom_cfg.ini这个文件。它通常躺在/vendor/etc/wifi/或者/persist/分区下看起来就是一堆键值对安安静静地待在那里好像没什么存在感。但实际情况是Wi-Fi连接不稳、吞吐量上不去、功耗偏高、热点起不来很多时候根子就在这个文件里。这个系列的前两篇已经聊过基础连接参数和部分射频相关配置这次继续往下挖。我会把重点放在连接管理、功耗控制、漫游行为、以及一些容易被忽略但影响巨大的参数上。这些参数不像gChannelBondingMode5GHz那样经常被拿出来讨论但它们对实际用户体验的影响一点都不小。这篇文章适合谁看如果你正在做Qualcomm平台的Wi-Fi驱动移植、系统集成、或者遇到了一些“莫名其妙”的Wi-Fi问题那这些内容应该能帮到你。如果你只是刚接触这个配置文件建议先翻翻前两篇把基础概念过一遍再来看这篇理解会更顺畅。下面直接进入正题按参数的功能分组来聊。2. 连接管理与重连行为的参数拆解2.1 断线重连的核心逻辑gReassocFailureTimeout与gRoamTriggerWi-Fi断线重连这件事看起来简单实际上涉及好几层判断。WCNSS_qcom_cfg.ini里有几个参数直接控制这个行为。先看gReassocFailureTimeout。这个参数的单位是毫秒默认值通常是5000。它的作用是当STA尝试重新关联Reassociation失败后等待多长时间再发起下一次尝试。很多人遇到“Wi-Fi断了之后半天连不上”的情况第一反应是驱动有问题但实际上可能是这个值设得太大。我实测过在某些AP环境下把默认的5000改成2000重连速度明显提升尤其是在AP负载较高、信标帧间隔不稳定的场景下。但这里有个坑不要把这个值设得太小。如果你设成500甚至更低在某些AP上会导致关联请求过于频繁AP直接把你拉黑反而连不上。我踩过这个坑当时在一个企业级AP环境下调试把超时设成1000结果AP的日志里全是“association flood”的告警STA被临时拒绝服务。后来改回3000才稳定下来。再来看gRoamTrigger。这个参数控制的是漫游触发的信号强度阈值单位是dBm。默认值一般是**-75**左右。意思是当当前连接的AP信号强度低于这个值时STA会开始扫描周围是否有更好的AP。这个值设得太高比如-65会导致STA频繁扫描功耗上升设得太低比如-85又会导致明明有更好的AP却不切换用户体验就是“信号满格但网速很慢”。提示gRoamTrigger的调整需要结合你实际部署环境的AP密度。密集部署比如办公室每20米一个AP可以设到-70左右稀疏部署比如仓库建议设到-80甚至更低。2.2 隐藏SSID的连接策略gEnableHiddenSSID与扫描行为隐藏SSID这个功能说实话在实际部署中越来越少见但有些企业环境还在用。WCNSS_qcom_cfg.ini里有一个gEnableHiddenSSID参数默认是0禁用。如果你把它设成1STA在扫描时会主动发送探测请求Probe Request去询问隐藏的SSID。这里有个细节值得注意开启这个功能会增加扫描时的空口开销。因为STA需要针对每个已知的隐藏SSID单独发送探测请求而不是被动等待信标帧。在AP数量多的环境下这会导致扫描时间变长进而影响漫游切换的速度。我的建议是除非你的部署环境确实用了隐藏SSID否则保持默认的0。如果必须开启配合gScanResultAgeCount参数一起调把这个值适当调大让扫描结果缓存更久一点减少重复扫描的次数。2.3 802.11k/v/r的协同gEnable11k、gEnable11v、gEnable11r这三个参数放在一起讲因为它们是802.11k/v/r快速漫游协议族的开关。gEnable11k无线资源管理Radio Resource Management让AP告诉STA周围有哪些邻居AP帮助STA更快找到漫游目标。gEnable11vBSS过渡管理BSS Transition ManagementAP可以主动建议STA切换到某个更好的AP。gEnable11r快速BSS过渡Fast BSS Transition也就是常说的“快速漫游”通过预认证减少漫游时的认证延迟。这三个参数的默认值在不同版本的Qualcomm驱动里可能不一样。我见过的一些版本默认全开也有一些只开了11k。关键问题是这三个协议需要AP侧也支持才能生效。如果你的AP不支持11rSTA这边开了也没用反而可能在关联时多花时间协商。实测经验在一个支持11r的AP环境下开启gEnable11r后漫游切换时间从原来的200ms左右降到了50ms以内对于VoWiFi这类对延迟敏感的应用体验提升非常明显。但如果AP不支持开启后反而可能导致关联失败率上升。所以先确认AP能力再决定是否开启。参数名默认值作用建议gEnable11k1邻居报告保持开启gEnable11v1BSS过渡管理保持开启gEnable11r0或1快速漫游确认AP支持后再开3. 功耗与性能的平衡那些影响续航的参数3.1 省电模式的核心gEnablePowerSaveOffload与gPowerSaveModeQualcomm平台在Wi-Fi省电方面做了不少工作WCNSS_qcom_cfg.ini里有几个参数直接控制这些行为。gEnablePowerSaveOffload这个参数默认值通常是1。它的意思是把省电模式的某些处理逻辑下放到固件Firmware里执行而不是让主机HostCPU来管。这样做的好处是减少主机唤醒次数降低功耗。如果你把它设成0省电逻辑全部由主机处理功耗会明显上升。我实测过在待机场景下设成0比设成1的功耗高出15%到20%。gPowerSaveMode控制的是省电模式的激进程度。常见取值有0省电关闭性能优先1省电开启标准模式2省电开启激进模式标准模式和激进模式的差别在于STA多久醒一次来接收AP的缓存帧。激进模式下STA睡眠时间更长功耗更低但延迟会增大。如果你在做VoWiFi或者在线游戏建议用标准模式甚至关闭省电。如果是后台同步、推送这类场景激进模式更合适。注意gPowerSaveMode的调整需要配合gEnablePowerSaveOffload一起看。如果Offload没开主机侧的省电逻辑可能会覆盖这个设置。3.2 扫描与功耗的取舍gScanPeriod与gScanResultAgeCountWi-Fi扫描是功耗大户这一点毋庸置疑。gScanPeriod控制的是后台扫描的间隔时间单位是秒。默认值一般在15到30秒之间。这个值越小STA发现新AP的速度越快但功耗越高。我做过一个简单的测试在同一个环境下把gScanPeriod从30秒改成10秒待机功耗增加了大约8%。对于手机这种电池敏感的设备这个差异不算小。但对于需要快速漫游的场景比如移动POS机、AGV小车扫描间隔短一点是值得的。gScanResultAgeCount这个参数控制扫描结果的缓存时间。默认值通常是2意思是扫描结果保留2个扫描周期。如果你把这个值调大STA在需要漫游时可以直接用缓存的扫描结果不用重新扫描从而加快切换速度。但代价是缓存可能过期导致切换到已经不存在的AP。我的经验是在AP密度高、移动速度慢的场景下把这个值调到3或4在AP稀疏、移动速度快的场景下保持默认或者调到1。3.3 蓝牙共存对Wi-Fi功耗的影响gEnableBtCoexQualcomm平台通常Wi-Fi和蓝牙是共存的gEnableBtCoex这个参数控制是否开启蓝牙共存机制。默认值是1开启。这个参数为什么影响功耗因为当蓝牙和Wi-Fi同时工作时它们共享天线和射频资源。共存机制会协调两者的收发时间避免互相干扰。但协调本身需要额外的信令和处理会带来一定的功耗开销。如果你在做纯Wi-Fi设备比如Wi-Fi Only的平板把gEnableBtCoex设成0可以减少不必要的协调开销功耗会略有下降。但如果是手机这种Wi-Fi和蓝牙都用的设备千万别关否则蓝牙音频和Wi-Fi下载同时进行时体验会非常糟糕。4. 热点模式SoftAP下的参数调优4.1 热点信道与带宽gAPChannel与gAPBandwidthSoftAP模式下gAPChannel控制热点使用的信道。默认值通常是0表示自动选择。但在某些场景下自动选择可能选到一个干扰很大的信道。我遇到过这样一个案例在一个办公室环境里SoftAP自动选到了信道6但周围有十几个AP都在信道6上导致热点下的设备网速极慢。后来手动把gAPChannel设成11问题立刻解决。所以在干扰严重的环境下手动指定信道比自动选择更可靠。gAPBandwidth控制热点的带宽常见取值是20MHz、40MHz、80MHz。带宽越大理论速率越高但抗干扰能力越差。在2.4GHz频段建议用20MHz在5GHz频段40MHz或80MHz都可以但80MHz在AP密集的环境下容易受到干扰。4.2 热点客户端数量限制gMaxAssocgMaxAssoc这个参数控制SoftAP最多允许多少个客户端同时连接。默认值通常是8或10。如果你在做物联网网关这类场景可能需要连接几十个设备这时候就需要把这个值调大。但要注意调大这个值会增加内存和处理开销。每增加一个关联客户端驱动需要维护更多的状态信息。我试过把gMaxAssoc设成32在连接了20多个设备后热点的转发性能明显下降延迟从几毫秒涨到了几十毫秒。所以按实际需求设置不要盲目调大。4.3 热点省电与信标间隔gBeaconInterval与gDTIMPeriodgBeaconInterval控制热点发送信标帧的间隔单位是TUTime Unit1TU约等于1.024ms。默认值是100也就是大约102.4ms。这个值调大信标帧发送频率降低功耗下降但客户端发现热点的时间会变长。调小则相反。一般来说100是一个比较平衡的值不建议随意改动。gDTIMPeriod控制的是DTIMDelivery Traffic Indication Message的周期。DTIM是信标帧的一种特殊类型用来告诉省电模式的客户端“有缓存数据等着你”。默认值通常是2或3。这个值越大客户端睡眠时间越长功耗越低但数据延迟越大。如果你在做热点下的视频传输建议把这个值设成1让数据尽快送达。如果是传感器数据采集这类对延迟不敏感的场景设成3甚至更大都可以。5. 那些容易踩坑的参数与排查思路5.1gCountryCode设置错误导致的连接问题gCountryCode这个参数看起来不起眼但设错了会导致非常诡异的问题。它控制的是Wi-Fi的国别码影响可用信道和发射功率。我遇到过这样一个案例设备出厂时gCountryCode设成了US但实际部署在欧洲。结果设备在扫描时能看到某些信道上的AP但就是连不上。原因是欧洲允许的信道和发射功率与美国不同驱动在关联时发现信道不符合国别码限制直接拒绝了关联请求。排查这个问题的关键是看驱动日志里的“regulatory”相关输出。如果看到“channel not allowed”或者“tx power limit”之类的信息基本就是国别码的问题。解决方法很简单把gCountryCode改成实际部署地区的代码比如DE德国、GB英国、JP日本等。提示国别码的修改需要重启Wi-Fi才能生效。有些平台还需要重新加载驱动模块。5.2gEnableDfsChannel与雷达检测DFSDynamic Frequency Selection信道是5GHz频段中需要避让雷达的信道。gEnableDfsChannel控制是否允许使用这些信道默认值通常是1允许。开启DFS信道的好处是可用信道更多尤其是在5GHz AP密集的环境下能有效减少干扰。但问题是当驱动检测到雷达信号时必须立即 vacate 当前信道这会导致Wi-Fi短暂断开然后切换到其他信道。这个过程通常需要几十秒到几分钟。如果你在做对连接稳定性要求极高的场景比如工业控制建议把gEnableDfsChannel设成0禁用DFS信道避免雷达检测导致的断连。代价是可用信道减少可能在AP密集环境下更容易遇到干扰。5.3 参数修改后的验证方法改完WCNSS_qcom_cfg.ini之后怎么确认参数生效了我通常用以下几种方法方法一看驱动日志。在dmesg或者logcat里搜索参数名比如gRoamTrigger驱动在初始化时会打印当前生效的值。方法二通过iwpriv命令查询。Qualcomm平台通常支持iwpriv wlan0 get_xxx这样的命令来查询运行时参数。具体命令取决于驱动版本可以查Qualcomm的文档。方法三实际场景验证。比如改了gRoamTrigger就拿着设备走动看漫游切换是否在预期的信号强度下发生。这里有个坑有些参数修改后需要重启Wi-Fi有些需要重启设备还有些需要重新加载驱动模块。如果你改完发现没生效先确认是不是需要重启。我见过有人改了参数没重启折腾了半天以为参数没用结果重启后一切正常。5.4 参数之间的相互影响最后要强调的是这些参数不是孤立的。比如你改了gRoamTrigger可能还需要调整gScanPeriod和gScanResultAgeCount来配合。改了gPowerSaveMode可能需要看gEnablePowerSaveOffload是否开启。我一般建议一次只改一个参数改完验证后再改下一个。如果一次改好几个出了问题很难定位是哪个参数导致的。这个习惯在调试Wi-Fi问题时特别重要因为Wi-Fi本身就是一个复杂的系统变量太多不控制变量根本没法排查。另外不同版本的Qualcomm驱动支持的参数可能不一样。有些参数在新版本里被废弃了有些是新加的。所以改之前先确认你的驱动版本支持哪些参数可以查Qualcomm的Release Note或者直接看驱动源码里的cfg80211相关定义。我在实际项目里积累的一个习惯是每次修改WCNSS_qcom_cfg.ini之前先备份一份原始文件然后记录下改了哪些参数、为什么改、改完后的效果。这样出了问题可以快速回滚也方便后续复盘。这个习惯帮我省了不少时间推荐你也试试。
阅读完成 · 觉得有帮助?