Flutter项目中无法验证用户输入的Wi-Fi密码与SSID匹配的问题
解决Flutter验证WiFi密码时断开当前连接且验证失效的问题
开发项目中,需通过Flutter收集WiFi凭证(SSID/密码),再用flutter_blue_plus通过蓝牙发送给Arduino Nano IoT 33实现联网。但使用WiFiForIoTPlugin等库验证密码时,会触发以下问题:
- 验证过程中Flutter设备会断开当前WiFi连接,影响后续MQTT等网络操作
- 验证逻辑失效:无论密码对错,首次调用返回
false,再次调用返回true并跳转页面,无法准确判断凭证有效性
可行解决方案
1. 让Arduino侧负责WiFi凭证验证(最优方案)
核心逻辑:Flutter仅负责收集用户输入的SSID和密码,通过蓝牙发送给Arduino;由Arduino尝试连接目标WiFi,再将连接结果(成功/失败)回传给Flutter。
- 优势:完全不影响Flutter设备的当前网络连接,验证结果由目标设备直接返回,准确性100%
- Arduino侧示例代码:
#include <WiFiNINA.h> #include <BluetoothSerial.h> BluetoothSerial SerialBT; void setup() { SerialBT.begin("ArduinoIoT"); // 初始化蓝牙 } void loop() { if (SerialBT.available()) { String credentials = SerialBT.readStringUntil('\n'); // 拆分SSID和密码(假设格式为"SSID,PASSWORD") int commaIndex = credentials.indexOf(','); String ssid = credentials.substring(0, commaIndex); String password = credentials.substring(commaIndex+1); // 尝试连接WiFi WiFi.begin(ssid.c_str(), password.c_str()); unsigned long timeout = millis() + 5000; // 5秒超时 while (WiFi.status() != WL_CONNECTED && millis() < timeout) { delay(500); } // 返回结果 if (WiFi.status() == WL_CONNECTED) { SerialBT.println("SUCCESS"); WiFi.disconnect(); // 断开连接,等待后续正式使用 } else { SerialBT.println("FAILED"); } } } - Flutter侧逻辑:发送凭证后监听蓝牙返回的结果,根据
SUCCESS/FAILED判断是否跳转页面。
2. 若必须在Flutter侧验证,添加严谨的恢复与校验逻辑
如果一定要在Flutter端验证,需增加状态稳定等待、原有连接恢复逻辑,尽量降低断网影响:
Future<bool> validateWiFi(String ssid, String password) async { final originalSSID = await WiFiForIoTPlugin.getSSID(); bool isValid = false; try { // 尝试连接目标WiFi bool connectResult = await WiFiForIoTPlugin.findAndConnect( ssid, password: password, withInternet: false, ); // 等待2秒确保连接状态稳定 await Future.delayed(const Duration(seconds: 2)); final currentSSID = await WiFiForIoTPlugin.getSSID(); final status = await WiFiForIoTPlugin.getWiFiStatus(); // 双重校验:连接结果为true、当前SSID匹配、状态为已连接 isValid = connectResult && currentSSID == ssid && status == WiFiStatus.connected; } catch (e) { print("验证错误: $e"); } finally { // 恢复原有WiFi连接 if (originalSSID.isNotEmpty && originalSSID != ssid) { await WiFiForIoTPlugin.findAndConnect(originalSSID); } } return isValid; }
- 注意:该方案仍可能导致短暂断网,且部分设备无法恢复原有连接,仅作为备选。
总结
最可靠的方案是将WiFi凭证验证逻辑转移到Arduino端,既避免了Flutter设备的断网问题,又能得到准确的验证结果,完全匹配项目需求。
内容的提问来源于stack exchange,提问作者Paco
相关产品推荐
相关产品推荐

