连接状态监控¶
本文档引用的文件 - eth_manager.c - eth_manager.h - main.c - esp_eth_mac_ch390.c - esp_eth_phy_ch390.c - config.h - gateway_config.c - wifi_manager.h - mqtt_client_wrapper.h - webui_server.h - ws2812_led.h - ble_scanner.h
目录¶
简介¶
这是一个基于ESP32-S3的BLE网关系统中的以太网连接状态监控组件。该系统实现了对CH390H以太网控制器的完整支持,包括物理连接状态检测、链路速度识别、全双工模式判断、IP地址获取和网络参数查询等功能。
系统采用模块化设计,通过事件驱动机制实现连接状态的实时监控和状态转换。主要特性包括:
- 完整的以太网连接管理:支持CH390H SPI以太网控制器的初始化、配置和状态监控
- 多级状态管理:断开、连接中、已连接、错误四种状态的精确控制
- 事件驱动架构:基于ESP-IDF事件系统的异步状态通知机制
- 网络参数监控:实时获取IP地址、网关、子网掩码等网络配置信息
- 性能优化:使用FreeRTOS事件组和信号量确保高效的并发处理
项目结构¶
该项目采用分层架构设计,主要分为以下几个层次:
graph TB
subgraph "应用层"
Main[主应用程序]
WebUI[Web界面服务器]
MQTT[MQTT客户端]
end
subgraph "业务逻辑层"
BLE[BLE扫描器]
WiFi[WiFi管理器]
Config[配置管理器]
end
subgraph "网络管理层"
ETH[以太网管理器]
NetMgr[网络管理器]
end
subgraph "硬件抽象层"
CH390_MAC[CH390 MAC驱动]
CH390_PHY[CH390 PHY驱动]
SPI[SPI接口]
end
subgraph "硬件层"
ESP32S3[ESP32-S3芯片]
CH390H[CH390H以太网控制器]
end
Main --> ETH
Main --> WiFi
Main --> BLE
Main --> WebUI
Main --> MQTT
ETH --> CH390_MAC
ETH --> CH390_PHY
CH390_MAC --> SPI
CH390_PHY --> SPI
SPI --> CH390H
ETH --> NetMgr
NetMgr --> WiFi
图表来源 - main.c - eth_manager.c
章节来源 - main.c - eth_manager.c
核心组件¶
以太网管理器(Ethernet Manager)¶
以太网管理器是整个系统的核心组件,负责CH390H以太网控制器的完整生命周期管理。它提供了以下关键功能:
- 初始化和配置:设置SPI接口、GPIO引脚、中断处理和PHY配置
- 状态监控:实时跟踪连接状态变化和网络参数
- 事件处理:处理以太网事件和IP事件的回调机制
- 参数查询:提供当前连接状态、IP地址、MAC地址等信息
CH390以太网驱动¶
CH390驱动程序实现了完整的以太网MAC和PHY功能:
- MAC层功能:数据包发送接收、CRC校验、流控制
- PHY层功能:链路状态检测、速度协商、双工模式识别
- 中断处理:硬件中断服务和轮询机制
- 寄存器操作:底层硬件寄存器的读写访问
网络管理器¶
网络管理器协调多个网络接口的状态,提供统一的网络连接视图:
- 多接口支持:同时管理以太网和WiFi连接
- 状态聚合:将多个网络接口的状态合并为统一视图
- 自动切换:在网络接口之间进行智能切换
章节来源 - eth_manager.h - eth_manager.c - esp_eth_mac_ch390.c - esp_eth_phy_ch390.c
架构概览¶
系统采用分层架构,从硬件到应用层逐层抽象:
sequenceDiagram
participant App as 应用程序
participant ETH as 以太网管理器
participant MAC as CH390 MAC
participant PHY as CH390 PHY
participant HW as 硬件接口
App->>ETH : 初始化以太网
ETH->>HW : 配置SPI接口
ETH->>HW : 设置GPIO引脚
ETH->>MAC : 创建MAC实例
ETH->>PHY : 创建PHY实例
ETH->>ETH : 注册事件处理器
Note over App,HW : 运行时监控阶段
HW->>PHY : 检测链路状态
PHY->>MAC : 报告速度和双工模式
MAC->>ETH : 更新连接状态
ETH->>App : 调用回调函数
App->>ETH : 查询状态信息
ETH->>ETH : 获取IP地址和网络参数
ETH->>App : 返回状态数据
图表来源 - eth_manager.c - esp_eth_mac_ch390.c - esp_eth_phy_ch390.c
系统架构的关键特点:
- 事件驱动设计:所有状态变化通过事件系统异步通知
- 模块化接口:每个组件都有清晰的接口定义和实现边界
- 硬件抽象:硬件细节被完全封装在驱动层
- 状态机管理:使用有限状态机确保状态转换的正确性
详细组件分析¶
以太网状态管理系统¶
以太网状态管理系统实现了完整的连接生命周期管理:
stateDiagram-v2
[*] --> 断开连接
断开连接 --> 连接中 : 链路建立
连接中 --> 已连接 : 获得IP地址
连接中 --> 断开连接 : 链路断开
已连接 --> 连接中 : IP丢失
断开连接 --> 错误 : 初始化失败
连接中 --> 错误 : 配置错误
错误 --> 断开连接 : 重置后恢复
图表来源 - eth_manager.h - eth_manager.c
状态转换逻辑¶
状态转换由以下事件触发:
- 物理连接事件:ETHERNET_EVENT_CONNECTED/ETHERNET_EVENT_DISCONNECTED
- IP地址事件:IP_EVENT_ETH_GOT_IP/IP_EVENT_ETH_LOST_IP
- 启动停止事件:ETHERNET_EVENT_START/ETHERNET_EVENT_STOP
事件处理机制¶
系统使用ESP-IDF的事件处理框架:
flowchart TD
Start([事件发生]) --> CheckType{检查事件类型}
CheckType --> |以太网事件| EthHandler[以太网事件处理器]
CheckType --> |IP事件| IpHandler[IP事件处理器]
EthHandler --> Connected{"连接事件?"}
Connected --> |是| UpdateLink[更新链路状态]
Connected --> |否| UpdateState[更新状态]
IpHandler --> GotIp{"获得IP?"}
GotIp --> |是| SetConnected[设置已连接状态]
GotIp --> |否| SetConnecting[设置连接中状态]
UpdateLink --> SetState[更新全局状态]
UpdateState --> SetState
SetConnected --> NotifyCallback[通知回调函数]
SetConnecting --> NotifyCallback
SetState --> NotifyCallback
NotifyCallback --> End([完成])
图表来源 - eth_manager.c
章节来源 - eth_manager.c - eth_manager.h
CH390 MAC驱动分析¶
CH390 MAC驱动实现了完整的以太网数据链路层功能:
数据包处理流程¶
flowchart TD
PacketArrival[数据包到达] --> CheckReady{检查就绪标志}
CheckReady --> |无数据| WaitNext[等待下一次通知]
CheckReady --> |有数据| ReadHeader[读取头部信息]
ReadHeader --> ValidateHeader{验证头部有效}
ValidateHeader --> |无效| ResetDevice[重置设备]
ValidateHeader --> |有效| CheckStatus[检查状态]
CheckStatus --> HasError{是否有错误}
HasError --> |是| DropFrame[丢弃帧]
HasError --> |否| CheckLength[检查长度]
CheckLength --> TooLong{长度超限?}
TooLong --> |是| ResetPointer[重置指针]
TooLong --> |否| ReadData[读取数据]
ReadData --> RemoveCRC[移除CRC]
RemoveCRC --> SendToStack[发送到TCP/IP栈]
DropFrame --> End([完成])
ResetDevice --> End
ResetPointer --> End
SendToStack --> End
图表来源 - esp_eth_mac_ch390.c
中断处理机制¶
系统支持两种中断处理模式:
- 硬件中断模式:使用CH390H的中断引脚
- 轮询模式:定时检查数据就绪状态
章节来源 - esp_eth_mac_ch390.c - esp_eth_mac_ch390.c
CH390 PHY驱动分析¶
CH390 PHY驱动负责物理层的链路状态管理和协商:
链路状态检测¶
flowchart TD
Start([开始检测]) --> ReadBMSR[读取BMSR寄存器]
ReadBMSR --> CheckLink{检查链接状态}
CheckLink --> |未连接| ReportDown[报告链接断开]
CheckLink --> |已连接| ReadBMCR[读取BMCR寄存器]
ReadBMCR --> CheckSpeed{检查速度设置}
CheckSpeed --> |100M| Set100M[设置100Mbps]
CheckSpeed --> |10M| Set10M[设置10Mbps]
Set100M --> CheckDuplex{检查双工模式}
Set10M --> CheckDuplex
CheckDuplex --> |全双工| SetFullDuplex[设置全双工]
CheckDuplex --> |半双工| SetHalfDuplex[设置半双工]
SetFullDuplex --> CheckPause{检查流控能力}
SetHalfDuplex --> CheckPause
CheckPause --> |支持| EnableFlowCtrl[启用流控]
CheckPause --> |不支持| DisableFlowCtrl[禁用流控]
EnableFlowCtrl --> UpdateState[更新状态]
DisableFlowCtrl --> UpdateState
ReportDown --> UpdateState
UpdateState --> End([完成])
图表来源 - esp_eth_phy_ch390.c
章节来源 - esp_eth_phy_ch390.c
网络参数查询系统¶
系统提供了完整的网络参数查询功能:
状态信息结构¶
| 字段名 | 类型 | 描述 | 单位 |
|---|---|---|---|
| state | eth_state_t | 当前连接状态 | 枚举值 |
| link_up | bool | 链路是否连接 | 布尔值 |
| speed | uint32_t | 连接速度 | Mbps |
| full_duplex | bool | 是否全双工 | 布尔值 |
| ip_addr | uint32_t | IP地址 | 32位整数 |
| gateway | uint32_t | 网关地址 | 32位整数 |
| netmask | uint32_t | 子网掩码 | 32位整数 |
| mac | uint8_t[6] | MAC地址 | 字节数组 |
实时参数获取¶
系统通过以下方式获取实时网络参数:
- 链路速度检测:使用
ETH_CMD_G_SPEEDioctl命令 - 双工模式识别:使用
ETH_CMD_G_DUPLEX_MODEioctl命令 - IP地址查询:从IP事件中提取当前IP信息
- MAC地址获取:通过
ETH_CMD_G_MAC_ADDRioctl命令
章节来源 - eth_manager.h - eth_manager.c
依赖关系分析¶
系统组件之间的依赖关系如下:
graph TB
subgraph "外部依赖"
ESP_IDF[ESP-IDF框架]
FreeRTOS[FreeRTOS内核]
LWIP[LWIP TCP/IP栈]
end
subgraph "系统组件"
ETH_Manager[以太网管理器]
CH390_MAC[CH390 MAC驱动]
CH390_PHY[CH390 PHY驱动]
SPI_Driver[SPI驱动]
GPIO_Driver[GPIO驱动]
end
subgraph "应用层"
Main_App[主应用程序]
Network_Mgr[网络管理器]
Config_Manager[配置管理器]
end
ESP_IDF --> ETH_Manager
ESP_IDF --> Network_Mgr
ESP_IDF --> Config_Manager
FreeRTOS --> ETH_Manager
FreeRTOS --> Network_Mgr
LWIP --> ETH_Manager
ETH_Manager --> CH390_MAC
ETH_Manager --> CH390_PHY
ETH_Manager --> SPI_Driver
ETH_Manager --> GPIO_Driver
Main_App --> ETH_Manager
Network_Mgr --> ETH_Manager
Config_Manager --> ETH_Manager
图表来源 - eth_manager.c - main.c
关键依赖点¶
- ESP-IDF集成:系统深度集成了ESP-IDF的事件系统、网络接口和驱动框架
- FreeRTOS同步:使用事件组和信号量确保线程安全的并发访问
- 硬件抽象:通过SPI和GPIO驱动实现与CH390H硬件的通信
章节来源 - eth_manager.c - main.c
性能考虑¶
内存管理¶
系统采用了高效的内存管理策略:
- 静态分配:核心状态变量使用静态内存分配,避免运行时内存碎片
- DMA传输:SPI数据传输使用DMA模式,减少CPU占用
- 缓冲区优化:网络数据包缓冲区大小经过优化,平衡内存使用和性能
中断处理优化¶
flowchart TD
Interrupt[硬件中断] --> ISR_Handler[ISR处理函数]
ISR_Handler --> TaskNotify[任务通知]
TaskNotify --> DeferredProcessing[延迟处理]
DeferredProcessing --> ProcessPacket[处理数据包]
ProcessPacket --> UpdateStats[更新统计信息]
UpdateStats --> SendToStack[发送到协议栈]
SendToStack --> End([完成])
图表来源 - esp_eth_mac_ch390.c
性能监控指标¶
系统可以监控以下关键性能指标:
- 连接建立时间:从初始化到获得IP地址的时间
- 数据包处理延迟:从数据包到达到底层处理完成的时间
- 内存使用情况:动态内存池的使用率和碎片程度
- CPU利用率:网络任务的CPU占用情况
故障排除指南¶
常见连接问题¶
1. 无法检测到以太网连接¶
症状:系统始终显示断开连接状态
可能原因: - 硬件连接问题(网线、端口) - CH390H芯片初始化失败 - SPI通信错误
诊断步骤: 1. 检查硬件连接和电源 2. 验证SPI引脚配置 3. 使用调试工具检查SPI通信
解决方案: - 重新插拔网线 - 检查引脚定义配置 - 更新驱动程序版本
2. IP地址获取失败¶
症状:链路显示连接但无法获得IP地址
可能原因: - DHCP服务器不可用 - 网络配置错误 - 网关设备故障
诊断步骤: 1. 检查路由器和交换机状态 2. 验证DHCP服务可用性 3. 查看网络日志信息
解决方案: - 手动配置静态IP地址 - 重启DHCP服务器 - 检查网络拓扑
3. 链路速度和双工模式异常¶
症状:连接速度低于预期或出现丢包
可能原因: - 自动协商失败 - 网络设备兼容性问题 - 线缆质量问题
诊断步骤: 1. 检查网络设备的协商状态 2. 测试不同网线和端口 3. 验证对端设备配置
解决方案: - 强制设置固定速度和双工模式 - 更换高质量网线 - 更新对端设备固件
调试工具和方法¶
日志分析¶
系统提供了详细的日志输出,可以通过以下方式查看:
- 串口监视器:使用ESP-IDF的idf.py monitor命令
- 日志级别调整:根据需要调整日志详细程度
- 事件跟踪:监控状态转换和错误事件
性能分析¶
flowchart LR
Start([开始分析]) --> CollectLogs[收集日志]
CollectLogs --> AnalyzeEvents[分析事件序列]
AnalyzeEvents --> CheckTiming[检查时间戳]
CheckTiming --> IdentifyBottlenecks[识别瓶颈]
IdentifyBottlenecks --> OptimizeConfig[优化配置]
OptimizeConfig --> VerifyFix[验证修复]
VerifyFix --> End([完成])
图表来源 - eth_manager.c
章节来源 - eth_manager.c
结论¶
以太网连接状态监控系统是一个设计精良的嵌入式网络管理解决方案。其主要优势包括:
- 模块化设计:清晰的组件分离和接口定义
- 事件驱动架构:高效的异步状态管理机制
- 硬件抽象:完整的CH390H驱动支持
- 状态完整性:全面的连接状态监控和参数查询
- 性能优化:针对嵌入式环境的优化设计
系统适用于需要稳定以太网连接的工业应用和物联网网关场景。通过合理的配置和维护,可以提供可靠的网络连接服务。
附录¶
配置参数参考¶
CH390H硬件配置¶
| 参数名称 | 默认值 | 描述 |
|---|---|---|
| ETH_SPI_HOST | SPI2_HOST | SPI主机编号 |
| ETH_SPI_CLK_MHZ | 20 | SPI时钟频率(MHz) |
| ETH_MOSI_PIN | 11 | MOSI引脚编号 |
| ETH_MISO_PIN | 13 | MISO引脚编号 |
| ETH_SCK_PIN | 12 | SCK引脚编号 |
| ETH_CS_PIN | 10 | 片选引脚编号 |
| ETH_INT_PIN | 14 | 中断引脚编号 |
| ETH_RST_PIN | 9 | 复位引脚编号 |
| ETH_PHY_ADDR | 1 | PHY地址 |
系统性能参数¶
| 参数名称 | 默认值 | 描述 |
|---|---|---|
| HCI_UART_BAUDRATE | 1000000 | UART波特率 |
| WIFI_CONNECT_TIMEOUT_MS | 30000 | WiFi连接超时(ms) |
| MQTT_RECONNECT_DELAY_MS | 5000 | MQTT重连延迟(ms) |
| WS2812_LED_COUNT | 3 | LED数量 |
API参考¶
以太网管理器API¶
| 函数名称 | 功能描述 | 返回值 |
|---|---|---|
| eth_manager_init() | 初始化以太网管理器 | ESP_OK/错误码 |
| eth_manager_start() | 启动以太网连接 | ESP_OK/错误码 |
| eth_manager_get_status() | 获取连接状态 | ESP_OK/错误码 |
| eth_manager_register_callback() | 注册状态回调 | ESP_OK/错误码 |
章节来源 - config.h - eth_manager.h