WiFiConfig.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "WiFiConfig.h"
  2. #include <Arduino.h>
  3. // 持久化存储
  4. Preferences preferences;
  5. // 持久化存储的参数
  6. String deviceID; //MAC地址 id
  7. String serverAddress; //mqtt服务器地址
  8. uint16_t serverPort; //mqtt端口
  9. uint16_t otaPort; // 新增 OTA 端口号
  10. // 加载服务器参数
  11. void loadServerParams() {
  12. preferences.begin("settings", true);
  13. serverAddress = preferences.getString("serverAddress", "192.168.3.31"); //mqtt地址
  14. serverPort = preferences.getUInt("serverPort", 1883); //mqtt端口
  15. otaPort = preferences.getUInt("otaPort", 2999); // 新增 OTA 端口号,默认 2999
  16. preferences.end();
  17. Serial.println("[信息] 加载服务器参数:");
  18. Serial.println("服务器地址: " + serverAddress); // 打印服务器地址
  19. Serial.println("服务器端口: " + String(serverPort)); // 打印 MQTT 端口号
  20. Serial.println("OTA 端口: " + String(otaPort)); // 打印 OTA 端口号
  21. }
  22. // 保存参数回调
  23. void saveParamsCallback() {
  24. Serial.println("[信息] 正在保存自定义参数...");
  25. preferences.begin("settings", false);
  26. preferences.putString("serverAddress", serverAddress); // 保存 MQTT 服务器地址
  27. preferences.putUInt("serverPort", serverPort); // 保存 MQTT 端口号
  28. preferences.putUInt("otaPort", otaPort); // 保存 OTA 端口号
  29. preferences.end();
  30. Serial.println("[信息] 参数保存成功。");
  31. }
  32. // WiFi 配网功能
  33. void setupWiFiConfig() {
  34. WiFiManager wifiManager;
  35. setConstantOn(true); // LED 常亮
  36. // 创建 WiFiManagerParameter 对象
  37. WiFiManagerParameter customServer("server", "服务器地址", serverAddress.c_str(), 40);
  38. WiFiManagerParameter customPort("port", "服务器端口", String(serverPort).c_str(), 6);
  39. WiFiManagerParameter customOtaPort("otaPort", "OTA 端口", String(otaPort).c_str(), 6); // 新增 OTA 端口配置
  40. // 添加参数
  41. wifiManager.addParameter(&customServer);
  42. wifiManager.addParameter(&customPort);
  43. wifiManager.addParameter(&customOtaPort); // 添加 OTA 端口配置
  44. // 设置保存参数回调
  45. wifiManager.setSaveParamsCallback([&customServer, &customPort, &customOtaPort]() {
  46. // 直接从已有的 WiFiManagerParameter 对象中获取值
  47. serverAddress = customServer.getValue();
  48. serverPort = String(customPort.getValue()).toInt();
  49. otaPort = String(customOtaPort.getValue()).toInt(); // 保存 OTA 端口号
  50. // 打印调试信息
  51. Serial.println("[调试] 保存参数:");
  52. Serial.println("服务器地址: " + serverAddress);
  53. Serial.println("服务器端口: " + String(serverPort));
  54. Serial.println("OTA 端口: " + String(otaPort));
  55. // 调用保存参数函数
  56. saveParamsCallback();
  57. });
  58. // 设置配置模式超时时间
  59. wifiManager.setConfigPortalTimeout(50); // 配置模式超时时间为 60 秒
  60. // 启动配置模式
  61. if (!wifiManager.startConfigPortal("人体存在感应器_Config")) {
  62. Serial.println("[错误] 配置模式超时或未完成配置!");
  63. feedWatchdog();
  64. setConstantOn(false); // 关闭 LED
  65. } else {
  66. // 配置成功,保存参数
  67. serverAddress = customServer.getValue();
  68. serverPort = String(customPort.getValue()).toInt();
  69. otaPort = String(customOtaPort.getValue()).toInt(); // 保存 OTA 端口号
  70. // 调用保存参数函数
  71. saveParamsCallback();
  72. // 重新加载保存的服务器配置
  73. loadServerParams();
  74. // 关闭 LED
  75. setConstantOn(false);
  76. }
  77. }
  78. // 尝试连接 WiFi
  79. bool connectWiFiWithTimeout(uint32_t timeoutMs) {
  80. Serial.println("[信息] 正在尝试连接 Wi-Fi...");
  81. WiFi.begin();
  82. uint32_t startAttemptTime = millis();
  83. feedWatchdog();
  84. while (WiFi.status() != WL_CONNECTED && (millis() - startAttemptTime) < timeoutMs) {
  85. delay(500);
  86. addBlinkTask(2);
  87. Serial.print(".");
  88. }
  89. if (WiFi.status() == WL_CONNECTED) {
  90. Serial.println("\n[信息] Wi-Fi 连接成功!");
  91. deviceID = WiFi.macAddress();
  92. Serial.println("设备 ID (MAC 地址): " + deviceID);
  93. Serial.println("IP 地址: " + WiFi.localIP().toString());
  94. return true;
  95. } else {
  96. Serial.print("\n[错误] Wi-Fi 连接超时,超时时间: ");
  97. Serial.print(timeoutMs);
  98. Serial.println(" 毫秒");
  99. setupWiFiConfig();
  100. return false;
  101. }
  102. }