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 信息 |
案例操作指导
编译烧录后串口输出:
关键配置
- 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");
}
}