ESP32+idf开发之WIFI通信入门(2)station网络连接

ESP32+idf开发之WIFI通信入门(2)station网络连接

1、新建工程项目ctrl+shift+p,选择new project,输入项目名,选择合适项目路径,选择对应的开发板,此处选择自定义,target选择ESP32 moudule,点击选择模板。

image-20230313212949442

2、选择idf的模板example,选择其中空白的样例工程,点击创建项目用此模板,并在新的窗口打开,旧窗口就可以关闭了。

image-20230313213413882

3、在vscode中项目路径下找到main.c文件,输入以下代码实现以下功能:

​ (1)能连接到你的热点(用户名ssid,密码password);

​ (2)能够实现断线重连;

​ (3)信号量完成事件处理函数和主任务的同步,当连接成功后,主任务能够输出“connected to ap!”

#include <esp_log.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>

#include <esp_netif.h>
#include <esp_wifi.h>
#include <esp_event.h>
#include <nvs_flash.h>

static char *TAG = "wifi station";

SemaphoreHandle_t sem;

// 状态机事件处理:static void event_handler(void * arg, esp_event_base_t event_base,
//                                           int32_t event_id, void * event_data)
static void event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data)
{
    
    
    if ((event_base == WIFI_EVENT) && (event_id == WIFI_EVENT_STA_START ||
                                       event_id == WIFI_EVENT_STA_DISCONNECTED))
    {
    
    
        ESP_LOGI(TAG, "begin to connect the AP");
        esp_wifi_connect();
    }
    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;
        ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
        xSemaphoreGive(sem);
    }
}

void app_main(void)
{
    
    
    sem = xSemaphoreCreateBinary();

    // nvs初始化:nvs_flash_init()
    ESP_ERROR_CHECK(nvs_flash_init());

    // 事件循环初始化:sp_event_loop_create_default();
    ESP_ERROR_CHECK(esp_event_loop_create_default());

    // 事件处理函数注册
    //  esp_err_t esp_event_handler_register(esp_event_base_t event_base, int32_t event_id,
    //                                       esp_event_handler_t event_handler, void * event_handler_arg)
    ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, event_handler, NULL));
    ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, event_handler, NULL));

    // 初始化阶段:esp_netif_init();sp_netif_create_default_wifi_sta();esp_wifi_init();
    ESP_ERROR_CHECK(esp_netif_init());
    esp_netif_create_default_wifi_sta();
    wifi_init_config_t wifi_cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&wifi_cfg));

    // 配置阶段:esp_wifi_set_mode();esp_wifi_set_config();
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
    wifi_config_t cfg = {
    
    
        .sta = {
    
    
            //用户名和密码根据实际情况修改
            .ssid = "ssid",
            .password = "password",
        }};
    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &cfg));

    // 启动阶段:esp_wifi_start()
    ESP_ERROR_CHECK(esp_wifi_start());

    while (1)
    {
    
    
        if (xSemaphoreTake(sem, portMAX_DELAY) == pdPASS)
        {
    
    
            ESP_LOGI(TAG, "connected to ap!");
        }
    }
}

4、编译(build)、烧写(flash)和监控(monitor),成功连接ap,断开后不断重连并打印begin to connect the AP,直到再次连接成功。

image-20230313215700736

猜你喜欢

转载自blog.csdn.net/coder_jun/article/details/129508849