Files
JChargePointProtocol/docs/开发者指南.md
2025-10-28 14:39:06 +08:00

12 KiB
Raw Blame History

开发者指南

**本文档中引用的文件** - [README.md](file://README.md) - [pom.xml](file://pom.xml) - [docker/start.sh](file://docker/start.sh) - [docker/docker-compose.monolith.yml](file://docker/docker-compose.monolith.yml) - [jcpp-app-bootstrap/src/main/resources/app-service.yml](file://jcpp-app-bootstrap/src/main/resources/app-service.yml) - [jcpp-protocol-bootstrap/src/main/resources/protocol-service.yml](file://jcpp-protocol-bootstrap/src/main/resources/protocol-service.yml) - [jcpp-app-bootstrap/src/main/java/sanbing/jcpp/JCPPServerApplication.java](file://jcpp-app-bootstrap/src/main/java/sanbing/jcpp/JCPPServerApplication.java) - [jcpp-protocol-bootstrap/src/main/java/sanbing/jcpp/protocol/JCPPProtocolServiceApplication.java](file://jcpp-protocol-bootstrap/src/main/java/sanbing/jcpp/protocol/JCPPProtocolServiceApplication.java) - [jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/ProtocolBootstrap.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/ProtocolBootstrap.java) - [jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/ProtocolMessageProcessor.java](file://jcpp-protocol-api/src/main/java/sanbing/jcpp/protocol/ProtocolMessageProcessor.java) - [jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/YunkuaichongV150ProtocolBootstrap.java](file://jcpp-protocol-yunkuaichong/src/main/java/sanbing/jcpp/protocol/yunkuaichong/v150/YunkuaichongV150ProtocolBootstrap.java) - [jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/v340/LvnengV340ProtocolBootstrap.java](file://jcpp-protocol-lvneng/src/main/java/sanbing/jcpp/protocol/lvneng/v340/LvnengV340ProtocolBootstrap.java) - [jcpp-app/src/main/java/sanbing/jcpp/app/service/impl/DefaultPileProtocolService.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/service/impl/DefaultPileProtocolService.java) - [jcpp-app/src/main/java/sanbing/jcpp/app/adapter/controller/RpcController.java](file://jcpp-app/src/main/java/sanbing/jcpp/app/adapter/controller/RpcController.java) - [jcpp-web-ui/package.json](file://jcpp-web-ui/package.json)

目录

  1. 环境搭建
  2. 代码获取与构建
  3. 本地运行
  4. 开发新协议
  5. 调试技巧

环境搭建

在开始开发之前,需要安装以下必要的开发工具:

  1. JDK 21本项目基于Java 21开发需安装JDK 21并配置JAVA_HOME环境变量。
  2. Maven用于构建Java后端模块建议使用最新稳定版本。
  3. Node.js用于构建前端项目建议使用LTS版本如v18或v20
  4. Docker用于启动依赖服务PostgreSQL, Redis, Kafka等建议安装最新稳定版。

安装完成后,可通过以下命令验证:

java -version
mvn -version
node --version
docker --version

Section sources

代码获取与构建

代码获取

使用Git克隆项目仓库

git clone https://github.com/sanbing-java/JChargePointProtocol.git
cd JChargePointProtocol

后端构建

项目包含多个Maven模块主要后端模块包括jcpp-appjcpp-protocol-*系列模块。

构建所有模块:

mvn clean install -DskipTests

仅构建特定模块(如jcpp-app

cd jcpp-app
mvn clean package -DskipTests

前端构建

前端项目位于jcpp-web-ui目录使用npm进行构建。

进入前端目录并安装依赖:

cd jcpp-web-ui
npm install

构建生产版本:

npm run build

启动开发服务器:

npm start

Section sources

本地运行

启动依赖服务

项目依赖PostgreSQL、Redis和Kafka等服务可通过Docker Compose一键启动。

使用提供的启动脚本:

bash docker/start.sh

或手动执行Docker Compose命令

docker-compose -f docker/docker-compose.postgres.yml -f docker/docker-compose.redis-standalone.yml -f docker/docker-compose.kafka.yml up -d

启动应用服务

项目包含两个核心启动模块:jcpp-app-bootstrap(应用后端)和jcpp-protocol-bootstrap(协议前置)。

  1. 启动应用后端服务:
cd jcpp-app-bootstrap
mvn spring-boot:run
  1. 启动协议前置服务:
cd jcpp-protocol-bootstrap
mvn spring-boot:run

服务启动后,可通过以下地址访问:

graph TD
A[Docker Compose] --> B[PostgreSQL]
A --> C[Redis]
A --> D[Kafka]
E[jcpp-app-bootstrap] --> B
E --> C
F[jcpp-protocol-bootstrap] --> D
F --> C
E --> G[前端UI]
F --> E

Diagram sources

Section sources

开发新协议

以实现一个新的充电桩协议为例,说明开发流程。

继承ProtocolBootstrap

创建新的协议启动类,继承ProtocolBootstrap抽象类。参考现有协议实现,如YunkuaichongV150ProtocolBootstrap

@ProtocolComponent("NEW_PROTOCOL_V100")
public class NewProtocolV100Bootstrap extends ProtocolBootstrap {
    
    @Override
    protected String getProtocolName() {
        return "NEW_PROTOCOL_V100";
    }
    
    @Override
    protected void _init() {
        // 初始化逻辑
    }
    
    @Override
    protected void _destroy() {
        // 销毁逻辑
    }
    
    @Override
    protected ProtocolMessageProcessor messageProcessor() {
        return new NewProtocolMessageProcessor(forwarder, protocolContext);
    }
}

实现消息处理器

创建消息处理器类,继承ProtocolMessageProcessor,实现上行和下行消息处理逻辑。

public class NewProtocolMessageProcessor extends ProtocolMessageProcessor {
    
    public NewProtocolMessageProcessor(Forwarder forwarder, ProtocolContext protocolContext) {
        super(forwarder, protocolContext);
    }
    
    @Override
    protected void uplinkHandle(ListenerToHandlerMsg listenerToHandlerMsg) {
        // 处理上行消息
    }
    
    @Override
    protected void doDownlinkHandle(SessionToHandlerMsg sessionToHandlerMsg) {
        // 处理下行消息
    }
}

定义命令类

根据协议规范定义上行和下行命令类,通常包含消息头、消息体、校验等字段。

配置文件注册

protocol-service.yml中注册新协议的配置,包括监听端口、转发方式等。

service:
  protocols:
    newProtocolV100:
      enabled: true
      listener:
        tcp:
          bind-port: 38021
      forwarder:
        type: kafka
classDiagram
class ProtocolBootstrap {
+init()
+destroy()
+health()
+getProtocolName()
+_init()
+_destroy()
+messageProcessor()
}
class NewProtocolV100Bootstrap {
+getProtocolName()
+_init()
+_destroy()
+messageProcessor()
}
class ProtocolMessageProcessor {
+uplinkHandleAsync()
+downlinkHandle()
+uplinkHandle()
+doDownlinkHandle()
}
class NewProtocolMessageProcessor {
+uplinkHandle()
+doDownlinkHandle()
}
ProtocolBootstrap <|-- NewProtocolV100Bootstrap
ProtocolMessageProcessor <|-- NewProtocolMessageProcessor
NewProtocolV100Bootstrap --> NewProtocolMessageProcessor : "creates"

Diagram sources

Section sources

调试技巧

查看日志

应用日志默认输出到控制台,并保存在logs/目录下。关键日志文件包括:

  • logs/accesslog/HTTP访问日志
  • logs/gc/gc.logJVM GC日志
  • logs/heapdump/:内存溢出时的堆转储文件

可通过配置app-service.yml调整日志级别:

logging:
  level:
    sanbing: DEBUG

远程调试

通过JVM参数启用远程调试修改启动脚本docker/start.sh

export JAVA_OPTS_EXTEND="-Xdebug -Xrunjdwp:transport=dt_socket,address=0.0.0.0:8000,server=y,suspend=n"

在IDE中配置远程调试连接

  • 主机localhost
  • 端口8000
  • 调试器Java

RPC调用调试

通过RpcController提供的API接口发送调试指令

curl -X POST http://localhost:8080/api/rpc/oneway \
  -H "Content-Type: application/json" \
  -d '{
    "method": "startCharge",
    "parameter": {"pileCode": "P123", "gunNo": "1"}
  }'
sequenceDiagram
participant Dev as 开发者
participant IDE as IDE
participant App as jcpp-app-bootstrap
participant Protocol as jcpp-protocol-bootstrap
Dev->>IDE : 配置远程调试
IDE->>App : 连接调试端口8000
Dev->>App : 发送RPC指令
App->>Protocol : 通过Kafka转发
Protocol->>App : 处理协议消息
App-->>Dev : 返回响应结果

Diagram sources

Section sources