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_modestart_apstart_p2p 和网卡电源操作集中放在适配层,避免多个业务模块直接修改同一块 Wi-Fi 硬件。

10. 总结

STA、AP 和 P2P 的驱动调用并不复杂,真正需要关注的是模式状态、应用服务和连接状态的一致性。

一个稳定的多模式方案通常具备以下特点:

  • 所有模式切换经过统一 Controller。
  • 停止旧模式和启动新模式组成完整事务。
  • 模式、无线关联和应用连接分别记录。
  • 服务线程具备明确的生命周期状态。
  • 每个失败分支都有对称清理和恢复路径。
Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐