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
相关产品推荐
相关产品推荐

