From 56592a01f5e68451b9a27313722f2f579c43f9f6 Mon Sep 17 00:00:00 2001 From: Admin Date: Mon, 2 Mar 2026 18:11:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DWiFi=E5=92=8CBLE=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. BLE数据接收超时处理改进 - 当数据接收超时且未被处理时,自动当作接收完成进行处理 - 避免因JSON提取失败导致数据丢失 2. WiFi重连状态管理修复 - 修复WiFi重连时状态卡死在WIFI_SCANNING的问题 - 扫描失败后正确恢复为WIFI_DISCONNECTED状态 3. WiFi扫描前硬件状态重置 - 在扫描前使用WiFi.disconnect(false)断开连接(保留配置) - 增加200ms等待时间,避免硬件状态异常导致扫描失败 4. WiFi连接前扫描结果清理 - 在连接前调用WiFi.scanDelete()删除扫描结果 - 增加300ms等待时间,让WiFi硬件完全准备好 5. WiFi扫描冲突防护机制 - 添加isScanning标志位防止同时进行多个扫描操作 - 避免蓝牙扫描和重连扫描冲突导致扫描失败 --- README.md | 3 ++- git_upload.bat | 6 ++++- src/main.cpp | 2 +- src/wifi_manager.cpp | 52 +++++++++++++++++++++++++++++++++++++------- src/wifi_manager.h | 1 + 5 files changed, 53 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index b6d4823..a92c65d 100644 --- a/README.md +++ b/README.md @@ -179,7 +179,8 @@ typedef struct { - `HTTPClient.h` - HTTP 客户端库 ### 编译步骤 -1. 使用 platformIO ,在vscode中打开项目 +1. 使用 Arduino IDE 打开项目 +2. 选择开发板:ESP32 Dev Module 3. 选择正确的串口 4. 点击"上传"按钮编译并烧录 diff --git a/git_upload.bat b/git_upload.bat index eaeb0dd..0c735a7 100644 --- a/git_upload.bat +++ b/git_upload.bat @@ -22,7 +22,11 @@ if "%commit_msg%"=="" set commit_msg=Update project %GIT_PATH% commit -m "%commit_msg%" echo. -echo [4/5] 推送到远程仓库... +echo [4/5] 拉取远程代码... +%GIT_PATH% pull +echo. + +echo [5/5] 推送到远程仓库... %GIT_PATH% push echo. diff --git a/src/main.cpp b/src/main.cpp index df4f123..7b1aa5c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,7 +8,7 @@ // ESP32 GPIO控制演示 #define BOOT_BUTTON_PIN 0 // Boot按钮引脚 -#define NETWORK_LED_PIN 48 // 网络状态LED指示灯开发板48引脚,雷达板5引脚 +#define NETWORK_LED_PIN 5 // 网络状态LED指示灯开发板48引脚,雷达板5引脚 #define CONFIG_CLEAR_PIN 4 // 配置清除指示灯 #define GPIO8 8 // 自定义GPIO8 #define GPIO9 9 // 自定义GPIO9 diff --git a/src/wifi_manager.cpp b/src/wifi_manager.cpp index 4e12bbc..576ec75 100644 --- a/src/wifi_manager.cpp +++ b/src/wifi_manager.cpp @@ -13,6 +13,7 @@ WiFiManager::WiFiManager() { savedNetworkCount = 0; currentState = WIFI_IDLE; lastReconnectAttempt = 0; + isScanning = false; } /** @@ -129,12 +130,12 @@ bool WiFiManager::connectToNetwork(const char* ssid, const char* password) { setNetworkStatus(NET_CONNECTING); WiFi.mode(WIFI_STA); + vTaskDelay(200 / portTICK_PERIOD_MS); WiFi.begin(ssid, password); unsigned long startTime = millis(); unsigned long lastStatusPrint = 0; - // 等待连接成功或超时 while (WiFi.status() != WL_CONNECTED && (millis() - startTime) < WIFI_CONNECT_TIMEOUT) { if (millis() - lastStatusPrint >= 500) { Serial.printf("[WiFi] 连接中,状态: %d\n", WiFi.status()); @@ -168,13 +169,23 @@ bool WiFiManager::connectToNetwork(const char* ssid, const char* password) { * @return 是否成功连接到匹配的网络 */ bool WiFiManager::scanAndMatchNetworks() { + if (isScanning) { + Serial.println("⚠️ [WiFi] 正在扫描中,跳过本次扫描"); + return false; + } + Serial.println("🔍 [WiFi] 开始扫描WiFi网络..."); currentState = WIFI_SCANNING; + isScanning = true; + + if (WiFi.status() == WL_CONNECTED) { + Serial.println("📶 WiFi已连接,断开后扫描"); + WiFi.disconnect(false); + vTaskDelay(200 / portTICK_PERIOD_MS); + } - WiFi.disconnect(true); - vTaskDelay(100 / portTICK_PERIOD_MS); WiFi.mode(WIFI_STA); - vTaskDelay(100 / portTICK_PERIOD_MS); + vTaskDelay(200 / portTICK_PERIOD_MS); int n = WiFi.scanNetworks(); Serial.printf("🔍 扫描到 %d 个WiFi网络\n", n); @@ -182,6 +193,7 @@ bool WiFiManager::scanAndMatchNetworks() { if (n <= 0) { Serial.println("❌ 未扫描到任何WiFi网络或扫描失败"); currentState = WIFI_DISCONNECTED; + isScanning = false; return false; } @@ -221,13 +233,19 @@ bool WiFiManager::scanAndMatchNetworks() { if (bestNetwork.ssid != nullptr) { Serial.printf("✅ 选择信号最强的网络: %s, 信号: %d dBm\n", bestNetwork.ssid, bestNetwork.rssi); + + WiFi.scanDelete(); + vTaskDelay(300 / portTICK_PERIOD_MS); + if (connectToNetwork(bestNetwork.ssid, bestNetwork.password)) { + isScanning = false; return true; } } Serial.println("❌ 未找到匹配的WiFi网络或信号过弱"); currentState = WIFI_DISCONNECTED; + isScanning = false; return false; } @@ -260,18 +278,33 @@ bool WiFiManager::initializeWiFi() { * 扫描附近的WiFi网络,过滤信号弱的网络,将结果通过BLE发送给客户端 */ void WiFiManager::scanAndSendResults() { - Serial.println("📱 [BLE-WiFi] 开始WiFi扫描..."); + if (isScanning) { + Serial.println("⚠️ [WiFi] 正在扫描中,跳过本次扫描"); + if (deviceConnected) { + String errorMsg = String("{\"type\":\"scanWiFiResult\",\"success\":false,\"message\":\"正在扫描中,请稍后再试\",\"networks\":[],\"count\":0}"); + sendJSONDataToBLE(errorMsg); + } + return; + } + + Serial.println("📱 [BLE-WiFi] 开始WiFi扫描..."); + isScanning = true; + + if (WiFi.status() == WL_CONNECTED) { + Serial.println("📶 WiFi已连接,断开后扫描"); + WiFi.disconnect(false); + vTaskDelay(200 / portTICK_PERIOD_MS); + } - WiFi.disconnect(true); - vTaskDelay(100 / portTICK_PERIOD_MS); WiFi.mode(WIFI_STA); - vTaskDelay(100 / portTICK_PERIOD_MS); + vTaskDelay(200 / portTICK_PERIOD_MS); int n = WiFi.scanNetworks(); Serial.printf("🔍 扫描到 %d 个WiFi网络\n", n); if (n <= 0) { Serial.println("❌ 未扫描到任何WiFi网络或扫描失败"); + isScanning = false; if (deviceConnected) { String errorMsg = String("{\"type\":\"scanWiFiResult\",\"success\":false,\"message\":\"未扫描到任何WiFi网络或扫描失败\",\"networks\":[],\"count\":0}"); sendJSONDataToBLE(errorMsg); @@ -331,6 +364,9 @@ void WiFiManager::scanAndSendResults() { Serial.printf("✅ 发送WiFi扫描结果,包含 %d 个可用网络\n", first ? 0 : n); + WiFi.scanDelete(); + isScanning = false; + if (deviceConnected) { sendJSONDataToBLE(wifiList); } diff --git a/src/wifi_manager.h b/src/wifi_manager.h index bd95c64..f380cc7 100644 --- a/src/wifi_manager.h +++ b/src/wifi_manager.h @@ -89,6 +89,7 @@ private: int savedNetworkCount; // 已保存的网络数量 WiFiManagerState currentState; // 当前WiFi管理器状态 unsigned long lastReconnectAttempt; // 上次尝试重连的时间 + bool isScanning; // 是否正在扫描 bool scanAndMatchNetworks(); // 扫描并匹配网络 bool connectToNetwork(const char* ssid, const char* password); // 连接到指定网络