主应用模块¶
本文引用的文件 - main.c - config.h - led_indicator.h - led_indicator.c - config_manager.h - config_manager.c - wifi_provision.h - network_manager.h - network_manager.c - hci_transport.c - ble_gateway.c - webui_server.c
目录¶
简介¶
本文件面向ESP32S3 BLE网关的主应用模块,系统性梳理从启动到稳定运行的初始化流程与组件协调机制,重点覆盖以下方面: - 系统初始化:NVS闪存初始化、事件循环创建、硬件状态检查 - 组件协调:子模块初始化顺序、依赖关系与启动流程 - 任务调度:LED状态任务、系统监控任务与FreeRTOS任务管理 - 状态指示:LED颜色编码、状态更新机制与错误处理策略 - 实战示例:组件协作模式与最佳实践(以源码路径形式呈现)
项目结构¶
主应用位于main目录,核心头文件集中在include目录,功能组件分布在components目录。主入口负责全局初始化与流程编排,各子模块通过接口进行解耦协作。
graph TB
A["main/main.c<br/>主入口与流程编排"] --> B["include/config.h<br/>全局配置与引脚定义"]
A --> C["include/led_indicator.h<br/>LED指示器接口"]
A --> D["include/config_manager.h<br/>配置管理接口"]
A --> E["include/wifi_provision.h<br/>WiFi配置门户接口"]
A --> F["include/network_manager.h<br/>网络管理接口"]
A --> G["include/ble_gateway.h<br/>BLE网关接口"]
A --> H["include/webui_server.h<br/>WebUI服务接口"]
C --> C1["components/led_indicator/led_indicator.c<br/>LED实现"]
D --> D1["components/config_manager/config_manager.c<br/>配置实现"]
F --> F1["components/network_manager/network_manager.c<br/>网络实现"]
G --> G1["components/ble_gateway/ble_gateway.c<br/>BLE实现"]
H --> H1["components/webui_server/webui_server.c<br/>WebUI实现"]
G1 --> T1["components/hci_transport/hci_transport.c<br/>HCI传输实现"]
图表来源 - main.c - config.h - led_indicator.h - led_indicator.c - config_manager.h - config_manager.c - wifi_provision.h - network_manager.h - network_manager.c - hci_transport.c - ble_gateway.c - webui_server.c
核心组件¶
- LED指示器:提供三色LED状态指示与定时闪烁控制,用于系统、网络、BLE状态可视化反馈。
- 配置管理:基于NVS存储网关配置(网络、BLE、MQTT、WebUI等),支持加载、保存与重置。
- 网络管理:统一管理以太网与WiFi连接,支持多种主备模式与自动切换。
- WiFi配置门户:提供AP+Web界面的配网能力,支持保存凭据与重置。
- HCI传输:通过UART与nRF52833通信,承载BLE命令与事件。
- BLE网关:注册HCI回调,维护设备列表,提供扫描与连接接口。
- WebUI服务:挂载SPIFFS静态资源,提供REST API与静态页面服务。
章节来源 - led_indicator.h - led_indicator.c - config_manager.h - config_manager.c - network_manager.h - network_manager.c - wifi_provision.h - hci_transport.c - ble_gateway.c - webui_server.c
架构总览¶
主应用在app_main中完成系统初始化与启动决策,随后根据网络模式与WiFi凭据选择不同路径,并在成功后启动BLE网关、WebUI与MQTT等服务。同时,LED指示器贯穿全程提供状态反馈;按钮任务在后台持续监测长按触发的恢复与重置行为。
sequenceDiagram
participant M as "主应用(main.c)"
participant L as "LED指示器(led_indicator)"
participant N as "NVS配置(config_manager)"
participant W as "WiFi门户(wifi_provision)"
participant NM as "网络管理(network_manager)"
participant H as "HCI传输(hci_transport)"
participant BG as "BLE网关(ble_gateway)"
participant S as "WebUI(webui_server)"
M->>L : 初始化LED并设置系统启动状态
M->>N : 初始化配置管理(NVS打开/加载/默认值)
M->>M : 检查启动按键(长按触发工厂复位)
alt 以太网模式
M->>NM : 初始化并启动以太网
M->>NM : 初始化WiFi(作为备份)
M->>NM : 启动网络管理器
NM-->>M : 状态更新(以太网已连)
else 已有WiFi凭据
M->>NM : 初始化以太网与WiFi
M->>NM : 连接已保存WiFi
alt 连接成功
M->>NM : 启动网络管理器(仅WiFi)
NM-->>M : 状态更新(已连)
else 连接失败
M->>W : 启动配置门户
end
else 无凭据
M->>NM : 初始化WiFi(启动AP模式)
M->>W : 启动配置门户
end
M->>H : 初始化并复位控制器
H-->>M : 就绪
M->>BG : 初始化BLE网关
M->>S : 初始化WebUI与REST API
M->>M : 创建按钮任务与主监控循环
图表来源 - main.c - config_manager.c - network_manager.c - hci_transport.c - ble_gateway.c - webui_server.c
详细组件分析¶
系统初始化与启动流程¶
- LED优先初始化:确保启动阶段具备视觉反馈。
- NVS初始化与擦除策略:若分区损坏或版本不匹配则擦除并重新初始化。
- 事件循环创建:为事件驱动的网络与外设提供统一调度。
- 启动信息打印:输出固件版本、芯片信息与堆内存。
- 按键检测:启动时长按触发工厂复位;后台任务持续监听长按以进入配置门户。
- 配置加载:加载或生成默认配置,包含网络、BLE、MQTT、WebUI等参数。
- 网络模式判定:依据配置决定以太网优先、WiFi优先或仅以太网/仅WiFi模式。
- 以太网模式:先初始化以太网,再初始化WiFi作为备份,启动网络管理器。
- WiFi模式:初始化以太网与WiFi,尝试连接已保存凭据;失败则进入配置门户。
- 无凭据模式:直接进入配置门户,提供AP与WebUI引导用户配网。
- 服务启动:成功后初始化BLE网关、WebUI与REST API;可选初始化MQTT。
- 任务创建:创建按钮监控任务与主监控循环,周期性打印系统状态。
章节来源 - main.c - config_manager.c - network_manager.c
组件协调机制与初始化顺序¶
- 依赖链路
- 主应用依赖LED、配置管理、网络管理、WiFi门户、BLE网关、WebUI等模块。
- BLE网关依赖HCI传输层;网络管理依赖以太网与WiFi管理器。
- WebUI依赖SPIFFS与REST API;MQTT在配置允许时按需初始化。
- 初始化顺序
- LED → NVS → 事件循环 → 配置管理 → 网络子系统 → 服务组件 → 任务创建。
- 启动流程
- 以太网模式:ETH → WiFi(备份) → 网络管理器 → BLE网关/WebUI/MQTT。
- WiFi模式:ETH → WiFi → 连接/失败分支 → 网络管理器 → BLE网关/WebUI/MQTT。
- 无凭据:WiFi(AP) → 配置门户 → 成功后走WiFi模式。
章节来源 - main.c - network_manager.c - ble_gateway.c - webui_server.c
任务调度策略¶
- LED状态任务
- 由LED模块内部定时器驱动,周期性切换LED状态,无需外部任务参与。
- 按钮监控任务
- 单独任务持续轮询按键状态,长按触发快速闪烁与重置流程。
- 主监控循环
- 定期打印系统状态(堆内存、网络连接、BLE设备数量)。
- FreeRTOS任务优先级
- 配置中定义了各任务优先级,确保关键任务(如BLE/HCI)具有较高优先级。
章节来源 - led_indicator.c - main.c - main.c - config.h
系统状态指示逻辑¶
- LED颜色与含义
- 黄灯:网络状态
- 绿灯:BLE状态
- 蓝灯:系统状态
- 状态枚举
- 关闭、常亮、慢速闪烁、快速闪烁、单次闪烁。
- 更新机制
- 主应用在不同阶段设置LED状态,LED模块通过定时器驱动硬件电平。
- 错误处理
- NVS分区异常时擦除并重建;WiFi连接失败时进入配置门户;BLE控制器未就绪时关闭对应LED指示。
章节来源 - led_indicator.h - led_indicator.c - main.c - main.c
组件协作模式与最佳实践¶
- NVS与配置管理
- 在app_main中先初始化LED与NVS,再加载配置,避免因配置缺失导致后续初始化失败。
- 参考路径:main.c,config_manager.c
- 网络模式与Failover
- 使用网络管理器统一管理ETH/WiFi,结合定时器实现主备切换与恢复。
- 参考路径:network_manager.c
- BLE与HCI
- 先初始化HCI传输并复位控制器,再初始化BLE网关并注册回调。
- 参考路径:hci_transport.c,ble_gateway.c
- WebUI与REST
- 先挂载SPIFFS,再启动HTTP服务器并注册REST处理器。
- 参考路径:webui_server.c
- 按钮与门户
- 后台任务持续监测按键,长按触发快速闪烁与门户重置。
- 参考路径:main.c,main.c
依赖关系分析¶
主应用对各子模块存在明确的调用关系,且遵循“低耦合、高内聚”的设计原则。
graph LR
MAIN["main/main.c"] --> LED["led_indicator.h/.c"]
MAIN --> CFG["config_manager.h/.c"]
MAIN --> WFP["wifi_provision.h"]
MAIN --> NETM["network_manager.h/.c"]
MAIN --> HCI["hci_transport.c"]
MAIN --> BLE["ble_gateway.c"]
MAIN --> WEB["webui_server.c"]
BLE --> HCI
NETM --> ETH["eth_manager.c"]
NETM --> WIFI["wifi_manager.c"]
图表来源 - main.c - ble_gateway.c - network_manager.c
章节来源 - main.c - ble_gateway.c - network_manager.c
性能考虑¶
- 任务栈大小与优先级:配置中为网络、BLE、WebUI等关键任务分配了较大的栈空间与较高优先级,确保实时性与稳定性。
- UART缓冲区:HCI传输使用较大RX/TX缓冲区,降低溢出风险。
- SPIFFS挂载:首次挂载失败会自动格式化,保证文件系统可用性但可能影响首次启动时间。
- 监控周期:主监控循环每30秒打印一次状态,兼顾可观测性与CPU占用。
章节来源 - config.h - hci_transport.c - webui_server.c - main.c
故障排查指南¶
- NVS初始化失败
- 现象:NVS分区损坏或版本不匹配。
- 处理:程序会自动擦除并重建分区,重启后使用默认配置。
- 参考路径:main.c,config_manager.c
- WiFi连接失败
- 现象:已保存凭据无法连接。
- 处理:进入配置门户,重新配网;或清除凭据后重试。
- 参考路径:main.c,wifi_provision.h
- BLE控制器未就绪
- 现象:BLE LED关闭或扫描失败。
- 处理:确认nRF52833供电与连线;检查UART配置与波特率;尝试发送HCI Reset。
- 参考路径:main.c,hci_transport.c
- 网络主备切换异常
- 现象:ETH断开后未自动切回WiFi或反之。
- 处理:检查网络模式配置与failover定时器;确认ETH/WiFi状态回调正常。
- 参考路径:network_manager.c,network_manager.c
- WebUI无法访问
- 现象:浏览器无法打开WebUI或返回404。
- 处理:确认SPIFFS挂载成功;检查静态文件是否存在;验证URI处理器注册。
- 参考路径:webui_server.c,webui_server.c
章节来源 - main.c - config_manager.c - main.c - wifi_provision.h - main.c - hci_transport.c - network_manager.c - network_manager.c - webui_server.c - webui_server.c
结论¶
主应用模块通过清晰的初始化流程、严格的组件协调与稳健的任务调度,实现了从启动到稳定运行的全生命周期管理。LED状态指示与错误处理策略提升了可运维性;网络管理器的多模式支持与Failover机制增强了可靠性;BLE与WebUI服务的模块化设计便于扩展与维护。建议在后续迭代中进一步完善BLE事件解析与数据上报、增强日志分级与远程诊断能力。
附录¶
- 关键宏与配置项
- 引脚定义、网络模式、BLE参数、WebUI端口、MQTT参数、任务栈与优先级等。
- 参考路径:config.h
- LED状态枚举与API
- 状态类型、设置/查询/批量设置、单次闪烁等。
- 参考路径:led_indicator.h,led_indicator.c
- 配置结构体与NVS操作
- 网络、BLE、MQTT、WebUI配置;加载/保存/重置。
- 参考路径:config_manager.h,config_manager.c
- 网络状态与模式
- 状态枚举、模式枚举、状态查询、IP获取、回调注册。
- 参考路径:network_manager.h,network_manager.c
- WiFi配置门户状态机
- 状态枚举、启动/停止、凭据保存/清除、回调。
- 参考路径:wifi_provision.h