0


图文手把手教程--ESP32 一键配网(Smartconfig、Airkiss)

本文内容

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 重启


本文转载自: https://blog.csdn.net/felix_tao/article/details/126045135
版权归原作者 淘梦TaoDream 所有, 如有侵权,请联系我们删除。

“图文手把手教程--ESP32 一键配网(Smartconfig、Airkiss)”的评论:

还没有评论