1. 概述
OCPP 1.6 采用扁平 key-value 配置模型。中央系统(CS/CSMS)通过两条指令管理充电桩(CP)的配置:
| 指令 | 方向 | 作用 | 特点 |
|---|---|---|---|
GetConfiguration |
CS → CP | 读取配置键当前值 | 可批量(一次最多 GetConfigurationMaxKeys 个) |
ChangeConfiguration |
CP ← CS | 修改配置键的值 | 一次只能改一个键 |
核心原则:
- 两条指令的复杂逻辑都发生在 CS 侧,充电桩只需实现 key-value 的读写与校验。
- 配置键分为必填键 与可选键 ;可选键不实现时,CP 应在
unknownKey中返回,或按 unsupported 处理。 - 除标准键外,厂商会扩展自定义键 (如
ServerURL、FreeCharging、LockCablePermanently)。运维时建议先用空键列表的GetConfiguration拉取该桩全部键,再针对处理。
⚠️ 实践铁律 :OCPP 1.6 里所有 value 都以字符串传输 ,包括数字和布尔值(
"60"、"true")。发送 JSON 原生数字(60)是导致Rejected的最常见原因 。键名严格区分大小写。
2. GetConfiguration ------ 读取配置
2.1 GetConfiguration.req(CS → CP)
| 字段 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---|---|
key |
array of string | ⬜ 可选 | 每项 maxLength: 50 | 要检索的配置键列表。省略或传空数组时返回该桩支持的全部键 |
📌 若请求的键数量超过该桩
GetConfigurationMaxKeys的值,CP 可能直接返回错误。批量拉取前建议先读一次该键。
2.2 GetConfiguration.conf(CP → CS)
| 字段 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---|---|
configurationKey |
array | ⬜ 可选 | --- | 已识别的配置键列表 |
└key |
string | ✅ | maxLength: 50 | 配置键名称 |
└readonly |
boolean | ✅ | --- | 该键是否为只读(true = 不可通过 ChangeConfiguration 修改) |
└value |
string | ⬜ | maxLength: 500 | 该键的当前值(可能为空字符串) |
unknownKey |
array of string | ⬜ | 每项 maxLength: 50 | 请求了但该桩不识别的键列表 |
2.3 GetConfiguration 实例
请求:读取单个键
csharp
[2, "cfg-001", "GetConfiguration", {
"key": ["HeartbeatInterval", "NumberOfConnectors"]
}]
响应
json
[3, "cfg-001", {
"configurationKey": [
{ "key": "HeartbeatInterval", "readonly": false, "value": "300" },
{ "key": "NumberOfConnectors", "readonly": true, "value": "2" }
],
"unknownKey": []
}]
请求:拉取该桩全部配置(推荐用于设备建档 / 排查)
csharp
[2, "cfg-002", "GetConfiguration", {}]
响应(含不识别键的示例)
json
[3, "cfg-002", {
"configurationKey": [
{ "key": "SupportedFeatureProfiles", "readonly": true, "value": "Core,FirmwareManagement,LocalAuthListManagement,Reservation,SmartCharging,RemoteTrigger" },
{ "key": "MeterValuesSampledData", "readonly": false, "value": "Energy.Active.Import.Register,Power.Active.Import" }
],
"unknownKey": ["FakeKeyThatDoesNotExist"]
}]
3. ChangeConfiguration ------ 修改配置
3.1 ChangeConfiguration.req(CS → CP)
| 字段 | 类型 | 必填 | 约束 | 说明 |
|---|---|---|---|---|
key |
string | ✅ | maxLength: 50 | 要修改的配置键名称 |
value |
string | ✅ | maxLength: 500 | 配置键的新值(字符串形式) |
3.2 ChangeConfiguration.conf(CP → CS)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
status |
string(枚举) | ✅ | 配置修改结果,见下表 |
| status | 含义 | CS 侧应对动作 |
|---|---|---|
Accepted |
键已设置且立即生效 | 无需额外动作,可回读校验 |
Rejected |
键存在但值被拒绝(超范围 / 格式错误 / 该桩上为只读) | 检查值格式(是否误传 JSON 数字)、范围、只读性 |
RebootRequired |
值已存储,但需重启后才生效 | CS 需再下发 Reset(Soft / Hard),重启后用 GetConfiguration 回读确认 |
NotSupported |
该桩完全不支持此键 | 确认 key 是否为厂商私有键或该桩固件未实现;必要时改用 DataTransfer 扩展 |
3.3 ChangeConfiguration 实例
请求:修改心跳间隔
csharp
[2, "chg-001", "ChangeConfiguration", {
"key": "HeartbeatInterval",
"value": "900"
}]
响应:立即生效
csharp
[3, "chg-001", { "status": "Accepted" }]
请求:修改计量采样数据项(通常需重启)
csharp
[2, "chg-002", "ChangeConfiguration", {
"key": "MeterValuesSampledData",
"value": "Energy.Active.Import.Register,Power.Active.Import,Current.Import,Voltage"
}]
响应:需重启生效
csharp
[3, "chg-002", { "status": "RebootRequired" }]
典型错误响应示例
csharp
[3, "chg-003", { "status": "NotSupported" }]
[3, "chg-004", { "status": "Rejected" }]
4. OCPP 1.6 标准配置键清单
访问权限 :R = 只读(readonly: true,无法用 ChangeConfiguration 修改);RW = 可读可写。类型 :boolean / integer / CSL(Comma-Separated List,逗号分隔列表)。必填性:Required = 规范要求 CP 必须支持;Optional = 规范中可选。
4.1 Core(核心,32 个键)
| 键名 | 类型 | 访问 | 必填性 | 说明 |
|---|---|---|---|---|
AllowOfflineTxForUnknownId |
boolean | RW | 可选 | 离线时是否为未知 idTag 启动交易。true 可保证网络中断时站点仍可充电,代价是可能产生无法计费的会话 |
AuthorizationCacheEnabled |
boolean | RW | 可选 | 是否启用授权缓存(由真实 Authorize 结果自动填充,区别于后端推送的本地授权列表) |
AuthorizeRemoteTxRequests |
boolean | R 或 RW | 必填 | RemoteStartTransaction 前是否需先走一次 Authorize 授权 |
BlinkRepeat |
integer(次) | RW | 可选 | 信号提示时灯具闪烁次数 |
ClockAlignedDataInterval |
integer(秒) | RW | 必填 | 时钟对齐电表值间隔(自 00:00:00 起算)。0 = 禁用;900 = 每 15 分钟一次 |
ConnectionTimeOut |
integer(秒) | RW | 必填 | 从进入 Preparing 到未插枪自动取消交易的超时时长 |
ConnectorPhaseRotation |
CSL | RW | 必填 | 各枪相对电表的相位序,格式 connectorId.RST,如 0.RST, 1.RST, 2.RTS。填错会导致分相电表值与单相负载均衡错误 |
ConnectorPhaseRotationMaxLength |
integer | R | 可选 | ConnectorPhaseRotation 的最大项数 |
GetConfigurationMaxKeys |
integer | R | 必填 | 单次 GetConfiguration.req 可请求的最大键数 |
HeartbeatInterval |
integer(秒) | RW | 必填 | 无任何 OCPP 交互后发送 Heartbeat 的间隔。BootNotification.conf 的 interval 可覆盖此值 |
LightIntensity |
integer(%) | RW | 可选 | 充电桩照明亮度百分比 |
LocalAuthorizeOffline |
boolean | RW | 必填 | 离线时是否使用本地授权列表 / 缓存授权启动交易 |
LocalPreAuthorize |
boolean | RW | 必填 | 在线时是否用本地授权列表 / 缓存预授权启动,不等 Authorize.conf |
MaxEnergyOnInvalidId |
integer(Wh) | RW | 可选 | idTag 被判定无效后仍允许交付的最大电量 |
MeterValuesAlignedData |
CSL | RW | 必填 | 时钟对齐 MeterValues 上报的量测项(按 ClockAlignedDataInterval 触发,无论是否插枪) |
MeterValuesAlignedDataMaxLength |
integer | R | 可选 | MeterValuesAlignedData 的最大项数 |
MeterValuesSampledData |
CSL | RW | 必填 | 交易中周期采样的量测项 (按 MeterValueSampleInterval 发送)。默认 Energy.Active.Import.Register |
MeterValuesSampledDataMaxLength |
integer | R | 可选 | MeterValuesSampledData 的最大项数 |
MeterValueSampleInterval |
integer(秒) | RW | 必填 | 交易中采样 MeterValuesSampledData 的间隔。0 = 禁用,60 为常见合理值 |
MinimumStatusDuration |
integer(秒) | RW | 可选 | 状态稳定多久后才上报 StatusNotification,用于抑制状态抖动 |
NumberOfConnectors |
integer | R | 必填 | 该桩的物理枪数(只读,无法修改) |
ResetRetries |
integer(次) | RW | 必填 | Reset 失败后的重试次数 |
StopTransactionOnEVSideDisconnect |
boolean | RW | 必填 | 车端拔枪时是否停止运行中的交易。false 可能导致会话永不结束 |
StopTransactionOnInvalidId |
boolean | RW | 必填 | 收到非 Accepted 的授权状态时是否停止进行中的交易 |
StopTxnAlignedData |
CSL | RW | 必填 | 附加到 StopTransaction 的 transactionData 中的时钟对齐量测项 |
StopTxnAlignedDataMaxLength |
integer | R | 可选 | StopTxnAlignedData 的最大项数 |
StopTxnSampledData |
CSL | RW | 必填 | 附加到 StopTransaction 的 transactionData 中的采样量测项。务必保持简短(整个会话的每个采样都会重复,易产生被后端拒绝的 MB 级报文) |
StopTxnSampledDataMaxLength |
integer | R | 可选 | StopTxnSampledData 的最大项数 |
SupportedFeatureProfiles |
CSL | R | 必填 | 该桩支持的功能簇列表。取值:Core、FirmwareManagement、LocalAuthListManagement、Reservation、SmartCharging、RemoteTrigger |
SupportedFeatureProfilesMaxLength |
integer | R | 可选 | SupportedFeatureProfiles 的最大项数 |
TransactionMessageAttempts |
integer(次) | RW | 必填 | 交易类消息(Start/StopTransaction、MeterValues)后端处理失败后的重试次数 |
TransactionMessageRetryInterval |
integer(秒) | RW | 必填 | 交易类消息重试的基础等待间隔 |
UnlockConnectorOnEVSideDisconnect |
boolean | RW | 必填 | 车端拔枪时桩侧是否解锁线缆 |
WebSocketPingInterval |
integer(秒) | RW | 可选 | OCPP-J 连接上 WebSocket Ping 帧间隔。0 = 禁用。用于解决 NAT/防火墙断开空闲连接导致的掉线 |
4.2 LocalAuthListManagement(本地授权列表管理,3 个键)
| 键名 | 类型 | 访问 | 必填性 | 说明 |
|---|---|---|---|---|
LocalAuthListEnabled |
boolean | RW | 必填 | 是否启用本地授权列表 |
LocalAuthListMaxLength |
integer | R | 必填 | 本地授权列表可存储的最大 idTag 条目数 |
SendLocalListMaxLength |
integer | R | 必填 | 单条 SendLocalList.req 可携带的最大条目数。超出需分批做差分更新 |
4.3 Reservation(预约,1 个键)
| 键名 | 类型 | 访问 | 必填性 | 说明 |
|---|---|---|---|---|
ReserveConnectorZeroSupported |
boolean | R | 可选 | 存在且为 true 时,表示该桩支持**对 0 号枪(即整桩/任意枪)**的预约 |
4.4 SmartCharging(智能充电,5 个键)
| 键名 | 类型 | 访问 | 必填性 | 说明 |
|---|---|---|---|---|
ChargeProfileMaxStackLevel |
integer | R | 必填 | 充电配置可接受的最高 StackLevel(层级越高优先级越高),同时也表示每种用途允许安装的最大充电计划数 |
ChargingScheduleAllowedChargingRateUnit |
CSL | R | 必填 | 充电计划支持的单位:Current(A)、Power(W)。向只接受 A 的桩发 W 会被拒绝 |
ChargingScheduleMaxPeriods |
integer | R | 必填 | 单个 ChargingSchedule 允许的最大周期数 |
ConnectorSwitch3to1PhaseSupported |
boolean | R | 可选 | 存在且为 true 时,支持交易过程中三相/单相切换 |
MaxChargingProfilesInstalled |
integer | R | 必填 | 同时可安装的充电配置数量上限 |
4.5 FirmwareManagement(固件管理)
| 键名 | 类型 | 访问 | 必填性 | 说明 |
|---|---|---|---|---|
SupportedFileTransferProtocols |
CSL | R | 必填 | 支持的文件传输协议,如 HTTP,HTTPS,FTP。决定 GetDiagnostics 与 UpdateFirmware 的 location 可用协议 |
说明:
SupportedFileTransferProtocols属于 FirmwareManagement 功能簇的配置键,规范中该簇涉及的键极少。若该桩未实现 FirmwareManagement,此键可能不出现在GetConfiguration结果中。
4.6 安全扩展键(OCPP 1.6J Security Whitepaper,非规范正文)
以下键来自 OCPP 1.6J Security Whitepaper ,在正文规范中不存在,是否支持取决于固件实现(推荐但非强制):
| 键名 | 类型 | 访问 | 说明 |
|---|---|---|---|
SecurityProfile |
integer | RW | 安全档位:0 = ws 无认证;1 = ws + Basic Auth;2 = wss + Basic Auth;3 = wss + 客户端证书 |
AuthorizationKey |
string | RW | HTTP Basic Auth 密码(SecurityProfile 为 1 或 2 时必填) |
CpoName |
string | RW | 充电运营商名称,用于证书签发 |
AdditionalRootCertificateCheck |
boolean | RW | 是否对根证书做额外校验 |
CertificateStoreMaxLength |
integer | R | 证书库可容纳的证书数量 |
CertificateSignedMaxChainSize |
integer | R | 证书链最大长度 |
5. 常见量测项(measurand)取值参考
MeterValuesSampledData、MeterValuesAlignedData、StopTxnSampledData、StopTxnAlignedData 这四个 CSL 键的取值来自同一套 measurand 词汇表:
| measurand | 说明 |
|---|---|
Energy.Active.Import.Register |
累计有功电能(计费核心,移除它会破坏计费) |
Power.Active.Import |
实时有功功率 |
Current.Import/Current.Offered |
实际 / 可提供电流(三相桩上单项会展开为 3 个值) |
Voltage |
电压 |
Temperature |
温度 |
SoC |
电池荷电状态(AC 桩通常无此值) |
Frequency |
频率 |
Power.Factor |
功率因数 |
⚠️ 陷阱 :只要列表中有一个 measurand 不被支持 ,整个列表就会被拒绝;
Wh/kWh单位不可自行假设;采样间隔过短会产生高昂流量成本。
6. 运维速查与注意事项
6.1 速查表
| 场景 | 做法 |
|---|---|
| 查询桩的枪数 | GetConfiguration 读 NumberOfConnectors(只读) |
| 拉取桩支持的全部配置 | GetConfiguration(不传 key 或传空数组) |
| 调整心跳频率 | ChangeConfiguration 改 HeartbeatInterval;注意会被 BootNotification.conf 覆盖 |
| 调整计量上报粒度 | ChangeConfiguration 改 MeterValuesSampledData+MeterValueSampleInterval,通常返回 RebootRequired |
| 修相位序 | ChangeConfiguration 改 ConnectorPhaseRotation,三相站点务必核对 |
| 判断是否支持智能充电 | GetConfiguration 读 SupportedFeatureProfiles |
| 排查掉线 | GetConfiguration 读 WebSocketPingInterval,为 0 时考虑设为 30--300 |
6.2 高频问题清单
- 改配置返回
Rejected→ 优先检查 value 是否误传成 JSON 数字/布尔;其次检查范围与是否只读。 - 改配置返回
RebootRequired→ 必须由 CS 再下发一次Reset,重启后回读确认。 - 读配置返回
unknownKey→ 该桩固件未实现该键;核对键名拼写(大小写敏感)是否与规范一致。 NotSupported与 Rejected的区别 → 前者是键不支持 ,后者是值有问题(键本身存在)。- 厂商私有键 → 标准之外的键(如
ServerURL、FreeCharging)仅该厂商桩支持,不可跨厂商复用。
6.3 与其他指令的配合
| 相关指令 | 关系 |
|---|---|
BootNotification |
其 .conf 中的 interval 会覆盖 HeartbeatInterval |
Reset |
收到 RebootRequired 后必须配合下发 |
TriggerMessage |
可用 DiagnosticsStatusNotification 等触发状态自检,辅助确认配置生效 |
GetReport/GetVariables(OCPP 2.0.1) |
2.0.1 起配置管理改走设备模型变量,与本手册的 key-value 模型完全不同,迁移时需重写 |