OCPP 1.6 与 2.0.1 对比
2.0.1 并不是「加了更多报文的 1.6」。它重构了配置、交易与安全,而且两者在任一方向上都不具备线路级兼容性。
两个版本共用一套传输——WebSocket 上的 OCPP-J——以及一套子协议协商机制,相似之处大致就到此为止。充电桩在 Sec-WebSocket-Protocol 中声明 ocpp1.6 或 ocpp2.0.1,而同时支持两者的 CSMS,实际上是在这个选择背后跑着两套独立实现。
OCPP 1.6 仍是多数已部署硬件所使用的版本。2.0.1 则越来越多地成为新采购的硬性要求。多数运营方会在很长一段时间里同时运行两者——这正是这份对比有现实意义的原因。
报文对应关系
每条 1.6 报文在 2.0.1 中的去向。这不是一条迁移路径——即便名称沿用,载荷也已不同。
| OCPP 1.6 | OCPP 2.0.1 | 变化 |
|---|---|---|
Authorize | Authorize | 用途相同。`idTag` 变为结构化的 `idToken` 对象。 |
BootNotification | BootNotification | `chargePointVendor`/`chargePointModel` 移入 `chargingStation` 对象。 |
Heartbeat | Heartbeat | 用途未变。 |
StartTransaction | TransactionEvent | 开始、结束与中途更新合并为一条带 `eventType` 的报文。 |
StopTransaction | TransactionEvent | 同上——`eventType: "Ended"`。 |
MeterValues | TransactionEvent | 会话进行期间,电表数据随 TransactionEvent 一并传送。 |
StatusNotification | StatusNotification | 现在按 EVSE 与连接器分别上报,而不再是扁平的连接器编号。 |
ChangeConfiguration | SetVariables | 扁平的字符串键变为设备模型中可寻址的变量。 |
GetConfiguration | GetVariables | 同样的变化,只是由写改为读。 |
GetDiagnostics | GetLog | 做了泛化:既涵盖诊断日志,也涵盖安全日志。 |
ReserveNow | ReserveNow | ReserveNow 现已成为核心的一部分,而不再属于可选档。 |
设备模型
这是其余一切变化的源头。OCPP 1.6 的配置是一张扁平的字符串键值表——HeartbeatInterval、MeterValueSampleInterval——而一台充电桩的能力,就等于它恰好拥有哪些键。
2.0.1 用结构化的设备模型取而代之:组件、变量,以及带类型与约束的属性。CSMS 可以直接让充电桩自我描述,而不必逐个试探键名再听天由命。
这是一项实打实的改进,同时也是迁移工作量最大的单一来源,因为 1.6 配置层面的一切都无法直接平移。
交易合并成了一条报文
在 1.6 中,一次会话是 StartTransaction、然后 MeterValues、再 StopTransaction——三种报文类型,各自的关联规则不同,transactionId 由服务端分配。
在 2.0.1 中,这三者统一为 TransactionEvent,eventType 取 Started、Updated 或 Ended,且交易编号由充电桩自己生成。离线处理因此大为简化,因为充电桩再也不必等服务端来给一次它已经开始的会话命名。
安全是被规定的,而不是被默认的
OCPP 1.6 在安全方面几乎什么都没说。TLS 只是建议,认证不在范围内,实践中的部署从明文 ws:// 到双向 TLS 什么都有。
2.0.1 定义了三种安全配置档:TLS 上的 HTTP Basic、带客户端证书的 TLS,以及双向证书认证的 TLS,并配有用于轮换证书的管理报文。对于任何曾经要为一张充电网络填写安全问卷的人来说,这是整次升级中最有价值的部分。
EVSE 与连接器现在是两个概念
1.6 的连接器从 1 开始编号,0 表示整台充电桩。这种扁平模型无法表达这样一个站点:两个连接器共用一个功率模块,因而无法同时满功率充电。
2.0.1 在站点与连接器之间引入了 EVSE 这一显式层级,正是它让多插座硬件上的负荷分配得以正确进行。
智能充电能力更强,也更复杂
两个版本都有充电计划。2.0.1 增加了来自本地能源管理系统的充电限值、对 ISO 15118 的支持(即插即充与双向能量流动),以及对「什么可以约束一次会话」远为丰富的表达。
如果你的 1.6 智能充电能跑通,概念是可以迁移的。载荷则不行。
该实现哪一个?
如果你正在为今年出货的硬件开发固件,多数网络接入它时用的仍是 1.6,而越来越多的招标要求 2.0.1。把协议层放在一层抽象之后——而不是让 OCPP 报文类型贯穿你的业务逻辑——才是让同时支持两者变得划算的关键。
如果你在构建 CSMS,两者都得支持,因为在可预见的时间里,你客户的车队里两种版本都会存在。
无论哪种情况,迁移成本都集中在配置与交易上,而不在传输层。把预算留给设备模型。
完整的 1.6 报文集合记录在我们的 OCPP 1.6 参考文档中,而 OcppPilot 用同一套 Go 接口实现了两个版本。