1. WiFi热点扫描延迟问题解析
最近在开发一个需要WiFi互联的产品时,遇到了一个看似简单但实际相当棘手的问题:当设备A扫描周围热点时,即使某些热点已经关闭,它们仍然会长时间显示在扫描列表中。这种情况在产品体验上造成了困扰——用户明明已经关闭了热点,却还能在设备上看到它们,这显然不够友好。
经过深入排查,发现问题出在wpa_supplicant的缓存机制上。wpa_supplicant作为Linux系统中最常用的WiFi连接管理工具,为了提高效率,默认会对扫描到的热点信息进行缓存。这种设计在大多数场景下是合理的,因为WiFi热点通常不会频繁开关,缓存可以减少不必要的重复扫描,节省电量和系统资源。
但在我们的产品场景中,这种缓存机制反而成了问题。当多个设备B作为热点时,如果其中一台被关闭,设备A仍然会显示已关闭的热点,直到缓存过期。默认情况下,这个过期时间是180秒(3分钟),对于实时性要求较高的产品交互来说,这个延迟确实太长了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. wpa_supplicant缓存机制深度剖析
2.1 核心参数解析
wpa_supplicant通过两个关键参数控制热点信息的缓存行为:
-
bss_expiration_age:以秒为单位的热点信息最大存活时间。默认值为180秒,意味着一个热点信息最多会在扫描结果中保留3分钟,即使该热点已经关闭。
-
bss_expiration_scan_count:热点信息需要经过多少次扫描未被发现才会被移除。默认值为2次,表示如果一个热点连续两次扫描都没有出现,就会被从列表中移除。
这两个参数共同决定了热点信息在扫描结果中的保留时间。实际保留时间取两者中的较小值:要么达到最大存活时间,要么经过足够次数的扫描未被发现。
2.2 版本兼容性注意事项
需要注意的是,这两个参数的支持情况与wpa_supplicant的版本密切相关:
- 2.4及以上版本:完全支持这两个参数
- 2.4以下版本:可能使用不同的参数名或根本不支持
- 有些旧版本使用
bss_expire_count和bss_expire_age - 极旧版本可能完全不提供这些配置选项
- 有些旧版本使用
在实际项目中,我们遇到过一个特殊情况:某些嵌入式设备使用的定制版本中,这些参数的行为与官方文档描述略有不同。因此
