【笔记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

工程可以下载

相关推荐
无心水1 小时前
24、系统架构师论文写作专题 核心考点与学习笔记
笔记·学习·系统架构·架构师·安全架构·软考架构师·软考系统架构设计师
蒸蒸yyyyzwd2 小时前
邓明 Agent 系统面试-意图识别学习笔记
笔记·学习
Zhao-Jichao5 小时前
AI Prompting for Everyone 课程笔记 - P21 总结 Conclusion
人工智能·笔记
欢欢李5 小时前
【LTE L3 笔记 05】LTE同步信号
笔记·无线通信·物理层·lte·空口协议
La Pulga7 小时前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蒸蒸yyyyzwd7 小时前
秋招学习笔记 day106
笔记·学习
小李不想当小白8 小时前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
欢欢李8 小时前
【LTE L3 笔记 04】LTE帧结构
笔记·无线通信·物理层·lte·空口协议
Zhao-Jichao11 小时前
AI Prompting for Everyone 课程笔记 - P20 实验与期末项目 Lab and Final Project
前端·人工智能·笔记
Z21-X11 小时前
云原生运维实战笔记:企业网站综合上云部署与云运维服务全景解析
运维·笔记·学习·云原生