WiFi

Wi-Fi 库支持配置及监控 ESP32 Wi-Fi 连网功能。

WiFi工作模式

1. 基站模式(即 STA 模式或 Wi-Fi 客户端模式),此时 ESP32 连接到接入点 (AP)。

2. AP 模式(即 Soft-AP 模式或接入点模式),此时基站连接到 ESP32。

3. AP-STA 共存模式(ESP32 既是接入点,同时又作为基站连接到另外一个接入点)。

4. 上述模式的各种安全模式(WPA、WPA2 及 WEP 等)。

5. 扫描接入点(包括主动扫描及被动扫描)。

6. 使用混杂模式监控 IEEE802.11 Wi-Fi 数据包。

常用功能

头文件

components/esp_wifi/include/esp_wifi.h

WiFi初始化

esp_err_t esp_wifi_init(const wifi_init_config_t *config) 初始化WiFi为WiFi驱动程序分配资源,如WiFi控制结构,RX/TX缓冲区,WiFi NVS结构等。此 WiFi 也会启动 WiFi 任务。 **注意**必须先调用此 API,然后才能调用所有其他 WiFi API 参数:config:配置 – 指向 WiFi 初始化配置结构的指针;可以指向临时变量 返回值: ESP_OK:成功 ESP_ERR_NO_MEM:内存不足 其他 const wifi_init_config_t *config wifi初始化配置结构体。 #define WIFI_INIT_CONFIG_DEFAULT() { \ .event_handler = &esp_event_send_internal, \ .osi_funcs = &g_wifi_osi_funcs, \ .wpa_crypto_funcs = g_wifi_default_wpa_crypto_funcs, \ .static_rx_buf_num = CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM,\ .dynamic_rx_buf_num = CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM,\ .tx_buf_type = CONFIG_ESP32_WIFI_TX_BUFFER_TYPE,\ .static_tx_buf_num = WIFI_STATIC_TX_BUFFER_NUM,\ .dynamic_tx_buf_num = WIFI_DYNAMIC_TX_BUFFER_NUM,\ .cache_tx_buf_num = WIFI_CACHE_TX_BUFFER_NUM,\ .csi_enable = WIFI_CSI_ENABLED,\ .ampdu_rx_enable = WIFI_AMPDU_RX_ENABLED,\ .ampdu_tx_enable = WIFI_AMPDU_TX_ENABLED,\ .amsdu_tx_enable = WIFI_AMSDU_TX_ENABLED,\ .nvs_enable = WIFI_NVS_ENABLED,\ .nano_enable = WIFI_NANO_FORMAT_ENABLED,\ .rx_ba_win = WIFI_DEFAULT_RX_BA_WIN,\ .wifi_task_core_id = WIFI_TASK_CORE_ID,\ .beacon_max_len = WIFI_SOFTAP_BEACON_MAX_LEN, \ .mgmt_sbuf_num = WIFI_MGMT_SBUF_NUM, \ .feature_caps = g_wifi_feature_caps, \ .sta_disconnected_pm = WIFI_STA_DISCONNECTED_PM_ENABLED, \ .magic = WIFI_INIT_CONFIG_MAGIC\ }

默认配置,如果要设置自己的初始值,请覆盖WIFI_INIT_CONFIG_DEFAULT设置的默认值。

配置示例:

static void WiFi_init(void){ wifi_init_config_t inf = WIFI_INIT_CONFIG_DEFAULT(); esp_wifi_init(&inf); }

设置配置

设置 ESP32 STA 或 AP 的配置

esp_err_t esp_wifi_set_config(wifi_interface_t interface, wifi_config_t *conf) 参数: interface: STA模式下:WIFI_IF_STA AP模式下:WIFI_IF_AP conf: wifi_config_t结构体,如果是STA模式,则配置要连接WiFi的ssid、 Password和连接方式;如果是AP模式,则配置释放的WiFi的SSID和Password等参数 返回值: ESP_OK:成功 ESP_ERR_WIFI_NOT_INIT:WiFi 未通过esp_wifi_init初始化 ESP_ERR_INVALID_ARG:参数无效 ESP_ERR_WIFI_IF:接口无效 ESP_ERR_WIFI_MODE:无效模式 ESP_ERR_WIFI_PASSWORD:密码无效 ESP_ERR_WIFI_NVS:WiFi 内部 NVS 错误 其他:参考 esp_err.h 中的 ERRO 代码

设置wifi工作模式

esp32的WiFi常用工作模式有三种分别是AP,STA和AP STA共存模式。在初始化WiFi之后需要设置WiFi的工作模式,使用函数: **esp_err_t esp_wifi_set_mode(wifi_mode_t mode)**

esp_err_t esp_wifi_set_mode(wifi_mode_t mode) 参数:mode WIFI_MODE_NULL = 0, /**< null mode */ WIFI_MODE_STA, /**< WiFi station mode */ WIFI_MODE_AP, /**< WiFi soft-AP mode */ WIFI_MODE_APSTA, /**< WiFi station soft-AP mode */ WIFI_MODE_MAX 返回值: ESP_OK:成功 ESP_ERR_WIFI_NOT_INIT:WiFi 未通过esp_wifi_init初始化 ESP_ERR_INVALID_ARG:参数无效 其他:请参阅 esp_err.h 中的错误代码

连接wifi

ESP32设置为STA模式时使用函数**esp_err_t esp_wifi_connect(void)** 连接WiFi

esp_err_t esp_wifi_connect(void) 参数:无 返回值: ESP_OK:成功 ESP_ERR_WIFI_NOT_INIT:WiFi 未通过esp_wifi_init初始化 ESP_ERR_WIFI_NOT_STARTED:esp_wifi_start无法启动 WiFi ESP_ERR_WIFI_CONN:WiFi 内部错误、工作站或软 AP 控制块错误 ESP_ERR_WIFI_SSID:工作站连接的AP的SSID无效

启动WiFi

根据当前配置启动WiFi,如何WiFi模式为**WIFI_MODE_STA** 则启动站控制块并启动站;如果WiFi模式为**WIFI_MODE_AP** 则创建软AP控制块并启动软AP 如果模式WIFI_MODE_APSTA,则创建软AP和站控制块并启动软AP和站

esp_err_t esp_wifi_start(void) 参数:无 返回值: ESP_OK:成功 ESP_ERR_WIFI_NOT_INIT:WiFi 未通过esp_wifi_init初始化 ESP_ERR_INVALID_ARG:参数无效 ESP_ERR_NO_MEM:内存不足 ESP_ERR_WIFI_CONN:WiFi 内部错误、工作站或软 AP 控制块错误 ESP_FAIL:其他 WiFi 内部错误

更多API参考官网: [乐鑫文档——WiFi配置](https://docs.espressif.com/projects/esp-idf/zh_CN/v4.4.3/esp32/api-reference/network/esp_wifi.html)

实例1:配置esp32为STA模式,连接到WiFi

#include <stdio.h> #include "esp_system.h" #include "FreeRTOS/FreeRTOS.h" #include "freertos/task.h" #include "nvs_flash.h" #include "esp_log.h" #include "esp_wifi.h" const static char *TAG = "WIFI"; static void System_Init(void); static void WiFi_init(void); void app_main(void){ ESP_LOGI(TAG,"System initilation"); System_Init(); ESP_LOGI(TAG,"WiFi initilation"); WiFi_init(); while (1){ vTaskDelay(500 / portTICK_PERIOD_MS); ESP_LOGI(TAG, "..."); } } static void System_Init(void){ esp_err_t ret = nvs_flash_init(); if(ret==ESP_ERR_NVS_NOT_FOUND || ret == ESP_ERR_NVS_NEW_VERSION_FOUND){ ESP_ERROR_CHECK(ret); ret = nvs_flash_init(); } ESP_ERROR_CHECK(ret); } static void WiFi_init(void){ wifi_init_config_t inf = WIFI_INIT_CONFIG_DEFAULT(); esp_wifi_init(&inf); ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); wifi_config_t conf = { .sta={ .ssid="FAST_FFBD", .password="123456789", .threshold.authmode=WIFI_AUTH_WPA2_PSK } }; ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA,&conf)); ESP_ERROR_CHECK(esp_wifi_start()); ESP_ERROR_CHECK(esp_wifi_connect()); }

运行结果:

esp32如何通过wifi收发数据(ESP32WiFi)(1)

在输出日志WiFi:connected中,看到已经成功连接上WiFi。

,