本文內容
1)使用smart_config例程,使用樂鑫ESPTouch APP或者微信公眾號配網(wǎng)。
2)修改smart_config例程,使ESP32復位后,如果已配過網(wǎng),則不再進行配網(wǎng),而是直接連接路由器上網(wǎng),使貼近實際項目開發(fā)。
一、首先完成集成開發(fā)環(huán)境搭建:
圖文手把手教程(史上最強):windows下ESP32集成開發(fā)環(huán)境搭建和HelloWorld顯示(樂鑫官方推薦方法-使用VSCode安裝ESP-IDF插件)
二、下載樂鑫官方APP和關注樂鑫官方公眾號
1)樂鑫官方APP下載鏈接:https://www.espressif.com.cn/zh-hans/support/download/apps
2)微信關注“樂鑫信息科技”公眾號。
三、主流WIFI 配網(wǎng)方式簡單介紹。
目前主流的 WIFI 配網(wǎng)方式主要有以下 三 種:
1)?SoftAP配網(wǎng)
ESP32?會建立一個 WiFi 熱點(AP模式),用戶將手機連接到這個熱點后,將要連接的 WiFi 信息發(fā)送給 ESP32,ESP32得到ssid和password。
優(yōu)點:這種方式很可靠,成功率基本達到100%,設備端的代碼也簡單。
缺點:需要手動切換手機wifi連接的網(wǎng)絡,先連接到ESP32的AP網(wǎng)絡,配置完成后再恢復連接正常wifi網(wǎng)絡,操作上有一定的復雜性,會給用戶帶來一定的困擾。
官方支持:沒有提供Demo。
2)Smartconfig配網(wǎng)
ESP32處于混雜模式下,監(jiān)聽網(wǎng)絡中的所有報文,手機APP將當前連接的ssid和password編碼到UDP報文中,通過廣播或者組播的方式發(fā)送報文,ESP32接收到UDP報文后解碼,得到ssid和password,然后使用該組ssid和password去連接網(wǎng)絡。
優(yōu)缺點:這種方式簡潔,用戶也很容易操作,但是配網(wǎng)成功率受環(huán)境影響較大。
官方支持:有提供Demo,smart_config例程。
3)Airkiss配網(wǎng)
AirKiss是微信硬件平臺提供的一種WIFI設備快速入網(wǎng)配置技術,要使用微信客戶端的方式配置設備入網(wǎng),需要設備支持AirKiss技術。Aiskiss的原理和smartconfig很類似,設備工作在混雜模式下,微信客戶端發(fā)送包含ssid和password的廣播包,設備收到廣播包解碼得到ssid和password,詳細的可以參考微信官方的介紹。
優(yōu)缺點:這種方式簡潔,用戶也很容易操作,但是配網(wǎng)成功率受環(huán)境影響較大。
官方支持:有提供Demo,smart_config例程。
四、運行smart_config例程,使用APP和微信配網(wǎng)。
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框架與示例是分離的,所以示例保存的路徑可以隨意,但需要注意:路徑不能有中文和空格,否則報錯。
創(chuàng)建完后,如下圖所示。
2)編譯、下載到ESP32開發(fā)板,打開串口監(jiān)控,如下圖所示。
?3)打開手機APP EspTouch進行配網(wǎng)。
?
APP點擊確認后,觀察VSCODE中的串口監(jiān)控打印的信息,并沒有提示配網(wǎng)成功,而是看到錯誤的信息:smartconfig:setsockopt failed。
原因:是樂鑫官方的ESP-IDF存在BUG,官方修復問題的鏈接:
https://github.com/espressif/esp-idf/commit/2e31779931599bfb38c0c9420ef30177f130e1f9
?根據(jù)目錄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開發(fā)板,打開串口監(jiān)控,這時顯示配網(wǎng)成功,如下圖所示。
?
配網(wǎng)成功后,APP會彈出配網(wǎng)完成的信息,如下圖所示,如果失敗,是不會彈出的。
5)使用微信公眾號配網(wǎng)。
微信公眾號配網(wǎng)與APP配網(wǎng)的例程是一樣的,只需要修改配網(wǎng)的類型即可,配網(wǎng)的類型如下:
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和微信配網(wǎng),修改完后重新編譯、下載到ESP32開發(fā)板中。
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設備。
?打開串口監(jiān)控,顯示的信息與APP配網(wǎng)基本是一樣的。
?至此,使用APP和微信公眾號配網(wǎng)全部完成,但是有缺點,即ESP32每次復位后都需要進行配網(wǎng),并沒有保存原來配網(wǎng)的信息,故這里需要優(yōu)化代碼。
五、優(yōu)化配網(wǎng)代碼,使貼合實際應用。
1)例程中的Smart_config?配網(wǎng),每次復位ESP32后,又得重新配網(wǎng),不符合實際的應用,這里對代碼進行修改,使配網(wǎng)的信息(帳號和密碼)被保存在 NVS 中,每次配網(wǎng)之前讀取NVS中的信息,如果未配網(wǎng)過,則進行配網(wǎng)操作,如果已經(jīng)配網(wǎng)過,則直接連接路由器。
2)smartconfig_main.c->修改smartconfig_example_task()任務函數(shù),修改如下:
//配網(wǎng)任務函數(shù)
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();
}
// 如果沒有配置過,就進行配網(wǎng)操作
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)
{
// 復位后,如果已經(jīng)配網(wǎng)過,則不會再進行配網(wǎng),
// 只打印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"); // 配網(wǎng)結束
esp_smartconfig_stop();
vTaskDelete(NULL);// 關閉線程
}
}
}
?3)編譯、下載到ESP32開發(fā)板中,并打開串口監(jiān)控。
可以看到之前配網(wǎng)的信息,已經(jīng)被保存在NVS中了,增加判斷后,就不會重新配網(wǎng),而是直接連接到路由器上網(wǎng)了。
?4)想要重新配網(wǎng),怎么辦?
想要重新配網(wǎng),需要刪除原來配網(wǎng)保存的信息,這里提供兩種方法。
方法一:擦除整片F(xiàn)lash,僅僅適合調試用。
在VSCODE中打開終端工具ESP-IDF Terminal,然后輸入以下命令,然后按Enter。
python E:\ESP32-IDF\esp\esp-idf\components\esptool_py\esptool\esptool.py?erase_flash
?注意:每個人的ESP-IDF存放路徑都不一樣,需要根據(jù)自己的路徑來找到esptool.py,然后使用擦除flash命令erase_flash。
重新下載程序,并打開串口監(jiān)控,顯示沒有配網(wǎng)信息,需要重新配網(wǎng),按上面的流程,使用APP和微信公眾號配網(wǎng)即可。
方法二:增加一個按鍵來重置配網(wǎng)信息,適用實際項目開發(fā)。
通過觸發(fā)按鍵,例如長按10秒來調用esp_wifi_restore()函數(shù),重置配網(wǎng)信息,具體做法這里就不說了,網(wǎng)上找一個現(xiàn)成的按鍵驅動來關聯(lián)實現(xiàn)即可。
至此,關于smart_config配網(wǎng)的內容全部完畢,愉快的玩耍吧!
完整的例程代碼下載: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。
?
本文參考了以下博客,鳴謝!文章來源:http://www.zghlxwxcb.cn/news/detail-417973.html
ESP32-C3入門教程 網(wǎng)絡 篇(二、 Wi-Fi 配網(wǎng) — Smart_config方式 和 BlueIF方式)_矜辰所致的博客-CSDN博客_esp32 wifi配網(wǎng)
ESP32存儲配網(wǎng)信息,上電重啟均可自動重連之前配置的無線網(wǎng)絡_荻夜的博客-CSDN博客_esp32 wifi 重啟文章來源地址http://www.zghlxwxcb.cn/news/detail-417973.html
到了這里,關于圖文手把手教程--ESP32 一鍵配網(wǎng)(Smartconfig、Airkiss)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!