跳转至

配置管理接口

本文档引用的文件 - 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

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构概览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排除指南
  9. 结论

简介

本文档详细说明了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

章节来源 - main.c - config.h

核心组件

配置数据结构

系统使用统一的配置结构体来管理所有设置:

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

运行时配置更新

运行时配置更新的注意事项:

  1. 原子性操作:配置更新必须是原子性的,避免部分更新导致的数据不一致
  2. 验证优先:先验证新配置的有效性,再应用到系统
  3. 回滚机制:如果新配置无效,应回滚到之前的配置
  4. 资源释放:更新网络配置时需要正确释放旧的网络连接

章节来源 - 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响应:采用分块传输,避免大响应导致内存不足

并发控制

使用互斥锁确保配置访问的线程安全:

static SemaphoreHandle_t s_mutex = NULL;

存储优化

  • 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提供了完整的设备配置管理能力,具有以下特点:

  1. 完整的配置覆盖:支持WiFi、MQTT、BLE等所有关键配置
  2. 可靠的持久化:基于NVS的可靠存储机制
  3. 严格的验证:多层验证确保配置数据的完整性
  4. 友好的接口:RESTful API设计便于集成和使用
  5. 完善的错误处理:多层次的错误处理机制

该系统为ESP32S3 BLE网关提供了灵活且可靠的配置管理方案,支持设备的远程配置和管理需求。