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"

bash 复制代码
idf.py create-project sta

2、进到sta目录下,使用以下指令,对工程编译一下

bash 复制代码
idf.py build

3、编译完成后,打开VSCode,通过SSH,远程登录到我们的Ubuntu系统

4、然后打开刚刚我们创建的sta这个工程

5、按住Ctrl+Shift+P,然后选中图示这个选项,不然包含头文件啥的会报错

6、在sta.c文件下写入如下代码:

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-Fi
                break;
            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、代码编写完成后,在工程目录下,执行以下指令,自动完成编译、烧录、打开串口日志监控

bash 复制代码
idf.py flash monitor

9、观察打印,发现自动重连了两次,然后连接到热点,然后分配到IP,自此,我们就成功连接上了wifi

相关推荐
Brookty3 小时前
【算法】前缀和
java·学习·算法·前缀和·动态规划
云里物里3 小时前
云里物里智能物联电子标签系统助力零售品牌力提升
物联网·零售·电子价签·esl电子标签·电子标签
。TAT。3 小时前
C++ - List
数据结构·c++·学习
北京耐用通信4 小时前
破解工业通信瓶颈:耐达讯自动化Modbus转Profinet网关连接驱动器的奥秘
人工智能·物联网·网络协议·自动化·信息与通信
金宗汉4 小时前
《宇宙递归拓扑学:基于自指性与拓扑流形的无限逼近模型》
大数据·人工智能·笔记·算法·观察者模式
张永清-老清4 小时前
每周读书与学习->JMeter主要元件详细介绍(一)配置元件
学习·jmeter·性能调优·jmeter性能测试·性能分析·干货分享
狮智先生5 小时前
【学习笔记】利用meshlab进行曲面的质量检查
经验分享·笔记·课程设计·几何学
鼾声鼾语5 小时前
grootN1 grootN1.5 gr00t安装方法以及使用(学习)
学习·angular.js·simulink·isaacsim·isaaclab
清风6666665 小时前
基于单片机的简易智能衣架控制系统设计
单片机·嵌入式硬件·毕业设计·课程设计