当前位置: 首页 > news >正文

OCPP1.6协议

目录

导言

功能简介

本地授权列表

类型

IdToken

IdTagInfo

授权状态

协议指令

1、授权

1.1 说明

1.2  Authorize.req

1.3 Authorize.conf

1.4 JSON格式

1.5 代码

2、启动通知

2.1 说明

2.2 BootNotification.req

2.3 BootNotification.conf

2.4 JSON格式

2.5 代码


导言

     这是 OCPP 1.6 版的规范。
     OCPP 是一种标准的开放式协议,用于充电站与中央系统之间的通信,可适用于任何类型的充电技术。
      OCPP 1.6 引入了适应市场的新功能:智能充电、通过 Websockets 使用 JSON 的 OCPP、更好的诊断可能性( 原因 )、更多的充电点 状态 触发信息 TriggerMessage )。OCPP 1.6 以 OCPP 1.5 为基础,增加了一些新功能和大量 文字上的改进、说明,并修正了所有已知的模糊之处。由于改进和新增功能,OCPP 1 . 6 与 OCPP 1.5 并不向后兼容 。
有关变更的完整列表,请参阅 OCPP 1.6 中的新 功能。
       一些基本概念将在本介绍性章节的以下部分进行解释。各章: 由充电桩启动的操作 由中央系统启动 的操作描述 了协议支持的操作。确切的信息及其参数将在本章中详细说明: 信息 和数据类型在 "数据类型 "一章中进行了描述 : 类型 。定义的配置密钥在 "标准配置密钥名称和参数 "一章中描述: 标准配置键名称和值
     随着 OCPP 1.6 版本的推出,OCPP 有了两种不同的版本;除了基于 SOAP 的实现外,还有可能使用更为简洁的 JSON 版本。为避免在交流中混淆实现类型,我们建议使用不同的后缀 -J 和 -S 来表示 JSON 或 SOAP。一般来说, OCPP-J 表示 JSON,OCPP-S 表示 SOAP。
为了支持不同的版本,OCPP 标准分为多个文件。基础文档(您正在阅读的文档)包含技术协议规范。 OCPP SOAP 规范》(OCPP SOAP Specification )包含实现 OCPP-S 所需的实施规范。对于 OCPP-J,必须使用 OCPP JSON 规范。
为提高中央系统与充电桩之间的互操作性,建议满足 OCPP 1.6 合规性测试 文件中的要求。

功能简介

在 OCPP 1.6 中,功能和相关信息按 配置文件 分组。根据所需功能,实施者可选择实施以下一个或多个配置文件。
客户可使用这些配置文件来确定 OCPP 1.6 产品是否具备其业务所需的功能。合规性测试将根据配置文件测试产品 是否符合 OCPP 1.6 规范。 必 须 执行核心配置文件。其他配置文件为可选配置文件。 在执行核心、固件管理、本地验证列表管理和预订配置文件时,将涵盖源自 OCPP 1.5 [OCPP1. 5 ] 的所有功能。
下表显示了所有信息在其配置文件中的分组情况

本地授权列表

类型

IdToken

包含用于授权的标识符。这是一个不区分大小写的字符串。在今后的版本中,它可能会成为 一个复杂类型,以支持 多种形式的标识符。

IdTagInfo

包含有关标识符的状态信息。它在授权、开始交易和停止交易响应中返回。
如果没有给出 expiryDate,则状态没有结束日期。

授权状态

枚举
Authorize.req 响应中的状态。

协议指令

1、授权

1.1 说明

      在电动汽车车主开始或停止充电之前,充电桩必须授权操作。充电点只能在授权后才能提供能量。停止交易时, 只有当用于停止交易的标识符与开始交易的标识符不同时,充电桩才会发送 Authorize.req 消息。
Authorize.req 应仅用于授权标识符收费。
本地授权列表 所述,充电点可在不涉及中央系统的情况下在本地授权标识符。如果用户提交的 idTag 不在本地
授权列表或授权缓存中,则充电点应向中央系统发送 Authorize.req PDU 请求授权。如果 idTag 存在于本地授权
列表或授权缓存中,则充电点可以向中央系统发送 Authorize.req PDU。
收到 Authorize.req PDU 后,中心系统应回应一个 Authorize.conf PDU。此响应 PDU 应表明中心系统是否接受
idTag。如果中心系统 接受 idTag,那么响应 PDU 可以包括 parentIdTag ,并且必须包括 表示接受或拒绝原因的 授权
状态值。
如果 Charge Point 已实施了授权缓存,那么在收到 Authorize.conf PDU 后,如果 idTag 不在 本地授权列表 中,
Charge Point 应按照 授权 缓存中所述,用响应中的 IdTagInfo 值更新缓存条目

1.2  Authorize.req

它包含充电点发送到中央系统的 Authorize.req PDU 的字段定义。

1.3 Authorize.conf

它包含中央系统为响应 Authorize.req PDU 而向充电点发送的 Authorize. conf PDU 的字段定义。

1.4 JSON格式

【SEND】♂[2,"yiBSjMizbzFWUcmz","Authorize",{"idTag":"F3F7C00B"}]


【RECV】♀[3,"yiBSjMizbzFWUcmz",{"idTagInfo":{"status":"Accepted"}}]

1.5 代码

逻辑处理

/**
*   授权
* @param data
* @param msgId
* @param msgType
* @param
* @param
* @return
*/
public ReturnData Authorize(String data,String msgId,
String msgType,String ip,String action,String body){
// 桩子 发起的充电,都要走授权
ReturnData returnData=new ReturnData();
try {
// 根据ip查询对应的设备
String equSql="select * from jk_equ where ip='"+ip+"' order by communication_time desc ";
Record equRecord=Db.findFirst(equSql);
if(null!=equRecord){
// [2,"m3MxfgtUXBR1QoyY","Authorize",{"idTag":"43AA3CA6"}]
JSONObject idTagObj=JSONObject.parseObject(data);
// 卡号 43AA3CA6
String idTag=idTagObj.getString("idTag");
IdTagInfo info=new IdTagInfo();
info.setStatus("Accepted");

// 时间推迟 60分钟
Date endDate=DateUtil.getAfterMinute(new Date(),60);
String utcStr=DateUtil.localToUTC(endDate);
info.setExpiryDate(utcStr);

List resultList=new ArrayList();
resultList.add(Integer.parseInt(msgType)+1);
resultList.add(msgId);
AuthorizeConfig authorizeConfig=new AuthorizeConfig();
authorizeConfig.setIdTagInfo(info);
resultList.add(authorizeConfig);

returnData.setResult(true);
log.info("刷卡返回信息:{}",JSON.toJSONString(resultList));
String json=new ObjectMapper().writeValueAsString(resultList);
returnData.setData(json);
}else{
log.error("收到充电点反馈,并且开启事务异常:设备不在线");
returnData.setMsg("设备不在线");
returnData.setResult(false);
}
}catch (Exception e){
log.error("收到充电点反馈,并且开启事务异常",e);
returnData.setResult(false);
}
return returnData;
}

实体类 

1、IdTagInfo

import lombok.Data;
/**
*
* 授权token回复详细信息
*/
@Data
public class IdTagInfo {
// Accepted 允许使用可充电的标识符
// Blocked 标识符已被阻止。不允许充电。
// Expired 标识符已过期。不允许充电。
// Invalid 标识符未知。不允许充电。
// ConcurrentTx 标识符已涉及到另一个事务中,并且不允许有多个事务。(仅与StartTransaction.req相关。)
private String status;
// 这其中包含idTag应该从授权缓存中删除的日期。
private String expiryDate;
//private IdToken idToken;//父级标识符。
}

2、AuthorizeConfig

import lombok.Data;
/**
* 授权配置
*/
@Data
public class AuthorizeConfig {
   private IdTagInfo idTagInfo;
}

2、启动通知

2.1 说明

其中包含中央系统为响应 BootNotification. req PDU 而向充电点发送的 BootNotification. conf PDU 的字段定义。
启动后,充电点应向中央系统发出请求,提供有关其配置的信息(如版本、供应商等)。中央系统应作出回应, 表明是否接受该充电点。
每次启动或重启时,充电点都应发送 BootNotification.req PDU。在物理开机/重启和成功完成 BootNotification( 中央系统返回 "接受 "或 " 等待 " 之间,充电点不得向中央系统发送任何其他请求。这包括缓存的 充电点中仍然存在的信息。
当中央系统以 " 已接受 " Accepted )状态回复 BootNotification.conf 时,充电点 将 根据回复 PDU 中的时间间隔调整心 跳间隔,建议将其内部时钟与提供的中央系统当前时间同步。如果中央系统返回的不是 " 接受 " ,则间隔字段的值表 示发送下一个启动通知请求 前的最短等待时间 。如果时间间隔值为零,则充电点自 行 选择等待时间间隔,以避免中心系统收到大量请求。除非有 TriggerMessage.req 请求,否则充电点不应提前发送 BootNotification.req
如果中央系统返回 " 拒绝 " 状态,充电点不得向中央系统发送任何 OCPP 报文,直到上述重试间隔时间结束。在此时间间隔内,中央系统可能无法再联系到充电点。例如,充电点可以关闭其通信通道或关闭其通信硬件。中央系统也可以 关闭通信通道,例如释放系统资源。 在拒绝 期间,充电点不得响应任何由中央系统发起的信息。
中央系统也可以返回一个 " 待定 " 注册状态,以表明它希望在中央系统接受该充电点之前检索或设置充电点的某些 信息。如果中央系统返回 "等待 " 状态,充电点或中央系统都不应关闭通信通道。中央系统可发送请求信息,从充电点获取信息或更改其配置。充电点应响应这些信息。除非中央系统发出 TriggerMessage.req 请求,否则充电点不得向中央系统发送请求信息。
待处理 状态下,不允许使用以下由中央系统发起的报文: RemoteStartTransaction.req
RemoteStopTransaction.req。

2.2 BootNotification.req

中文图

英文图

2.3 BootNotification.conf

中文图

英文图

2.4 JSON格式

[2,\"e3ba4698-d64b-447e-81f5-0bf0e09700eb\",\"BootNotification\",{\"chargePointVendor\":\"\",\"chargePointModel\":\"\",\"chargePointSerialNumber\":\"\",\"chargeBoxSerialNumber\":\"\",\"firmwareVersion\":\"\",\"iccid\":\"\",\"imsi\":\"\",\"meterType\":\"\",\"meterSerialNumber\":\"\"}]

[3, "e3ba4698-d64b-447e-81f5-0bf0e09700eb", {"status": "Accepted", "interval": 30, "currentTime": "2023-10-10T03:37:53Z"}]

2.5 代码

1.逻辑处理

/**
* 设备启动通知
* @param data
* @param msgId
* @param msgType
* @param action
* @param ip
* @return
*/
public ReturnData BootNotification(String data,String msgId,String msgType,String action,String ip,String body){
ReturnData returnData=new ReturnData();
try {
equHex=equHex.replaceAll("/","");
BootNotificationReq req=JSON.parseObject(data,BootNotificationReq.class);
String chargePointSerialNumber=req.getChargePointSerialNumber();//充电桩编号
log.info("sn的Hex{}",chargePointSerialNumber);
String states="Accepted";// 默认拒绝
BootNotificationConf conf=new BootNotificationConf();
String utcDateStr=DateUtil.localToUTC(new Date());

conf.setCurrentTime(utcDateStr); //过期时间
conf.setInterval(30);
conf.setStatus(states);

List resultList=new ArrayList();
resultList.add(Integer.parseInt(msgType)+1);
resultList.add(msgId);
resultList.add(conf);
String json = new ObjectMapper().writeValueAsString(resultList); //用此方法转为json字符串
returnData.setData(json);
returnData.setResult(true);
}catch (Exception e){
log.error("启动通知异常",e);
returnData.setResult(false);
}
return returnData;
}

2. BootNotificationReq
import lombok.Data;
/**
* 启动通知req
*/
@Data
public class BootNotificationReq {
//可选。它包含一个值,用来标识充电点内的充电箱的序列号。已弃用
//,将在未来的版本中被删除
private String chargeBoxSerialNumber;
//需要。这包含一个标识字符点模型的值。
private String chargePointModel;//充电桩模型
//可选。这其中包含一个标识充电点序列号的值。
private String chargePointSerialNumber;
//需要。这包含一个标识特征点的供应商的值
private String chargePointVendor;
//可选。这其中包含了充电点的固件版本
private String firmwareVersion;
//可选。其中包含调制解调器SIM卡的ICCID。
private String iccid;
//可选。其中包含调制解调器SIM卡的IMSI。
private String imsi;
//可选。其中包含充电点的主电表的序列号。
private String meterSerialNumber;
//可选。这包含了充电点的主电表的类型。
private String meterType;
}

3. BootNotificationConf

import lombok.Data;
/**
* 启动通知回复
*/
@Data
public class BootNotificationConf {
// Accepted 充电点已被中央系统接受。
//Pending 中央系统还没有准备好接受充电点。中央系统可以发送信息来检索信息或准备充电点。
// Rejected 中央系统不接受充电点。当中央系统不知道充电点id时,可能会发生这种情况以上翻译结果来自有道神经网络翻译(YNMT)· 通用场景
private String status;
//需要。这包含了中央系统的当前时间。
private String currentTime;
//需要。当接受注册状态时,它包含以秒为单位的心跳间隔。如果中央系统返回的不
//是“接受”,则间隔字段的值表示发送下一个引导通知请求之前的最小等待时间
private Integer interval;
}

相关文章:

OCPP1.6协议

目录 导言 功能简介 本地授权列表 类型 IdToken IdTagInfo 授权状态 协议指令 1、授权 1.1 说明 1.2 Authorize.req 1.3 Authorize.conf 1.4 JSON格式 1.5 代码 2、启动通知 2.1 说明 2.2 BootNotification.req 2.3 BootNotification.conf 2.4 JSON格式 2…...

【数据存储:小端模式和大端模式】

一、引言 在计算机科学中,数据存储模式是指如何将数据存储在计算机内存中的方式。小端模式和大端模式是两种主要的字节序方式,它们决定了字节在内存中的排列顺序。这种字节顺序的选择对于跨平台编程和数据传输至关重要。在这篇博客中,我们将…...

【git】gitlab安装、备份

gitlab官网 官网:官网 中文官网:中文官网 作为一个英文不好的程序员,所以我都去中文网站去看了。下面也是带着大家去走走 安装gitlab 我不想写具体的安装方法,直接去逛网看下面是我的截图。步骤非常详细。 安装文档地址&…...

C51--基本认知

单片机基本认知: 1、什么是单片机 单片机是一种集成电路芯片。 把具有数据处理能力的中央处理器 CPU、随机存储器RAM、只读存储器ROM。 多种 I / O 口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器…...

centos7 安装 mysql 8.0

文章目录 环境介绍一、安装前准备 1.卸载MariaDB 1.1 查看是否安装mariadb1.2 卸载1.3 检查是否卸载干净 2.检查依赖 2.1 查看是否安装libaio2.2 查看是否安装numactl 二、安装MySQL 1.下载资源包 1.1 官网下载1.2 wget下载 2.解压3.重命名4.创建存储数据文件5.设置用户组并赋…...

Vue15 计算属性VS监视属性(侦听属性)

计算属性VS监视属性(侦听属性) computed和watch之间的区别: 1.computed能完成的功能,watch都可以完成。 2.watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作。 两个重要的小…...

快速全面掌握数据库系统核心知识点

快速全面掌握数据库系统核心知识点 一、数据库系统二、三级模式-两层映射三、三级模式-视图四、数据库设计过程五、E-R模型六、关系代数七、规范化理论八、函数依赖九、规范化理论-键十、规范化理论-求候选键十一、规范化理论-范式十二、规范化理论-第一范式十三、规范化理论-第…...

学习笔记 | 音视频 | 推流项目框架及细节

推流项目: 跑起来项目,再调,创造问题,注意项目跑起来包括哪些步骤 前期准备:环境的配置 依赖库要交叉编译,编译还需注意依赖的库对应的头文件(注意是绝对路径还是相对路径) Rv1126_lib、arm_libx264、arm_libx265、arm_libsrt、arm32_ffmpeg_srt、arm_openssl Ubuntu搭…...

拓扑几何学

目录 一,欧拉定理 1,平面图论图 2,单连通多面体 3,一般多面体 一,欧拉定理 1,平面图论图 在一个联通无向图中,点数-边数面数 1 如: 7-126 1 如果把最外面的五边形外面也算…...

1.12.C++项目:仿muduo库实现并发服务器之LoopThreadPool模块的设计

文章目录 一、LoopThreadPool模块二、实现思想(一)功能(二)意义(三)功能设计 三、代码 一、LoopThreadPool模块 1.线程数量可配置(0或多个) 2. 对所有的线程进行管理,其…...

SpringBoot介绍

一、什么是SpringBoot 在使用传统的Spring去做Java EE(Java Enterprise Edition)开发中,大量的 XML 文件存在于项目之中,导致JavaEE项目变得慢慢笨重起来,繁琐的配置和整合第三方框架的配置,导致了开发和部…...

2022最新版-李宏毅机器学习深度学习课程-P17 卷积神经网络CNN

一、CNN 用于图像分类 需要图片大小统一 彩色图像分为R G B 三层,展平后首尾相接 值代表着颜色的强度 图像识别中不需要全连接的,参数太多了 观测1:通过判断多个小局部图像就能判断出图片标签 感受野的定义 简化1 感受野可以重叠&#xff…...

微博清理僵尸粉

1.选择chrome或者firefox浏览器 2.登陆微博账号 3.chrome右键点检查,选择console firefox右键点检查,选择控制台 4.粘贴下面代码到console或者控制台并且回车 let removeTargetFans false; /*是否删除符合条件的粉丝,默认关闭*/let dee…...

创建React Native的第一个hello world工程

创建React Native的第一个hello world工程 需要安装好node、npm环境 如果之前没有安装过react-native-cli脚手架的,可以按照下述步骤直接安装。如果已经安装过的,但是在使用这个脚手架初始化工程的时候遇到下述报错的话 cli.init(root, projectname);…...

基础课3——自然语言处理的应用

自然语言处理是一种将人类语言转换为机器语言,以实现人机交互的技术。应用非常广泛,例如: 人机交互:自然语言处理技术可以应用于人机交互,让机器能够理解和运用人类语言,从而实现更加智能化的交互体验。 机…...

理解 Git 的三个工作区:工作区、暂存区和版本库

文章目录 创建 Git 本地仓库配置Git认识⼯作区、暂存区、版本库添加⽂件--场景查看 .git ⽂件添加⽂件--场景⼆ 创建 Git 本地仓库 要提前说的是,仓库是进⾏版本控制的⼀个⽂件⽬录。我们要想对⽂件进⾏版本控制,就必须先创建⼀个仓库出来。创建⼀个 Gi…...

web前端基础训练-----创建用户反馈表单

1&#xff0c;实验代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>用户反馈表单</title></head><body><form><fieldset><h1>用户反馈</h1><hr/><h4>亲爱的用…...

Scrum 敏捷管理流程图及敏捷管理工具

​敏捷开发中的Scrum流程通常可以用一个简单的流程图来表示&#xff0c;以便更清晰地展示Scrum框架的各个阶段和活动。以下是一个常见的Scrum流程图示例&#xff1a; 转自&#xff1a;Leangoo.com 免费敏捷工具 这个流程图涵盖了Scrum框架的主要阶段和活动&#xff0c;其中包括…...

Android Handler/Looper视角看UI线程的原理

概述 Handler/Looper机制是android系统非重要且基础的机制&#xff0c;即使在rtos或者linux操作系统上开发应用框架时&#xff0c;也经常借鉴这个机制。通过该机制机制可以让一个线程循环处理事件&#xff0c;事件处理逻辑即在Handler的handleMessge种。本文建议android8.1源码…...

【网络】网络入门

网络入门 一、网络发展二、网络协议初识1、认识"协议"2、协议分层3、OSI七层模型4、TCP/IP五层(或四层)模型 三、网络传输基本流程1、同局域网的两台主机通信2、跨网络的两台主机通信 四、网络中的地址管理1、IP地址2、认识MAC地址 一、网络发展 独立模式&#xff1a…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...