主要参考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
