当前位置: 首页 > news >正文

【esp32 WIFI连接】-STA模式

文章目录

  • 前言
  • wifi配置步骤
    • 初始化
    • wifi配置
    • 事件注册回调函数
    • wifi清理
  • 需要注意的事情

前言

esp32 的wifi功能很强大,这篇记录基本的esp32 连接wifi,获取ip地址,:官方文档介绍

wifi配置步骤

初始化

wifi初始化代码如下:

static void initialise_wifi(void)
{/* 创建事件标志组 */wifi_event_group_handler = xEventGroupCreate();/* 初始化底层TCP/IP堆栈,*/ESP_ERROR_CHECK(esp_netif_init());/* 创建默认循环事件 在整个项目中只能初始化一次只能初始化一次*/ESP_ERROR_CHECK(esp_event_loop_create_default());/* 创建默认wifi-sta网络接口,如果初始化错误,此api终止 */esp_netif_create_default_wifi_sta();/* 获取默认wifi配置参数结构体变量 */wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();/* 根据cfg参数,初始化wifi连接所需要的资源 */ESP_ERROR_CHECK(esp_wifi_init(&cfg));/* 注册事件到系统默认事件循环 */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));/* 启动wifi驱动(配置硬件) */esp_wifi_start();
}
  1. esp_netif_init函数

    • 创建一个 LwIP 核心任务,并初始化 LwIP 相关工作。
    • 该函数主要是初始化网络基础设施,网络基础设施是指TCP/IP协议栈运行、网络通信和wifi功能基础组件。
    • wifi驱动需要依赖esp_netif来管理IP地址、DNS、路由等网络功能。
    • TCP/IP协议栈(lwip)
      作用:提供TCP/IP协议支持,如(DHCP、DNS、TCP/IP)
      关键组件:
      • LwIP(Lightweight IP):ESP-IDF 使用的轻量级 TCP/IP 协议栈。
      • IP 层:管理 IP 地址分配(静态/DHCP)。
      • Socket API:提供标准的 BSD Socket 接口(socket(), bind(), connect() 等)。
      • 如果没有TCP/IP协议栈,wifi只能进行底层数据收发,无法实现HTTP、MQTT等高级网络通信。
  2. esp_event_loop_create_default

    • 创建默认的事件循环(Event Loop),用于处理系统中各种事件(如 WiFi 事件、IP 事件、自定义事件等)。
    • 该回调函数唯一的动作就是将事件中继到应用程序任务中。
  3. esp_netif_create_default_wifi_sta

    • 设置默认网络接口,该函数是将设备设置为客户端模式
    • 如果没有默认网络接口,wifi连接后将无法自动获取IP地址(DHCP不会生效);上层应用无法正确绑定到网络接口
  4. esp_wifi_init

    • 创建 Wi-Fi 驱动程序任务,并初始化 Wi-Fi 驱动程序。
  5. esp_event_handler_register

    • 注册事件,将需要关注的事件注册到循环事件中
  6. esp_wifi_start

    • 启动wifi
    • Wi-Fi 驱动程序将事件 WIFI_EVENT_STA_START 发布到事件任务中,然后,事件任务将执行一些正常操作并调用应用程序的事件回调函数。
    • 应用程序的事件回调函数将事件 WIFI_EVENT_STA_START 中继到应用程序任务中。此时,推荐调用函数 esp_wifi_connect() 进行 Wi-Fi 连接。当然,也可以等待在 WIFI_EVENT_STA_START 事件发生后的其它阶段再调用此函数。

wifi配置

bool wifi_connect(const char *ssid, const char *passwd, int timeout_ms) 
{/* 配置结构体 */wifi_config_t wifi_config = { 0 };strlcpy((char *) wifi_config.sta.ssid, ssid, sizeof(wifi_config.sta.ssid));strlcpy((char *) wifi_config.sta.password, passwd, sizeof(wifi_config.sta.password));/* 设置WiFi工作模式为sta */esp_wifi_set_mode(WIFI_MODE_STA);/* 设置wifi连接的参数,主要是ssid和passwd */esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config);/* 连接wifi */esp_wifi_connect();/* 使用事件按标志组等待连接建立(WIFI_CONNECTED_BIT)或连接失败(WIFI_FAIL_BIT)事件 */EventBits_t bits;                                                       /* 定义一个事件变量来接受事件标志组等待函数返回值 */bits = xEventGroupWaitBits( wifi_event_group_handler,                   // 等待的事件标志组WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,         // 等待的事件标志位pdFALSE,                                    // 在退出此函数之前所设置的这些事件位不变,为pdFALSE则清零pdFALSE,                                    // 设置的这些事件位任意一个置1就会返回,为pdFALSE则需全为1才返回timeout_ms / portTICK_PERIOD_MS);/* 根据事件标志组等待函数的返回值获取wifi连接状态 */if (bits & WIFI_CONNECTED_BIT) {                                            /* WiFi连接成功 */ESP_LOGI(TAG, "connected to ap SSID:%s OK \n", wifi_config.sta.ssid);xEventGroupClearBits(wifi_event_group_handler, WIFI_CONNECTED_BIT);} else if (bits & WIFI_FAIL_BIT) {                                          /* wifi连接失败 */ESP_LOGI(TAG, "Failed to connect to SSID:%s \n", WIFI_SSID);}return 0;
}
  1. esp_wifi_set_mode
    • 设置wifi工作模式
  2. esp_wifi_set_config
    • 配置wifi,包括连接的路由器名称、密码等信息
  3. xEventGroupWaitBits
    • 等待注册的事件标志组
  4. esp_wifi_connect
    • 连接wifi
    • 调用函数 esp_wifi_connect() 后,Wi-Fi 驱动程序将启动内部扫描/连接过程。
    • 如果内部扫描/连接过程成功,将产生 WIFI_EVENT_STA_CONNECTED 事件。然后,事件任务将启动 DHCP 客户端服务,最终触发 DHCP 程序。
    • 在此情况下,应用程序的事件回调函数会将 WIFI_EVENT_STA_CONNECTED 事件中继到应用程序任务中。
  5. 根据收到的事件标志组做相应逻辑

事件注册回调函数

根据具体逻辑处理即可

static void event_handler(void* arg,esp_event_base_t event_base,int32_t event_id,void* event_data
){static int retry_num = 0;if ( event_base == WIFI_EVENT ) {           // wifi事件if ( event_id == WIFI_EVENT_STA_CONNECTED ) {ESP_LOGI(TAG, "connect event");// xEventGroupSetBits(wifi_event_group_handler, WIFI_CONNECTED_BIT);} else if (event_id == WIFI_EVENT_STA_DISCONNECTED) {xEventGroupSetBits(wifi_event_group_handler, WIFI_FAIL_BIT);}} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {     // ip 事件ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data;ESP_LOGI(TAG, "got ip:%d.%d.%d.%d \n", IP2STR(&event->ip_info.ip));retry_num = 0;xEventGroupSetBits(wifi_event_group_handler, WIFI_CONNECTED_BIT);}}

wifi清理

清理函数

 esp_wifi_disconnect() 断开 Wi-Fi 连接。esp_wifi_stop() 终止 Wi-Fi 驱动程序。esp_wifi_deinit() 清理 Wi-Fi 驱动程序。

需要注意的事情

  1. esp_event_loop_create_default函数只需要调用一次
  2. wifi链接需要内存比较大,如果在任务重调用wifi链接,则任务要给较大堆栈内存

相关文章:

  • SpringBoot多环境配置文件切换
  • 高速串行差分信号仿真分析及技术发展挑战续
  • TF-IDF和词袋模型
  • Python实用工具:文件批量重命名器
  • MySQL分库分表
  • 对神经正切核的理解和推导(1)
  • 浅析SpringBoot中的classpath
  • 互联网和以太网之是什么与区别
  • DVWA文件上传笔记
  • 踩坑记录:RecyclerView 局部刷新notifyItemChanged多次调用只触发一次 onBindViewHolder 的原因
  • 数据库调优与数据表的范式设计
  • LangGraph:部署智能应用
  • 在 .NET 环境下实现跨进程高频率读写数据
  • 再论自然数全加和-3
  • 使用CodeBuddy实现网页自动连点器
  • 【通用技巧】技术文章工业级指南:目标定位、架构设计与持续演进
  • java中的SPI(Service Provider Interface)机制解读
  • AWTK嵌入式图形框架开发备忘(二)
  • LangGraph 实战指南:长期记忆管理
  • 海外IP代理在跨境电商选品、运营、风控的实战应用解析
  • wordpress图片上传大小/长春关键词优化报价
  • php门户网站开发/如何做好互联网营销
  • 建设校园标准信息服务网站论文/企业网站cms
  • 太原市做网站公司/正规的教育机构有哪些
  • 全网营销建设网站/百度流量统计
  • 进一步加强政府网站建设的通知/股票指数是什么意思