文章目录
- 🔧 一、ESP32-C3 连接 Wi-Fi 的基本原理(STA 模式)
- ✅ 二、完整代码 + 注释讲解(适配 ESP32-C3)
- 📌 三、几个关键点解释
- 🔚 四、小结
🔧 一、ESP32-C3 连接 Wi-Fi 的基本原理(STA 模式)
ESP32-C3 使用 STA(Station)模式连接 Wi-Fi 热点流程如下:
- 初始化 NVS 存储:保存 Wi-Fi 参数等。
- 初始化网络接口(Netif)与事件循环(Event Loop)。
- 初始化 Wi-Fi 驱动并设置为 STA 模式。
- 设置 Wi-Fi SSID 和密码等参数。
- 注册 Wi-Fi 与 IP 相关事件(启动、断开、获取 IP 等)。
- 启动 Wi-Fi 并尝试连接。
- 连接成功后会触发 IP 事件,获取 IP 地址。
✅ 二、完整代码 + 注释讲解(适配 ESP32-C3)
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_netif.h"
// 设置你的 Wi-Fi 名称和密码
#define WIFI_SSID "P70PRO+"
#define WIFI_PASS "123456789"
// 打印日志用的 tag
static const char *TAG = "wifi_main";
// 用于标记是否已成功获取 IP
static bool got_ip = false;
/**
* @brief Wi-Fi 和 IP 事件处理函数
* 这里处理连接、断开、获取 IP 等事件
*/
static void wifi_event_handler(void* arg, esp_event_base_t event_base,
int32_t event_id, void* event_data)
{
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
// 当 Wi-Fi STA 模式启动后,尝试连接热点
esp_wifi_connect();
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
// 如果连接失败或掉线,自动重连
ESP_LOGI(TAG, "Disconnected. Reconnecting...");
esp_wifi_connect();
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
// 成功连接 Wi-Fi 并获取到 IP 地址
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
ESP_LOGI(TAG, "Got IP: " IPSTR, IP2STR(&event->ip_info.ip));
got_ip = true; // 设置标志位表示 Wi-Fi 已连接
}
}
/**
* @brief 主函数入口
* 程序从这里开始运行
*/
void app_main(void)
{
printf("hello world\n");
// 1. 初始化 NVS(非易失性存储),用于保存 Wi-Fi 配置等
ESP_ERROR_CHECK(nvs_flash_init());
// 2. 初始化底层网络接口(如 Wi-Fi STA 接口)
ESP_ERROR_CHECK(esp_netif_init());
// 3. 创建默认事件循环,用于处理系统事件
ESP_ERROR_CHECK(esp_event_loop_create_default());
// 4. 创建默认的 Wi-Fi STA 网络接口
esp_netif_create_default_wifi_sta();
// 5. 初始化 Wi-Fi 驱动
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
// 6. 注册 Wi-Fi 和 IP 相关事件的处理函数
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL));
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL));
// 7. 配置 Wi-Fi 参数(SSID 和密码)
wifi_config_t wifi_config = {
.sta = {
.ssid = WIFI_SSID, // Wi-Fi 名称
.password = WIFI_PASS, // Wi-Fi 密码
.threshold.authmode = WIFI_AUTH_WPA2_PSK, // 认证方式
},
};
// 8. 设置为 STA(Station)模式
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
// 9. 加载配置好的 Wi-Fi 参数
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
// 10. 启动 Wi-Fi(此时会触发 WIFI_EVENT_STA_START)
ESP_ERROR_CHECK(esp_wifi_start());
ESP_LOGI(TAG, "Wi-Fi started, waiting for connection...");
// 11. 使用轮询等待连接成功(避免使用事件组)
while (!got_ip) {
vTaskDelay(pdMS_TO_TICKS(500)); // 延迟 500 毫秒
}
// 12. 成功连接
ESP_LOGI(TAG, "Wi-Fi connected successfully!");
}
连接wifi成功:
📌 三、几个关键点解释
名称 | 说明 |
---|---|
esp_wifi_init() | 初始化 Wi-Fi 驱动 |
esp_netif_init() | 初始化底层 TCP/IP 栈 |
esp_event_loop_create_default() | 创建默认事件循环(处理回调) |
esp_event_handler_register() | 注册 Wi-Fi 或 IP 事件的处理函数 |
esp_wifi_connect() | 尝试连接 Wi-Fi |
WIFI_EVENT_STA_DISCONNECTED | Wi-Fi 断开时触发 |
IP_EVENT_STA_GOT_IP | 成功获取 IP 地址后触发 |
esp_wifi_set_config() | 设置 SSID、密码等 |
esp_wifi_start() | 启动 Wi-Fi 模块 |
vTaskDelay() | FreeRTOS 中延时函数 |
🔚 四、小结
你现在写的代码是ESP32-C3 连接 Wi-Fi 的最简方式之一:
- 省略了事件组:适合初学者快速验证功能
- 直接判断 got_ip 变量:逻辑简单清晰
- 结构合理:不依赖复杂任务调度、适合单线程程序