【ESP32】打造全网最强esp-idf基础教程——15.WiFi连接STA模式

WiFi连接STA模式

一、ESP32的WiFi功能介绍

       前面章节内容,基本上都是描述了ESP32强大的MCU能力,这些MCU能力使得ESP32可以替换许多类型的单片机工作,而自己承担这部分功能;当然ESP32的IOT能力才是它的主业,从硬件配置来看,ESP32支持2.4GHz频段WiFi+BT(LE)4.2,而esp-idf对WiFi的驱动支持可谓是十分完善,我们不需要花费太多的精力研究底层实现,更多的将精力放在自己的应用设计上。

       对于ESP32的WIFI,有三种工作模式:

  • STA模式,这种模式是ESP32最常用的模式,ESP32可以连接到任何已经存在的WiFi网络,从而允许ESP32与网络上的其他设备进行通信,类似于一台普通的WiFi客户端设备。
  •  AP模式,这种模式下ESP32创建自己的WiFi网络,成为一个小型WiFi路由器,接受其它WiFi终端设备连接,这种模式多用于设备配网。
  • STA+AP模式,在这种模式下,ESP32 同时工作在STA和AP两种模式下,既可以连接到已有的WiFi网络,也可以提供WiFi热点,这种高级功能使ESP32能够连接到现有的WiFi网络,同时创建自己的网络,充当桥接器或中继器,通俗的讲就是连接到一个热点后,ESP32自己又创建了一个网络,允许其它设备接入,这些设备以ESP32为中继节点,可以访问互联网。

二、STA模式代码
       STA模式代码位于esp32-board/wifi,因为esp-idf的WiFi驱动已经十分的完善,所以我们不需要很多代码就能完成WiFi连接,看到esp32-board/wifi/main/simple_wifi_sta.c文件,

#define DEFAULT_WIFI_SSID           "wifitest"
#define DEFAULT_WIFI_PASSWORD       "12345678"
static const char *TAG = "wifi";
/** 事件回调函数* @param arg   用户传递的参数* @param event_base    事件类别* @param event_id      事件ID* @param event_data    事件携带的数据* @return 无
*/
static void event_handler(void* arg, esp_event_base_t event_base,int32_t event_id, void* event_data)
{   if(event_base == WIFI_EVENT){switch (event_id){case WIFI_EVENT_STA_START:      //WIFI以STA模式启动后触发此事件esp_wifi_connect();         //启动WIFI连接break;case WIFI_EVENT_STA_CONNECTED:  //WIFI连上路由器后,触发此事件ESP_LOGI(TAG, "connected to AP");break;case WIFI_EVENT_STA_DISCONNECTED:   //WIFI从路由器断开连接后触发此事件esp_wifi_connect();             //继续重连ESP_LOGI(TAG,"connect to the AP fail,retry now");break;default:break;}}if(event_base == IP_EVENT)                  //IP相关事件{switch(event_id){case IP_EVENT_STA_GOT_IP:           //只有获取到路由器分配的IP,才认为是连上了路由器ESP_LOGI(TAG,"get ip address");break;}}
}
//WIFI STA初始化
esp_err_t wifi_sta_init(void)
{   ESP_ERROR_CHECK(esp_netif_init());  //用于初始化tcpip协议栈ESP_ERROR_CHECK(esp_event_loop_create_default());       //创建一个默认系统事件调度循环,之后可以注册回调函数来处理系统的一些事件esp_netif_create_default_wifi_sta();    //使用默认配置创建STA对象//初始化WIFIwifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();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配置wifi_config_t wifi_config = { .sta = { .ssid = DEFAULT_WIFI_SSID,              //WIFI的SSID.password = DEFAULT_WIFI_PASSWORD,      //WIFI密码.threshold.authmode = WIFI_AUTH_WPA2_PSK,   //加密方式.pmf_cfg = {.capable = true,.required = false},},};//启动WIFIESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );         //设置工作模式为STAESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) );   //设置wifi配置ESP_ERROR_CHECK(esp_wifi_start() );                         //启动WIFIESP_LOGI(TAG, "wifi_init_sta finished.");return ESP_OK;
}此文件只有两个函数,一个是WiFi连接事件回调函数,一个是初始化函数,先解析初始化内容。
ESP_ERROR_CHECK(esp_netif_init());  //用于初始化tcpip协议栈ESP_ERROR_CHECK(esp_event_loop_create_default());       //创建一个默认系统事件调度循环,之后可以注册回调函数来处理系统的一些事件esp_netif_create_default_wifi_sta();    //使用默认配置创建STA对象//初始化WIFIwifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&cfg));

       上述这部分是标准的WiFi底层初始化代码,包含网卡初始化、创建事件循环系统、STA默认配置、WIFI默认配置,这部分代码不用去动它,这些代码涉及到底层的初始化,感兴趣的同学可以看看WIFI_INIT_CONFIG_DEFAULT()这个默认配置到底配置了什么。 

        然后调用esp_event_handler_register函数,注册回调函数处理各种WIFI事件(WIFI_EVENT)的以及IP事件(IP_EVENT)。ESP_EVENT_ANY_ID参数表示任何的WIFI事件都执行回调函数,IP_EVENT_STA_GOT_IP表示获取到IP地址才会执行回调函数。

      wifi_config_t wifi_config定义了WiFi连接配置,这个配置里面我们填入了要连接的SSID和密码,还有加密方式,目前大部分路由器都支持WPA2-PSK方式,pmf_cfg这个成员表示对WiFi保护管理帧的配置,.capable成员不推荐使用,设置为true即可,表示ESP32一直使用保护管理帧(pmf)方式连接,.required表示是否只与支持保护管理帧(pmf)的设备进行连接。如果大家不知道这里是什么意思,按我这里设定就行,esp-idf官方例程也是如此。 

       esp_wifi_set_mode(WIFI_MODE_STA)表示WiFi工作在STA模式
     
 esp_wifi_set_config(WIFI_IF_STA, &wifi_config)表示将设置WiFi连接配置
       esp_wifi_start()表示启动wifi

       在启动WiFi后,WiFi驱动程序就会用配置的SSID和密码去尝试连接路由器,如果连接成功会触发WiFi事件WIFI_EVENT_STA_CONNECTED,我们在回调函数中可以将这个事件打印出来,但这个事件不代表可以连接网络,仅仅表示已经连接了AP热点,只有我们获取到了IP事件IP_EVENT_STA_GOT_IP,这个事件是路由器给ESP32分配了地址,到这才认为是已经连接到了网络,当然这个也是要求你的路由器能连接互联网。

       主函数实现如下: 

void app_main(void)
{//NVS初始化(WIFI底层驱动有用到NVS,所以这里要初始化)nvs_flash_init();//wifi STA工作模式初始化wifi_sta_init();while(1){vTaskDelay(pdMS_TO_TICKS(500));}
}

       由于WiFi底层驱动使用了nvs来一份默认可连接的SSID和密码,因此我们需要先初始化nvs。 

最后附上相关资料:

ESP32教程资料链接:
https://pan.baidu.com/s/1kCjD8yktZECSGmHomx_veg?pwd=q8er 
提取码:q8er 

配套源码下载地址:
esp32-board: esp32开发板配套的经典例程

鉴于实验需要开发板的支持,我也设计了一款ESP32开发板,包含部分传感器模块,1.69寸LCD高亮屏,Type-C一键下载,方便大家学习和做各种实验。开发板链接如下:

https://item.taobao.com/item.htm?ft=t&id=802401650392&spm=a21dvs.23580594.0.0.4fee645eXpkfcp&skuId=5635015963649
 

请大家多多支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/368446.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于软件本地化,您应该了解什么?

软件本地化是调整软件应用程序以满足目标市场的语言、文化和技术要求的过程。它不仅仅涉及翻译用户界面;它包含一系列活动,以确保软件在目标语言环境中可用且相关。以下是您应该了解的有关软件本地化的一些关键方面: 了解范围 软件本地化是…

阳光倒灌试验太阳辐射系统日光模拟器

太阳光模拟器概述 太阳光模拟器是一种能在实验室环境下模拟太阳光照射特性的设备,广泛应用于材料科学、能源研究、环境科学等领域。通过模拟太阳光的光谱分布和辐射强度,太阳光模拟器可以为科研和工业提供稳定且可重复的光照条件,进而对材料…

人工智能|深度学习——多模态条件机制 Cross Attention 原理及实现

一、引入 虽然之前写过 Attention 的文章,但现在回头看之前写的一些文章,感觉都好啰嗦,正好下一篇要写的 Stable Diffusion 中有 cross-attention,索性就再单拎出来简单说一下 Attention 吧,那么这篇文章的作用有两个&…

46. 全排列

计算数组的全排列 给定一个不含重复数字的数组 nums,返回其所有可能的全排列。你可以按任意顺序返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例 2: 输入&a…

护网蓝队面试

一、sql注入分类 **原理:**没有对用户输入项进行验证和处理直接拼接到查询语句中 查询语句中插⼊恶意SQL代码传递后台sql服务器分析执行 **从注入参数类型分:**数字型注入、字符型注入 **从注入效果分:**报错注入、布尔注入、延时注入、联…

day04-组织架构

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.组织架构-树组件应用树形组件-用层级结构展示信息,可展开或折叠。 2.组织架构-树组件自定义结构3.组织架构-获取组织架构数据4.组织架构-递归转化树形…

02-部署LVS-DR群集

1.LVS-DR工作原理 LVS-DR模式,Director Server作为群集的访问入口,不作为网购使用,节点Director Server 与 Real Server 需要在同一个网络中,返回给客户端的数据不需要经过Director Server 为了响应对整个群集的访问,…

Docker镜像加速配置

由于当前运营商网络问题,可能会导致您拉取 Docker Hub 镜像变慢,索引可以配置阿里云镜像加速器。阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台 每个人镜像地址都不一样,需要登陆阿里云自行查看,地址在上面&a…

llama-factory训练RLHF-PPO模型

理论上RLHF(强化学习)效果比sft好,也更难训练。ppo有采用阶段,步骤比较多,训练速度很慢. 记录下工作中使用llama-factory调试rlhf-ppo算法流程及参数配置,希望对大家有所帮助. llama-factory版本: 0.8.2 一 rlhf流程 ppo训练流程图如下, 会…

油猴Safari浏览器插件:Tampermonkey for Mac 下载

Tampermonkey 是一个强大的浏览器扩展,用于运行用户脚本,这些脚本可以自定义和增强网页的功能。它允许用户在网页上执行各种自动化任务,比如自动填写表单、移除广告、改变页面布局等。适用浏览器: Tampermonkey 适用于多数主流浏览…

Golang | Leetcode Golang题解之第201题数字范围按位与

题目&#xff1a; 题解&#xff1a; func rangeBitwiseAnd(m int, n int) int {for m < n {n & (n - 1)}return n }

二叉树与堆相关的时间复杂度问题

目录 满二叉树与完全二叉树高度h和树中节点个数N的关系 向上调整算法&#xff1a; 介绍&#xff1a; 复杂度推导&#xff1a; 向下调整算法&#xff1a; 介绍&#xff1a; 复杂度推导&#xff1a; 向上调整建堆&#xff1a; 介绍&#xff1a; 复杂度推导&#xff1a;…

Web Based Quiz System v1.0 SQL 注入漏洞(CVE-2022-32991)

前言 CVE-2022-32991 是一个影响 Web Based Quiz System v1.0 的 SQL 注入漏洞。这个漏洞存在于 welcome.php 文件中的 eid 参数处。攻击者可以通过此漏洞在数据库中执行任意 SQL 语句&#xff0c;从而获取、修改或删除数据库中的数据。 具体细节如下&#xff1a; 攻击向量&…

无人机森林火灾解决方案

森林火灾解决方案 森林火灾特点 森林火灾发生突然、蔓延迅速、难以控制&#xff0c;应对难度系 数很高&#xff0c;扑救工作十分困难 救援面临的挑战 • 林区交通不便&#xff0c; 山高坡陡&#xff0c; 沟壑纵横&#xff0c;难以及时侦查、 定位、扑灭 • 火灾发生的区域…

基于opencv的斜光测距及python实现

1.前言 最近做了一个基于opencv的斜光测距的小项目&#xff0c;东西不多&#xff0c;但是很有意思&#xff0c;值得拿出来学一学。项目里面需要比较精确的定位功能&#xff0c;将前人matlab代码移植到python上&#xff0c;并且做了一些优化&#xff0c;简化逻辑(毕竟我是专业的…

马工程刑法期末复习笔记重点2

马工程刑法期末复习笔记重点2

【JavaWeb程序设计】环境配置和Web工程的创建

目录 一、安装JDK、Tomcat&#xff0c;进行测试Tomcat能否正常启动。 二、修改Tomcat端口为8976&#xff0c;重新进行测试 三、使用集成开发环境Intelligent Idea&#xff0c;绑定JDK和Tomcat&#xff0c;建立站点&#xff0c;并测试 四、编写一个简单的html页面&#xff0…

微信小程序遮罩层显示

效果展示&#xff1a; wxml页面&#xff1a; <view classmodal-mask wx:if{{showModal}}><view class"modal-container"><view classmodal-content></view><view classmodal-footer bindtap"closeImage">//这个/images/ind…

SpringMVC的架构有什么优势?——控制器(一)

文章目录 控制器(Controller)1. 控制器(Controller)&#xff1a;2. 请求映射(Request Mapping)&#xff1a;3. 参数绑定(Request Parameters Binding)&#xff1a;4. 视图解析器(View Resolver)&#xff1a;5. 数据绑定(Data Binding)&#xff1a;6. 表单验证(Form Validation)…

Workerman在线客服系统源码,附搭建教程

源码介绍&#xff1a; Workerman在线客服系统源码。 workerman是一个高性能的PHP socket 服务器框架&#xff0c;workerman基于PHP多进程以及libevent事件轮询库&#xff0c;PHP开发者只要实现一两个接口&#xff0c;便可以开发出自己的网络应用&#xff0c;例如Rpc服务、聊天…