#include <string.h>
#include "nvs_flash.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_netif.h"
// 將編譯階段的日誌等級上限設為5(可改寫成ESP_LOG_VERBOSE常數)
#define CONFIG_LOG_MAXIMUM_LEVEL 5
static const char* TAG = "WIFI_BASIC";
// 事件處理回呼函式:當 Wi-Fi 發生大事時,廣播站會來呼叫這個函式
static void evt_handler(void* arg, esp_event_base_t evt_base,
int32_t evt_id, void* evt_data) {
if (evt_base == WIFI_EVENT && evt_id == WIFI_EVENT_STA_START) {
esp_wifi_connect(); // Wi-Fi 引擎啟動成功了,去連線吧!
} else if (evt_base == WIFI_EVENT && evt_id == WIFI_EVENT_STA_DISCONNECTED) {
esp_wifi_connect(); // 斷線了?再連一次!
ESP_LOGI(TAG, "嘗試重新連線...");
} else if (evt_base == IP_EVENT && evt_id == IP_EVENT_STA_GOT_IP) {
ip_event_got_ip_t* evt = (ip_event_got_ip_t*)evt_data;
ESP_LOGI(TAG, "IP位址:" IPSTR, IP2STR(&evt->ip_info.ip)); // 拿到 IP 了!
}
}
void app_main(void) {
// 在執行階段,將日誌等級設為「詳述」(ESP_LOG_VERBOSE可改成5)
esp_log_level_set(TAG, ESP_LOG_VERBOSE);
// 初始化 NVS (存儲 Wi-Fi 配置)
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());
ret = nvs_flash_init();
}
ESP_ERROR_CHECK(ret);
// 網路層與事件系統初始化
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_create_default_wifi_sta();
// Wi-Fi 驅動初始化
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
// 註冊「事件廣播站」:告訴系統有大事要通知 evt_handler
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &evt_handler, NULL, NULL));
ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &evt_handler, NULL, NULL));
// 設定SSID與密碼
wifi_config_t wifi_cfg = {
.sta = {
.ssid = "Wokwi-GUEST", // 請改成你的SSID
.password = "", // 請改成你的密碼
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_cfg));
// 啟動 Wi-Fi
ESP_LOGI(TAG, "連線Wi-Fi...");
ESP_ERROR_CHECK(esp_wifi_start());
}