ESP32 在 IDF_V5.3.1 版本下实现 STA 模式!(带WIFI事件处理)

一、什么是ESP32的STA模式?

        ESP32 的 STA 模式(Station 模式)指的是设备作为 WiFi 客户端连接到已有的无线网络(如家庭或办公室的路由器)。在这种模式下,ESP32 会扫描周围的 WiFi 网络,连接到指定的网络,并通过 DHCP 或静态配置获得一个 IP 地址,从而加入局域网或互联网。

主要特点

  • 作为客户端:ESP32 在 STA 模式下不是创建自己的网络,而是加入已有的网络,类似于笔记本电脑、手机等设备。
  • IP 地址分配:连接到 WiFi 后,ESP32 会通过 DHCP 从路由器获取 IP 地址,这样它就能与网络中的其他设备通信。
  • 网络通信:获得 IP 地址后,ESP32 可以通过 TCP/IP 协议与远程服务器、云平台或者局域网内的其他设备进行数据交换。
  • 常用场景:智能家居、物联网设备、数据采集终端、远程控制等应用,都是利用 STA 模式连接到互联网或局域网。

总结

  • STA 模式 是 ESP32 作为客户端连接到现有 WiFi 网络的模式。
  • 主要应用于需要联网访问互联网或局域网资源的设备。
  • 通过适当初始化 NVS、esp-netif、事件循环和 WiFi 驱动,ESP32 能够在 STA 模式下正常连接并获取 IP 地址,从而实现网络通信。

这种模式在物联网设备中非常常见,有助于实现数据上传、远程控制以及与云平台的通信。

 二、如何在ESP32上实现STA模式?

 1.初始化NVS(非易失性存储)

        在使用 WiFi 功能之前,必须初始化 NVS,因为 WiFi 驱动会从 NVS 中读取配置信息。
流程:

  • 调用 nvs_flash_init() 初始化 NVS。
  • 如果返回错误(例如内存页不足或版本不匹配),则先擦除 NVS 再重新初始化。
    示例代码:
esp_err_t nvs_init(void)
{
    esp_err_t ret;
    ret = nvs_flash_init(); /* 初始化 NVS 第一次调用时,它会加载存储区域。如果存储区域有问题或不兼容,会抛出 ESP_ERR_NVS_NO_FREE_PAGES 或 ESP_ERR_NVS_NEW_VERSION_FOUND 错误。此时,我们会擦除存储并重新初始化。 */
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    return ret;
}

 2.创建Wi-Fi驱动事件循环并初始化和注册事件

    //1.创建新的事件循环.
    ESP_ERROR_CHECK(esp_event_loop_create_default()); 
    //2.初始化WIFI连接/断开的标志事件组
    wifi_event_group = xEventGroupCreate();
    //3.注册事件ID和IP获取服务函数
    ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,ESP_EVENT_ANY_ID,&wifi_event_handler,NULL,NULL)); 
    ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,IP_EVENT_STA_GOT_IP,&wifi_event_handler,NULL,NULL));

3.网卡初始化并配置Wi-Fi为STA模式

    //4.网卡初始化.初始化底层TCP/IP堆栈
    ESP_ERROR_CHECK(esp_netif_init()); 
    //5.使用默认WiFi Station配置创建esp_netif对象,将netif连接到WiFi并注册默认WiFi处理程序。
    esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta(); 
    assert(sta_netif); //断言检查,确保程序在运行时满足特定的条件.
    //6.netif连接到WiFi并注册默认WiFi处理程序。
    esp_netif_set_default_netif(sta_netif);
    //7.初始化wifi配置参数为默认.
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); 
    //8.为 WiFi 驱动初始化 WiFi 分配资源,如 WiFi 控制结构、RX/TX 缓冲区、WiFi NVS 结构等,这个 WiFi 也启动 WiFi 任务。必须先调用此API,然后才能调用所有其他WiFi API
    ESP_ERROR_CHECK(esp_wifi_init(&cfg)); 
    ESP_LOGI(TAG_STA, "wifi init cfg !");
    //9.设置WIFI为STA模式
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
    ESP_LOGI(TAG_STA, "wifi set sta mode !");
    //10.设置WIFI STA模式的配置
    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, wifi_sta_cfg) );
    ESP_LOGI(TAG_STA, "wifi init sta finished !");

4.启动Wi-Fi并连接

    //11.启动WIFI
    ESP_ERROR_CHECK(esp_wifi_start()); 
    ESP_LOGI(TAG_STA, "wifi start !");

三、事件处理(关键步骤)

        为了监控连接状态、IP 地址获取和断开连接等事件,需要注册事件处理函数。主要关注以下事件:

  • WIFI_EVENT_STA_START:当 STA 模式启动时触发,可以主动调用 esp_wifi_connect()
  • WIFI_EVENT_STA_DISCONNECTED:当 STA 断开连接时触发,可以重新连接。
  • IP_EVENT_STA_GOT_IP:当通过 DHCP 获取到 IP 地址时触发。

示例代码:

/*
函数功能:WIFI连接事件回调服务函数,由于处理特定的WIFI事件
函数形参:
        arg:传入网卡控制块
        event_base:WIFI 事件
        event_id:事件 ID
        event_data:事件数据
*/
static void wifi_event_handler(void *arg, esp_event_base_t event_base,int32_t event_id, void *event_data)
{
    if(event_base == WIFI_EVENT && event_i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值