You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OCPP充电桩参数获取及Java/Kotlin库选型技术咨询

OCPP入门问题解决方案

一、可用的Java OCPP库推荐

  • Open Charge Point Protocol Java Implementation:维护活跃,支持OCPP 1.6与2.0.1版本,兼容WebSocket/HTTP传输协议,社区文档完善,适配主流充电桩模拟器,可解决旧库连接不稳定的问题。
  • Spring Boot OCPP Starter:基于Spring生态打造,能快速集成OCPP服务,适合Java后端开发者快速搭建监控工具,内置连接管理与消息处理机制,降低开发门槛。

二、使用IZIVIA ocpp-toolkit获取充电桩参数

你已完成授权与交易启动,接下来可通过OCPP标准指令获取目标参数,具体操作如下:

1. 获取静态参数(如最大充电功率)

调用getConfiguration方法读取充电桩的静态配置参数,示例代码:

// 授权成功后添加以下代码
var configReq = new GetConfigurationReq(Arrays.asList("MaxPower"));
var configResponse = connection.getConfiguration(new RequestMetadata(chargePointId, null), configReq).getResponse();
// 解析最大充电功率
configResponse.getKeyValue().forEach(kv -> {
    if ("MaxPower".equals(kv.getKey())) {
        log.info("最大充电功率: {} kW", kv.getValue());
    }
});

注:部分设备可能用PowerLimit作为功率参数键名,可根据设备文档调整。

2. 获取实时充电参数(如当前充电百分比、实时功率)

调用meterValues方法获取实时计量数据,需指定充电端口ID(示例用1):

// 获取实时计量值
var meterReq = new MeterValuesReq(1, Arrays.asList(
    new MeterValue(Instant.now(), Arrays.asList(
        new SampledValue("85", ReadingContext.SamplePeriod, ValueFormat.Raw, Measurand.Soc), // 当前充电百分比(SOC)
        new SampledValue("6.5", ReadingContext.SamplePeriod, ValueFormat.Raw, Measurand.PowerActiveImport) // 当前充电功率
    ))
));
var meterResponse = connection.meterValues(new RequestMetadata(chargePointId, null), meterReq).getResponse();
log.info("计量数据上报成功: {}", meterResponse);

3. 监听充电桩主动推送的状态

充电桩会主动推送StatusNotification等实时消息,需完善OcppCallbacks类接收数据:

public class OcppCallbacks implements ChargePointListener {
    @Override
    public void onStatusNotification(StatusNotificationReq req, RequestMetadata metadata) {
        log.info("充电桩状态更新: 端口{},状态{}", req.getConnectorId(), req.getStatus());
    }

    @Override
    public void onMeterValues(MeterValuesReq req, RequestMetadata metadata) {
        // 处理充电桩主动推送的计量数据
        req.getMeterValue().forEach(mv -> {
            mv.getSampledValue().forEach(sv -> {
                if (Measurand.Soc.equals(sv.getMeasurand())) {
                    log.info("主动推送的充电百分比: {}%", sv.getValue());
                }
            });
        });
    }

    // 实现其他必要的接口方法(如onAuthorize、onStartTransaction等)
}

整合后的完整代码

private static void testOcppConnection() throws ConnectException {
    final var chargePointId = "EFACECQCTEST";
    ChargePointOperations connection = ApiFactory.Companion.ocpp16ConnectionToCSMS(chargePointId,
            "ws://ws.ocpp-css.com/ocpp",
            TransportEnum.WEBSOCKET,
            null,
            null,
            Collections.emptyList(),
            new OcppCallbacks());

    connection.connect();
    final var idTag = "demo";
    var authResponse = connection.authorize(new RequestMetadata(chargePointId, null), new AuthorizeReq(idTag)).getResponse();
    if (authResponse.getIdTagInfo().getStatus() == AuthorizationStatus.Accepted) {
        log.info("Auth accepted");
        var transactionResponse = connection.startTransaction(new RequestMetadata(chargePointId, null), new StartTransactionReq(1, idTag, 0,
                Instant.Companion.fromEpochSeconds(java.time.Instant.now().getEpochSecond(), 0), null)).getResponse();
        var transactionId = transactionResponse.getTransactionId();
        log.info("Start transaction: {}", transactionId);
        log.info("{}", transactionResponse.getIdTagInfo());

        // 获取最大充电功率
        var configReq = new GetConfigurationReq(Arrays.asList("MaxPower"));
        var configResponse = connection.getConfiguration(new RequestMetadata(chargePointId, null), configReq).getResponse();
        configResponse.getKeyValue().forEach(kv -> {
            if ("MaxPower".equals(kv.getKey())) {
                log.info("最大充电功率: {} kW", kv.getValue());
            }
        });

        // 获取实时充电参数
        var meterReq = new MeterValuesReq(1, Arrays.asList(
                new MeterValue(Instant.now(), Arrays.asList(
                        new SampledValue("85", ReadingContext.SamplePeriod, ValueFormat.Raw, Measurand.Soc),
                        new SampledValue("6.5", ReadingContext.SamplePeriod, ValueFormat.Raw, Measurand.PowerActiveImport)
                ))
        ));
        var meterResponse = connection.meterValues(new RequestMetadata(chargePointId, null), meterReq).getResponse();
        log.info("计量数据上报成功: {}", meterResponse);

    } else {
        log.info("Auth rejected");
    }
}

额外提示

  • 可通过SetConfiguration方法调整充电桩的计量数据上报间隔,满足监控频率需求。
  • 若部分参数无法获取,可查阅OCPP 1.6官方规范文档确认指令与参数定义。

内容的提问来源于stack exchange,提问作者Alexander Popov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 17:45:59