OCPP 1.6 接入实现文档

2024-02-23 16:52
文章标签 实现 文档 1.6 接入 ocpp

本文主要是介绍OCPP 1.6 接入实现文档,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简介

OCPP(Open Charge Point Protocol)是一个开放的通信协议,用于充电站(Charge Point)与中央系统(Central System,如充电站管理系统或服务提供商平台)之间的通讯。本篇文档将详细阐述如何基于OCPP 1.6版本进行接入和实现。

1.1 OCPP 1.6 特点

OCPP 1.6标准增强了安全性,支持JSON格式的消息传输,并引入了更多的功能以满足更复杂的充电需求,例如智能充电、远程触发控制、计量数据上报等。

二、环境准备

  • 硬件:确保充电设备支持OCPP 1.6协议并配置网络连接。
  • 软件:在充电站和中央系统两端均需安装支持OCPP 1.6的软件栈,包括协议解析库和应用层业务逻辑处理程序。
  • 安全设置:根据OCPP 1.6规范,可以使用TLS加密以保证通讯的安全性。

三、接入步骤

3.1 建立连接

  1. 充电站启动后主动向中央系统发起TCP连接请求,并发送BootNotification消息以告知其已上线。
  2. 中央系统收到BootNotification后回应一个确认消息,并可能提供一些配置信息。
    1)BootNotification.req:充电站启动后发送BootNotification.req消息给中央系统。
    2)BootNotification.conf:中央系统收到请求后回复BootNotification.conf确认消息,并可能提供配置信息。

3.2 认证授权

  • 根据实际部署情况,可能需要执行身份认证和授权过程,这通常通过AuthorizeStartTransaction等消息实现。
    1)Authorize.req:当用户插入充电枪时,充电站向中央系统发起Authorize.req请求,包含用户ID(如RFID标签ID)。
    2)Authorize.conf:中央系统验证用户身份并回复Authorize.conf响应,指示是否授权成功。
    3)StartTransaction.req:在授权成功后,充电站发送StartTransaction.req以开始充电交易。
    4)StartTransaction.conf:中央系统回复确认交易开始的消息。
     

3.3 数据交互

  • 充电站定期或在特定事件触发时向中央系统发送状态更新,如HeartbeatMeterValuesStatusNotification等。
    1)MeterValues.req:充电过程中,充电站定期或按需发送MeterValues.req报告计量值(如电量消耗)。
    2)Heartbeat.req/Heartbeat.conf:为了保持连接状态和检查存活,双方可定期互发心跳包。
  • 中央系统可以通过RemoteStartTransactionRemoteStopTransactionChangeConfiguration等命令来远程控制和管理充电站。
     

3.4 交易处理

  • 交易生命周期涉及StartTransactionStopTransaction等消息,用于记录并结算充电费用。
    1)StopTransaction.req:充电结束时,充电站发送StopTransaction.req停止交易并结算费用。
    2)StopTransaction.conf:中央系统确认交易已停止并完成计费处理。
    3)UpdateFirmware.req:如果有新固件版本,中央系统可以发送UpdateFirmware.req命令要求充电站升级固件。
     

四、关键接口实现

4.1 BootNotification
Json
{"messageTypeId": "BootNotification","chargePointVendor": "Vendor Name","chargePointModel": "Model Name","firmwareVersion": "Version Number","iccid": "Optional ICCID","imsi": "Optional IMSI"
}
4.2 Authorize
Json
{"messageTypeId": "Authorize","idTag": "User's ID Tag"
}
4.3 StartTransaction
Json
{"messageTypeId": "StartTransaction","connectorId": "Connector Identifier","idTag": "User's ID Tag",// Other optional parameters...
}
4.4 MeterValues
Json
{"messageTypeId": "MeterValues","connectorId": "Connector Identifier","transactionId": "Transaction Identifier","meterValue": [{"timestamp": "Timestamp of the reading","sampledValue": [{"value": "Energy consumed in Wh",// Other sampled values such as voltage, current, etc.}]}]
}

1. 创建基础结构

首先,你需要创建一个ChargePoint类和一个CentralSystem类来模拟双方交互。假设使用了Spring Boot和WebSockets(因为OCPP 1.6支持WebSocket传输):

Java

public class ChargePoint {// 连接WebSocket会话private WebSocketSession session;// 其他属性如vendor, model等...public void sendToCentralSystem(Message message) {try {this.session.sendMessage(new TextMessage(objectMapper.writeValueAsString(message)));} catch (JsonProcessingException e) {// 处理序列化异常} catch (IOException e) {// 处理网络IO异常}}// 实现其他接口调用方法,如bootNotification, startTransaction等...
}public class CentralSystem {// 处理从充电站接收的消息public void handleMessage(String json) {Message message = objectMapper.readValue(json, Message.class);handleIncomingMessage(message);}private void handleIncomingMessage(Message message) {switch (message.getMessageTypeId()) {case BOOT_NOTIFICATION:BootNotificationRequest bootNotification = (BootNotificationRequest) message;// 处理并回应BootNotification请求break;// 类似的处理StartTransaction, MeterValues等其他类型的消息}}// 实现向充电站发送消息的方法
}

2. 定义消息模型

定义各类消息对象,例如BootNotificationRequestMeterValuesRequest等,它们都继承自一个基类Message

Java

public abstract class Message {private String messageTypeId;// 其他公共属性或方法...
}public class BootNotificationRequest extends Message {private String chargePointVendor;private String chargePointModel;// 其他属性...
}public class MeterValuesRequest extends Message {private List<MeterValue> meterValues;// 其他属性...public static class MeterValue {private Long timestamp;private List<SampledValue> sampledValues;// ...}public static class SampledValue {private String value;// 其他计量值属性...}
}

3. 序列化与反序列化

利用Jackson库或其他JSON库进行序列化和反序列化操作:

Java

import com.fasterxml.jackson.databind.ObjectMapper;ObjectMapper objectMapper = new ObjectMapper();

4. 实际消息处理逻辑

handleIncomingMessage方法中,针对每种消息类型执行相应的业务逻辑,例如处理BootNotification

Java

private void handleIncomingMessage(Message message) {if (message instanceof BootNotificationRequest) {BootNotificationRequest bootNotification = (BootNotificationRequest) message;// 业务逻辑:验证设备信息、保存到数据库、回复确认消息等BootNotificationResponse response = new BootNotificationResponse(RegistrationStatus.Accepted, "config");String jsonResponse = objectMapper.writeValueAsString(response);chargePoint.sendToCentralSystem(response);}// 其他消息类型的处理...
}

五、注意事项

  • 确保正确处理各类消息的响应以及错误处理机制。
  • 遵循协议规定的消息序列化和反序列化规则,确保数据传输准确无误。
  • 对于长期运行的服务,必须考虑异常恢复、断线重连及事务一致性问题。

六、测试验证

  • 在完成对接后,进行全面的功能测试和压力测试,确保在各种场景下系统的稳定性和可靠性。

通过遵循上述步骤和指南,您可以成功地将符合OCPP 1.6标准的充电站接入到您的中央系统中,实现充电设施的智能化管理和运营。同时,请务必查阅官方的OCPP 1.6完整规范以获取详细的协议定义和要求。

七、实现效果

APP 效果图:

首页及钱包页

运营平台:

首页

订单详情页

如有海外充电平台定制需求,可私。

这篇关于OCPP 1.6 接入实现文档的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/739282

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、