ESP32 聯(lián)網(wǎng)篇第五講——Smart_config 配網(wǎng))
目錄前言一、WIFI配網(wǎng)1.1 為什么需要配網(wǎng)1.2 常見配網(wǎng)方式二、SmartConfig配網(wǎng)2.1 基本工作原理2.2 SmartConfig 的協(xié)議類型2.2.1 ESPTouch2.2.2 AirKiss2.2.3 ESPTouch v2 的改進(jìn)支持加密支持自定義數(shù)據(jù)更適合產(chǎn)品化2.2.4 手機(jī)操作三、工程實(shí)現(xiàn)3.1 模塊流程3.2 初始化配網(wǎng)模塊3.3 獲取憑據(jù)并連接3.4 Console 啟動(dòng)命令3.5 結(jié)果查看四、免費(fèi)資源總結(jié)前言前面我們已經(jīng)學(xué)習(xí)Station、softAP和now等WIFI技術(shù)現(xiàn)在接觸下一個(gè)模塊——WIFI配網(wǎng)。wifi配網(wǎng)是一個(gè)wifi設(shè)備不可或缺的重要功能wifi配網(wǎng)的方法有很多常見的有SmartConfig、Soft-AP配網(wǎng)、藍(lán)牙配網(wǎng)等每種方法都有其特點(diǎn)和使用場(chǎng)景通常一個(gè)wifi設(shè)備會(huì)支持多種配網(wǎng)方案的組合以便用戶可以根據(jù)實(shí)際情況靈活調(diào)整。本章具體介紹一下SmartConfig方法。一、WIFI配網(wǎng)Wi?Fi 配網(wǎng)Wi?Fi Provisioning就是把無線路由器的 SSIDWi?Fi 名稱和密碼等信息傳遞給一個(gè)尚未聯(lián)網(wǎng)的設(shè)備使設(shè)備能夠以 STAStation模式連接到指定路由器并獲得 IP 地址的過程。1.1 為什么需要配網(wǎng)手機(jī)、電腦通??梢灾苯油ㄟ^界面輸入 Wi?Fi 密碼但許多物聯(lián)網(wǎng)設(shè)備沒有屏幕和鍵盤例如ESP32 開發(fā)板智能插座Wi?Fi 燈泡傳感器節(jié)點(diǎn)無線攝像頭。因此這些設(shè)備需要借助手機(jī)或其他設(shè)備將 Wi?Fi 憑據(jù)傳輸給它之后設(shè)備才能連接家庭路由器并訪問局域網(wǎng)或互聯(lián)網(wǎng)。1.2 常見配網(wǎng)方式配網(wǎng)方式基本原理特點(diǎn)SmartConfig手機(jī)通過 Wi?Fi 數(shù)據(jù)包廣播配網(wǎng)信息設(shè)備監(jiān)聽并解析不需要設(shè)備建立熱點(diǎn)操作較方便SoftAP 配網(wǎng)ESP32 創(chuàng)建臨時(shí)熱點(diǎn)手機(jī)連接該熱點(diǎn)后發(fā)送 Wi?Fi 信息原理直觀、兼容性較好藍(lán)牙 BLE 配網(wǎng)手機(jī)通過藍(lán)牙連接設(shè)備并寫入 Wi?Fi 參數(shù)體驗(yàn)較好適合支持 BLE 的設(shè)備二維碼配網(wǎng)手機(jī)顯示包含 Wi?Fi 信息的二維碼設(shè)備通過攝像頭識(shí)別適合帶攝像頭的設(shè)備有線或串口配網(wǎng)通過 USB、串口等接口寫入網(wǎng)絡(luò)參數(shù)適合調(diào)試和工程生產(chǎn)環(huán)節(jié)需要注意配網(wǎng)不是普通的 Wi?Fi 連接過程。Wi?Fi 連接是設(shè)備已經(jīng)知道 SSID 和密碼之后執(zhí)行的連接動(dòng)作配網(wǎng)則是設(shè)備還不知道這些信息時(shí)先通過某種通信方式獲得網(wǎng)絡(luò)參數(shù)。此外配網(wǎng)過程中會(huì)傳輸 Wi?Fi 密碼因此實(shí)際產(chǎn)品中應(yīng)考慮傳輸安全、配網(wǎng)超時(shí)、錯(cuò)誤重試、憑據(jù)擦除以及防止陌生設(shè)備獲取密碼等問題。二、SmartConfig配網(wǎng)SmartConfig 是一種通過手機(jī)廣播 Wi?Fi 配置信息使未聯(lián)網(wǎng)設(shè)備自動(dòng)獲取路由器 SSID 和密碼并連接到目標(biāo) Wi?Fi 網(wǎng)絡(luò)的配網(wǎng)技術(shù)。它最初由 TI 提出樂鑫在 ESP32 系列芯片中主要通過 ESP-Touch 等協(xié)議實(shí)現(xiàn)。它特別適合 ESP32、智能插座、傳感器等沒有屏幕和鍵盤的“無頭設(shè)備”。用戶只需在手機(jī) App 中輸入 Wi?Fi 密碼并啟動(dòng)配網(wǎng)設(shè)備即可監(jiān)聽并解析手機(jī)發(fā)送的數(shù)據(jù)而不需要手機(jī)直接連接設(shè)備熱點(diǎn)。2.1 基本工作原理以 ESP32 的 ESP-Touch 為例流程大致如下ESP32 進(jìn)入 SmartConfig 模式并開啟 Wi?Fi 混雜模式監(jiān)聽周圍的無線報(bào)文手機(jī)連接目標(biāo)路由器的 Wi?Fi并在 App 中輸入 Wi?Fi 密碼手機(jī)通過 UDP 廣播或組播發(fā)送經(jīng)過編碼的配網(wǎng)數(shù)據(jù)ESP32 根據(jù)報(bào)文長(zhǎng)度、地址等特征提取并解析 SSID、密碼等信息ESP32 退出監(jiān)聽狀態(tài)切換為 STA 模式并連接路由器連接成功后設(shè)備獲取 IP 地址并可向手機(jī)反饋配網(wǎng)結(jié)果。需要注意的是ESP32 在配網(wǎng)初期通常無法直接讀取普通 Wi?Fi 數(shù)據(jù)幀中的應(yīng)用層內(nèi)容因?yàn)闊o線網(wǎng)絡(luò)可能啟用了加密。因此SmartConfig 協(xié)議通常利用報(bào)文長(zhǎng)度等可觀察特征對(duì)數(shù)據(jù)進(jìn)行編碼和傳輸。2.2 SmartConfig 的協(xié)議類型ESP-IDF 文檔中ESP32-S3 等芯片支持 AirKiss、ESPTouch 和 ESPTouch v2 等 SmartConfig 類型。部分 ESP-AT 固件還支持組合模式例如ESP-TOUCH AirKiss。協(xié)議來源或應(yīng)用主要特點(diǎn)適用情況ESPTouch樂鑫 ESP-Touch 方案采用 ESP-Touch 配網(wǎng)機(jī)制適合樂鑫生態(tài)自己開發(fā) ESP32 App 或使用樂鑫示例AirKiss微信生態(tài)常用方案便于與微信及相關(guān)物聯(lián)網(wǎng)平臺(tái)結(jié)合微信小程序、公眾號(hào)或微信生態(tài)配網(wǎng)ESPTouch v2ESPTouch 的改進(jìn)版本支持更完善的安全機(jī)制和自定義數(shù)據(jù)新項(xiàng)目、對(duì)安全性和擴(kuò)展性有要求的產(chǎn)品ESPTouch AirKiss雙協(xié)議模式同時(shí)兼容兩種配網(wǎng)方式希望兼容不同手機(jī) App 或平臺(tái)2.2.1 ESPTouchESPTouch 是樂鑫推出的配網(wǎng)協(xié)議目標(biāo)是讓手機(jī)通過 SmartConfig 機(jī)制把 Wi?Fi 信息傳遞給 ESP8266 或 ESP32 設(shè)備。樂鑫提供了對(duì)應(yīng)的 Android、iOS 端資源及設(shè)備端實(shí)現(xiàn)。它的優(yōu)點(diǎn)是與 ESP-IDF 集成較好適合 ESP32 自定義 App設(shè)備端開發(fā)資料較多可以結(jié)合 ESP-Touch v2 擴(kuò)展安全和自定義數(shù)據(jù)。如果你是在 ESP-IDF 中編寫 ESP32 固件并且控制手機(jī)端 App那么 ESPTouch 通常是更自然的選擇。2.2.2 AirKissAirKiss 更偏向微信生態(tài)。其優(yōu)勢(shì)不是 ESP32 底層性能更好而是便于接入微信相關(guān)的配網(wǎng)流程。相關(guān)平臺(tái)和 App 需要按照 AirKiss 的協(xié)議格式發(fā)送數(shù)據(jù)。它適合微信小程序配網(wǎng)微信公眾號(hào)配網(wǎng)已經(jīng)使用微信物聯(lián)網(wǎng)平臺(tái)的產(chǎn)品不希望單獨(dú)開發(fā)完整手機(jī) App 的場(chǎng)景。因此AirKiss 與 ESPTouch 的主要差異更多體現(xiàn)在手機(jī)端和平臺(tái)生態(tài)而不是 ESP32 的 STA 連接過程。2.2.3 ESPTouch v2 的改進(jìn)ESPTouch v2 是對(duì)傳統(tǒng) ESPTouch 的增強(qiáng)版本重點(diǎn)改善了以下方面支持加密傳統(tǒng) SmartConfig 的風(fēng)險(xiǎn)在于Wi?Fi 密碼會(huì)通過無線環(huán)境傳遞如果沒有額外保護(hù)附近具備監(jiān)聽能力的設(shè)備可能嘗試恢復(fù)配網(wǎng)信息。ESPTouch v2 可以配合 AES 等機(jī)制保護(hù)配網(wǎng)數(shù)據(jù)。這樣即使攻擊者捕獲無線報(bào)文也不能直接得到明文密碼但手機(jī)端和 ESP32 必須使用相同的密鑰或約定配置復(fù)雜度也會(huì)增加。支持自定義數(shù)據(jù)ESPTouch v2 不僅可以傳輸 SSID 和密碼還可以攜帶廠商自定義信息例如設(shè)備編號(hào)產(chǎn)品型號(hào)用戶綁定信息云平臺(tái) Token臨時(shí)配網(wǎng)參數(shù)。不過這些自定義數(shù)據(jù)不應(yīng)直接替代完整的身份認(rèn)證機(jī)制。生產(chǎn)產(chǎn)品仍然需要考慮設(shè)備唯一密鑰、服務(wù)端校驗(yàn)和防重放攻擊。更適合產(chǎn)品化傳統(tǒng) ESPTouch 更適合快速實(shí)現(xiàn)和實(shí)驗(yàn)驗(yàn)證而 ESPTouch v2 更適合產(chǎn)品中使用。尤其是在需要加密、設(shè)備綁定、批量部署和擴(kuò)展字段時(shí)v2 的工程適應(yīng)性更好。一句話概括SmartConfig 就是“手機(jī)通過 Wi?Fi 廣播把網(wǎng)絡(luò)憑據(jù)發(fā)送出去ESP32 監(jiān)聽并解析這些信息然后自動(dòng)連接路由器”的配網(wǎng)方式。2.2.4 手機(jī)操作對(duì)于ESPTouch 和 ESPTouch v2協(xié)議使用的手機(jī)軟件可以去樂鑫官網(wǎng)下載App樂鑫科技Android版本ESP-TOUCH for AndroidIOS版本ESP-TOUCH for iOS使用AirKiss協(xié)議的話微雪公眾號(hào)里搜索《樂鑫信息科技》關(guān)注之后在公眾號(hào)菜單欄選擇“產(chǎn)品資源”“Airkiss設(shè)備”即可配置上網(wǎng)。三、工程實(shí)現(xiàn)模塊以 Console 命令觸發(fā)配網(wǎng) 為入口以SC_EVENT事件為主線在獲取到 Wi-Fi 憑據(jù)后切換到正常的 STA 連接流程并在手機(jī)端確認(rèn)收到 ACK 后結(jié)束 SmartConfig 會(huì)話。工程實(shí)現(xiàn)的核心目標(biāo)如下允許用戶通過串口命令隨時(shí)進(jìn)入 ESPTouch v2 配網(wǎng)模式配網(wǎng)前主動(dòng)斷開舊的 STA 連接避免連接狀態(tài)與配網(wǎng)狀態(tài)沖突在SC_EVENT_GOT_SSID_PSWD中取得 SSID、密碼和可選附加數(shù)據(jù)使用統(tǒng)一的 Wi-Fi 連接邏輯完成入網(wǎng)復(fù)用已有的重連與狀態(tài)管理機(jī)制在配網(wǎng)流程完成后調(diào)用esp_smartconfig_stop()釋放 SmartConfig 相關(guān)資源3.1 模塊流程從用戶輸入配網(wǎng)命令到設(shè)備獲得 IP 地址整體流程如圖所示SmartConfig 只負(fù)責(zé)將網(wǎng)絡(luò)憑據(jù)傳遞給設(shè)備真正的 Wi-Fi 關(guān)聯(lián)、認(rèn)證、DHCP 獲取地址以及后續(xù)掉線重連仍由 Wi-Fi STA 驅(qū)動(dòng)和已有的WIFI_EVENT、IP_EVENT處理邏輯負(fù)責(zé)。3.2 初始化配網(wǎng)模塊配網(wǎng)模塊初始化應(yīng)在 Wi-Fi 基礎(chǔ)設(shè)施準(zhǔn)備完成后執(zhí)行。這里主要完成超時(shí)時(shí)間配置、STA 初始化、SmartConfig 事件注冊(cè)以及 Console 命令注冊(cè)。int wifi_smartconfig_init(uint8_t time_s) { /* 1. 設(shè)置配網(wǎng)超時(shí)時(shí)間秒 */ esp_esptouch_set_timeout(time_s); /* 2. 初始化 STA攜帶配網(wǎng)標(biāo)志STA_START 時(shí)自動(dòng)啟動(dòng)配網(wǎng) */ wifi_station_init(ESP32C6, smartconfig_mode); /* 3. 注冊(cè) SC_EVENT 回調(diào)須在事件循環(huán)創(chuàng)建之后 */ ESP_ERROR_CHECK(esp_event_handler_instance_register(SC_EVENT, ESP_EVENT_ANY_ID, wifi_event_handler, NULL, NULL)); /* 4. 注冊(cè) smartconfig 控制臺(tái)命令 */ register_smartconfig_cmd(); ESP_LOGI(TAG, 智能配網(wǎng)模塊已初始化當(dāng)前版本: %s, esp_smartconfig_get_version()); return ESP_OK; }esp_esptouch_set_timeout()用于設(shè)置 ESPTouch 的超時(shí)周期。若設(shè)備在指定時(shí)間內(nèi)未完成配網(wǎng)SmartConfig 會(huì)重新開始掃描和監(jiān)聽超時(shí)時(shí)間不宜設(shè)置過短否則用戶尚未來得及在手機(jī)端發(fā)起配網(wǎng)設(shè)備就可能提前進(jìn)入下一輪掃描。建議在實(shí)際產(chǎn)品中將超時(shí)時(shí)間設(shè)置為 60 至 120 秒并在超時(shí)、連續(xù)失敗或用戶主動(dòng)取消時(shí)給出 LED、蜂鳴器或串口日志等明確反饋。3.3 獲取憑據(jù)并連接以下代碼放在統(tǒng)一事件處理函數(shù)中用于處理SC_EVENT。實(shí)現(xiàn)重點(diǎn)是先解析事件數(shù)據(jù)再填充wifi_config_t最后由esp_wifi_connect()啟動(dòng)正常 STA 連接。/* SC 事件 */ else if(event_base SC_EVENT) { switch (event_id) { /* ---------- SC_EVENT_SCAN_DONE — 配網(wǎng)掃描完成 ---------- * SmartConfig 內(nèi)部掃描結(jié)束需再次觸發(fā)掃描直至鎖定目標(biāo)信道 */ case SC_EVENT_SCAN_DONE: break; /* ---------- SC_EVENT_FOUND_CHANNEL — 已定位目標(biāo) AP 信道 ---------- */ case SC_EVENT_FOUND_CHANNEL: wifi_event.is_connected false; wifi_event.is_connecting true; /* 連接已完成 */ wifi_event.retry_count 0; wifi_event.retry_enabled true; ESP_LOGI(TAG, SmartConfig 找到目標(biāo)AP的信道); break; /* ---------- SC_EVENT_GOT_SSID_PSWD — 配網(wǎng)成功獲得 SSID/密碼 ---------- * 解析結(jié)果同步進(jìn) wifi_event 結(jié)構(gòu)體與 connect 命令共用同一狀態(tài) * 復(fù)用 wifi_station_connect() 發(fā)起連接 —— 后續(xù) STA_CONNECTED / * STA_DISCONNECTED 按原分類策略處理不產(chǎn)生路徑?jīng)_突。 */ case SC_EVENT_GOT_SSID_PSWD: { smartconfig_event_got_ssid_pswd_t *evt (smartconfig_event_got_ssid_pswd_t *)event_data; if (evt NULL) { ESP_LOGW(TAG, GOT_SSID_PSWD 事件數(shù)據(jù)為空忽略); break; } ESP_LOGI(TAG, SmartConfig 獲取到 SSID 和密碼); ESP_LOGI(TAG, SmartConfig SSID: %s, evt-ssid); ESP_LOGI(TAG, SmartConfig Password: %s, evt-password); /* ESPTouch V2 附加數(shù)據(jù)讀取事件回調(diào)中避免 abort僅告警 */ if (evt-type SC_TYPE_ESPTOUCH_V2) { uint8_t rvd_data[33] { 0 }; esp_err_t ret esp_smartconfig_get_rvd_data(rvd_data, sizeof(rvd_data)); if (ret ! ESP_OK) { ESP_LOGW(TAG, 讀取 ESPTouch V2 附加數(shù)據(jù)失敗: %s, esp_err_to_name(ret)); } else { ESP_LOGI(TAG, RVD_DATA:%s, rvd_data); } } wifi_config_t wifi_config { .sta { .scan_method WIFI_ALL_CHANNEL_SCAN, .failure_retry_cnt 3, .threshold.authmode WIFI_AUTH_OPEN }, }; memcpy(wifi_config.sta.ssid, evt-ssid, sizeof(wifi_config.sta.ssid)); memcpy(wifi_config.sta.password, evt-password, sizeof(wifi_config.sta.password)); ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, wifi_config)); esp_err_t ret esp_wifi_connect(); if (ret ! ESP_OK) { ESP_LOGE(TAG, 連接啟動(dòng)失敗: %s, esp_err_to_name(ret)); return; } break; } /* ---------- SC_EVENT_SEND_ACK_DONE — 已向手機(jī)回復(fù) ACK ---------- */ case SC_EVENT_SEND_ACK_DONE: { ESP_LOGI(TAG, SmartConfig 成功, 向目標(biāo)AP發(fā)送 ACK 完成); esp_err_t ret esp_smartconfig_stop(); if (ret ! ESP_OK) { ESP_LOGW(TAG, 停止 SmartConfig 失敗: %s, esp_err_to_name(ret)); } break; } /* ---------- 未顯式處理的 SC 事件 ---------- */ default: ESP_LOGD(TAG, 未處理的 SC 事件 (ID% PRIi32 )忽略, event_id); break; } }當(dāng)手機(jī)端使用 ESPTouch v2 發(fā)起配網(wǎng)時(shí)除了 SSID 與密碼還可以附帶一段自定義保留數(shù)據(jù)Reserved Data簡(jiǎn)稱 RVD Data。該數(shù)據(jù)可用于傳遞臨時(shí)綁定 Token、設(shè)備激活參數(shù)、區(qū)域標(biāo)識(shí)或業(yè)務(wù)配置標(biāo)志等信息。3.4 Console 啟動(dòng)命令為了方便調(diào)試和測(cè)試本工程將 SmartConfig 封裝為獨(dú)立的 Console 命令。執(zhí)行命令前先斷開現(xiàn)有網(wǎng)絡(luò)再停止殘留會(huì)話可以通過命令參數(shù)來選擇SmartConfig 的協(xié)議類型。static int smartconfig_cmd_handler(int argc, char **argv) { wifi_ap_record_t ap_info; /* 1. 解析配網(wǎng)協(xié)議類型默認(rèn) ESPTouch V2無需參數(shù)即可直接啟動(dòng) */ smartconfig_type_t sc_type SC_TYPE_ESPTOUCH_V2; if (argc 2) { if (strcmp(argv[1], espv2) 0) { sc_type SC_TYPE_ESPTOUCH_V2; } else if (strcmp(argv[1], air) 0) { sc_type SC_TYPE_AIRKISS; } else { printf(用法: smartconfig [espv2|air]\r\n); printf( espv2 - ESPTouch V2 配網(wǎng)默認(rèn)\r\n); printf( air - AirKiss 配網(wǎng)\r\n); return 1; } } /* 2. 檢查聯(lián)網(wǎng)狀態(tài)已連接或連接中則先斷開SmartConfig 要求空閑 */ if (wifi_event.is_connecting || esp_wifi_sta_get_ap_info(ap_info) ESP_OK) { ESP_LOGI(TAG, 檢測(cè)到已有連接先斷開舊連接); wifi_event.retry_enabled false; esp_err_t ret esp_wifi_disconnect(); if (ret ! ESP_OK) { ESP_LOGW(TAG, 斷開舊連接失敗: %s, esp_err_to_name(ret)); return 1; } while (esp_wifi_sta_get_ap_info(ap_info) ESP_OK ) { vTaskDelay(pdMS_TO_TICKS(100)); } } /* 3. 停止可能殘留的舊配網(wǎng)會(huì)話冪等 */ esp_err_t ret esp_smartconfig_stop(); if (ret ! ESP_OK) { ESP_LOGD(TAG, 無正在運(yùn)行的配網(wǎng)會(huì)話: %s, esp_err_to_name(ret)); } /* 4. 啟動(dòng) SmartConfig 配網(wǎng) */ ESP_ERROR_CHECK(esp_smartconfig_set_type(sc_type)); smartconfig_start_config_t cfg SMARTCONFIG_START_CONFIG_DEFAULT(); ret esp_smartconfig_start(cfg); if (ret ! ESP_OK) { ESP_LOGE(TAG, SmartConfig 啟動(dòng)失敗: %s, esp_err_to_name(ret)); return 1; } ESP_LOGI(TAG, SmartConfig(%s) 配網(wǎng)已啟動(dòng)請(qǐng)用手機(jī) App 發(fā)送 WiFi 憑證, (sc_type SC_TYPE_AIRKISS) ? AirKiss : ESPTouch V2); return 0; }這種“先斷開、再清理、后啟動(dòng)”的流程能避免設(shè)備同時(shí)處于舊網(wǎng)絡(luò)重連和 SmartConfig 監(jiān)聽狀態(tài)從而減少狀態(tài)競(jìng)爭(zhēng)和日志混亂。對(duì)于使用自動(dòng)重連機(jī)制的工程尤其要先關(guān)閉retry_enabled否則斷開舊連接后重連任務(wù)可能會(huì)搶占配網(wǎng)流程。3.5 結(jié)果查看注意以下內(nèi)容我是在手機(jī)熱點(diǎn)作為AP嘗試的成功實(shí)現(xiàn)同時(shí)我嘗試了用另一塊ESP32的softAP功能但始終無法連接成功。好像對(duì)于ESP32的softAP使用ESPTouch v2配網(wǎng)無法接收配網(wǎng)數(shù)據(jù)包。不知是不是有其他遺漏之處若有同學(xué)實(shí)現(xiàn)了還請(qǐng)留言不勝感激展示使用ESPTouch v2協(xié)議對(duì)于AirKiss協(xié)議更加間接更換協(xié)議只需要在Console 啟動(dòng)命令中輸入對(duì)應(yīng)參數(shù)皆可。板子上電后控制臺(tái)輸入命令smartconfig會(huì)啟動(dòng) smartconfig 配網(wǎng)功能當(dāng)代碼調(diào)用esp_smartconfig_start后此時(shí)ESP32 并不知道手機(jī)在哪個(gè)信道上發(fā)包所以驅(qū)動(dòng)會(huì)把當(dāng)前環(huán)境中所有信道都便利一遍。當(dāng)查找到環(huán)境中所有可用信道后比如1、6、11接下來會(huì)不斷在這些信道輪詢交替用來監(jiān)聽可能或出現(xiàn)的數(shù)據(jù)包。類似如下注意要明白一個(gè)前提兩個(gè)無線設(shè)備只要處于同樣信道下便可通信這是電磁波的特性頻率相同只不過于人們?cè)O(shè)置了各種協(xié)議和保護(hù)通信得到的數(shù)據(jù)包無法解析。此時(shí)先給手機(jī)連接上一個(gè)2.4G的wifi然后打開手機(jī)ESPTouch軟件選擇SmartConfig 的協(xié)議此時(shí)ESP32 就抓住了空中SmartConfig 配網(wǎng)數(shù)據(jù)包觸發(fā)SC_EVENT_FOUND_CHANNEL事件此時(shí)會(huì)等待我們?cè)O(shè)定的超時(shí)時(shí)間再該時(shí)間內(nèi)我們只要在手機(jī)ESPTouch軟件輸入該wifi的SSID和密碼ESP32就會(huì)觸發(fā)SC_EVENT_GOT_SSID_PSWD事件從而獲得這些信息就能成功聯(lián)網(wǎng)了。在我的代碼中如果想換一個(gè)wifi只需要控制臺(tái)輸入 smartconfig 命令就能重新啟動(dòng)SmartConfig從而可以連接新的wifi。需要注意獲取到 SSID 和密碼并不代表已經(jīng)聯(lián)網(wǎng)成功實(shí)際工程中應(yīng)以IP_EVENT_STA_GOT_IP作為 STA 聯(lián)網(wǎng)成功的判斷依據(jù)。四、免費(fèi)資源以上完整工程可以進(jìn)入我的Gitee中下載《https://gitee.com/pai-schoolmate/esp32_project.git》本工程路徑esp32_project-main\function\provisioning總結(jié)在工程設(shè)計(jì)上本文采用事件驅(qū)動(dòng)方式處理SC_EVENT、WIFI_EVENT和IP_EVENT通過 Console 命令啟動(dòng)配網(wǎng)并對(duì)舊連接、自動(dòng)重連、憑據(jù)解析和 SmartConfig 會(huì)話進(jìn)行統(tǒng)一管理。實(shí)踐表明SC_EVENT_GOT_SSID_PSWD僅代表設(shè)備成功獲取網(wǎng)絡(luò)參數(shù)最終應(yīng)以IP_EVENT_STA_GOT_IP作為聯(lián)網(wǎng)成功的判斷依據(jù)。SmartConfig 具有使用便捷、無需額外硬件和適合無屏設(shè)備等特點(diǎn)但其穩(wěn)定性受手機(jī)、路由器頻段及無線環(huán)境影響。實(shí)際產(chǎn)品中還應(yīng)進(jìn)一步完善配網(wǎng)超時(shí)、失敗重試、憑據(jù)保護(hù)、設(shè)備綁定和備用配網(wǎng)方案以提升系統(tǒng)的可靠性、安全性與產(chǎn)品適應(yīng)性。