# 绿能协议v3.40核心架构设计 **本文档引用的文件** - [LvnengV340ProtocolBootstrap.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/v340/LvnengV340ProtocolBootstrap.java) - [LvnengProtocolMessageProcessor.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/LvnengProtocolMessageProcessor.java) - [LvnengProtocolConstants.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/LvnengProtocolConstants.java) - [ProtocolBootstrap.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/ProtocolBootstrap.java) - [ProtocolMessageProcessor.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/ProtocolMessageProcessor.java) - [LvnengUplinkMessage.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/LvnengUplinkMessage.java) - [LvnengDwonlinkMessage.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/LvnengDwonlinkMessage.java) - [LvnengUplinkCmdExe.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/LvnengUplinkCmdExe.java) - [LvnengDownlinkCmdExe.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/LvnengDownlinkCmdExe.java) - [AbstractLvnengCmdExe.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/AbstractLvnengCmdExe.java) - [LvnengV340LoginULCmd.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/v340/cmd/LvnengV340LoginULCmd.java) - [LvnengV340RemoteStopDLCmd.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/v340/cmd/LvnengV340RemoteStopDLCmd.java) - [TcpListener.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/listener/tcp/TcpListener.java) - [ProtocolCommandRouter.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/routing/ProtocolCommandRouter.java) ## 目录 1. [引言](#引言) 2. [项目结构概览](#项目结构概览) 3. [核心组件架构](#核心组件架构) 4. [协议启动器设计](#协议启动器设计) 5. [消息处理机制](#消息处理机制) 6. [协议帧结构设计](#协议帧结构设计) 7. [命令路由系统](#命令路由系统) 8. [组件交互时序](#组件交互时序) 9. [性能优化考虑](#性能优化考虑) 10. [总结](#总结) ## 引言 绿能协议v3.40是JCPP(充电点协议平台)中的一个重要组成部分,专门用于处理绿能品牌的充电设备通信协议。该协议采用模块化设计,通过继承和组合模式实现了高度可扩展的架构。本文档将深入分析其核心架构设计,包括协议启动器、消息处理器、帧结构设计以及组件间的协作机制。 ## 项目结构概览 绿能协议v3.40的项目结构遵循分层架构原则,主要分为以下几个层次: ```mermaid graph TB subgraph "应用层" Bootstrap[LvnengV340ProtocolBootstrap
协议启动器] end subgraph "业务层" Processor[LvnengProtocolMessageProcessor
消息处理器] Constants[LvnengProtocolConstants
协议常量] end subgraph "命令层" UplinkCmd[LvnengUplinkCmdExe
上行命令基类] DownlinkCmd[LvnengDownlinkCmdExe
下行命令基类] AbstractCmd[AbstractLvnengCmdExe
协议基础类] end subgraph "数据模型层" UplinkMsg[LvnengUplinkMessage
上行消息模型] DownlinkMsg[LvnengDwonlinkMessage
下行消息模型] end subgraph "基础设施层" BaseBootstrap[ProtocolBootstrap
基础启动器] BaseProcessor[ProtocolMessageProcessor
基础消息处理器] Router[ProtocolCommandRouter
命令路由器] end Bootstrap --> Processor Processor --> UplinkCmd Processor --> DownlinkCmd UplinkCmd --> AbstractCmd DownlinkCmd --> AbstractCmd Processor --> UplinkMsg Processor --> DownlinkMsg Bootstrap --> BaseBootstrap Processor --> BaseProcessor Processor --> Router ``` **图表来源** - [LvnengV340ProtocolBootstrap.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/v340/LvnengV340ProtocolBootstrap.java#L1-L42) - [LvnengProtocolMessageProcessor.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/LvnengProtocolMessageProcessor.java#L1-L187) - [ProtocolBootstrap.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/ProtocolBootstrap.java#L1-L127) ## 核心组件架构 ### 组件关系图 绿能协议v3.40的核心架构采用了经典的分层设计模式,各组件之间通过接口进行解耦: ```mermaid classDiagram class ProtocolBootstrap { <> +ProtocolContext protocolContext +ProtocolCfg protocolCfg +Listener listener +Forwarder forwarder +init() void +destroy() void #getProtocolName()* String #_init()* void #_destroy()* void #messageProcessor()* ProtocolMessageProcessor } class LvnengV340ProtocolBootstrap { +String PROTOCOL_NAME +getProtocolName() String +_init() void +_destroy() void +messageProcessor() LvnengProtocolMessageProcessor } class ProtocolMessageProcessor { <> +Forwarder forwarder +ProtocolContext protocolContext +uplinkHandleAsync() void +downlinkHandle() void #uplinkHandle()* void #doDownlinkHandle()* void } class LvnengProtocolMessageProcessor { -ProtocolCommandRouter~LvnengUplinkCmdExe~ uplinkRouter -ProtocolCommandRouter~LvnengDownlinkCmdExe~ downlinkRouter -DownlinkCmdConverter downlinkCmdConverter +uplinkHandle() void +doDownlinkHandle() void -exeCmd() void } class LvnengUplinkCmdExe { <> +execute() void #uplinkMessageBuilder() Builder } class LvnengDownlinkCmdExe { <> +execute() void } class AbstractLvnengCmdExe { #encode() byte[] #encodeAndWriteFlush() void } ProtocolBootstrap <|-- LvnengV340ProtocolBootstrap ProtocolMessageProcessor <|-- LvnengProtocolMessageProcessor LvnengUplinkCmdExe <|-- AbstractLvnengCmdExe LvnengDownlinkCmdExe <|-- AbstractLvnengCmdExe LvnengProtocolMessageProcessor --> LvnengUplinkCmdExe LvnengProtocolMessageProcessor --> LvnengDownlinkCmdExe ``` **图表来源** - [ProtocolBootstrap.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/ProtocolBootstrap.java#L25-L127) - [LvnengV340ProtocolBootstrap.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/v340/LvnengV340ProtocolBootstrap.java#L15-L42) - [ProtocolMessageProcessor.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/ProtocolMessageProcessor.java#L20-L78) **章节来源** - [ProtocolBootstrap.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/ProtocolBootstrap.java#L1-L127) - [LvnengV340ProtocolBootstrap.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/v340/LvnengV340ProtocolBootstrap.java#L1-L42) - [ProtocolMessageProcessor.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/ProtocolMessageProcessor.java#L1-L78) ## 协议启动器设计 ### LvnengV340ProtocolBootstrap核心实现 LvnengV340ProtocolBootstrap作为绿能协议v3.40的主要入口点,继承自ProtocolBootstrap抽象类,并实现了协议特有的初始化和销毁逻辑。 #### 继承关系与方法实现 协议启动器通过以下方式实现核心功能: 1. **协议名称管理**:通过`getProtocolName()`方法返回协议标识 2. **初始化逻辑**:重写了`_init()`方法,目前为空实现 3. **资源清理**:重写了`_destroy()`方法,目前为空实现 4. **消息处理器创建**:通过`messageProcessor()`方法创建具体的处理器实例 #### 启动流程时序图 ```mermaid sequenceDiagram participant App as 应用程序 participant Bootstrap as LvnengV340ProtocolBootstrap participant Base as ProtocolBootstrap participant Listener as TcpListener participant Forwarder as Forwarder participant Processor as LvnengProtocolMessageProcessor App->>Bootstrap : 实例化启动器 App->>Base : 调用init() Base->>Base : 加载协议配置 Base->>Forwarder : 创建转发器 Base->>Listener : 创建TCP监听器 Base->>Bootstrap : 调用_init() Bootstrap-->>Base : 初始化完成 Base-->>App : 启动成功 Note over App,Processor : 协议运行阶段 App->>Listener : 接收客户端连接 Listener->>Processor : 处理上行消息 Processor->>Processor : 解析协议帧 Processor->>Processor : 路由命令处理 Processor-->>App : 返回处理结果 ``` **图表来源** - [LvnengV340ProtocolBootstrap.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/v340/LvnengV340ProtocolBootstrap.java#L25-L42) - [ProtocolBootstrap.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/ProtocolBootstrap.java#L45-L85) **章节来源** - [LvnengV340ProtocolBootstrap.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/v340/LvnengV340ProtocolBootstrap.java#L1-L42) - [ProtocolBootstrap.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/ProtocolBootstrap.java#L45-L85) ## 消息处理机制 ### LvnengProtocolMessageProcessor核心功能 LvnengProtocolMessageProcessor是绿能协议的消息处理中心,负责处理上行和下行消息流。它继承自ProtocolMessageProcessor,并实现了协议特定的消息解析和路由逻辑。 #### 消息处理架构 ```mermaid flowchart TD Start([接收原始消息]) --> ParseHeader[解析帧头信息] ParseHeader --> ValidateLength{验证消息长度} ValidateLength --> |长度异常| LogWarning[记录警告日志] ValidateLength --> |长度正常| ExtractBody[提取消息体] ExtractBody --> VerifyChecksum[验证校验和] VerifyChecksum --> ChecksumValid{校验和有效?} ChecksumValid --> |无效| LogError[记录错误日志] ChecksumValid --> |有效| BuildMessage[构建消息对象] BuildMessage --> RouteCommand[路由命令处理] RouteCommand --> ExecuteCmd[执行命令] ExecuteCmd --> SendResponse[发送响应] LogWarning --> End([处理结束]) LogError --> End SendResponse --> End ``` **图表来源** - [LvnengProtocolMessageProcessor.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/LvnengProtocolMessageProcessor.java#L55-L120) #### 上行消息处理流程 上行消息处理包含以下关键步骤: 1. **帧头解析**:读取起始符、长度、加密标识、序列号和命令码 2. **长度验证**:确保消息长度符合最小要求 3. **消息体提取**:读取实际的数据内容 4. **校验和验证**:使用CRC算法验证数据完整性 5. **消息对象构建**:封装为LvnengUplinkMessage对象 6. **命令路由**:根据命令类型路由到相应的处理器 #### 下行消息处理流程 下行消息处理采用统一的处理模式: 1. **命令转换**:将通用命令转换为协议特定命令 2. **消息构建**:创建LvnengDwonlinkMessage对象 3. **命令执行**:调用相应的命令处理器 4. **响应发送**:将处理结果发送给客户端 **章节来源** - [LvnengProtocolMessageProcessor.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/LvnengProtocolMessageProcessor.java#L55-L187) ## 协议帧结构设计 ### 帧结构定义 绿能协议v3.40采用固定格式的帧结构,确保消息的可靠传输和解析: | 字段 | 长度(字节) | 描述 | |------|--------|-------------------| | 起始符 | 2 | 固定值0xAAF5,标识帧开始 | | 长度 | 2 | 包含整个帧的总长度(小端序) | | 加密标识 | 1 | 0x10表示加密,0x00表示明文 | | 序列号 | 1 | 用于消息顺序控制 | | 命令码 | 2 | 指示消息类型(小端序) | | 数据域 | 变长 | 实际消息内容 | | 校验和 | 1 | CRC8校验值 | #### 帧结构示例 ``` +------------------+------------------+------------------+------------------+ | 起始符 | 长度 | 加密标识 | 序列号 | 命令码 | | (2字节) | (2字节) | (1字节) | (1字节) | (2字节) | +------------------+------------------+------------------+------------------+ | | | 数据域 | | | +---------------------------------------------------------------+ | 校验和 | | (1字节) | +--------------+ ``` ### 校验和算法 协议采用CRC8算法进行数据完整性验证: 1. **校验和计算**:对命令码和数据域进行CRC8计算 2. **校验和验证**:接收端重新计算并比较 3. **错误处理**:校验失败时记录日志并丢弃消息 **章节来源** - [LvnengProtocolMessageProcessor.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/LvnengProtocolMessageProcessor.java#L30-L35) - [AbstractLvnengCmdExe.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/AbstractLvnengCmdExe.java#L50-L70) ## 命令路由系统 ### ProtocolCommandRouter设计 ProtocolCommandRouter提供了基于协议名和命令字的智能路由功能,支持多版本协议的统一管理: ```mermaid classDiagram class ProtocolCommandRouter { -Map~String,T~ executorMap +ProtocolCommandRouter(scanBaseClass, executorFilter) +getExecutor(protocolName, cmd) T -initializeRoutes() void -registerExecutor() void -buildKey() String } class ProtocolCmd { <> +int value() +String[] protocolNames() } class LvnengUplinkCmdExe { <> +execute() void } class LvnengV340LoginULCmd { +execute() void } ProtocolCommandRouter --> LvnengUplinkCmdExe LvnengUplinkCmdExe --> ProtocolCmd LvnengV340LoginULCmd --|> LvnengUplinkCmdExe ProtocolCmd --> LvnengV340LoginULCmd ``` **图表来源** - [ProtocolCommandRouter.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/routing/ProtocolCommandRouter.java#L25-L105) - [LvnengUplinkCmdExe.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/LvnengUplinkCmdExe.java#L19-L39) ### 命令执行器层次结构 ```mermaid classDiagram class AbstractLvnengCmdExe { #byte[] encode() #encodeAndWriteFlush() #DOWNLINK_CMD_CONVERTER #LVNENG_HEAD #LVNENG_ENCRYPTION_FLAG } class LvnengUplinkCmdExe { <> +execute() void #uplinkMessageBuilder() } class LvnengDownlinkCmdExe { <> +execute() void } class LvnengV340LoginULCmd { +execute() void } class LvnengV340RemoteStopDLCmd { +execute() void } AbstractLvnengCmdExe <|-- LvnengUplinkCmdExe AbstractLvnengCmdExe <|-- LvnengDownlinkCmdExe LvnengUplinkCmdExe <|-- LvnengV340LoginULCmd LvnengDownlinkCmdExe <|-- LvnengV340RemoteStopDLCmd ``` **图表来源** - [AbstractLvnengCmdExe.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/AbstractLvnengCmdExe.java#L18-L120) - [LvnengUplinkCmdExe.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/LvnengUplinkCmdExe.java#L19-L39) - [LvnengDownlinkCmdExe.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/LvnengDownlinkCmdExe.java#L14-L18) ### 命令处理时序图 ```mermaid sequenceDiagram participant Session as TcpSession participant Processor as LvnengProtocolMessageProcessor participant Router as ProtocolCommandRouter participant Executor as 命令执行器 participant Forwarder as Forwarder Session->>Processor : uplinkHandleAsync() Processor->>Processor : 解析消息帧 Processor->>Router : getExecutor(protocolName, cmd) Router-->>Processor : 返回命令执行器 Processor->>Executor : execute(session, message, context) Executor->>Executor : 处理业务逻辑 Executor->>Forwarder : 发送上行消息 Forwarder-->>Session : 返回处理结果 ``` **图表来源** - [LvnengProtocolMessageProcessor.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/LvnengProtocolMessageProcessor.java#L150-L187) **章节来源** - [ProtocolCommandRouter.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/routing/ProtocolCommandRouter.java#L25-L105) - [LvnengProtocolMessageProcessor.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/LvnengProtocolMessageProcessor.java#L150-L187) ## 组件交互时序 ### 协议初始化时序 ```mermaid sequenceDiagram participant App as 应用程序 participant Bootstrap as LvnengV340ProtocolBootstrap participant Config as ProtocolContext participant Forwarder as Forwarder participant Listener as TcpListener participant Processor as LvnengProtocolMessageProcessor App->>Bootstrap : 实例化 App->>Bootstrap : init() Bootstrap->>Config : loadConfig(protocolName) Config-->>Bootstrap : 返回配置信息 Bootstrap->>Forwarder : 创建转发器 Forwarder-->>Bootstrap : 转发器实例 Bootstrap->>Listener : 创建TCP监听器 Listener->>Processor : 创建消息处理器 Processor->>Processor : 初始化命令路由器 Processor-->>Listener : 处理器就绪 Listener-->>Bootstrap : 监听器就绪 Bootstrap->>Bootstrap : _init() Bootstrap-->>App : 初始化完成 Note over App,Processor : 协议服务已启动 ``` **图表来源** - [LvnengV340ProtocolBootstrap.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/v340/LvnengV340ProtocolBootstrap.java#L25-L42) - [ProtocolBootstrap.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/ProtocolBootstrap.java#L45-L85) ### 消息处理时序 ```mermaid sequenceDiagram participant Client as 客户端 participant Listener as TcpListener participant Processor as LvnengProtocolMessageProcessor participant Router as ProtocolCommandRouter participant CmdExe as 命令执行器 participant Forwarder as Forwarder Client->>Listener : 发送原始消息 Listener->>Processor : uplinkHandleAsync() Processor->>Processor : 解析协议帧 Processor->>Processor : 验证校验和 Processor->>Router : getExecutor(protocolName, cmd) Router-->>Processor : 返回执行器 Processor->>CmdExe : execute(session, message, context) CmdExe->>CmdExe : 处理业务逻辑 CmdExe->>Forwarder : sendMessage(uplinkQueueMessage) Forwarder-->>Client : 返回处理结果 Note over Client,Forwarder : 异步处理流程 ``` **图表来源** - [LvnengProtocolMessageProcessor.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/LvnengProtocolMessageProcessor.java#L55-L120) - [TcpListener.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/listener/tcp/TcpListener.java#L40-L70) **章节来源** - [LvnengV340ProtocolBootstrap.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/v340/LvnengV340ProtocolBootstrap.java#L25-L42) - [LvnengProtocolMessageProcessor.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/LvnengProtocolMessageProcessor.java#L55-L120) ## 性能优化考虑 ### 异步处理机制 协议采用异步处理模式,通过线程池管理消息处理: 1. **线程池隔离**:使用分片线程池避免资源竞争 2. **异步消息处理**:上行消息处理采用异步模式 3. **内存管理**:及时释放ByteBuf资源 ### 内存优化策略 1. **对象复用**:重用消息对象减少GC压力 2. **缓冲区管理**:合理设置TCP缓冲区大小 3. **序列号管理**:维护序列号状态避免重复 ### 并发控制 1. **无锁设计**:使用ConcurrentHashMap实现线程安全 2. **原子操作**:利用CAS操作提高并发性能 3. **批量处理**:支持批量消息处理 ## 总结 绿能协议v3.40的核心架构展现了优秀的软件设计原则: ### 设计亮点 1. **模块化设计**:清晰的分层架构,职责分离明确 2. **可扩展性**:基于注解的命令路由系统,易于添加新命令 3. **可靠性**:完善的错误处理和校验机制 4. **性能优化**:异步处理和资源管理策略 ### 架构优势 1. **高内聚低耦合**:各组件职责单一,依赖关系清晰 2. **可测试性**:良好的接口设计便于单元测试 3. **可维护性**:清晰的代码结构和文档 4. **可监控性**:完整的健康检查和统计指标 该架构为绿能协议v3.40提供了稳定、高效、可扩展的通信基础,能够满足现代充电站系统的复杂需求。