当前位置: 首页 > 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链接,则任务要给较大堆栈内存
http://www.xdnf.cn/news/621613.html

相关文章:

  • rce命令执行原理及靶场实战(详细)
  • Vue项目前后端交互大量数据的-之-前端优化方案
  • 前端流行框架Vue3教程:25. 组件保持存活
  • 湖北理元理律师事务所债务优化方案解析:如何科学规划还款保障生活质量
  • 0304考试通过-逻辑回归实战-机器学习-人工智能
  • Symbol、Set 与 Map:新数据结构探秘
  • uniapp-商城-66-shop(2-品牌信息显示,数据库读取的异步操作 放到vuex actions)
  • Perl单元测试实战指南:从Test::Class入门到精通的完整方案
  • Linux系统管理与编程23:巧用git资源一键部署LAMP
  • ShenNiusModularity项目源码学习(29:ShenNius.Admin.Mvc项目分析-14)
  • React整合【ECharts】教程001:柱状图的构建和基本设置
  • 【Python 中 lambda、map、filter 和 reduce】详细功能介绍及用法总结
  • Java三十而立:Java 的30岁与Spring AI 1.0正式发布
  • STC89C52RC/LE52RC
  • 嵌入式Openharmony系统应用开发与实现方法
  • (已开源-CVPR2024) RadarDistill---NuScenes数据集Radar检测第一名
  • TypeScript 和 JavaScript核心关系及区别
  • 最大似然估计(Maximum Likelihood Estimation, MLE)详解
  • 机器学习课程设计报告 —— 基于二分类的岩石与金属识别模型
  • PHP SPL 自动加载机制详解与实战应用:spl_autoload_register 使用指南
  • BLIP论文笔记
  • 使用 CodeBuddy 实现视频合并工具:解决本地视频处理痛点
  • 【RabbitMQ运维】集群搭建
  • 【强化学习】#7 基于表格型方法的规划和学习
  • 力扣 283.移动零 (双指针)
  • SQL语句的执行流程
  • C++搜索二叉树
  • Java语言快速排序和堆排序(优先队列)介绍,附demo代码
  • C# 深入理解类(析构函数和this关键字)
  • 【RK3588新品】嵌入式人工智能实验箱EDU-AIoT ELF 2发布