ESP32编程笔记(五)——WIFI
标签搜索

ESP32编程笔记(五)——WIFI

ChencyCT
2024-02-19 / 0 评论 / 14 阅读 / 正在检测是否收录...

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配置

实例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());
}

运行结果:
lssud1aj.png

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

实例2

将ESP32WiFi设置为AP模式。

#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);
static void app_main(void){
    System_Init();
    ESP_LOGI(TAG,"System initilation");
    WiFi_Init();
    ESP_LOGI(TAG,"WiFi initilation");

    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_NEW_VERSION_FOUND || ret == ESP_ERR_NVS_NO_FREE_PAGES){
        ESP_ERROR_CHECK(ret);
        ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);
}

static void WiFi_Init(void){
    wifi_init_config_t conf = WIFI_INIT_CONFIG_DEFAULT();
    esp_wifi_init(&conf);
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
    wifi_config_t con = {
        .ap={
            .ssid="ESP-32",
            .password="123456789"
        }
    };
    ESP_ERROR_CHECK(esp_wifi_set_config(&con));
    ESP_ERROR_CHECK(esp_wifi_start());
}

运行结果:
lssud9qm.png

可以看到ESP32的WiFi名称。
lssudo91.png

0

评论 (0)

取消