什么是 OCPP 2.0.1 和 2.1?
它们是开放充电点协议(Open Charge Point Protocol)的较新版本。这项开放标准由开放充电联盟(Open Charge Alliance)制定,规定充电桩如何与管理它的软件通信:这个软件在规范中称为 CSMS,在市场上称为后台。与 1.6J 一样,充电桩向后台建立一条 WebSocket 连接,双方通过它发送 JSON 消息。
OCPP 2.0.1 不向后兼容 1.6。它把充电桩描述为由组件和变量构成的设备模型,内置三种安全配置文件,用一条消息 TransactionEvent 报告交易,并支持 ISO 15118,用于 Plug and Charge 以及结合车辆输入的智能充电。
OCPP 2.1 以 2.0.1 为基础。它的 schema 就是在 2.0.1 的 schema 上增加了可选字段,并新增 27 条消息,涵盖双向充电、DER 控制、由充电桩自行计算费用的费率、在充电桩上支付、周期性事件流和换电。充电桩与其后台在 WebSocket 建立时商定使用一个版本。
- 开放标准可免费实现,由开放充电联盟维护。OCPP 2.1 也以 IEC 63584-210 发布。
- WebSocket 和 JSON由充电桩保持打开的一条连接。2.1 新增 SEND,一种不需要应答的消息。
- 91 条消息2.0.1 中有 64 条,2.1 又新增 27 条,分属 19 个功能块。
- 双向充电桩和后台各自发起自己的消息。
OCPP 2.0.1 和 2.1 全部 91 条消息
每条消息都是一方发出的请求和另一方给出的响应,二者通过消息 ID 对应。唯一的例外是 NotifyPeriodicEventStream:它是 2.1 中的 SEND 消息,不需要应答。
安全
充电桩和后台的证书,以及充电桩报告的安全事件。
配置与注册
启动、向后台注册、读取和设置设备模型,以及重置。
授权
充电前检查 ID 令牌、授权缓存,以及 2.1 中的临时支付。
本地授权列表
后台存储在充电桩上的 ID 令牌列表,让充电桩可以自行授权。
交易
每笔交易的开始、更新和结束都用同一条消息 TransactionEvent 报告。
远程控制
从后台启动和停止交易、解锁充电接口,以及触发消息。
可用性
每个充电接口的状态、心跳,以及让充电桩或 EVSE 停止服务。
预约
为某个 ID 令牌预约 EVSE,以及取消该预约。
费率和费用
面向驾驶员的价格和实时费用;在 2.1 中还包括由充电桩自行计算费用的费率。
电表数值
交易之外的电表读数;交易期间的读数通过 TransactionEvent 传送。
智能充电
带功率或电流限值的充电配置文件、来自外部的限值,以及车辆的需求。
固件管理
更新充电桩固件,以及通过本地控制器发布固件。
证书管理
安装和检查证书,包括 Plug and Charge 的合同证书。
诊断
日志、设备模型上的监控项、事件、客户数据,以及 2.1 中的周期性事件流。
显示消息
后台为充电桩设置的、向驾驶员显示的消息。
数据传输
厂商数据,用于标准未涵盖的功能。
双向能量传输
2.1 新增:通过充电配置文件控制充电和放电(V2X)。
DER 控制
2.1 新增:为作为分布式能源(DER)运行的充电桩和车辆设置电网支撑参数。
换电
2.1 新增:换电站。
没有与该搜索匹配的消息。
OCPP 2.0.1 设备模型
在 OCPP 1.6 中,充电桩有一个扁平的配置键列表。在 2.0.1 和 2.1 中,充电桩用组件来描述自己,例如充电站、EVSE、充电接口,或 OCPPCommCtrlr 这样的控制器,每个组件都有变量。一个变量可以有四个值:Actual、Target、MinSet 和 MaxSet。过去的配置键,现在是某个控制器组件的变量。
如何使用
- GetVariables 和 SetVariables在一条消息中读取或设置多个变量。充电桩对每个变量分别应答。
- GetBaseReport 和 GetReport请求整个设备模型或其中一部分。充电桩通过 NotifyReport 消息返回。
- 监控项SetVariableMonitoring 按阈值、变化或固定间隔监控某个变量,充电桩通过 NotifyEvent 报告。
- 按功能启用可选功能的控制器(例如 AuthCacheCtrlr 或 ReservationCtrlr)有一个 Enabled 变量,用来开启或关闭该功能。
SetVariables 的应答
- Accepted
- 值已设置。
- Rejected
- 变量存在,但值被拒绝。
- Unknown
Component - 充电桩没有这个组件。
- Unknown
Variable - 该组件没有这个变量。
- NotSupported
AttributeType - 该变量没有这种类型的值,例如没有 Target。
- RebootRequired
- 值已保存,重启后生效。
取代最常用 1.6 配置键的变量
规范标准化了更多变量,列在其附录中。充电桩会在应答 GetBaseReport 时报告自己具有的变量。
| 组件和变量 | 类型 | 设置内容 | OCPP 1.6 中 |
|---|---|---|---|
| OCPPCommCtrlr | integer(秒) | 没有其他消息时,充电桩在经过多少秒后发送 Heartbeat。 | Heartbeat |
| OCPPCommCtrlr | integer | 后台未能处理某条 TransactionEvent 时,充电桩尝试发送该消息的次数。 | Transaction |
| OCPPCommCtrlr | integer | 充电桩重试前等待的秒数。 | Transaction |
| OCPPCommCtrlr | integer(秒) | WebSocket ping 之间的秒数;设为 0 时关闭充电桩自己发出的 ping。 | Web |
| OCPPCommCtrlr | integer | 重置失败时充电桩重试的次数。 | Reset |
| OCPPCommCtrlr | boolean | 在车辆一侧拔下线缆时,解锁充电桩一侧的线缆。 | Unlock |
| SampledDataCtrlr | 列表 | 充电桩在交易期间测量的内容,通过 eventType 为 Updated 的 TransactionEvent 发送。 | Meter |
| SampledDataCtrlr | integer(秒) | 这些读数之间的秒数;设为 0 时交易期间不发送读数。 | Meter |
| SampledDataCtrlr | 列表 | 放入结束交易的 TransactionEvent 中的内容。 | Stop |
| AlignedDataCtrlr | integer(秒) | 按时钟对齐的读数之间的秒数。 | Clock |
| AlignedDataCtrlr | 列表 | 按时钟对齐的读数所包含的内容。 | Meter |
| AlignedDataCtrlr | 列表 | 放入结束交易的 TransactionEvent 中的按时钟对齐的读数。 | Stop |
| TxCtrlr | integer(秒) | 交易开始后,驾驶员需要在多少秒内插上充电枪,否则交易会被取消。 | Connection |
| TxCtrlr | boolean | 在车辆一侧拔下线缆时结束交易。 | Stop |
| TxCtrlr | boolean | 当正在进行的交易的 ID 令牌最终未被接受时,停止该交易。 | Stop |
| TxCtrlr | integer | 后台拒绝 ID 令牌后,充电桩仍可输出的电量(Wh)。 | Max |
| TxCtrlr | 列表 | 交易何时开始:授权时、插上充电枪时、开始输电时等。 | 2.0.1 新增 |
| TxCtrlr | 列表 | 交易何时结束,从同一列表中选择。 | 2.0.1 新增 |
| AuthCtrlr | boolean | 充电桩是否先用 Authorize 检查远程启动的 ID 令牌。 | Authorize |
| AuthCtrlr | boolean | 离线时为已知的 ID 令牌启动交易。 | Local |
| AuthCtrlr | boolean | 为已知的 ID 令牌启动交易,不等待后台。 | Local |
| AuthCtrlr | boolean | 离线时为未知的 ID 令牌启动交易。 | Allow |
| AuthCacheCtrlr | boolean | 使用授权缓存。 | Authorization |
| LocalAuthListCtrlr | boolean | 使用本地授权列表。 | Local |
| LocalAuthListCtrlr | integer | 一条 SendLocalList 中 ID 令牌的最大数量。 | Send |
| SmartChargingCtrlr | integer | 充电配置文件可以使用的最高堆栈级别。 | Charge |
| SmartChargingCtrlr | 列表 | 充电计划可以使用安培、瓦特还是两者均可。 | Charging |
| SmartChargingCtrlr | integer | 一个充电计划中时段的最大数量。 | Charging |
| SmartChargingCtrlr | boolean | 充电桩能否在交易期间从三相切换到单相。 | Connector |
| ReservationCtrlr | boolean | 预约能否针对整台充电桩,而不是某一个 EVSE。 | Reserve |
没有与该搜索匹配的变量。
OCPP 2.0.1 和 2.1 安全配置文件
两个版本都定义了三种安全配置文件。充电桩与其后台每次只使用其中一种,并在第一条 OCPP 消息之前确定。后台通过 SetNetworkProfile 为每个连接槽位设置安全配置文件,充电桩在 SecurityCtrlr.SecurityProfile 中报告正在使用的那一种。
| 配置文件 | 充电桩如何证明身份 | 后台如何证明身份 | 连接 |
|---|---|---|---|
| 1. 不加密传输,使用基本身份验证 | HTTP 基本身份验证,使用密码 | 不证明 | 不加密。仅适用于可信网络,例如充电桩与后台之间的 VPN。 |
| 2. TLS,使用基本身份验证 | HTTP 基本身份验证,使用密码 | 其 TLS 服务器证书 | TLS 1.2 或更高版本 |
| 3. TLS,使用客户端证书 | 其自己的 TLS 客户端证书 | 其 TLS 服务器证书 | TLS 1.2 或更高版本 |
- 降级充电桩只能从配置文件 3 降到配置文件 2,而且仅当 AllowSecurityProfileDowngrade 设为 true 时才可以。它绝不会通过 OCPP 降到配置文件 1。
- 密码和证书密码为 SecurityCtrlr.BasicAuthPassword。充电桩通过 SignCertificate 申请新证书,后台通过 CertificateSigned 交付证书。
- 安全事件充电桩通过 SecurityEventNotification 报告发生的事件,例如重置、固件更新或被后台拒绝的凭据。
从 OCPP 1.6 到 2.0.1,逐条对照消息
OCPP 2.0.1 保留了许多 1.6 的消息名称,也重命名或合并了其他消息。点击链接可在本参考或 1.6J 参考中打开该消息。
关于 OCPP 2.0.1 和 2.1 的问题
开放充电点协议的 2.0.1 版本,由开放充电联盟于 2020 年发布。它取代了 OCPP 2.0;与 1.6 相比,它增加了设备模型、安全配置文件、ISO 15118 支持和 TransactionEvent。它不向后兼容 1.6。
OCPP 2.1 于 2025 年 1 月发布,同时也是 IEC 63584-210 标准。它新增 27 条消息,没有删除任何消息,涵盖:双向充电(V2X)和 DER 控制、ISO 15118-20、由充电桩自行计算费用的费率、通过刷卡终端或二维码在充电桩上支付、优先充电、动态充电配置文件、周期性事件流和换电。在消息列表上方选择“2.1 新增”即可查看。
2.1 的 schema 就是在 2.0.1 的 schema 上增加了可选字段。据开放充电联盟介绍,为 2.0.1 编写的逻辑只需两处小改动即可继续使用:SignCertificate 可以携带一个 requestId,随后由 CertificateSigned 重复返回;NotifyMonitoringReport 新增了一个必填字段。版本仍按连接商定:在 WebSocket 握手时,充电桩提供例如 ocpp2.1、ocpp2.0.1 和 ocpp1.6,由后台选择其中一个。
2.0.1 有自己的一套消息:用设备模型取代配置键,增加安全配置文件,用 TransactionEvent 取代 StartTransaction 和 StopTransaction,在充电桩与其充电接口之间增加 EVSE 这一层级,并提供用于 ISO 15118 的消息。充电桩与其后台在建立连接时商定使用一个版本。上方的表格对照了两个版本的消息,OCPP 1.6J 参考收录了全部 1.6 消息。
OCPP 2.0 发布后,出现了一些只能通过修改消息 schema 才能解决的问题,而 2.0 的实现无法跟进这些修改。开放充电联盟为修正后的版本单独编号为 2.0.1,并建议只实现 2.0.1。在规范中,除非另有说明,OCPP 2.0 即指 2.0.1。
开放充电联盟在其网站上免费发布这两个版本,附有每条消息的 JSON schema 和勘误表。本参考依据 JSON schema 和规范第 2 部分编写。两者不一致时,以规范及其勘误为准。
在充电桩数据库中查一查:其中 102 款充电桩列有 OCPP 2.0.1,4 款列有 2.1。数据手册通常也会注明。支持多个版本的充电桩在连接时会提供全部版本,由后台选择其中一个。