ESP32一键配置 SmartConfig

这个实验的功能演示 ESP32 smartconfig 的使用方法。 这个实验的代码为工程“4_3_wifi_SmartConfig”目录。

4.3.1. 实验内容

(1) 学习 SmartConfig 原理和工作过程
(2) 学习乐鑫的 ESP32 的 SmartConfig 程序设计

4.3.2. 一键配置 SmartConfig 简介

SmartConfig 模式,采用 UDP 广播模式(UDP 接收 IP 地址是 255.255.255.255)。WiFi 设备先 scan 环境下 AP,得到 AP 的相关信息,如工作的 channel,然后配置 WiFi 芯片工作在刚才 scan 到的 channel 上去接收 UDP 包,如果没有接收到,继续配置工作在另外的 channel 上,如此循环,直到收到 UDP 包 为止。随意此种办法的致命缺点是成功率只有 70%,而且有些路由器不支持;优点显而易见,一键完成。
一键配网连接过程:
1)ESP32 开启混杂模式监听所有网络数据包。
2)手机连上 WiFi,开启 APP 软件,输入手机所在 WiFi 密码,请求配网。
3)手机通过广播、组播循环发送路由 SSID 和 PASSWD 数据包,一定格式加密。
4)ESP32 通过 UDP 包(长度)获取配置信息捕捉到路由 SSID 和 PASSWD,连接路由器。

4.3.3. ESP32 SmartConfig 函数介绍

这个实验会使用到 AP 和 STA 实验里的大部分函数,在以下只列出没有介绍过的函数。

 SmartConfig 配置类型设置函数
函数定义:
esp_err_t esp_smartconfig_set_type(smartconfig_type_t type); 参数说明:
smartconfig_type_t type:配置类型,在这个实验里选择 SC_TYPE_ESPTOUCH 返回值:ESP_OK(成功)。

 SmartConfig 开始一键配置
函数定义:
esp_err_t esp_smartconfig_start(sc_callback_t cb, …); 参数说明:
sc_callback_t cb:smartconfig 的回调函数,从回调函数里可以得到 smartconfig 的结果 返回值:ESP_OK(成功)。

 SmartConfig 一键配置回调函数
函数定义:
void (*sc_callback_t)(smartconfig_status_t status, void *pdata); 参数说明:
smartconfig_status_t status:smartconfig 状态,这是一个枚举,具体定义在后面有说明 返回值:无

 SmartConfig 停止一键配置函数
函数定义:
esp_err_t esp_smartconfig_stop(void); 参数说明:无
返回值:无

4.3.4. 代码讲解

使用 vs code 展开本实验的工程目录,如下图:
在这里插入图片描述

我们的这个实验,smartconfig 相关的代码是写在源文件 app_main.c 里,components 文件夹是关于 LCD
和 LED 的驱动代码,LED 在 3.3 章和 LCD 在 3.4 章有比较详情的讲解。 我们的这个实验的程序启动后,开发板的红灯亮并进入 smartconfig 状态,当 smartconfig 成功后红灯
灭蓝灯亮,表示 smartconfig 成功连接上 WIFI 了。 下面按照程序启动的流程讲解。
(1) 程序启动
程序启动后,初始化了显示屏、LED 灯、打开红灯和配置 wifi 进入 sta 模式。

//用户函数入口,相当于 main 函数 void app_main(void)
{
ESP_ERROR_CHECK(nvs_flash_init());//nvs 初始化 tcpip_adapter_init();//tcp/IP 配置 initLed();//LED IO 口初始化 led_red(LED_ON);//打开红灯

//显示屏初始化以及显示相关的提示 Lcd_Init();
lcd_display(0);

startWifiSta();//配置 wifi 进入 STA 模式
}

(2) 配置 wifi 进入 STA 模式

//配置 wifi 进入 STA 模式 void startWifiSta()
{
//事件组
wifi_event_group  = xEventGroupCreate();
//注册 wifi 事件 ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));
//wifi 设置:默认设置,等待 sc 配置
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg));
 //sta 模式 ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
//启动 wifi ESP_ERROR_CHECK(esp_wifi_start());
}

(3) 创建 smartconfig 任务
在 wifi 的回调函数里,等待 sta 启动的消息 SYSTEM_EVENT_STA_START,然后创建 smartconfig 任务。

//wifi 连接事件回调函数
static  esp_err_t  event_handler(void  *ctx,  system_event_t *event)
{
switch (event->event_id)
{
case SYSTEM_EVENT_STA_START://STA 开始工作 ESP_LOGI(TAG1, "SYSTEM_EVENT_STA_START");
//创建 smartconfig 任务
xTaskCreate(smartconfig_example_task, "smartconfig_example_task",4096, NULL, break;
....略......
default:
//启动 smartconfig
//在 smartconfig 任务里启动 smartconfig,
//smartconfig 任务
void  smartconfig_example_task(void *parm)
{
EventBits_t uxBits;
//使用 ESP-TOUCH 配置工具 ESP_ERROR_CHECK(esp_smartconfig_set_type(SC_TYPE_ESPTOUCH));

//开始注册 smartconfig 回调 ESP_ERROR_CHECK(esp_smartconfig_start(sc_callback)); while (1)
{
///等待 smartconfig 完成///

(4) smartconfig 回调函数处理
如果手机上的 smartconfig 开始一键配网,那么我们会先收到 SC_STATUS_LINK 消息,从而得到了 SSID 和密码,我们就开始 sta 配置并启动连接,wifi 连接成功后收到消息 SC_STATUS_LINK_OVER,此时 ESP32 已 经分配到 IP 了。最后通过事件 xEventGroupSetBits(wifi_event_group, ESPTOUCH_DONE_BIT),告诉 smartconfig 任务完成 smartconfig 配置。

//smartconfig 事件回调处理函数
static  void  sc_callback(smartconfig_status_t  status,  void *pdata)
{
switch (status)
{
case SC_STATUS_WAIT:	//等待配网 ESP_LOGI(TAG, "SC_STATUS_WAIT");
break;
case SC_STATUS
ESP_LOGI(TAG, "SC_STATUS_FINDING_CHANNEL");
break;
case SC_STATUS_GETTING_SSID_PSWD:	//获取到 ssid 和密码
ESP_LOGI(TAG,
break; SC_STATUS_LINK:
ESP_LOGI(TAG,
ESP_LOGI(TAG,  "SSID:%s", wifi_config->sta.ssid);
ESP_LOGI(TAG,  "PASSWORD:%s", wifi_config->sta.password);
//保存帐号用于显示
memcpy(wifi_ssid,  (uint8_t  *)wifi_config->sta.ssid, 32);
//断开默认的 ESP_ERROR_CHECK(esp_wifi_disconnect());
//设置获取的 ap 和密码到寄存器 ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, wifi_config));
//连接获取的 ssid 和密码 ESP_ERROR_CHECK(esp_wifi_connect()); break;
case SC_STATUS_LINK_OVER:	//连接上配置后,结束 ESP_LOGI(TAG, "SC_STATUS_LINK_OVER");
//
if  (pdata  != NULL)
{
uint8_t phone_ip[4] = {0}; memcpy(phone_ip,  (uint8_t  *)pdata, 4);
memcpy(wifi_ip,  (uint8_t  *)phone_ip,  4);//保存分配的 IP 用于显示 ESP_LOGI(TAG,  "Phone  ip:  %d.%d.%d.%d\n",  phone_ip[0],  phone_ip[1], phone_
ip[2], phone_ip[3]);
}
//发送 sc 结束事件
xEventGroupSetBits(wifi_event_group, 

(5) 停止 smartconfig 完成配网
完成 smartconfig 配网后,调用了函数 esp_smartconfig_stop(),同时蓝灯打开,关闭红灯。

//smartconfig 任务
void  smartconfig_example_task(void *parm)
{
/略// while (1)
{
//死等事件组:CONNECTED_BIT  | ESPTOUCH_DONE_BIT
uxBits = xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT |  ESPTOUCH_DONE_BIT, true,  false, portMAX_DELAY);

//smartconfig 结束
if  (uxBits  & ESPTOUCH_DONE_BIT)
{
ESP_LOGI(TAG, "smartconfig over"); esp_smartconfig_stop();//停止 smartconfig
//设置绿灯表示 smartconfig 结束
led_red(LED_OFF);//关闭红灯 led_blue(LED_ON);//打开蓝灯 lcd_display(1);

//此处 smartconfig 结束,并且连上设置的 AP,以下可以展开自定义工作了 vTaskDelete(NULL);
}
//连上 ap
if  (uxBits  & CONNECTED_BIT)
{
ESP_LOGI(TAG,  "WiFi  Connected  to ap");
}
}
}

4.3.5. 实验过程

配置下载串口、波特率、编绎和程序下载的详细过程请往回看 3.1.4,在这个实验里都是一笔带过。 (1) 把开发板通过 USB 线接到电脑上,通过设备管理器查看生成的串口。开发板在我们演示电脑上生成的是 COM3。
(2) 在 menuconfig 菜单里配置下载程序串口。提供的例程配置的串口是 COM3,波特率为 921600。
(3) 通过 make all 编绎工程。
(4) 当编绎通过之后,使用命令 make flash 把程序下载到开发板上。或者参考 2.3.2 节,使用工具下载。
(5) 按下开发板的复位键,让程序运行起来,此时开发板的红灯亮起(拨码开关 一定要打开)。
(6) 使用串口工具打开开发板生成的串口,默认的波特率是 115200,观察串口工具的输出(拨码开关 一定要打开)。串口工具在目录:.\开发软件\串口工具-sscom32.rar。
(7) 安装 smartconfig 程序到手机上,程序在提供的目录里有:
在这里插入图片描述

(8) 打开手机 wifi,打开安装的 smartconfig 程序,开始配网。
在这里插入图片描述

(9) 配网过程中,观察开发板彩灯变化,观察 LCD 显示屏信息变化,观察串口工具的输出信息变化。
在这里插入图片描述
最后推荐一款开发套件,可以手淘扫码查看。
在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bytechip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值