跳转至

STA 连接

STA 模式 — 连接路由器 — WiFi STA API、事件驱动模式

学习目标

  • 理解 WiFi STA 模式——WS63 作为客户端连接路由器
  • 掌握 WiFi 初始化、STA 配置、连接、DHCP 获取 IP 的完整流程
  • 理解 WiFi 事件驱动的异步模型
  • 能够在 WS63 上连接路由器并获取 IP 地址

规格与功能

WS63 作为 WiFi STA 连接到路由器,自动获取 IP 地址,连接成功后串口打印 IP。

规格项 说明
WiFi 模式 STA(Station)
安全模式 WPA2-PSK
IP 获取 DHCP 自动分配
事件通知 连接 / 断开 / DHCP 成功 通过回调

程序运行流程:WiFi 初始化 → 设置 STA 模式 → 配置 SSID/Password → 发起连接 → 关联成功 → DHCP 获取 IP → 串口打印 IP → 可进行 TCP/UDP 通信。

基本概念

WiFi 事件驱动模型

WiFi 连接是异步的——调用 wifi_sta_connect() 后函数立即返回,真正的连接结果通过事件回调通知。

sequenceDiagram
    participant App as 应用层
    participant WiFi as WiFi 协议栈
    participant Router as 路由器

    App->>WiFi: wifi_init()
    App->>WiFi: wifi_set_mode(STA)
    App->>WiFi: wifi_register_event_cb(callbacks)
    App->>WiFi: wifi_sta_connect(ssid, password)

    WiFi->>Router: 关联请求
    Router-->>WiFi: 关联成功
    WiFi-->>App: 事件回调: CONNECTED

    WiFi->>Router: DHCP 请求
    Router-->>WiFi: IP = 192.168.1.100
    WiFi-->>App: 事件回调: DHCP_SUCCESS

    Note over App: 可以开始 TCP/UDP 通信了

STA vs SoftAP

STA 模式 SoftAP 模式
类比 手机连 WiFi 手机开热点
角色 客户端 服务端(Access Point)
IP 来源 DHCP Client(路由器分配) DHCP Server(本机分配)
用途 连接互联网 设备直连 / 配网

涉及 API

API 用途
wifi_init() / wifi_deinit() WiFi 初始化 / 去初始化
wifi_set_mode() 设置模式(STA / SoftAP / STA+SoftAP)
wifi_sta_connect() 连接指定路由器
wifi_sta_disconnect() 断开连接
wifi_register_event_cb() 注册事件回调
wifi_get_ip_info() 获取当前 IP 信息

案例操作指导

编译烧录后串口输出:

[WiFi] connecting to MyRouter...
[WiFi] connected
[WiFi] IP: 192.168.1.100

关键配置

  • SSID + Password:硬编码在代码中,需要替换为实际的路由器信息
  • 安全模式:WPA2-PSK
  • 连接超时:30 秒

代码详解

WiFi 初始化

static void wifi_event_cb(wifi_event_t event, void *data);

void wifi_sta_init(void)
{
    wifi_init();                          // 1. 初始化 WiFi
    wifi_set_mode(WIFI_MODE_STA);         // 2. 设置 STA 模式
    wifi_register_event_cb(wifi_event_cb);   // 3. 注册事件回调

    // 4. 配置并连接
    wifi_sta_config_t sta_config = {
        .ssid     = "MyRouter",
        .password = "12345678",
        .security = WIFI_SEC_WPA2_PSK,
    };
    wifi_sta_connect(&sta_config);
}

事件回调

static void wifi_event_cb(wifi_event_t event, void *data)
{
    switch (event) {
    case WIFI_EVENT_STA_CONNECTED:
        printf("[WiFi] connected\n");
        break;

    case WIFI_EVENT_STA_DISCONNECTED:
        printf("[WiFi] disconnected, reconnecting...\n");
        wifi_sta_reconnect();  // 自动重连
        break;

    case WIFI_EVENT_STA_DHCP_SUCCESS: {
        wifi_ip_info_t *ip = (wifi_ip_info_t *)data;
        printf("[WiFi] IP: %s\n", ip->ip_addr);
        break;
    }

    case WIFI_EVENT_STA_DHCP_FAIL:
        printf("[WiFi] DHCP failed\n");
        break;
    }
}

断线重连

// DISCONNECTED 事件中自动重连,或使用指数退避策略
static void on_disconnected(void)
{
    static int retry_count = 0;
    if (retry_count < 5) {
        int delay = 1000 * (1 << retry_count);  // 指数退避
        osal_msleep(delay);
        wifi_sta_reconnect();
        retry_count++;
    } else {
        printf("[WiFi] max retries reached\n");
    }
}