首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【玩转ESP32】7、ESP32连接wifi

【玩转ESP32】7、ESP32连接wifi

作者头像
ManInRoad
发布2021-05-18 14:35:17
发布2021-05-18 14:35:17
6.6K00
代码可运行
举报
文章被收录于专栏:物联网思考物联网思考
运行总次数:0
代码可运行

点击上方[物联网思考],选择置顶,第一时间查看物联网分享!

前言:ESP32 WIFI功能支持STA、AP、APSTA三种模式,本文聊聊在STA模式下,连接到路由器。

1、官方参考历程

在examples\wifi\getting_started\station目录下就是官方的流程,只需要根据自己的实际情况改变ssid和password即可,官方代码以宏定义的形式定义,更改之后,编译、下载即可连接上。

2、代码实现

2.1、初始化

代码语言:javascript
代码运行次数:0
运行
复制
void wifi_init_sta(void)
{
    s_wifi_event_group = xEventGroupCreate();

    ESP_ERROR_CHECK(esp_netif_init());
    ESP_ERROR_CHECK(esp_event_loop_create_default());
    esp_netif_create_default_wifi_sta();
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));

    ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
                                                        ESP_EVENT_ANY_ID,
                                                        &event_handler,
                                                        NULL,
                                                        NULL));
    ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
                                                        IP_EVENT_STA_GOT_IP,
                                                        &event_handler,
                                                        NULL,
                                                        NULL));
    wifi_config_t wifi_config = {
        .sta = {
            .ssid = IOT_CORE_ESP_WIFI_SSID,
            .password = IOT_CORE_ESP_WIFI_PASS,
          .threshold.authmode = WIFI_AUTH_WPA2_PSK,
            .pmf_cfg = {
                .capable = true,
                .required = false
            },
        },
    };
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );
    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) );
    ESP_ERROR_CHECK(esp_wifi_start() );
    ESP_LOGI(TAG, "wifi_init_sta finished.");
}

其中xEventGroupCreate()用于创建一个事件标志组,返回值是事件标志组句柄,属于frerertos里面的东西;

esp_netif_init()用于初始化tcpip协议栈;

esp_event_loop_create_default()创建一个默认系统事件调度循环,之后可以注册回调函数来处理系统的一些事件;

esp_netif_create_default_wifi_sta()创建wifi sta;

wifi_init_config_t cfg=WIFI_INIT_CONFIG_DEFAULT()用于获取wifi的默认配置;

esp_wifi_init(&cfg)用于初始化wifi;

esp_event_handler_instance_register 用于向上面的esp_event_loop_create_default()`注册回调函数,在回调函数里面可以处理各种系统事件,比如wfi连接,断开等;

wifi_config是一个结构体变量,用于设置wifi的参数,如ssid,password等;

esp_wifi_set_mode用于设置wifi的模式,在这里使用sta模式;

esp_wifi_set_config设置wifi参数;

esp_wifi_start启动wifi。

2.2、回调函数

代码语言:javascript
代码运行次数:0
运行
复制
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) 
    {
        esp_wifi_connect();
    } 
    else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) 
    {
        if (s_retry_num < IOT_CORE_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");
    } 
    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));
        s_retry_num = 0;
        xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
    }
}

只要默认系统事件有变化,就会进这个函数,在这个函数里面可以处理wifi连接、断开事件等,事件发生后设置事件标志位。

2.3、阻塞等待wifi连接

代码语言:javascript
代码运行次数:0
运行
复制
void esp_wifi_sta_check_state(void)
{
    /* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum
     * number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */
    EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
            WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
            pdFALSE,
            pdFALSE,
            portMAX_DELAY);


    /* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually
     * happened. */
    if (bits & WIFI_CONNECTED_BIT) 
    {
        xEventGroupClearBits(s_wifi_event_group,WIFI_CONNECTED_BIT);  
        ESP_LOGI(TAG, "connected to ap SSID:%s password:%s",
                 IOT_CORE_ESP_WIFI_SSID, IOT_CORE_ESP_WIFI_PASS);
    } 
    else if (bits & WIFI_FAIL_BIT) 
    {
        xEventGroupClearBits(s_wifi_event_group,WIFI_FAIL_BIT);       
        ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s",
                 IOT_CORE_ESP_WIFI_SSID, IOT_CORE_ESP_WIFI_PASS);
    } 
    else 
    {
        ESP_LOGE(TAG, "UNEXPECTED EVENT");
    }
}

在这个函数里面,调用xEventGroupWaitBits阻塞等待标志位,参数portMAX_DELAY是等待时间,表示一直等待,设置了两个WIFI_FAIL_BIT和IP_EVENT_STA_GOT_IP,其中IP_EVENT_STA_GOT_IP位设置后,就代表连接到了wifi,获取到了ip。

3、现象

esp32连接到了wifi,并且分配了ip地址;如果断开,会进行重连。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 物联网思考 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 点击上方[物联网思考],选择置顶,第一时间查看物联网分享!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档