ESP32 开发笔记——WIFI-STA模式

1.编写主函数

/**
 * 主应用程序入口函数。
 * 该函数首先初始化NVS(Non-Volatile Storage),然后初始化Wi-Fi为STA(Station)模式。
 * 
 */
void app_main(void)
{
    // 初始化NVS,如果遇到特定错误则进行擦除并重新初始化
    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()); // 擦除NVS
        ret = nvs_flash_init(); // 重新初始化NVS
    }
    ESP_ERROR_CHECK(ret); // 检查NVS初始化是否成功

    // 打印日志信息,表明Wi-Fi将初始化为STA模式
    ESP_LOGI(TAG, "ESP_WIFI_MODE_STA");
    wifi_init_sta(); // 初始化Wi-Fi为STA模式
}

2.wifi初始化配置

/**
 * 初始化Wi-Fi station模式。
 * 该函数创建必要的事件组,初始化网络接口和事件循环,配置Wi-Fi模式和参数,并尝试连接到指定的Wi-Fi网络。
 * 
 * 参数: 无
 * 返回值: 无
 */
void wifi_init_sta(void)
{
    // 创建事件组用于Wi-Fi状态指示
    s_wifi_event_group = xEventGroupCreate();

    // 初始化ESP-NETIF网络接口
    ESP_ERROR_CHECK(esp_netif_init());

    // 创建默认的事件循环
    ESP_ERROR_CHECK(esp_event_loop_create_default());
    // 创建默认的Wi-Fi station接口
    esp_netif_create_default_wifi_sta();

    // 配置Wi-Fi初始化参数
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));

    // 注册事件处理程序实例,用于处理Wi-Fi事件
    esp_event_handler_instance_t instance_any_id;
    esp_event_handler_instance_t instance_got_ip;
    ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
                                                        ESP_EVENT_ANY_ID,
                                                        &event_handler,
                                                        NULL,
                                                        &instance_any_id));
    // 注册事件处理程序实例,用于处理获取IP地址事件
    ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
                                                        IP_EVENT_STA_GOT_IP,
                                                        &event_handler,
                                                        NULL,
                                                        &instance_got_ip));

    // 设置Wi-Fi配置,包括SSID、密码和认证模式
    wifi_config_t wifi_config = {
        .sta = {
            .ssid = EXAMPLE_ESP_WIFI_SSID,
            .password = EXAMPLE_ESP_WIFI_PASS,
            .threshold.authmode = WIFI_AUTH_WPA_WPA2_PSK,
            .sae_pwe_h2e = WPA3_SAE_PWE_BOTH,
        },
    };
    // 设置Wi-Fi模式为station
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );
    // 应用配置到Wi-Fi模块
    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) );
    // 启动Wi-Fi
    ESP_ERROR_CHECK(esp_wifi_start() );

    // 打印初始化完成日志
    ESP_LOGI(TAG, "wifi_init_sta finished.");

    // 等待连接成功或失败
    EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
            WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
            pdFALSE,
            pdFALSE,
            portMAX_DELAY);

    // 根据等待结果,打印相应的日志
    if (bits & WIFI_CONNECTED_BIT) {// 连接成功
        ESP_LOGI(TAG, "connected to ap SSID:%s password:%s",EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
    } else if (bits & WIFI_FAIL_BIT) {// 连接失败
        ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s",EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
    } else {// 其他
        ESP_LOGE(TAG, "UNEXPECTED EVENT");
    }
}

EXAMPLE_ESP_WIFI_SSID:要连接的wifi名称

EXAMPLE_ESP_WIFI_PASS:要连接的wifi密码

wifi_config.sta.threshold.authmode :认证模式

/* Strength of authmodes */

/* OPEN < WEP < WPA_PSK < OWE < WPA2_PSK = WPA_WPA2_PSK < WAPI_PSK < WPA2_ENTERPRISE < WPA3_PSK = WPA2_WPA3_PSK */

typedef enum {

    WIFI_AUTH_OPEN = 0,         /**< authenticate mode : open */

    WIFI_AUTH_WEP,              /**< authenticate mode : WEP */

    WIFI_AUTH_WPA_PSK,          /**< authenticate mode : WPA_PSK */

    WIFI_AUTH_WPA2_PSK,         /**< authenticate mode : WPA2_PSK */

    WIFI_AUTH_WPA_WPA2_PSK,     /**< authenticate mode : WPA_WPA2_PSK */

    WIFI_AUTH_WPA2_ENTERPRISE,  /**< authenticate mode : WPA2_ENTERPRISE */

    WIFI_AUTH_WPA3_PSK,         /**< authenticate mode : WPA3_PSK */

    WIFI_AUTH_WPA2_WPA3_PSK,    /**< authenticate mode : WPA2_WPA3_PSK */

    WIFI_AUTH_WAPI_PSK,         /**< authenticate mode : WAPI_PSK */

    WIFI_AUTH_OWE,              /**< authenticate mode : OWE */

    WIFI_AUTH_MAX

} wifi_auth_mode_t;

3.wifi回调函数

/**
 * WiFi回调函数,用于处理Wi-Fi连接相关的事件。
 * 
 * @param arg 传递给事件处理函数的用户数据。
 * @param event_base 事件基,用于识别事件来源。
 * @param event_id 事件ID,用于具体识别发生的事件。
 * @param event_data 事件数据,包含事件的详细信息。
 */
static void event_handler(void* arg, esp_event_base_t event_base,int32_t event_id, void* event_data)
{
    // 当事件源为Wi-Fi事件且事件ID为STA开始连接时,尝试连接到Wi-Fi网络
    if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
        esp_wifi_connect();
    // 当事件源为Wi-Fi事件且事件ID为STA断开连接时,处理重新连接逻辑
    } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
        // 如果重试次数小于最大重试次数,则尝试重新连接,否则设置Wi-Fi连接失败标志
        if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) {//EXAMPLE_ESP_MAXIMUM_RETRY最大重连次数
            esp_wifi_connect();
            s_retry_num++;
            ESP_LOGI(TAG, "retry to connect to the AP");
        } else {
            xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
        }
        ESP_LOGI(TAG,"connect to the AP fail");
    // 当事件源为IP事件且事件ID为STA获得IP地址时,处理IP获取成功的逻辑
    } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
        ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
        // 打印获得的IP地址,并重置重试次数,设置Wi-Fi连接成功标志
        ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
        s_retry_num = 0;
        xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值