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 "esp_wifi.h"
#include "esp_event.h"
#include "esp_netif.h"
#include "freertos/event_groups.h"
#include "esp_log.h"
#include "freertos/semphr.h"
@@ -50,6 +51,8 @@ WifiHandler::~WifiHandler() {
}
vSemaphoreDelete(this->scan_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");
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
char* ssid = nullptr;
@@ -67,7 +110,7 @@ void WifiHandler::init() {
if (ssid && password) {
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) {
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[] password;
// TODO: setup WiFi event handlers
// TODO: add auto-reconnect logic
//
initialized = true;
}