Files
health-wellness-device-2/include/wifi_manager.h

138 lines
3.1 KiB
C++

/**
* @file wifi_manager.h
* @brief WiFi 配网管理器
*
* 功能:
* - 自动连接已保存的 WiFi
* - 配网失败/首次启动 → AP 模式 + 强制门户页面
* - 自定义参数: MQTT 服务器/端口/用户/密码、设备名称、环境备注
* - 长按按钮重置配置
* - LED 状态指示
* - LittleFS 持久化存储
*/
#ifndef WIFI_MANAGER_H
#define WIFI_MANAGER_H
#include <Arduino.h>
#include <WiFiManager.h>
#include <LittleFS.h>
#include <ArduinoJson.h>
#include "config.h"
// 设备配置结构体
struct DeviceConfig {
char mqtt_server[40];
char mqtt_port[6];
char mqtt_user[20];
char mqtt_pass[20];
char device_id[20];
char env_note[20]; // 环境备注 (如: "主卧", "客厅", "老人房")
};
class WiFiMgmt {
public:
WiFiMgmt();
~WiFiMgmt();
// 单例指针 (用于静态回调)
static WiFiMgmt* _instance;
/**
* @brief 初始化 WiFi 管理器
* @return true=成功
*/
bool begin();
/**
* @brief 主循环, 处理配网流程和按钮检测
* @return true=WiFi 已连接
*/
bool loop();
/**
* @brief WiFi 是否已连接
*/
bool isConnected() const;
/**
* @brief 获取设备配置
*/
DeviceConfig getConfig() const;
/**
* @brief 获取设备 ID (用于 MQTT client_id)
*/
const char* getDeviceId() const;
/**
* @brief 获取环境备注
*/
const char* getEnvNote() const;
/**
* @brief 强制进入配网模式
*/
void startConfigPortal();
/**
* @brief 清除所有配置并重启
*/
void resetSettings();
private:
/**
* @brief 尝试连接 WiFi
*/
bool _connectWiFi();
/**
* @brief 设置 LED 模式 (线程安全, 无阻塞)
* @param mode 0=灭 1=慢闪(断连1s) 2=快闪(配网300ms) 3=常亮(已连接)
*/
void _setLEDMode(uint8_t mode);
/**
* @brief LED 闪烁独立任务 (FreeRTOS, 不受主循环阻塞影响)
*/
static void _ledTaskFunc(void* param);
/**
* @brief 检测按钮长按
*/
bool _checkButtonLongPress();
/**
* @brief 加载/保存配置到 LittleFS
*/
bool _loadConfig();
bool _saveConfig();
/**
* @brief 保存 WiFi 参数回调 (WiFiManager 的回调)
*/
static void _saveParamsCallback();
static void _apCallback(WiFiManager* wm);
WiFiManager _wm;
DeviceConfig _config;
bool _connected;
uint32_t _lastCheckTime;
uint32_t _buttonPressTime;
bool _buttonPressed;
// LED 独立任务 (不被 startConfigPortal 阻塞影响)
TaskHandle_t _ledTaskHandle;
volatile uint8_t _ledMode; // 0=灭 1=慢闪 2=快闪 3=常亮
// WiFiManager 自定义参数
WiFiManagerParameter* _param_mqtt_server;
WiFiManagerParameter* _param_mqtt_port;
WiFiManagerParameter* _param_mqtt_user;
WiFiManagerParameter* _param_mqtt_pass;
WiFiManagerParameter* _param_device_id;
WiFiManagerParameter* _param_env_note;
};
#endif // WIFI_MANAGER_H