feat: enhance WifiHandler initialization with event handling and TCP/IP stack setup

This commit is contained in:
GW_MC
2026-01-20 10:04:24 +08:00
parent 41516374f0
commit a1404a196e

View File

@@ -1,6 +1,7 @@
#include "wifi_handler.h" #include "wifi_handler.h"
#include "esp_wifi.h" #include "esp_wifi.h"
#include "esp_event.h" #include "esp_event.h"
#include "esp_netif.h"
#include "freertos/event_groups.h" #include "freertos/event_groups.h"
#include "esp_log.h" #include "esp_log.h"
#include "freertos/semphr.h" #include "freertos/semphr.h"
@@ -50,6 +51,8 @@ WifiHandler::~WifiHandler() {
} }
vSemaphoreDelete(this->scan_mutex); vSemaphoreDelete(this->scan_mutex);
vSemaphoreDelete(this->connection_mutex); vSemaphoreDelete(this->connection_mutex);
esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, &WifiHandler::wifi_event_handler);
esp_event_handler_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, &WifiHandler::wifi_event_handler);
} }
} }
@@ -58,7 +61,47 @@ void WifiHandler::init() {
ESP_LOGW(TAG, "Already initialized, skipping"); ESP_LOGW(TAG, "Already initialized, skipping");
return; return;
} }
esp_err_t err;
// initialize TCP/IP stack and default event loop
err = esp_netif_init();
if (err != ESP_OK) {
ESP_LOGE(TAG, "esp_netif_init failed: %s", esp_err_to_name(err));
return;
}
err = esp_event_loop_create_default();
if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) {
ESP_LOGE(TAG, "esp_event_loop_create_default failed: %s", esp_err_to_name(err));
return;
}
// create default WiFi station
esp_netif_create_default_wifi_sta();
// init WiFi driver
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
err = esp_wifi_init(&cfg);
if (err != ESP_OK) {
ESP_LOGE(TAG, "esp_wifi_init failed: %s", esp_err_to_name(err));
return;
}
// register event handlers for WiFi and IP events
esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &WifiHandler::wifi_event_handler, this);
esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &WifiHandler::wifi_event_handler, this);
err = esp_wifi_set_mode(WIFI_MODE_STA);
if (err != ESP_OK) {
ESP_LOGE(TAG, "esp_wifi_set_mode failed: %s", esp_err_to_name(err));
return;
}
err = esp_wifi_start();
if (err != ESP_OK) {
ESP_LOGE(TAG, "esp_wifi_start failed: %s", esp_err_to_name(err));
return;
}
// get WiFi credentials from KV storage if available // get WiFi credentials from KV storage if available
char* ssid = nullptr; char* ssid = nullptr;
@@ -67,7 +110,7 @@ void WifiHandler::init() {
if (ssid && password) { if (ssid && password) {
ESP_LOGI(TAG, "Found stored WiFi credentials, connecting to SSID: %s", ssid); ESP_LOGI(TAG, "Found stored WiFi credentials, connecting to SSID: %s", ssid);
esp_err_t err = this->connect(ssid, password); err = this->connect(ssid, password);
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGE(TAG, "Failed to connect to stored WiFi credentials: %s", esp_err_to_name(err)); ESP_LOGE(TAG, "Failed to connect to stored WiFi credentials: %s", esp_err_to_name(err));
} }
@@ -77,9 +120,7 @@ void WifiHandler::init() {
delete[] ssid; delete[] ssid;
delete[] password; delete[] password;
// TODO: setup WiFi event handlers
// TODO: add auto-reconnect logic
//
initialized = true; initialized = true;
} }