文章目录
1 实验简介
参考博文 《图文手把手教程–ESP32 一键配网(Smartconfig、Airkiss)》
本章内容介绍给esp32配网的几种方式:
- 固定ssid与password配网
即将ssid和password写入菜单配置或直接写入代码中; - SoftAP配网
ESP32 会建立一个 WiFi 热点(AP模式),用户将手机连接到这个热点后,将要连接的 WiFi 信息发送给 ESP32,ESP32得到ssid和password。
优点:这种方式很可靠,成功率基本达到100%,设备端的代码也简单。
缺点:需要手动切换手机wifi连接的网络,先连接到ESP32的AP网络,配置完成后再恢复连接正常wifi网络,操作上有一定的复杂性,会给用户带来一定的困扰。
官方支持:没有提供Demo。 - Smartconfig配网
ESP32处于混杂模式下,监听网络中的所有报文,手机APP将当前连接的ssid和password编码到UDP报文中,通过广播或者组播的方式发送报文,ESP32接收到UDP报文后解码,得到ssid和password,然后使用该组ssid和password去连接网络。
优缺点:这种方式简洁,用户也很容易操作,但是配网成功率受环境影响较大。
官方支持:有提供Demo,smart_config例程。 - Airkiss配网
AirKiss是微信硬件平台提供的一种WIFI设备快速入网配置技术,要使用微信客户端的方式配置设备入网,需要设备支持AirKiss技术。Aiskiss的原理和smartconfig很类似,设备工作在混杂模式下,微信客户端发送包含ssid和password的广播包,设备收到广播包解码得到ssid和password,详细的可以参考微信官方的介绍。
优缺点:这种方式简洁,用户也很容易操作,但是配网成功率受环境影响较大。
官方支持:有提供Demo,smart_config例程。
1.1 固定ssid与password配网
- 参考工程 Espressif\frameworks\esp-idf-v5.2.1\examples\wifi\getting_started\station
- 使用命令
idf.py menuconfig
打开菜单配置并输入ssid、password。
- 保存退出,执行命令
idf.py -p COM11 flash monitor
,COM11根据自己实际串口决定
- 在程序中配置WiFi账号、密码
在station_example_main.c
文件配置wifi热点账号、wifi热点密码
重新编译并烧录程序,效果与在配置菜单中配置一样。#define EXAMPLE_ESP_WIFI_SSID "TP-LINK-4067" /*wifi账号*/ #define EXAMPLE_ESP_WIFI_PASS "weijing418" /*wifi密码*/ #define EXAMPLE_ESP_MAXIMUM_RETRY 5 /*wifi重连最大次数*/
1.2 Smartconfig配网
- 参考工程 Espressif\frameworks\esp-idf-v5.2.1\examples\wifi\smart_config
- 下载配网APP
- 执行命令
idf.py -p COM11 flash monitor
,COM11根据自己实际串口决定
- 打开手机APP EspTouch , 输入账号和密码,最后确认
- 连接成功
1.2 使用 Airkiss 配网
-
参考工程 Espressif\frameworks\esp-idf-v5.2.1\examples\wifi\smart_config
-
修改配网方式,并执行命令
idf.py -p COM11 flash monitor
,COM11根据自己实际串口决定static void smartconfig_example_task(void * parm) { ... ESP_ERROR_CHECK( esp_smartconfig_set_type(SC_TYPE_AIRKISS) ); ... }
配网方式还可以修改为如下
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;
-
在微信公众号 乐鑫信号科技 操作Airkiss
-
连接成功
2 程序优化
例程中的Smart_config 配网,每次复位ESP32后,又得重新配网,不符合实际的应用,这里对代码进行修改,使配网的信息(帐号和密码)被保存在 NVS 中,每次配网之前读取NVS中的信息,如果未配网过,则进行配网操作,如果已经配网过,则直接连接路由器。
2.1 复位后,如果之前有配网,则直接连接路由器,否则执行配网程序
- 在执行
esp_wifi_set_config(WIFI_IF_STA, &wifi_config)
函数之后,之前配网的账号和密码会保存到 NVS 中 - 修改程序如下
static void smartconfig_example_task(void * parm)
{
EventBits_t uxBits;
wifi_config_t my_wifi_config;
// 获取wifi配置信息,如果配置过,就直接连接wifi
esp_wifi_get_config(ESP_IF_WIFI_STA, &my_wifi_config);
if (strlen((char*)my_wifi_config.sta.ssid) > 0)
{
ESP_LOGI(TAG, "alrealy set, ssid is :%s,password is :%s,start connect", my_wifi_config.sta.ssid,my_wifi_config.sta.password);
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) );
}
...
}
执行命令 idf.py -p COM11 flash monitor
,COM11根据自己实际串口决定
2.2 重新配网,删除原来配网保存的信息
2.2.1 擦除整个flash(仅用于调试时)
- 执行
esptool.py erase_flash
擦除整个flash,再次烧录程序就会重新开始手动配网
2.2.2 执行esp_wifi_restore()
函数
- 通过触发按键,例如长按10秒来调用
esp_wifi_restore()
函数,重置配网信息,具体做法这里就不说了,网上找一个现成的按键驱动来关联实现即可。