Wi-Fi多模式切换基础与使用
1. 引言
不少嵌入式设备需要在 STA、AP 和 P2P 三种 Wi-Fi 模式之间动态切换。例如,设备平时通过 STA 接入路由器,需要本地配置时开启 AP,需要点对点传输时再进入 P2P。
这类功能的难点不只是调用驱动接口,而是保证模式状态、网络接口、DHCP、应用服务和连接状态始终一致。比较可靠的做法是建立统一的模式控制器,由它负责完整的停止、启动和回滚流程。
2. 三种模式的基本概念
2.1 STA 模式
STA(Station)模式下,设备作为无线客户端连接路由器或其他接入点。
适合以下场景:
- 接入局域网或互联网。
- 使用路由器分配的 IP 地址。
- 依赖系统自动重连已保存的网络。
典型连接过程:
设置 STA 模式
→ 扫描或使用指定网络
→ 连接 SSID
→ DHCP 获取地址
→ 启动应用层服务
2.2 AP 模式
AP(Access Point)模式下,设备创建热点,其他终端连接该热点。
适合以下场景:
- 首次配置设备。
- 本地维护和诊断。
- 没有路由器时建立局域网通信。
AP 模式通常还需要配置:
- SSID 和密码。
- 固定网关地址。
- DHCP Server。
- DNS 是否下发。
- 应用服务监听端口。
2.3 P2P 模式
Wi-Fi P2P 用于设备之间直接建立无线连接。作为 Group Owner 的设备在底层行为上与 AP 相似,但在业务协议、凭据生成和连接协商方面不同。
典型过程:
创建 P2P Group Owner
→ 开启配对或 WPS 窗口
→ 客户端完成无线关联
→ 客户端获取地址
→ 建立应用层连接
P2P GO 和普通 AP 可能共用同一个底层 AP 网络接口,因此不能仅根据“AP 接口是否 active”判断当前业务模式。
3. 使用统一的模式控制器
推荐让一个 Controller 统一维护当前模式:
typedef enum {
WIFI_MODE_IDLE,
WIFI_MODE_STA,
WIFI_MODE_AP,
WIFI_MODE_P2P,
} wifi_mode_t;
如果系统存在多种 AP 用途,还可以增加 AP 子类型:
typedef enum {
AP_TYPE_NONE,
AP_TYPE_NORMAL,
AP_TYPE_MAINTENANCE,
} ap_type_t;
Controller 主要负责:
- 保存当前逻辑模式。
- 串行化模式切换请求。
- 停止旧模式和关联服务。
- 启动目标模式和关联服务。
- 处理超时、失败回滚和自动恢复。
应用层只提交“切换到目标模式”的请求,不直接组合底层 WLAN 调用。
4. 推荐的模式切换事务
一次完整切换可以分为以下阶段:
检查请求
→ 标记切换中
→ 停止旧应用连接和服务
→ 停止旧 Wi-Fi 模式
→ 启动目标 Wi-Fi 模式
→ 启动 DHCP 或应用服务
→ 提交新模式
→ 清理切换状态
这里有两个重要原则。
第一,只有目标模式及其必要服务都启动成功后,才更新当前模式。否则软件状态可能显示为 AP 或 P2P,但实际网络不可用。
第二,失败路径必须与成功路径对称。只要底层启动动作已经执行,就要在失败时停止对应接口并恢复到明确状态。
5. 串行化和切换保护
Wi-Fi 驱动、SDIO、电源管理和网络协议栈通常不适合并发切换。Controller 可以使用 switching 状态阻止多个请求同时进入:
switching = false 可以接受新请求
switching = true 正在执行停止或启动序列
实际停止、启动过程中应保持严格互斥。切换完成后可以保留一个较短的保护时间,过滤应用层的重复请求,但保护时间不应代替真实的连接超时和恢复机制。
6. 区分三类连接状态
模式启动成功不等于客户端已经可以通信。建议分别记录:
mode_active Wi-Fi 模式是否启动
peer_associated 对端是否完成无线关联
service_connected 应用层连接是否建立
以 P2P 为例:
P2P GO 启动成功
只代表无线组已经创建,并不代表客户端已经关联,更不代表 TCP 等应用协议已经连接。
分层记录状态可以减少日志和上层业务对 connected 含义的误解。
7. 应用服务的生命周期
如果三种模式共用同一个 TCP、HTTP 或自定义服务,服务生命周期应和网络模式一起管理。
建议至少区分:
STOPPED 没有服务线程
STARTING 正在创建和初始化
RUNNING 已经监听
STOPPING 正在关闭旧连接和线程
当旧服务仍处于 STOPPING 时收到新启动请求,可以记录“期望最终运行”,等待旧线程退出后再启动,避免同时创建两个监听线程或漏掉新模式的监听服务。
8. 常见使用方式
STA 切换到 AP
停止 STA 自动重连
→ 断开当前网络
→ 停止旧应用服务
→ 启动 AP 和 DHCP Server
→ 启动应用服务
AP 切换到 STA
停止 AP 客户端和应用服务
→ 停止 DHCP Server
→ 关闭 AP
→ 设置 STA 模式
→ 恢复自动重连或连接指定网络
AP 切换到 P2P
停止 AP 和旧应用服务
→ 创建 P2P GO
→ 开启配对窗口
→ 启动应用服务
→ 等待客户端关联和连接
P2P 切换到 AP
主动关闭旧应用连接
→ 停止 P2P GO
→ 启动目标 AP
→ 启动 DHCP 和应用服务
9. 接口设计建议
对外接口尽量表达业务意图:
wifi_switch_to_sta(...);
wifi_switch_to_ap(...);
wifi_switch_to_p2p(...);
wifi_stop_current_mode();
底层的 set_mode、start_ap、start_p2p 和网卡电源操作集中放在适配层,避免多个业务模块直接修改同一块 Wi-Fi 硬件。
10. 总结
STA、AP 和 P2P 的驱动调用并不复杂,真正需要关注的是模式状态、应用服务和连接状态的一致性。
一个稳定的多模式方案通常具备以下特点:
- 所有模式切换经过统一 Controller。
- 停止旧模式和启动新模式组成完整事务。
- 模式、无线关联和应用连接分别记录。
- 服务线程具备明确的生命周期状态。
- 每个失败分支都有对称清理和恢复路径。
更多推荐
所有评论(0)