关于我们 / 企业动态
技术实践 3 分钟阅读

【云创智城】YunCharge充电桩系统源码实现云快充协议深度解析与Java技术实践:打造高效充电桩运营系统

云快充协议 V1.5 为充电桩与运营平台的交互提供了完整的技术框架,通过本文的解析和代码实现,开发者可以快速构建符合协议标准的充电管理系统。在实际应用中,还需结合具体业务场景进行定制化开发,并持续关注协议的更新动态,以适应新能源充电领域的技

【云创智城】YunCharge充电桩系统源码实现云快充协议深度解析与Java技术实践:打造高效充电桩运营系统

原文链接:【云创智城】YunCharge充电桩系统源码实现云快充协议深度解析与Java技术实践:打造高效充电桩运营系统

在新能源汽车充电领域,标准化的通信协议是充电桩与运营平台互联互通的基础。云快充协议V1.5、充协议V1.6作为行业内广泛应用的通信规范,为充电桩设备与云平台的交互提供了完整的技术解决方案。本文将深入剖析该协议的技术架构、核心流程,并通过Java代码实现关键功能,为开发者提供从理论到实践的全面指导。

协议核心架构与数据模型

云快充协议采用分层架构设计,基于TCP/IP通信协议,在应用层定义了完整的数据交互规范。整个架构可分为物理层、链路层、网络层、传输层和应用层五层体系,其中应用层是协议的核心,定义了充电桩与平台交互的所有消息格式和业务逻辑。

应用层报文帧格式

协议的应用层数据帧采用固定格式,包含7个核心字段,形成了一套完整的数据传输单元:

CODE
| 起始标志 | 数据长度 | 序列号域 | 加密标志 | 帧类型标志 | 消息体 | 帧校验域 |
|----------|----------|----------|----------|----------|--------|----------|
| 1字节    | 1字节    | 2字节    | 1字节    | 1字节    | N字节  | 2字节    |
  • 起始标志:固定为0x68,表示一帧数据的开始
  • 数据长度:表示数据域的字节数,不加密时为原数据长度,加密时为加密后长度
  • 序列号域:数据包的发送顺序号,从0开始递增,应答包与请求包序号一致
  • 加密标志:标识消息体是否加密,0x00为不加密,0x01为3DES加密
  • 帧类型标志:定义上下行数据帧的类型,充电桩定义为奇数,平台定义为偶数
  • 帧校验域:从序列号域到数据域的CRC16校验,校验多项式为0x180D

核心数据模型

协议定义了丰富的数据模型来描述充电业务中的各类实体:

  1. 交易流水号:作为一次充电操作的唯一标识,格式为桩号(7bytes)+枪号(1byte)+年月日时分秒(6bytes)+自增序号(2bytes),例如32010600019236012001061803423060
  2. 计费模型:支持分时计费,将一天分为48个时段(每半小时一个时段),每个时段可配置尖、峰、平、谷四种费率,包含电费和服务费分开计算的机制
  3. 充电状态:定义了离线、故障、空闲、充电中、充电结束等多种状态,通过状态码进行标识和上报
  4. 故障代码:采用位掩码方式定义了丰富的故障类型,如急停按钮故障、绝缘检测故障、电度表通信中断等

关键通信流程解析

上电与认证流程

充电桩上电或网络恢复后的首要任务是完成与平台的认证连接,这一过程包含多个关键步骤:

CODE
graph TD;
    A[充电桩上电] --> B[发送登录认证帧(0x01)];
    B --> C[平台接收并验证桩信息];
    C --> D{验证是否通过?};
    D -- 是 --> E[平台发送登录应答(0x02)成功];
    D -- 否 --> F[平台发送登录应答(0x02)失败并断开连接];
    E --> G[桩检查离线数据];
    G --> H{有离线数据?};
    H -- 是 --> I[桩上传离线数据];
    H -- 否 --> J[桩请求计费模型(0x09)];
    J --> K[平台返回计费模型应答(0x0A)];

在Java中实现这一流程,需要创建登录认证消息类,并处理网络连接和响应:

JAVA
// 登录认证消息类
public class LoginMessage {

    private byte startFlag = 0x68;         // 起始标志
    private byte dataLength;                // 数据长度
    private short sequence;                 // 序列号
    private byte encryptFlag = 0x00;        // 加密标志
    private byte frameType = 0x01;          // 帧类型码0x01
    private String桩Code;                   // 桩编码
    private byte桩Type;                     // 桩类型(0直流,1交流)
    private byte gunCount;                   // 充电枪数量
    private byte protocolVersion;            // 通信协议版本
    private String programVersion;           // 程序版本
    private byte networkType;                // 网络连接类型
    private String simCard;                  // SIM卡号码
    private byte operator;                   // 运营商

    // 转换为字节数组发送
    public byte[] toBytes() {

        // 实现字节转换逻辑,包含BCD码转换、CRC校验计算等
        // ...
    }

    // 从字节数组解析
    public static LoginMessage fromBytes(byte[] data) {

        // 解析数据帧,构建消息对象
        // ...
    }
}

// 通信管理类
public class ChargingCommManager {

    private Socket socket;
    private LoginMessage loginMessage;

    public void connect() throws IOException {

        socket = new Socket("121.199.192.223", 8768); // 测试服务器地址
        loginMessage = new LoginMessage();
        loginMessage.set桩Code("32010600019");
        // 设置其他参数...

        sendMessage(loginMessage.toBytes());
        byte[] response = receiveMessage();
        handleLoginResponse(response);
    }

    private void handleLoginResponse(byte[] data) {

        // 解析登录应答帧(0x02)
        // ...
    }
}

充电流程与状态机设计

充电过程是协议的核心业务流程,涉及多个交互环节,可抽象为状态机模型:

想看更多与您场景匹配的落地案例?

立即咨询