ESP32学习笔记(基于IDF):IOT应用——WIFI连接
前言
学习esp32的wifi连接,并尝试把开发板连接到手机的热点
一、ESP32的WIFI的三种工作方式
工作方式 | 描述 | 典型场景 | 特点 |
---|---|---|---|
STA | ESP32 作为 Wi-Fi 客户端,连接到现有的无线网络(如家用路由器、热点),就像手机、电脑连接 Wi-Fi 一样 | 接入互联网获取数据(如从服务器拉取信息、上报传感器数据到云端)。与同一局域网内的其他设备(如电脑、手机)通信。 | 需知道目标网络的 SSID(名称)和密码,连接后获取路由器分配的 IP 地址,融入现有网络。 |
AP | ESP32 自身作为 Wi-Fi 热点(类似路由器),允许其他设备(如手机、电脑、其他 ESP32)连接到它。 | 构建小型局域网,让其他设备直接与 ESP32 通信(如手机连接 ESP32 热点后,通过网页配置设备参数)。无需外部路由器的场景(如两个 ESP32 直接互联传输数据)。 | ESP32 会广播自己的 SSID,其他设备需输入 ESP32 热点的密码(可设置无密码)才能连接,ESP32 作为网关为连接的设备分配 IP 地址。 |
STA+AP | 同时开启 STA 模式和 AP 模式,ESP32 既可以连接到外部路由器(STA 角色),又可以作为热点供其他设备连接(AP 角色)。 | 物联网网关:ESP32 连接互联网(STA 模式),同时本地设备(如传感器节点)连接到 ESP32 的热点(AP 模式),ESP32 负责转发本地数据到云端。中继功能:扩展现有 Wi-Fi 覆盖(但 ESP32 本身不支持自动中继,需手动编程实现数据转发)。 | 兼顾两种模式的功能,适合需要同时与外部网络和本地设备通信的场景,但会增加功耗。 |
二、我尝试的是STA 模式
1、在根目录下使用以下指令新建一个工程,名字就叫”sta“
idf.py create-project sta
2、进到sta目录下,使用以下指令,对工程编译一下
idf.py build
3、编译完成后,打开VSCode,通过SSH,远程登录到我们的Ubuntu系统
4、然后打开刚刚我们创建的sta这个工程
5、按住Ctrl+Shift+P,然后选中图示这个选项,不然包含头文件啥的会报错
6、在sta.c文件下写入如下代码:
#include <stdio.h>
#include "nvs_flash.h"// NVS闪存初始化库(用于存储Wi-Fi等配置信息的非易失性存储)
#include "esp_wifi.h"// Wi-Fi功能库(ESP32 Wi-Fi相关API)
#include "esp_event.h"// 事件处理库(用于处理Wi-Fi连接、IP获取等事件)
#include "esp_log.h"// 日志库(用于打印调试信息)
#include "esp_err.h"// 错误处理库(定义ESP32错误码)
#include <string.h>#define TEST_SSID "Xiaomi 14 Pro"// 要连接的Wi-Fi热点名称(SSID)
#define TEST_PASSWORD "12345678"// 要连接的Wi-Fi密码#define TAG "sta"// 日志标签(打印日志时的标识,方便筛选)/*** Wi-Fi事件处理函数* 用于响应Wi-Fi连接状态变化、IP地址获取等事件* @param event_handler_arg: 事件处理参数(未使用)* @param event_base: 事件类型(如WIFI_EVENT、IP_EVENT)* @param event_id: 具体事件ID(如连接成功、断开连接)* @param event_data: 事件相关数据(未使用)*/
void wifi_event_handle(void* event_handler_arg,esp_event_base_t event_base,int32_t event_id,void* event_data)
{if(event_base == WIFI_EVENT)// 处理Wi-Fi相关事件(WIFI_EVENT类型){switch(event_id){case WIFI_EVENT_STA_START: //事件1:STA模式启动完成(Wi-Fi已准备好连接)esp_wifi_connect();// 调用连接函数,尝试连接到指定Wi-Fibreak;case WIFI_EVENT_STA_CONNECTED:// 事件2:STA成功连接到Wi-Fi热点ESP_LOGI(TAG,"esp32 connected to ap!");break;case WIFI_EVENT_STA_DISCONNECTED:// 事件3:STA与Wi-Fi热点断开连接esp_wifi_connect(); // 自动重试连接ESP_LOGI(TAG,"esp32 connect the ap faild! retry!");break;default:break;}}else if(event_base == IP_EVENT)//处理IP相关事件(IP_EVENT类型){switch(event_id){case IP_EVENT_STA_GOT_IP://事件:STA成功获取IP地址(此时可正常联网)ESP_LOGI(TAG,"esp32 get ip address");break;}}
}void app_main(void)
{// 1. 初始化NVS闪存(用于存储Wi-Fi配置等信息,必须先初始化)// ESP_ERROR_CHECK:检查函数返回值,若出错则终止程序并打印错误ESP_ERROR_CHECK(nvs_flash_init());//2. 初始化网络接口(创建网络协议栈,如TCP/IP)ESP_ERROR_CHECK(esp_netif_init());// 3. 创建默认事件循环(用于处理Wi-Fi、IP等事件的消息队列)ESP_ERROR_CHECK(esp_event_loop_create_default());// 4. 创建默认的STA模式网络接口(绑定Wi-Fi STA与TCP/IP协议栈)esp_netif_create_default_wifi_sta();// 5. 初始化Wi-Fi配置(使用默认配置,包含MAC地址、信道等基础参数)wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&cfg));// 应用Wi-Fi初始化配置// 6. 注册事件处理器(将事件与处理函数绑定)// 注册所有Wi-Fi事件(ESP_EVENT_ANY_ID)到wifi_event_handle函数esp_event_handler_register(WIFI_EVENT,ESP_EVENT_ANY_ID,wifi_event_handle,NULL);// 注册IP获取事件(IP_EVENT_STA_GOT_IP)到wifi_event_handle函数esp_event_handler_register(IP_EVENT,IP_EVENT_STA_GOT_IP,wifi_event_handle,NULL);// 7. 配置要连接的Wi-Fi参数(热点名称、密码、加密方式等)wifi_config_t wifi_config = {.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK,// 加密方式(WPA2-PSK,常见家用Wi-Fi加密).sta.pmf_cfg.capable = true,// 支持PMF.sta.pmf_cfg.required = false,// 不强制要求路由器支持PMF};// 清空SSID数组(避免残留垃圾数据)memset(&wifi_config.sta.ssid,0,sizeof(wifi_config.sta.ssid));// 将TEST_SSID(热点名称)复制到Wi-Fi配置中memcpy(wifi_config.sta.ssid,TEST_SSID,strlen(TEST_SSID));// 清空密码数组(避免残留垃圾数据)memset(&wifi_config.sta.password,0,sizeof(wifi_config.sta.password));// 将TEST_PASSWORD(密码)复制到Wi-Fi配置中memcpy(wifi_config.sta.password,TEST_PASSWORD,strlen(TEST_PASSWORD));// 8. 设置Wi-Fi工作模式为STA(客户端模式,连接其他热点)ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));// 应用Wi-Fi配置(将上面设置的热点信息传入Wi-Fi驱动)ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA,&wifi_config));// 启动Wi-Fi(开始执行连接流程)ESP_ERROR_CHECK(esp_wifi_start());return;}
7、然后在手机打开热点,名称跟密码写上热点所对应的
8、代码编写完成后,在工程目录下,执行以下指令,自动完成编译、烧录、打开串口日志监控
idf.py flash monitor
9、观察打印,发现自动重连了两次,然后连接到热点,然后分配到IP,自此,我们就成功连接上了wifi