ESP32学习笔记(十二)——WIFI STA模式
WIFI是无线局域网(WLAN)的商用俗称。无线局域网(Wireless Local Area Network,WLAN)是基于IEEE 802.11系列标准制定的无线联网技术。
注:使用VSCode中的ESP-IDF插件进行开发,笔记基于B站UP主艾谷科技的视频教程
ESP32S3+ESPIDF入门教程 程序纯手打 手把手教学 中文字幕 持续更新中_哔哩哔哩_bilibili
目录
esp_event_loop_create_default(void);
esp_netif_create_default_wifi_sta(void);
esp_wifi_init(const wifi_init_config_t *config);
esp_wifi_set_mode(wifi_mode_t mode);
esp_wifi_set_config(wifi_interface_t interface, wifi_config_t *conf);
(3).在components中的CMakeList文件中添加WIFISTA文件路径
一、WIFI简介
WIFI简介
- WIFI是无线局域网(WLAN)的商用俗称。无线局域网(Wireless Local Area Network,WLAN)是基于IEEE 802.11系列标准制定的无线联网技术。
- WIFI的工作模式:STA(站点模式)、AP(接入点模式)、AP+STA(混合模式)
- 按照频段分类:
- 2.4GHz频段:国际标准频率范围2.400GHz~2.4835GHz
- 5GHz频段:国际标准频率范围5.150GHz~5.825GHz
- 按照IEEE 802.11标准号分类:
802.11b、802.11g、802.11n、802.11ac、802.11ax、802.11be
拓扑简介
- 网络拓扑指计算机网络中节点(如计算机、服务器、路由器等)与通信链路(如电缆、无线连接等)的物理或逻辑排列方式。
- 网络拓扑决定了数据在网络中的传输路径、效率和可靠性。
- 在嵌入式领域,星型拓扑是最常用、最主流的拓扑结构。
常见网络名词
- 客户端:客户端是指向服务器请求服务或资源的终端设备或软件。常见的客户端包括浏览器、移动应用、桌面程序等。客户端通常负责用户交互,向服务器发送请求并接收响应。
- 服务端:服务端是为客户端提供数据、资源或计算服务的设备或软件。它接收客户端的请求,处理逻辑(如数据库查询、文件传输等),并返回结果。常见的服务端包括Web服务器(如Nginx、Apache)、数据库服务器(如MySQL)等。
- 路由器:路由器是网络设备,负责在不同网络之间转发数据包。它通过路由表确定数据的最佳传输路径,实现局域网(LAN)与广域网(WAN)的互联。现代路由器通常兼具防火墙、NAT(网络地址转换)等功能。
- IP地址:IP地址是互联网协议地址,用于唯一标识网络中的设备。分为IPv4(如
192.168.1.1)和IPv6(如2001:0db8::1)两种格式。IP地址分为公网地址(全球唯一)和私有地址(局域网内使用,如10.0.0.0/8)。- LWIP协议栈:LWIP(Lightweight IP)是一个轻量级的TCP/IP协议栈,专为嵌入式系统设计。它支持IPv4/IPv6、TCP、UDP、DHCP等协议,占用资源少,适合内存受限的设备(如单片机)。广泛应用于物联网(IoT)和实时操作系统(如FreeRTOS)。

二、ESP32S3—WIFI功能简介
- ESP32S3内部集成了无线局域网(WALN)模块;
- 工作频段:仅支持2.4GHz
- 标准:符合802.11b/g/n标准(即仅支持WIFI4及以下的标准)
- 工作模式:STA(站点模式)、AP(接入点模式)、STA+AP(混合模式)

三、WIFI工作流程

nvs_flash_init(void);
- 该函数没有参数,且为通用步骤,可以放在main函数中执行,注意包含"nvs_flash.h"头文件
- 该函数用于初始化NVS
esp_netif_init(void);
- 该函数没有参数
- 该函数用于初始化LWIP协议栈
esp_event_loop_create_default(void);
- 该函数没有参数
- 该函数用于创建循环事件组
esp_event_handler_register(esp_event_base_t event_base, int32_t event_id,esp_event_handler_t event_handler, void* event_handler_arg);
- 参数
- event_base:事件组,WIFI部分的是WIFI_EVENT和IP_EVENT事件组
- event_id:表示要监听的数据,可以选择其中的其部分进行监听,也可以选择全部监听(由WIFI_EVENT跳转定义可以看到所有的WIFI_EVENT事件)
- event_handler:事件回调函数,当WIFI_EVENT和IP_EVENT事件组中的事件发生时,会调用该函数进行处理
- event_handler_arg:事件回调函数中需要传入的参数,该参数会在事件回调函数中使用。
- 该函数用于向循环事件组中注册要监听的事件组及事件编号,并创建事件函数
esp_netif_create_default_wifi_sta(void);
- 该函数没有参数
- 该函数用于将STA模块/AP模块与LWIP协议栈单元连接
esp_wifi_init(const wifi_init_config_t *config);
- 参数
- config:结构体指针,需要创建新的结构体,但此处不需要引出所有成员,官方文件中已经将所有的参数都配置好,调用头文件即可(该宏定义位于wifi_init_config_t 跳转定义后的文件的222行:WIFI_INIT_CONFIG_DEFAULT)
- 该函数用于初始化与WIFI相关的底层硬件
esp_wifi_set_mode(wifi_mode_t mode);
- 参数:
- mode:选择WIFI的工作模式,可以设置为STA模式、AP模式、APSTA模式和NAN模式
- 该函数用于设置WIFI模块的工作模式
esp_wifi_set_config(wifi_interface_t interface, wifi_config_t *conf);
- 参数:
- interface:选择配置哪一个模式的参数
- conf:结构体,需要创建新的结构体,并引出结构体成员
wifi_config_t wifi_config = {
.sta = {
.ssid = WIFI_SSID, //设置WIFI名称,可选择在.h文件中宏定义
.password = WIFI_PASSWORD, //WIFI密码
}仅需要引出上面的两个结构体成员
};该结构体成员是一个联合体,同一时间只能配置一个
该函数用于配置STA模式/AP模式的参数
esp_wifi_start(void);
- 该函数没有参数
- 该函数用于启动WIFI模块
esp_wifi_connect(void);
- 该函数没有参数
- 该函数用于启动WIFI连接
esp_wifi_stop(void);
- 该函数没有参数
- 该函数用于关闭WIFI模块
六、建立工程项目
(1).复制工程文件夹
复制SPILCD的工程文件夹,并改名为WIFISTA,在components文件夹下创建新的文件夹并取名WIFISTA,在WIFISTA文件夹中创建相应的WIFISTA.c、WIFISTA.h文件。
(2).在VSCode中打开新的工程文件夹
打开工程文件后,先点击垃圾桶按钮清理之前编译程序产生的中间文件,清理完成后再进行编译。
(3).在components中的CMakeList文件中添加WIFISTA文件路径

(4).编写WIFISTA.c文件
#include "WIFISTA.h"
#include "esp_wifi.h"
#include "lcd.h"
#include "esp_event.h"
void wifista_event_handler(void* event_handler_arg,esp_event_base_t event_base,int32_t event_id,void* event_data)
{
if(event_base == WIFI_EVENT )
{
if(event_id == WIFI_EVENT_STA_START)
{
esp_wifi_connect();
}
else if(event_id == WIFI_EVENT_STA_CONNECTED)
{
LCD_ShowString( 1, 1,"connected ", YELLOW, BLACK, 16, 0);//显示连接状态
}
else if(event_id == WIFI_EVENT_STA_DISCONNECTED)
{
LCD_ShowString( 1, 1,"disconnected", YELLOW, BLACK, 16, 0);
LCD_ShowString( 0, 16," ", BLACK, BLACK, 16, 0);
//可追加额外操作,可以选择断网重新连接
esp_wifi_connect();
//esp_wifi_stop();
}
}
else if(event_base == IP_EVENT)
{
if(event_id == IP_EVENT_STA_GOT_IP)
{
ip_event_got_ip_t *event = (ip_event_got_ip_t *)event_data;
esp_netif_ip_info_t *ip_info = &event->ip_info;
//esp_netif_ip_info_t *event = (esp_netif_ip_info_t *)event_data;
//定义一个结构体指针将返回的参数放入返回函数的参数中,注意此处需要将event_data转换为结构体指针类型
//返回类型为uint32_t,需要用ESP-IDF提供的宏定义将返回值转换为0.0.0.0的IP地址格式
//宏定义在IP_EVENT跳转后,再esp_ip4_addr_t跳转声明,在那个文档的50~53的宏定义
LCD_ShowIntNum(0, 16, esp_ip4_addr1_16(&ip_info->ip), 3, GREEN, BLACK, 16);
LCD_ShowString(24, 16, ".", GREEN, BLACK, 16, 0);
LCD_ShowIntNum(32, 16, esp_ip4_addr2_16(&ip_info->ip), 3, GREEN, BLACK, 16);
LCD_ShowString(56, 16, ".", GREEN, BLACK, 16, 0);
LCD_ShowIntNum(64, 16, esp_ip4_addr3_16(&ip_info->ip), 3, GREEN, BLACK, 16);
LCD_ShowString(88, 16, ".", GREEN, BLACK, 16, 0);
LCD_ShowIntNum(96, 16, esp_ip4_addr4_16(&ip_info->ip), 3, GREEN, BLACK, 16);
}
}
}
void wifista_init(void)
{
//初始化NVS是通用步骤放在main.c中进行
esp_netif_init();
esp_event_loop_create_default();
esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifista_event_handler, NULL);
//esp_event_base_t事件组当前需要了解的是WIFI_EVENT和IP_EVENT事件组
//第二个参数表示要监听的事件,可以选择其中的其部分进行监听,也可以选择全部监听(由WIFI_EVENT跳转定义可以看到所有的WIFI_EVENT事件)
//跳转到函数声明中可以看到监听全部事件组的宏定义(ESP_EVENT_ANY_BASE表示所有事件组,ESP_EVENT_ANY_ID表示所有事件编号)
//第三个参数表示事件回调函数,当WIFI_EVENT和IP_EVENT事件组中的事件发生时,会调用该函数进行处理
//第四个参数表示事件回调函数中需要传入的参数,该参数会在事件回调函数中使用,这里我们传入NULL,表示不传入参数
esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifista_event_handler, NULL);
esp_netif_create_default_wifi_sta();//创建默认的WIFI STA接口
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); //此处官方已经给这些参数配置好了默认值,只需要调用宏定义即可
esp_wifi_init(&cfg);//初始化WIFI
esp_wifi_set_mode(WIFI_MODE_STA);//设置为WIFI STA模式
wifi_config_t wifi_config = {
.sta = {
.ssid = WIFI_SSID, //设置WIFI名称,可选择在.h文件中宏定义
.password = WIFI_PASSWORD, //WIFI密码
}
};
//wifi_config_t是一个联合体,同一时间只能配置一个,此处配置为STA模式
esp_wifi_set_config(WIFI_IF_STA, &wifi_config);//设置WIFI配置
//第一个参数用于选择配置哪一个模式的参数
//第二个参数用于设置WIFI配置
esp_wifi_start();//启动WIFI
}
(5).编写WIFISTA.h文件
#ifndef _WIFISTA_H
#define _WIFISTA_H
#define WIFI_SSID "改为需要接入的WIFI的名称"
#define WIFI_PASSWORD "改为需要接入WIFI的密码"
void wifista_init(void);
#endif
(6).编写main.c文件
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "lcd.h"
#include "lcdinit.h"
#include "spi.h"
#include "WIFISTA.h"
#include "nvs_flash.h"
void app_main(void)
{
nvs_flash_init(); //wifi使用第一步是初始化nvs_flash
LCD_Init();
LCD_Fill(0, 0, 128, 160, BLACK);
wifista_init();
while(1) {
vTaskDelay(500);
}
}
(7).编译
(8).连接电路

(9).下载并运行
当成功连接提前设置好的WIFI会在屏幕上显示connected,同时在下一行显示开发板的IP地址;否则显示disconnected

更多推荐



所有评论(0)