1.编写主函数
/**
* 主应用程序入口函数。
* 该函数首先初始化NVS(Non-Volatile Storage),然后初始化Wi-Fi为STA(Station)模式。
*
*/
void app_main(void)
{
// 初始化NVS,如果遇到特定错误则进行擦除并重新初始化
esp_err_t ret = nvs_flash_init();
if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase()); // 擦除NVS
ret = nvs_flash_init(); // 重新初始化NVS
}
ESP_ERROR_CHECK(ret); // 检查NVS初始化是否成功
// 打印日志信息,表明Wi-Fi将初始化为STA模式
ESP_LOGI(TAG, "ESP_WIFI_MODE_STA");
wifi_init_sta(); // 初始化Wi-Fi为STA模式
}
2.wifi初始化配置
/**
* 初始化Wi-Fi station模式。
* 该函数创建必要的事件组,初始化网络接口和事件循环,配置Wi-Fi模式和参数,并尝试连接到指定的Wi-Fi网络。
*
* 参数: 无
* 返回值: 无
*/
void wifi_init_sta(void)
{
// 创建事件组用于Wi-Fi状态指示
s_wifi_event_group = xEventGroupCreate();
// 初始化ESP-NETIF网络接口
ESP_ERROR_CHECK(esp_netif_init());
// 创建默认的事件循环
ESP_ERROR_CHECK(esp_event_loop_create_default());
// 创建默认的Wi-Fi station接口
esp_netif_create_default_wifi_sta();
// 配置Wi-Fi初始化参数
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
// 注册事件处理程序实例,用于处理Wi-Fi事件
esp_event_handler_instance_t instance_any_id;
esp_event_handler_instance_t instance_got_ip;
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
ESP_EVENT_ANY_ID,
&event_handler,
NULL,
&instance_any_id));
// 注册事件处理程序实例,用于处理获取IP地址事件
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
IP_EVENT_STA_GOT_IP,
&event_handler,
NULL,
&instance_got_ip));
// 设置Wi-Fi配置,包括SSID、密码和认证模式
wifi_config_t wifi_config = {
.sta = {
.ssid = EXAMPLE_ESP_WIFI_SSID,
.password = EXAMPLE_ESP_WIFI_PASS,
.threshold.authmode = WIFI_AUTH_WPA_WPA2_PSK,
.sae_pwe_h2e = WPA3_SAE_PWE_BOTH,
},
};
// 设置Wi-Fi模式为station
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );
// 应用配置到Wi-Fi模块
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) );
// 启动Wi-Fi
ESP_ERROR_CHECK(esp_wifi_start() );
// 打印初始化完成日志
ESP_LOGI(TAG, "wifi_init_sta finished.");
// 等待连接成功或失败
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
pdFALSE,
pdFALSE,
portMAX_DELAY);
// 根据等待结果,打印相应的日志
if (bits & WIFI_CONNECTED_BIT) {// 连接成功
ESP_LOGI(TAG, "connected to ap SSID:%s password:%s",EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
} else if (bits & WIFI_FAIL_BIT) {// 连接失败
ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s",EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
} else {// 其他
ESP_LOGE(TAG, "UNEXPECTED EVENT");
}
}
EXAMPLE_ESP_WIFI_SSID:要连接的wifi名称
EXAMPLE_ESP_WIFI_PASS:要连接的wifi密码
wifi_config.sta.threshold.authmode :认证模式
/* Strength of authmodes */
/* OPEN < WEP < WPA_PSK < OWE < WPA2_PSK = WPA_WPA2_PSK < WAPI_PSK < WPA2_ENTERPRISE < WPA3_PSK = WPA2_WPA3_PSK */
typedef enum {
WIFI_AUTH_OPEN = 0, /**< authenticate mode : open */
WIFI_AUTH_WEP, /**< authenticate mode : WEP */
WIFI_AUTH_WPA_PSK, /**< authenticate mode : WPA_PSK */
WIFI_AUTH_WPA2_PSK, /**< authenticate mode : WPA2_PSK */
WIFI_AUTH_WPA_WPA2_PSK, /**< authenticate mode : WPA_WPA2_PSK */
WIFI_AUTH_WPA2_ENTERPRISE, /**< authenticate mode : WPA2_ENTERPRISE */
WIFI_AUTH_WPA3_PSK, /**< authenticate mode : WPA3_PSK */
WIFI_AUTH_WPA2_WPA3_PSK, /**< authenticate mode : WPA2_WPA3_PSK */
WIFI_AUTH_WAPI_PSK, /**< authenticate mode : WAPI_PSK */
WIFI_AUTH_OWE, /**< authenticate mode : OWE */
WIFI_AUTH_MAX
} wifi_auth_mode_t;
3.wifi回调函数
/**
* WiFi回调函数,用于处理Wi-Fi连接相关的事件。
*
* @param arg 传递给事件处理函数的用户数据。
* @param event_base 事件基,用于识别事件来源。
* @param event_id 事件ID,用于具体识别发生的事件。
* @param event_data 事件数据,包含事件的详细信息。
*/
static void event_handler(void* arg, esp_event_base_t event_base,int32_t event_id, void* event_data)
{
// 当事件源为Wi-Fi事件且事件ID为STA开始连接时,尝试连接到Wi-Fi网络
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
esp_wifi_connect();
// 当事件源为Wi-Fi事件且事件ID为STA断开连接时,处理重新连接逻辑
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
// 如果重试次数小于最大重试次数,则尝试重新连接,否则设置Wi-Fi连接失败标志
if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) {//EXAMPLE_ESP_MAXIMUM_RETRY最大重连次数
esp_wifi_connect();
s_retry_num++;
ESP_LOGI(TAG, "retry to connect to the AP");
} else {
xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
}
ESP_LOGI(TAG,"connect to the AP fail");
// 当事件源为IP事件且事件ID为STA获得IP地址时,处理IP获取成功的逻辑
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
// 打印获得的IP地址,并重置重试次数,设置Wi-Fi连接成功标志
ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
s_retry_num = 0;
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
}
}