|
17 | 17 | #include <esp_log.h> |
18 | 18 | #include <nvs_flash.h> |
19 | 19 | #include <esp_netif.h> |
| 20 | +#include <esp_wifi_default.h> |
| 21 | +#include <esp_wifi_netif.h> |
| 22 | +#include <esp_private/wifi.h> |
20 | 23 | #include <esp_http_server.h> |
21 | 24 |
|
22 | 25 | #define TAG "wifi" |
|
25 | 28 | #define WIFI_PASS "" |
26 | 29 | #define MAX_STA_CONN 4 |
27 | 30 |
|
| 31 | +static bool s_wifi_ap_netif_started = false; |
| 32 | + |
| 33 | +static void wifi_remote_ap_start_handler(void* arg, esp_event_base_t base, int32_t event_id, void* data) |
| 34 | +{ |
| 35 | + auto* netif = static_cast<esp_netif_t*>(arg); |
| 36 | + if (s_wifi_ap_netif_started || esp_netif_is_netif_up(netif)) { |
| 37 | + ESP_LOGW(TAG, "ignore duplicate Wi-Fi AP start event"); |
| 38 | + return; |
| 39 | + } |
| 40 | + |
| 41 | + auto driver = static_cast<wifi_netif_driver_t>(esp_netif_get_io_driver(netif)); |
| 42 | + uint8_t mac[6]; |
| 43 | + esp_err_t ret = esp_wifi_get_if_mac(driver, mac); |
| 44 | + if (ret != ESP_OK) { |
| 45 | + ESP_LOGE(TAG, "esp_wifi_get_if_mac failed: %s", esp_err_to_name(ret)); |
| 46 | + return; |
| 47 | + } |
| 48 | + |
| 49 | + if (esp_wifi_is_if_ready_when_started(driver)) { |
| 50 | + ret = esp_wifi_register_if_rxcb(driver, esp_netif_receive, netif); |
| 51 | + if (ret != ESP_OK) { |
| 52 | + ESP_LOGE(TAG, "esp_wifi_register_if_rxcb failed: %s", esp_err_to_name(ret)); |
| 53 | + return; |
| 54 | + } |
| 55 | + } |
| 56 | + |
| 57 | + ret = esp_wifi_internal_reg_netstack_buf_cb(esp_netif_netstack_buf_ref, esp_netif_netstack_buf_free); |
| 58 | + if (ret != ESP_OK) { |
| 59 | + ESP_LOGE(TAG, "netstack cb register failed: %s", esp_err_to_name(ret)); |
| 60 | + return; |
| 61 | + } |
| 62 | + |
| 63 | + esp_netif_set_mac(netif, mac); |
| 64 | + esp_netif_action_start(netif, base, event_id, data); |
| 65 | + s_wifi_ap_netif_started = true; |
| 66 | +} |
| 67 | + |
| 68 | +static void wifi_remote_ap_stop_handler(void* arg, esp_event_base_t base, int32_t event_id, void* data) |
| 69 | +{ |
| 70 | + auto* netif = static_cast<esp_netif_t*>(arg); |
| 71 | + if (!s_wifi_ap_netif_started && !esp_netif_is_netif_up(netif)) { |
| 72 | + ESP_LOGW(TAG, "ignore duplicate Wi-Fi AP stop event"); |
| 73 | + return; |
| 74 | + } |
| 75 | + |
| 76 | + esp_netif_action_stop(netif, base, event_id, data); |
| 77 | + s_wifi_ap_netif_started = false; |
| 78 | +} |
| 79 | + |
| 80 | +static esp_netif_t* create_wifi_remote_ap_netif() |
| 81 | +{ |
| 82 | + esp_netif_config_t cfg = ESP_NETIF_DEFAULT_WIFI_AP(); |
| 83 | + esp_netif_t* netif = esp_netif_new(&cfg); |
| 84 | + assert(netif); |
| 85 | + |
| 86 | + ESP_ERROR_CHECK(esp_netif_attach_wifi_ap(netif)); |
| 87 | + ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_AP_START, wifi_remote_ap_start_handler, netif)); |
| 88 | + ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_AP_STOP, wifi_remote_ap_stop_handler, netif)); |
| 89 | + |
| 90 | + return netif; |
| 91 | +} |
| 92 | + |
28 | 93 | // HTTP 处理函数 |
29 | 94 | esp_err_t hello_get_handler(httpd_req_t* req) |
30 | 95 | { |
@@ -89,7 +154,7 @@ void wifi_init_softap() |
89 | 154 | ESP_ERROR_CHECK(esp_netif_init()); |
90 | 155 | ESP_ERROR_CHECK(esp_event_loop_create_default()); |
91 | 156 |
|
92 | | - esp_netif_create_default_wifi_ap(); |
| 157 | + create_wifi_remote_ap_netif(); |
93 | 158 |
|
94 | 159 | wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); |
95 | 160 | ESP_ERROR_CHECK(esp_wifi_init(&cfg)); |
|
0 commit comments