配置管理接口¶
本文档引用的文件 - gateway_config.h - gateway_config.c - webui_server.h - webui_server.c - wifi_manager.h - wifi_manager.c - mqtt_client_wrapper.h - mqtt_client_wrapper.c - ble_scanner.h - ble_scanner.c - config.h - main.c - index.html
目录¶
简介¶
本文档详细说明了ESP32S3 BLE网关项目的配置管理API,重点介绍以下两个核心端点:
- GET /api/config:获取当前配置信息
- POST /api/config:更新配置信息
该系统采用嵌入式Web服务器提供RESTful API接口,支持WiFi配置、MQTT配置和BLE扫描配置的完整管理。所有配置变更都会持久化到Flash存储中,确保设备重启后配置不会丢失。
项目结构¶
该项目采用模块化设计,主要组件包括:
graph TB
subgraph "应用层"
WebUI[Web用户界面]
API[REST API接口]
end
subgraph "配置管理层"
GWConfig[网关配置管理器]
NVS[NVS Flash存储]
end
subgraph "功能组件"
WiFi[WiFi管理器]
MQTT[MQTT客户端]
BLE[BLE扫描器]
end
subgraph "硬件抽象层"
HCI[HCI传输层]
ETH[以太网管理器]
end
WebUI --> API
API --> GWConfig
GWConfig --> WiFi
GWConfig --> MQTT
GWConfig --> BLE
GWConfig --> NVS
BLE --> HCI
ETH --> API
图表来源 - main.c - webui_server.c
核心组件¶
配置数据结构¶
系统使用统一的配置结构体来管理所有设置:
classDiagram
class gateway_config_t {
+char device_name[32]
+wifi_config_data_t wifi
+mqtt_config_t mqtt
+ble_scan_params_t ble_scan
+ble_device_filter_t ble_filter
+bool auto_start_scan
+uint32_t status_report_interval
}
class wifi_config_data_t {
+char ssid[33]
+char password[65]
+bool use_static_ip
+uint32_t static_ip
+uint32_t gateway
+uint32_t netmask
+uint32_t dns1
+uint32_t dns2
}
class mqtt_config_t {
+char broker_uri[129]
+char username[65]
+char password[65]
+char client_id[33]
+char base_topic[257]
+uint16_t keepalive
+bool use_tls
+bool clean_session
}
class ble_scan_params_t {
+uint16_t scan_interval
+uint16_t scan_window
+uint8_t scan_type
+uint8_t filter_policy
+bool filter_duplicates
}
gateway_config_t --> wifi_config_data_t
gateway_config_t --> mqtt_config_t
gateway_config_t --> ble_scan_params_t
图表来源 - gateway_config.h - wifi_manager.h - mqtt_client_wrapper.h - ble_scanner.h
配置持久化机制¶
配置管理器使用ESP-IDF的NVS(Non-Volatile Storage)进行持久化存储:
sequenceDiagram
participant Client as 客户端
participant API as API处理器
participant Config as 配置管理器
participant NVS as NVS存储
participant Flash as Flash存储
Client->>API : POST /api/config
API->>API : 解析JSON请求
API->>Config : gateway_config_set(config)
Config->>Config : 更新内存中的配置
API->>Config : gateway_config_save()
Config->>NVS : nvs_open(NVS_NAMESPACE)
Config->>NVS : nvs_set_str(key, value)
Config->>NVS : nvs_commit()
NVS->>Flash : 写入Flash
Config-->>API : 返回成功
API-->>Client : {"success" : true}
图表来源 - webui_server.c - gateway_config.c
章节来源 - gateway_config.h - gateway_config.c
架构概览¶
系统采用分层架构设计,各层职责明确:
graph TB
subgraph "表示层"
HTML[HTML页面]
CSS[样式表]
JS[JavaScript客户端]
end
subgraph "Web服务器层"
HTTPD[HTTP服务器]
Handlers[HTTP处理器]
end
subgraph "业务逻辑层"
ConfigMgr[配置管理器]
WiFiMgr[WiFi管理器]
MQTTEdge[MQTT边缘]
BLEMgr[BLE管理器]
end
subgraph "数据访问层"
NVS[NVS存储]
SPIFFS[SPIFFS文件系统]
end
HTML --> HTTPD
CSS --> HTTPD
JS --> HTTPD
HTTPD --> Handlers
Handlers --> ConfigMgr
ConfigMgr --> WiFiMgr
ConfigMgr --> MQTTEdge
ConfigMgr --> BLEMgr
ConfigMgr --> NVS
HTML --> SPIFFS
图表来源 - webui_server.c - main.c
详细组件分析¶
GET /api/config 接口¶
请求处理流程¶
sequenceDiagram
participant Client as 客户端
participant HTTPD as HTTP服务器
participant Handler as 配置处理器
participant Config as 配置管理器
participant JSON as JSON序列化器
Client->>HTTPD : GET /api/config
HTTPD->>Handler : 调用api_config_handler
Handler->>Config : gateway_config_get(&config)
Config->>Config : 复制配置到输出缓冲区
Handler->>JSON : 创建JSON对象
JSON->>JSON : 添加WiFi配置
JSON->>JSON : 添加MQTT配置
JSON->>JSON : 添加BLE配置
JSON-->>Handler : 返回JSON字符串
Handler-->>HTTPD : HTTP响应
HTTPD-->>Client : 200 OK + JSON
图表来源 - webui_server.c
响应数据格式¶
GET /api/config返回的JSON结构如下:
{
"wifi": {
"ssid": "string",
"password": "string"
},
"mqtt": {
"broker": "string",
"username": "string",
"topic": "string"
},
"ble": {
"autoStart": true
}
}
章节来源 - webui_server.c
POST /api/config 接口¶
请求处理流程¶
flowchart TD
Start([开始处理POST请求]) --> Receive["接收JSON数据"]
Receive --> ParseJSON["解析JSON"]
ParseJSON --> ValidJSON{"JSON有效?"}
ValidJSON --> |否| Return400["返回400 Bad Request"]
ValidJSON --> |是| LoadCurrent["加载当前配置"]
LoadCurrent --> ParseWiFi["解析WiFi配置"]
ParseWiFi --> ParseMQTT["解析MQTT配置"]
ParseMQTT --> UpdateConfig["更新配置"]
UpdateConfig --> SaveConfig["保存配置到NVS"]
SaveConfig --> CommitNVS["提交NVS事务"]
CommitNVS --> Success{"保存成功?"}
Success --> |否| ReturnError["返回错误"]
Success --> |是| ReturnSuccess["返回成功响应"]
Return400 --> End([结束])
ReturnError --> End
ReturnSuccess --> End
图表来源 - webui_server.c
请求数据格式¶
POST /api/config接受的JSON结构:
{
"wifi": {
"ssid": "your_wifi_ssid",
"password": "your_wifi_password"
},
"mqtt": {
"broker": "mqtt://192.168.1.100:1883",
"username": "optional_username",
"password": "optional_password",
"topic": "home/ble_gateway"
}
}
配置验证规则¶
系统对配置参数实施严格的验证规则:
| 参数 | 最大长度 | 验证规则 | 默认值 |
|---|---|---|---|
| WiFi SSID | 32字符 | 非空字符串 | 空字符串 |
| WiFi 密码 | 64字符 | 可选,任意字符 | 空字符串 |
| MQTT Broker | 128字符 | URL格式验证 | 空字符串 |
| MQTT 用户名 | 64字符 | 可选,任意字符 | 空字符串 |
| MQTT 密码 | 64字符 | 可选,任意字符 | 空字符串 |
| MQTT 主题 | 256字符 | 可选,任意字符 | "home/ble_gateway" |
| 设备名称 | 32字符 | 可选,任意字符 | "ESP32S3_BLE_GW" |
章节来源 - webui_server.c - wifi_manager.h - mqtt_client_wrapper.h
配置持久化机制¶
NVS存储结构¶
配置数据在NVS中的存储键名:
graph LR
subgraph "NVS命名空间: ble_gw_cfg"
DEV_NAME["dev_name<br/>设备名称"]
WIFI_SSID["wifi_ssid<br/>WiFi SSID"]
WIFI_PASS["wifi_pass<br/>WiFi密码"]
MQTT_URI["mqtt_uri<br/>MQTT服务器URI"]
MQTT_USER["mqtt_user<br/>MQTT用户名"]
MQTT_PASS["mqtt_pass<br/>MQTT密码"]
MQTT_TOPIC["mqtt_topic<br/>MQTT主题"]
BLE_AUTO["ble_auto<br/>自动扫描标志"]
CFG_VALID["cfg_valid<br/>配置有效性标志"]
end
图表来源 - gateway_config.c
持久化流程¶
sequenceDiagram
participant Config as 配置管理器
participant NVS as NVS句柄
participant Flash as Flash存储
Config->>NVS : nvs_open("ble_gw_cfg", READWRITE)
Config->>NVS : nvs_set_str("dev_name", device_name)
Config->>NVS : nvs_set_str("wifi_ssid", ssid)
Config->>NVS : nvs_set_str("wifi_pass", password)
Config->>NVS : nvs_set_str("mqtt_uri", broker_uri)
Config->>NVS : nvs_set_str("mqtt_user", username)
Config->>NVS : nvs_set_str("mqtt_pass", password)
Config->>NVS : nvs_set_str("mqtt_topic", base_topic)
Config->>NVS : nvs_set_u8("ble_auto", auto_start_scan)
Config->>NVS : nvs_set_u8("cfg_valid", 1)
Config->>NVS : nvs_commit()
NVS->>Flash : 持久化写入
Config->>NVS : nvs_close()
图表来源 - gateway_config.c
章节来源 - gateway_config.c
配置重载最佳实践¶
启动时配置加载¶
系统启动时的配置加载流程:
flowchart TD
Boot([系统启动]) --> InitNVS["初始化NVS"]
InitNVS --> LoadConfig["尝试从NVS加载配置"]
LoadConfig --> ConfigFound{"找到有效配置?"}
ConfigFound --> |是| ApplyConfig["应用配置到各组件"]
ConfigFound --> |否| SetDefaults["设置默认配置"]
ApplyConfig --> InitWiFi["初始化WiFi管理器"]
SetDefaults --> InitWiFi
InitWiFi --> InitMQTT["初始化MQTT客户端"]
InitMQTT --> InitBLE["初始化BLE扫描器"]
InitBLE --> InitWebUI["初始化WebUI服务器"]
InitWebUI --> Ready([系统就绪])
图表来源 - main.c
运行时配置更新¶
运行时配置更新的注意事项:
- 原子性操作:配置更新必须是原子性的,避免部分更新导致的数据不一致
- 验证优先:先验证新配置的有效性,再应用到系统
- 回滚机制:如果新配置无效,应回滚到之前的配置
- 资源释放:更新网络配置时需要正确释放旧的网络连接
章节来源 - main.c - gateway_config.c
依赖关系分析¶
组件间依赖关系¶
graph TB
subgraph "WebUI服务器"
WebServer[webui_server.c]
HTTPHandlers[HTTP处理器]
end
subgraph "配置管理层"
GWConfig[gateway_config.c]
NVSStorage[NVS存储]
end
subgraph "功能组件"
WiFiMgr[wifi_manager.c]
MQTTEdge[mqtt_client_wrapper.c]
BLEMgr[ble_scanner.c]
end
subgraph "硬件抽象层"
HCITrans[hci_transport.c]
ETHMgr[eth_manager.c]
end
WebServer --> HTTPHandlers
HTTPHandlers --> GWConfig
GWConfig --> WiFiMgr
GWConfig --> MQTTEdge
GWConfig --> BLEMgr
GWConfig --> NVSStorage
BLEMgr --> HCITrans
WebServer --> ETHMgr
图表来源 - webui_server.c - main.c
错误处理机制¶
系统实现了多层次的错误处理:
flowchart TD
Request[API请求] --> Parse[解析阶段]
Parse --> Validate[验证阶段]
Validate --> Process[处理阶段]
Process --> Persist[持久化阶段]
Parse --> ParseError[解析错误]
Validate --> ValidateError[验证错误]
Process --> ProcessError[处理错误]
Persist --> PersistError[持久化错误]
ParseError --> Return400[返回400错误]
ValidateError --> Return400
ProcessError --> Return500[返回500错误]
PersistError --> Return500
图表来源 - webui_server.c
章节来源 - webui_server.c
性能考虑¶
内存管理¶
系统采用内存池和静态分配策略:
- 配置结构体:使用静态分配,避免动态内存碎片
- JSON处理:使用cJSON库,支持流式处理减少内存占用
- HTTP响应:采用分块传输,避免大响应导致内存不足
并发控制¶
使用互斥锁确保配置访问的线程安全:
存储优化¶
- NVS事务:批量写入减少Flash磨损
- 配置缓存:内存中的配置副本避免频繁读取Flash
- 增量更新:只更新发生变化的配置项
故障排除指南¶
常见问题及解决方案¶
配置无法保存¶
症状:POST /api/config返回成功但重启后配置丢失
可能原因: 1. NVS写入失败 2. Flash空间不足 3. 配置校验失败
解决步骤: 1. 检查NVS分区是否正确挂载 2. 验证Flash剩余空间 3. 查看系统日志中的NVS错误信息
配置加载失败¶
症状:系统启动时使用默认配置而非保存的配置
可能原因: 1. NVS中没有有效配置标记 2. 配置数据损坏 3. NVS命名空间不匹配
解决步骤: 1. 检查NVS键值是否存在 2. 验证配置数据完整性 3. 确认NVS命名空间配置正确
网络连接问题¶
症状:WiFi或MQTT连接失败
诊断方法: 1. 使用GET /api/status检查连接状态 2. 查看系统日志中的网络事件 3. 验证配置参数的有效性
章节来源 - gateway_config.c - webui_server.c
结论¶
本配置管理API提供了完整的设备配置管理能力,具有以下特点:
- 完整的配置覆盖:支持WiFi、MQTT、BLE等所有关键配置
- 可靠的持久化:基于NVS的可靠存储机制
- 严格的验证:多层验证确保配置数据的完整性
- 友好的接口:RESTful API设计便于集成和使用
- 完善的错误处理:多层次的错误处理机制
该系统为ESP32S3 BLE网关提供了灵活且可靠的配置管理方案,支持设备的远程配置和管理需求。