【esp32 WIFI连接】-STA模式
文章目录
- 前言
- wifi配置步骤
- 初始化
- wifi配置
- 事件注册回调函数
- wifi清理
- 需要注意的事情
前言
esp32 的wifi功能很强大,这篇记录基本的esp32 连接wifi,获取ip地址,:官方文档介绍
wifi配置步骤
初始化
wifi初始化代码如下:
static void initialise_wifi(void)
{/* 创建事件标志组 */wifi_event_group_handler = xEventGroupCreate();/* 初始化底层TCP/IP堆栈,*/ESP_ERROR_CHECK(esp_netif_init());/* 创建默认循环事件 在整个项目中只能初始化一次只能初始化一次*/ESP_ERROR_CHECK(esp_event_loop_create_default());/* 创建默认wifi-sta网络接口,如果初始化错误,此api终止 */esp_netif_create_default_wifi_sta();/* 获取默认wifi配置参数结构体变量 */wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();/* 根据cfg参数,初始化wifi连接所需要的资源 */ESP_ERROR_CHECK(esp_wifi_init(&cfg));/* 注册事件到系统默认事件循环 */ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL));ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL));/* 启动wifi驱动(配置硬件) */esp_wifi_start();
}
-
esp_netif_init函数
- 创建一个 LwIP 核心任务,并初始化 LwIP 相关工作。
- 该函数主要是初始化网络基础设施,网络基础设施是指TCP/IP协议栈运行、网络通信和wifi功能基础组件。
- wifi驱动需要依赖esp_netif来管理IP地址、DNS、路由等网络功能。
- TCP/IP协议栈(lwip)
作用:提供TCP/IP协议支持,如(DHCP、DNS、TCP/IP)
关键组件:- LwIP(Lightweight IP):ESP-IDF 使用的轻量级 TCP/IP 协议栈。
- IP 层:管理 IP 地址分配(静态/DHCP)。
- Socket API:提供标准的 BSD Socket 接口(socket(), bind(), connect() 等)。
- 如果没有TCP/IP协议栈,wifi只能进行底层数据收发,无法实现HTTP、MQTT等高级网络通信。
-
esp_event_loop_create_default
- 创建默认的事件循环(Event Loop),用于处理系统中各种事件(如 WiFi 事件、IP 事件、自定义事件等)。
- 该回调函数唯一的动作就是将事件中继到应用程序任务中。
-
esp_netif_create_default_wifi_sta
- 设置默认网络接口,该函数是将设备设置为客户端模式
- 如果没有默认网络接口,wifi连接后将无法自动获取IP地址(DHCP不会生效);上层应用无法正确绑定到网络接口
-
esp_wifi_init
- 创建 Wi-Fi 驱动程序任务,并初始化 Wi-Fi 驱动程序。
-
esp_event_handler_register
- 注册事件,将需要关注的事件注册到循环事件中
-
esp_wifi_start
- 启动wifi
- Wi-Fi 驱动程序将事件 WIFI_EVENT_STA_START 发布到事件任务中,然后,事件任务将执行一些正常操作并调用应用程序的事件回调函数。
- 应用程序的事件回调函数将事件 WIFI_EVENT_STA_START 中继到应用程序任务中。此时,推荐调用函数 esp_wifi_connect() 进行 Wi-Fi 连接。当然,也可以等待在 WIFI_EVENT_STA_START 事件发生后的其它阶段再调用此函数。
wifi配置
bool wifi_connect(const char *ssid, const char *passwd, int timeout_ms)
{/* 配置结构体 */wifi_config_t wifi_config = { 0 };strlcpy((char *) wifi_config.sta.ssid, ssid, sizeof(wifi_config.sta.ssid));strlcpy((char *) wifi_config.sta.password, passwd, sizeof(wifi_config.sta.password));/* 设置WiFi工作模式为sta */esp_wifi_set_mode(WIFI_MODE_STA);/* 设置wifi连接的参数,主要是ssid和passwd */esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config);/* 连接wifi */esp_wifi_connect();/* 使用事件按标志组等待连接建立(WIFI_CONNECTED_BIT)或连接失败(WIFI_FAIL_BIT)事件 */EventBits_t bits; /* 定义一个事件变量来接受事件标志组等待函数返回值 */bits = xEventGroupWaitBits( wifi_event_group_handler, // 等待的事件标志组WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, // 等待的事件标志位pdFALSE, // 在退出此函数之前所设置的这些事件位不变,为pdFALSE则清零pdFALSE, // 设置的这些事件位任意一个置1就会返回,为pdFALSE则需全为1才返回timeout_ms / portTICK_PERIOD_MS);/* 根据事件标志组等待函数的返回值获取wifi连接状态 */if (bits & WIFI_CONNECTED_BIT) { /* WiFi连接成功 */ESP_LOGI(TAG, "connected to ap SSID:%s OK \n", wifi_config.sta.ssid);xEventGroupClearBits(wifi_event_group_handler, WIFI_CONNECTED_BIT);} else if (bits & WIFI_FAIL_BIT) { /* wifi连接失败 */ESP_LOGI(TAG, "Failed to connect to SSID:%s \n", WIFI_SSID);}return 0;
}
- esp_wifi_set_mode
- 设置wifi工作模式
- esp_wifi_set_config
- 配置wifi,包括连接的路由器名称、密码等信息
- xEventGroupWaitBits
- 等待注册的事件标志组
- esp_wifi_connect
- 连接wifi
- 调用函数 esp_wifi_connect() 后,Wi-Fi 驱动程序将启动内部扫描/连接过程。
- 如果内部扫描/连接过程成功,将产生 WIFI_EVENT_STA_CONNECTED 事件。然后,事件任务将启动 DHCP 客户端服务,最终触发 DHCP 程序。
- 在此情况下,应用程序的事件回调函数会将 WIFI_EVENT_STA_CONNECTED 事件中继到应用程序任务中。
- 根据收到的事件标志组做相应逻辑
事件注册回调函数
根据具体逻辑处理即可
static void event_handler(void* arg,esp_event_base_t event_base,int32_t event_id,void* event_data
){static int retry_num = 0;if ( event_base == WIFI_EVENT ) { // wifi事件if ( event_id == WIFI_EVENT_STA_CONNECTED ) {ESP_LOGI(TAG, "connect event");// xEventGroupSetBits(wifi_event_group_handler, WIFI_CONNECTED_BIT);} else if (event_id == WIFI_EVENT_STA_DISCONNECTED) {xEventGroupSetBits(wifi_event_group_handler, WIFI_FAIL_BIT);}} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { // ip 事件ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data;ESP_LOGI(TAG, "got ip:%d.%d.%d.%d \n", IP2STR(&event->ip_info.ip));retry_num = 0;xEventGroupSetBits(wifi_event_group_handler, WIFI_CONNECTED_BIT);}}
wifi清理
清理函数
esp_wifi_disconnect() 断开 Wi-Fi 连接。esp_wifi_stop() 终止 Wi-Fi 驱动程序。esp_wifi_deinit() 清理 Wi-Fi 驱动程序。
需要注意的事情
- esp_event_loop_create_default函数只需要调用一次
- wifi链接需要内存比较大,如果在任务重调用wifi链接,则任务要给较大堆栈内存