本文内容
1)使用smart_config例程,使用乐鑫ESPTouch APP或者微信公众号配网。
2)修改smart_config例程,使ESP32复位后,如果已配过网,则不再进行配网,而是直接连接路由器上网,使贴近实际项目开发。
一、首先完成集成开发环境搭建:
图文手把手教程(史上最强):windows下ESP32集成开发环境搭建和HelloWorld显示(乐鑫官方推荐方法-使用VSCode安装ESP-IDF插件)
二、下载乐鑫官方APP和关注乐鑫官方公众号
1)乐鑫官方APP下载链接:https://www.espressif.com.cn/zh-hans/support/download/apps
2)微信关注“乐鑫信息科技”公众号。
三、主流WIFI 配网方式简单介绍。
目前主流的 WIFI 配网方式主要有以下 三 种:
1) SoftAP配网
ESP32 会建立一个 WiFi 热点(AP模式),用户将手机连接到这个热点后,将要连接的 WiFi 信息发送给 ESP32,ESP32得到ssid和password。
优点:这种方式很可靠,成功率基本达到100%,设备端的代码也简单。
缺点:需要手动切换手机wifi连接的网络,先连接到ESP32的AP网络,配置完成后再恢复连接正常wifi网络,操作上有一定的复杂性,会给用户带来一定的困扰。
官方支持:没有提供Demo。
2)Smartconfig配网
ESP32处于混杂模式下,监听网络中的所有报文,手机APP将当前连接的ssid和password编码到UDP报文中,通过广播或者组播的方式发送报文,ESP32接收到UDP报文后解码,得到ssid和password,然后使用该组ssid和password去连接网络。
优缺点:这种方式简洁,用户也很容易操作,但是配网成功率受环境影响较大。
官方支持:有提供Demo,smart_config例程。
3)Airkiss配网
AirKiss是微信硬件平台提供的一种WIFI设备快速入网配置技术,要使用微信客户端的方式配置设备入网,需要设备支持AirKiss技术。Aiskiss的原理和smartconfig很类似,设备工作在混杂模式下,微信客户端发送包含ssid和password的广播包,设备收到广播包解码得到ssid和password,详细的可以参考微信官方的介绍。
优缺点:这种方式简洁,用户也很容易操作,但是配网成功率受环境影响较大。
官方支持:有提供Demo,smart_config例程。
四、运行smart_config例程,使用APP和微信配网。
1)打开示例项目smart_config:VSCODE中->"查看"->”命令面板“->输入:Show Examples projects->选择Use current ESP-IDF(E:\ESP32-IDF\esp\esp-idf)->弹出示例ESP-IDF Examples,选择wifi->smart_config->Create project using example smart_config->选择示例保存的路径。
例如:E:\ESP32-IDF\project-example,因ESP-IDF框架与示例是分离的,所以示例保存的路径可以随意,但需要注意:路径不能有中文和空格,否则报错。
创建完后,如下图所示。
2)编译、下载到ESP32开发板,打开串口监控,如下图所示。
** 3)打开手机APP EspTouch进行配网。**
APP点击确认后,观察VSCODE中的串口监控打印的信息,并没有提示配网成功,而是看到错误的信息:****smartconfig:setsockopt failed。
原因:是乐鑫官方的ESP-IDF存在BUG,官方修复问题的链接:
https://github.com/espressif/esp-idf/commit/2e31779931599bfb38c0c9420ef30177f130e1f9
根据目录E:\ESP32-IDF\esp\esp-idf\components\esp_wifi\src,找到smartconfig_ack.c
打开smartconfig_ack.c,修改的地方如下:
//删除
/* if (setsockopt(send_sock, SOL_SOCKET, SO_BROADCAST | SO_REUSEADDR, &optval, sizeof(int)) < 0) {
ESP_LOGE(TAG, "setsockopt failed");
goto _end;
} */
//增加
if (setsockopt(send_sock, SOL_SOCKET, SO_BROADCAST, &optval, sizeof(int)) < 0) {
ESP_LOGE(TAG, "setsockopt SO_BROADCAST failed");
goto _end;
}
//增加
if (setsockopt(send_sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(int)) < 0) {
ESP_LOGE(TAG, "setsockopt SO_REUSEADDR failed");
goto _end;
}
修改完后进行保存,如下图所示:
4)这时重新编译(如有问题,先清除,再编译)、下载到ESP32开发板,打开串口监控,这时显示配网成功,如下图所示。
配网成功后,APP会弹出配网完成的信息,如下图所示,如果失败,是不会弹出的。
5)使用微信公众号配网。
微信公众号配网与APP配网的例程是一样的,只需要修改配网的类型即可,配网的类型如下:
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;
这里由例程的SC_TYPE_ESPTOUCH,修改为SC_TYPE_ESPTOUCH_AIRKISS,即同时支持APP和微信配网,修改完后重新编译、下载到ESP32开发板中。
static void smartconfig_example_task(void * parm)
{
EventBits_t uxBits;
ESP_ERROR_CHECK( esp_smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS) );
smartconfig_start_config_t cfg = SMARTCONFIG_START_CONFIG_DEFAULT();
ESP_ERROR_CHECK( esp_smartconfig_start(&cfg) );
while (1) {
uxBits = xEventGroupWaitBits(s_wifi_event_group, CONNECTED_BIT | ESPTOUCH_DONE_BIT, true, false, portMAX_DELAY);
if(uxBits & CONNECTED_BIT) {
ESP_LOGI(TAG, "WiFi Connected to ap");
}
if(uxBits & ESPTOUCH_DONE_BIT) {
ESP_LOGI(TAG, "smartconfig over");
esp_smartconfig_stop();
vTaskDelete(NULL);
}
}
}
打开微信公众号“乐鑫信息科技”,商铺->Airkiss设备。
打开串口监控,显示的信息与APP配网基本是一样的。
至此,使用APP和微信公众号配网全部完成,但是有缺点,即ESP32每次复位后都需要进行配网,并没有保存原来配网的信息,故这里需要优化代码。
五、优化配网代码,使贴合实际应用。
1)例程中的Smart_config 配网,每次复位ESP32后,又得重新配网,不符合实际的应用,这里对代码进行修改,使配网的信息(帐号和密码)被保存在 NVS 中,每次配网之前读取NVS中的信息,如果未配网过,则进行配网操作,如果已经配网过,则直接连接路由器。
2)smartconfig_main.c->修改smartconfig_example_task()任务函数,修改****如下:
//配网任务函数
static void smartconfig_example_task(void * parm)
{
EventBits_t uxBits;
wifi_config_t myconfig = {0};
ESP_LOGI(TAG, "creat smartconfig_example_task");
// 获取wifi配置信息,如果配置过,就直接连接wifi
esp_wifi_get_config(ESP_IF_WIFI_STA, &myconfig);
if (strlen((char*)myconfig.sta.ssid) > 0)
{
ESP_LOGI(TAG, "alrealy set, SSID is :%s,start connect", myconfig.sta.ssid);
esp_wifi_connect();
}
// 如果没有配置过,就进行配网操作
else
{
ESP_LOGI(TAG, "have no set, start to config");
ESP_ERROR_CHECK( esp_smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS) );//支持APP ESPTOUCH和微信AIRKISS
smartconfig_start_config_t cfg = SMARTCONFIG_START_CONFIG_DEFAULT();
ESP_ERROR_CHECK( esp_smartconfig_start(&cfg) );
}
// ESP_ERROR_CHECK( esp_smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS) );
// smartconfig_start_config_t cfg = SMARTCONFIG_START_CONFIG_DEFAULT();
// ESP_ERROR_CHECK( esp_smartconfig_start(&cfg) );
while (1)
{
uxBits = xEventGroupWaitBits(s_wifi_event_group, CONNECTED_BIT | ESPTOUCH_DONE_BIT, true, false, portMAX_DELAY);
if(uxBits & CONNECTED_BIT)
{
// 复位后,如果已经配网过,则不会再进行配网,
// 只打印WiFi Connected to ap,而不会打印smartconfig over
ESP_LOGI(TAG, "WiFi Connected to ap");// 成功连接路由器
vTaskDelete(NULL);// 关闭线程
}
if(uxBits & ESPTOUCH_DONE_BIT)
{
ESP_LOGI(TAG, "smartconfig over"); // 配网结束
esp_smartconfig_stop();
vTaskDelete(NULL);// 关闭线程
}
}
}
** 3)编译、下载到ESP32开发板中,并打开串口监控。**
可以看到之前配网的信息,已经被保存在NVS中了,增加判断后,就不会重新配网,而是直接连接到路由器上网了。
** 4)想要重新配网,怎么办?**
想要重新配网,需要删除原来配网保存的信息,这里提供两种方法。
方法一:擦除整片Flash,仅仅适合调试用。
在VSCODE中打开终端工具ESP-IDF Terminal,然后输入以下命令,然后按Enter。
python E:\ESP32-IDF\esp\esp-idf\components\esptool_py\esptool\esptool.py erase_flash
注意:每个人的ESP-IDF存放路径都不一样,需要根据自己的路径来找到esptool.py,然后使用擦除flash命令erase_flash。
重新下载程序,并打开串口监控,显示没有配网信息,需要重新配网,按上面的流程,使用APP和微信公众号配网即可。
方法二:增加一个按键来重置配网信息,适用实际项目开发。
通过触发按键,例如长按10秒来调用esp_wifi_restore()函数,重置配网信息,具体做法这里就不说了,网上找一个现成的按键驱动来关联实现即可。
至此,关于smart_config配网的内容全部完毕,愉快的玩耍吧!
完整的例程代码下载:https://download.csdn.net/download/felix_tao/86268485
使用例程,报错怎么办,解决办法如下:
1)打开VSCODE报错,c_cpp_properties.json无法找到E:\ESP32-IDF...
解决办法:点击.vscode->c_cpp_properties.json,修改盘符即可,例如将E盘改为D盘。
2)编译工程报错:
[0/1] Re-running CMake...
FAILED: build.ninja
CreateProcess failed: The system cannot find the file specified.
ninja: error: rebuilding 'build.ninja': subcommand failed
解决方法:清除编译产生的所有文件,左下角->点击垃圾桶图标(ESP-IDF Full Clean)->清除后,接着重新编译即OK。
本文参考了以下博客,鸣谢!
ESP32-C3入门教程 网络 篇(二、 Wi-Fi 配网 — Smart_config方式 和 BlueIF方式)_矜辰所致的博客-CSDN博客_esp32 wifi配网
ESP32存储配网信息,上电重启均可自动重连之前配置的无线网络_荻夜的博客-CSDN博客_esp32 wifi 重启
版权归原作者 淘梦TaoDream 所有, 如有侵权,请联系我们删除。