本文章 来自原创专栏《ESP32教学专栏 (基于ESP-IDF)》,讲解如何使用 ESP-IDF 构建 ESP32 程序,发布文章并会持续为已发布文章添加新内容! 每篇文章都经过了精打细磨!
↓↓↓通过下方对话框进入专栏目录页↓↓↓
CSDN 请求进入目录 _ O x
是否进入ESP32教学导航(基于ESP-IDF)?
确定
文章目录
一、ESP32 WIFI介绍
Wi-Fi 库支持配置及监控 ESP32 Wi-Fi 连网功能。
支持配置:
-
基站模式(即 STA 模式或 Wi-Fi 客户端模式),此时 ESP32 连接到接入点 (AP)。
-
AP 模式(即 Soft-AP 模式或接入点模式),此时基站连接到 ESP32。
-
AP-STA 共存模式(ESP32 既是接入点,同时又作为基站连接到另外一个接入点)。
-
上述模式的各种安全模式(WPA、WPA2 及 WEP 等)。
-
扫描接入点(包括主动扫描及被动扫描)。
-
使用混杂模式监控 IEEE802.11 Wi-Fi 数据包。
二、WiFi 的启动(STA 及 AP 模式)
1. WiFi STA 模式(连接到其他设备的热点)
(1) 步骤及API简介
① 初始化nvs_flash
② 初始化esp_netif
③ 创建事件循环event_loop
—— event_loop
是esp32库的一种事件处理模式,中文曰“事件循环”
④ 初始化、配置WiFi并启动
⑤ 事件处理(使用第③步创建的事件循环)
(2) 分步讲解
① 初始化nvs_flash
#include <nvs_flash.h>
/**
* @brief 用于初始化nvs
*/
void init_nvs() {
/*尝试初始化一次nvs_flash*/
esp_err_t err = nvs_flash_init();
if(err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND){
/*第一次初始化失败, 检查错误, 处理错误, 重新初始化*/
nvs_flash_erase();
err = nvs_flash_init();
}
ESP_ERROR_CHECK(err);
}
② 初始化event_loop
#include "esp_event.h"
esp_event_loop_create_default();
esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID,
想要用于处理事件的函数, NULL, &wifi_handler);
esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP,
想要用于处理时间的函数, NULL, &ip_handler));
代码解析:
- ①
esp_event_loop_create_default();
函数用于创建一个默认的事件循环(同一个esp32程序中可以有多个event_loop
,这里使用默认的事件循环) - ②
esp_event_handler_instance_register()
函数解析见下:
函数名 | esp_event_handler_instance_register() |
---|---|
函数原型 | esp_err_t esp_event_handler_instance_register(esp_event_base_t event_base, int32_t event_id, esp_event_handler_t event_handler, void *event_handler_arg, esp_event_handler_instance_t *instance) |
含义 | 将事件处理程序的实例注册到默认循环。 |
返回值 | esp_err_t |
参数 | event_base类型为:esp_event_base_t ;表示 事件基,代表事件的大类(如WiFi事件,IP事件等)event_id类型为: int32_t ;表示事件ID,即事件基下的一个具体事件(如WiFi连接丢失,IP成功获取)event_handler类型为: esp_event_handler_t ;表示一个handler函数(模板请见第⑤步)*event_handler_arg类型为: void ;表示需要传递给handler函数的参数*instance类型为: esp_event_handler_instance_t 指针;**[输出]**表示此函数注册的事件实例对象,用于生命周期管理(如删除unrigister 这个事件handler) |
③ 初始化esp_netif
#include "esp_netif.h"
esp_netif_t *pEsp_wifi_netif;
esp_netif_init();
/*创建wifi sta模式的默认netif, 返回一个指针*/
pEsp_wifi_netif = esp_netif_create_default_wifi_sta();
/* (非必须) 这行代码是修改ESP32的主机名, 即WiFi设备名, 连接其他WiFi时显示的名称 */
esp_netif_set_hostname(esp_wifi_netif, "Augtons");// 不建议使用汉字
上述代码第 6 行函数esp_netif_create_default_wifi_sta()
是必要的,只不过函数返回值可以在不需要的时候忽略(本文我们借助这个创建得到的esp_netif
对象来修改了主机名为Augtons
,因此保留了这个返回值)
④ 初始化、配置WiFi并启动
注意:下文的代码实例只展示了最简单的wifi连接代码,实际上第4行配置的结构体下的sta还有很多成员,这里不再细讲
#include "driver/wifi.h"
/* 第一步, WiFi初始化 */
/*
这个宏 WIFI_INIT_CONFIG_DEFAULT() 可以初始化一
个wifi_init_config(wifi初始化配置)结构体为默认值
*/
wifi_init_config_t wifi_init_config = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&wifi_init_config