修复WiFi和BLE相关问题

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标志位防止同时进行多个扫描操作
   - 避免蓝牙扫描和重连扫描冲突导致扫描失败
This commit is contained in:
Admin
2026-03-02 18:11:11 +08:00
parent bdf2be1c16
commit 56592a01f5
5 changed files with 53 additions and 11 deletions

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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); // 连接到指定网络