【笔记2-8】ESP32:SmartConfig一键配网

主要参考b站宸芯IOT老师的视频,记录自己的笔记,老师讲的主要是linux环境,但配置过程实在太多问题,就直接用windows环境了,老师也有讲一些windows的操作,只要代码会写,操作都还好,开发板用ESP-WROOM-32,其实坑还挺多的,慢慢来吧。

在上一篇中,已经实现了esp32通过STA模式连接到无线wifi,但是,SSID和密码是写在代码中的,这样不能灵活的使用,实际操作中不可能这么做,因此,需要通过其他方式,将SSID和密码告诉esp32,这就是配网操作。

配网原理比较复杂,这里不进行讲解,只记录代码和使用过程

程序的主要内容还是基于STA连接的代码,直接把初始化和事件处理复制过来就可以

c 复制代码
#include <stdio.h>
#include <string.h>
#include "nvs_flash.h"
#include "esp_log.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_err.h"//错误检查头文件
#include "esp_smartconfig.h"
#include "esp_netif.h"
 

static const char *TAG = "smart-config-test";

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)
    {
        switch(event_id)
        {
            case WIFI_EVENT_STA_START://说明STA工作模式启动
                esp_wifi_connect();//开始用WiFi config配置尝试连接
            break;

            case WIFI_EVENT_STA_CONNECTED://已经连接了
                ESP_LOGI(TAG,"wifi connect !! !! !!");
            break;

            case WIFI_EVENT_STA_DISCONNECTED://断开
                esp_wifi_connect();//重连
                ESP_LOGI(TAG,"wifi disconnect !! !! !!");
            break;

            default:break;
        }
    }
    else if(event_base == IP_EVENT)
    {
        switch(event_id)
        {
            case IP_EVENT_STA_GOT_IP://已经获取到从路由器分配的IP,此时才认为真正连接上了路由器
                ESP_LOGI(TAG,"get ip address !! !! !!");
            break;
        }
    }
}

void app_main(void)
{
    ESP_ERROR_CHECK(nvs_flash_init());//用ESP_ERROR_CHECK检查初始化
    ESP_ERROR_CHECK(esp_netif_init());//初始化TCPIP协议栈,esp32用的是lwip
    ESP_ERROR_CHECK(esp_event_loop_create_default());//创建事件系统循环,wifi连接过程中产生各种事件,通过回调函数通知我们
    esp_netif_create_default_wifi_sta();//创建sta
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();//wifi配置初始化结构体,这里使用默认配置
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));

    //注册wifi事件和网络事件回调函数
    esp_event_handler_register(WIFI_EVENT,ESP_EVENT_ANY_ID,&wifi_event_handle,NULL);//注册事件回调函数,参数分别是事件类型,事件ID(any全部事件),事件处理函数
    esp_event_handler_register(IP_EVENT,IP_EVENT_STA_GOT_IP,&wifi_event_handle,NULL);//连接到路由器获取IP地址后,触发这个事件

    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));//设置工作模式
    ESP_ERROR_CHECK(esp_wifi_start());
}

接下来要追加以下SmartConfig相关的代码

1.注册事件回调函数

c 复制代码
esp_event_handler_register(SC_EVENT,ESP_EVENT_ANY_ID,&wifi_event_handle,NULL);//捕获smart config相关事件,事件类型也是所有事件

2.实现回调函数

在wifi_event_handle中追加SC_EVENT事件的内容即可

这里需要关注SC_EVENT_SCAN_DONE,SC_EVENT_GOT_SSID_PSWD,SC_EVENT_SEND_ACK_DONE三个事件

在获取到SSID和密码后,进行wifi配置,连接wifi

收到配网信息后,通知手机APP配网结束

c 复制代码
 else if(event_base == SC_EVENT)
    {
       switch(event_id)
        {
            case SC_EVENT_SCAN_DONE://扫描完成事件
                ESP_LOGI(TAG,"sc scan done !! !! !!");
            break;

            case SC_EVENT_GOT_SSID_PSWD://获取到了SSID和密码

                smartconfig_event_got_ssid_pswd_t *evt = (smartconfig_event_got_ssid_pswd_t*)event_data;//获取事件数据
                wifi_config_t wifi_config = {0};
                snprintf((char*)wifi_config.sta.ssid , sizeof(wifi_config.sta.ssid) , "%s" , (char*)evt->ssid);
                snprintf((char*)wifi_config.sta.password , sizeof(wifi_config.sta.password) , "%s" , (char*)evt->password);

                wifi_config.sta.bssid_set = evt->bssid_set;//是否设置mac地址,这步不用管
                if(wifi_config.sta.bssid_set)
                {
                    memcpy(wifi_config.sta.bssid , evt->bssid , 6);
                }
                esp_wifi_disconnect();
                esp_wifi_set_config(WIFI_IF_STA, &wifi_config);
                esp_wifi_connect();

                ESP_LOGI(TAG,"sc scan done !! !! !!");
            break;

            case SC_EVENT_SEND_ACK_DONE://设备收到配网信息后,告诉APP配网结束,否则APP一直等
                esp_smartconfig_stop();//配网结束可以停止了
            break;
            default:break;
        } 
    }

3.设置SmartConfig的类型

esp_smartconfig_set_type的参数是类型,有4种,如下所示,类型之间互不兼容

c 复制代码
// typedef enum {
//     SC_TYPE_ESPTOUCH = 0,       /**< protocol: ESPTouch */
//     SC_TYPE_AIRKISS,            /**< protocol: AirKiss *///微信
//     SC_TYPE_ESPTOUCH_AIRKISS,   /**< protocol: ESPTouch and AirKiss */
//     SC_TYPE_ESPTOUCH_V2,        /**< protocol: ESPTouch v2*/
// } smartconfig_type_t;
c 复制代码
esp_smartconfig_set_type(SC_TYPE_ESPTOUCH);//设置smartconfig版本

4.然后配置SmartConfig,默认配置即可,然后开启

c 复制代码
smartconfig_start_config_t smartcfg = SMARTCONFIG_START_CONFIG_DEFAULT();
esp_smartconfig_start(&smartcfg);

经过以上处理,代码就完成了,接下来需要下载ESPTouch,用于发送配网信息,以下是官网链接,另外自存一份

https://www.espressif.com.cn/zh-hans/support/download/apps?keys=\&field_technology_tid[]=20

https://download.csdn.net/download/qq_43598101/92428441

配网后通过log可以确认,收到信息后,可以正常连接到wifi

工程可以下载

相关推荐
AA陈超26 分钟前
Lyra学习6:GameFeatureAction_AddComponents分析
c++·笔记·学习·ue5
影林握雪30 分钟前
M|大佛普拉斯 (2017)
经验分享·笔记·其他·生活
sheeta19981 小时前
LeetCode 每日一题笔记 日期:2025.12.02 题目:3623. 统计梯形的数目 I
笔记·算法·leetcode
程序员东岸2 小时前
《数据结构——排序(上)》从扑克牌到分治法:插入排序与希尔排序的深度剖析
数据结构·笔记·算法·排序算法
客梦2 小时前
数据结构-哈希表
java·数据结构·笔记
YJlio2 小时前
Autologon 学习笔记(9.7):安全自动登录的正确打开方式
笔记·学习·安全
四谎真好看2 小时前
Java 黑马程序员学习笔记(进阶篇30)
java·笔记·学习·学习笔记
超级大只老咪2 小时前
Nmap笔记
笔记
雍凉明月夜2 小时前
视觉opencv学习笔记Ⅳ
笔记·opencv·学习·计算机视觉