跳到正文

OCPP 1.6J 协议参考。

充电桩与其后台之间互相发送的内容:全部 28 条消息,附字段和示例;43 个配置键;充电桩可以测量的数据;以及实际使用中容易出错的地方。

消息配置键测量量常见问题

什么是 OCPP 1.6J?

OCPP,即开放充电点协议(Open Charge Point Protocol),是开放充电联盟(Open Charge Alliance)制定的一项免费开放标准。它规定充电桩如何与管理它的软件通信:这个软件在规范中称为中央系统(Central System),在市场上称为后台。

在 1.6J 版本中,充电桩向后台建立一条 WebSocket 连接,双方通过它发送 JSON 消息。充电桩报告自己的状态、电表数值和充电会话。后台启动和停止充电会话、更改设置并设定充电限值。

由于这项标准是开放的,支持它的充电桩也可以连接到其他同样支持它的后台,具体取决于型号、固件和配置。正因如此,您可以在同一场地混用不同品牌,也可以把充电桩迁移到另一个后台。如需让一台充电桩同时连接多个后台,请使用 OCPP 代理。

  • 开放标准可免费实现,由开放充电联盟维护。
  • WebSocket 和 JSON一条保持打开的连接,传送结构化消息。
  • 28 条消息分属六个功能配置文件,从核心到远程触发。
  • 双向充电桩和后台各自发起自己的消息。

OCPP 1.6 全部 28 条消息

每条消息都是一方发出的请求和另一方给出的响应,二者通过唯一的消息 ID 对应。

核心

必需。充电点的基本操作:授权、交易、状态报告、配置和基本远程控制。

在允许充电前请求对 idTag 进行授权。

请求
字段类型要求内容
idTagstring必填要授权的标识符。最多 20 个字符。
响应
字段类型要求内容
idTagInfoobject必填该 idTag 的授权信息。
statusstring必填授权状态。取值:Accepted、Blocked、Expired、Invalid、ConcurrentTx。
expiryDatestring可选idTag 被视为过期的时间点。值为日期时间。
parentIdTagstring可选用于组授权的父级 idTag。最多 20 个字符。
示例
充电桩发送
[2, "7f83df9c", "Authorize", {
  "idTag": "04A2B3C4D5E6F7"
}]
后台应答
[3, "7f83df9c", {
  "idTagInfo": {
    "status": "Accepted"
  }
}]

OCPP 2.0.1 中对应:Authorize

启动后发送,用于向后台注册。

请求
字段类型要求内容
chargePointVendorstring必填充电点的厂商。最多 20 个字符。
chargePointModelstring必填充电点的型号。最多 20 个字符。
chargePointSerialNumberstring可选充电点的序列号。最多 25 个字符。
chargeBoxSerialNumberstring可选充电箱(charge box)的序列号。最多 25 个字符。
firmwareVersionstring可选充电点的固件版本。最多 50 个字符。
iccidstring可选SIM 卡的 ICCID。最多 20 个字符。
imsistring可选SIM 卡的 IMSI。最多 20 个字符。
meterTypestring可选电能表的类型。最多 25 个字符。
meterSerialNumberstring可选电能表的序列号。最多 25 个字符。
响应
字段类型要求内容
statusstring必填注册状态。取值:Accepted、Pending、Rejected。
currentTimestring必填中央系统的当前时间。值为日期时间。
intervalinteger必填心跳间隔,单位为秒。
示例
充电桩发送
[2, "392b5b40", "BootNotification", {
  "chargePointVendor": "ExampleVendor",
  "chargePointModel": "ExampleModel",
  "firmwareVersion": "1.4.2"
}]
后台应答
[3, "392b5b40", {
  "status": "Accepted",
  "currentTime": "2026-10-06T09:30:00Z",
  "interval": 300
}]

OCPP 2.0.1 中对应:BootNotification

更改充电接口的可用性。

请求
字段类型要求内容
connectorIdinteger必填充电接口的 ID(0 表示整个充电点)。
typestring必填请求的可用性变更。取值:Inoperative、Operative。
响应
字段类型要求内容
statusstring必填可用性变更请求的结果。取值:Accepted、Rejected、Scheduled。
示例
后台发送
[2, "be3dcf2e", "ChangeAvailability", {
  "connectorId": 1,
  "type": "Operative"
}]
充电桩应答
[3, "be3dcf2e", {
  "status": "Accepted"
}]

OCPP 2.0.1 中对应:ChangeAvailability

更改充电桩上的一个配置键。

请求
字段类型要求内容
keystring必填要更改的配置键。最多 50 个字符。
valuestring必填配置键的新值。最多 500 个字符。
响应
字段类型要求内容
statusstring必填配置更改的结果。取值:Accepted、Rejected、RebootRequired、NotSupported。
示例
后台发送
[2, "6fdf2255", "ChangeConfiguration", {
  "key": "MeterValueSampleInterval",
  "value": "60"
}]
充电桩应答
[3, "6fdf2255", {
  "status": "Accepted"
}]

OCPP 2.0.1 中对应:SetVariables

清除充电桩上的授权缓存。

请求

没有字段:请求为空。

响应
字段类型要求内容
statusstring必填清除缓存请求的结果。取值:Accepted、Rejected。
示例
后台发送
[2, "e993e844", "ClearCache", {}]
充电桩应答
[3, "e993e844", {
  "status": "Accepted"
}]

OCPP 2.0.1 中对应:ClearCache

厂商自定义的数据交换。

请求
字段类型要求内容
vendorIdstring必填标识厂商。最多 255 个字符。
messageIdstring可选消息的附加标识。最多 50 个字符。
datastring可选厂商自定义数据。
响应
字段类型要求内容
statusstring必填数据传输的结果。取值:Accepted、Rejected、UnknownMessageId、UnknownVendorId。
datastring可选厂商自定义的响应数据。
示例
一方发送
[2, "e1a403d5", "DataTransfer", {
  "vendorId": "com.example"
}]
另一方应答
[3, "e1a403d5", {
  "status": "Accepted"
}]

OCPP 2.0.1 中对应:DataTransfer

从充电桩读取配置键。

请求
字段类型要求内容
keyarray可选要读取的配置键列表。每项最多 50 个字符。
响应
字段类型要求内容
configurationKeyarray可选已知配置键的列表。
keystring必填配置键名称。最多 50 个字符。
readonlyboolean必填该键是否为只读。
valuestring可选该键的当前值。最多 500 个字符。
unknownKeyarray可选所请求的键中无法识别的键的列表。每项最多 50 个字符。
示例
后台发送
[2, "02bd00f5", "GetConfiguration", {
  "key": [
    "MeterValueSampleInterval"
  ]
}]
充电桩应答
[3, "02bd00f5", {
  "configurationKey": [
    {
      "key": "MeterValueSampleInterval",
      "readonly": false,
      "value": "60"
    }
  ]
}]

OCPP 2.0.1 中对应:GetBaseReport 和 GetVariables

定期保持连接,让后台知道充电桩在线。

请求

没有字段:请求为空。

响应
字段类型要求内容
currentTimestring必填中央系统的当前时间。值为日期时间。
示例
充电桩发送
[2, "83622997", "Heartbeat", {}]
后台应答
[3, "83622997", {
  "currentTime": "2026-10-06T09:30:00Z"
}]

OCPP 2.0.1 中对应:Heartbeat

发送定期或触发的电表读数。

请求
字段类型要求内容
connectorIdinteger必填充电接口的 ID(0 表示主电表)。
meterValuearray必填一个或多个带时间戳的电表数值。
timestampstring必填电表数值的时间戳。值为日期时间。
sampledValuearray必填一个或多个采样值。
valuestring必填测得的值。
contextstring可选读数的上下文。取值:Interruption.Begin、Interruption.End、Sample.Clock、Sample.Periodic、Transaction.Begin、Transaction.End、Trigger、Other。
formatstring可选值的格式。取值:Raw、SignedData。
measurandstring可选测量类型。取值:Energy.Active.Export.Register、Energy.Active.Import.Register、Energy.Reactive.Export.Register、Energy.Reactive.Import.Register、Energy.Active.Export.Interval、Energy.Active.Import.Interval、Energy.Reactive.Export.Interval、Energy.Reactive.Import.Interval、Power.Active.Export、Power.Active.Import、Power.Offered、Power.Reactive.Export、Power.Reactive.Import、Power.Factor、Current.Import、Current.Export、Current.Offered、Voltage、Frequency、Temperature、SoC、RPM。
phasestring可选测量所对应的相。取值:L1、L2、L3、N、L1-N、L2-N、L3-N、L1-L2、L2-L3、L3-L1。
locationstring可选测量位置。取值:Cable、EV、Inlet、Outlet、Body。
unitstring可选测量单位。取值:Wh、kWh、varh、kvarh、W、kW、VA、kVA、var、kvar、A、V、K、Celcius、Celsius、Fahrenheit、Percent。
transactionIdinteger可选这些电表数值所属的交易。
响应

没有字段:响应为空。

示例
充电桩发送
[2, "80a15023", "MeterValues", {
  "connectorId": 1,
  "meterValue": [
    {
      "timestamp": "2026-10-06T09:30:00Z",
      "sampledValue": [
        {
          "value": "19840",
          "measurand": "Energy.Active.Import.Register",
          "unit": "Wh"
        }
      ]
    }
  ],
  "transactionId": 4521
}]
后台应答
[3, "80a15023", {}]

OCPP 2.0.1 中对应:MeterValues

远程启动充电会话。

请求
字段类型要求内容
idTagstring必填本次充电会话使用的标识符。最多 20 个字符。
connectorIdinteger可选要启动的充电接口。
chargingProfileobject可选应用于本次充电会话的充电配置文件。
chargingProfileIdinteger必填该充电配置文件的唯一标识符。
stackLevelinteger必填配置文件的优先级(数值越高,优先级越高)。
chargingProfilePurposestring必填充电配置文件的用途。取值:ChargePointMaxProfile、TxDefaultProfile、TxProfile。
chargingProfileKindstring必填计划的类型。取值:Absolute、Recurring、Relative。
chargingScheduleobject必填充电计划。
chargingRateUnitstring必填充电速率的单位(安培或瓦特)。取值:A、W。
chargingSchedulePeriodarray必填计划时段列表。
startPeriodinteger必填时段的开始时间,从计划开始起算的秒数。
limitnumber必填该时段内的功率或电流限值。步长为 0.1。
numberPhasesinteger可选充电使用的相数。
durationinteger可选计划的时长,单位为秒。
startSchedulestring可选计划的开始日期时间。值为日期时间。
minChargingRatenumber可选支持的最低充电速率。步长为 0.1。
transactionIdinteger可选该配置文件所适用的交易。
recurrencyKindstring可选循环配置文件的重复周期。取值:Daily、Weekly。
validFromstring可选配置文件开始生效的日期时间。值为日期时间。
validTostring可选配置文件失效的日期时间。值为日期时间。
响应
字段类型要求内容
statusstring必填充电点是否接受该请求。取值:Accepted、Rejected。
示例
后台发送
[2, "b7e2ef8a", "RemoteStartTransaction", {
  "idTag": "04A2B3C4D5E6F7",
  "connectorId": 1
}]
充电桩应答
[3, "b7e2ef8a", {
  "status": "Accepted"
}]

OCPP 2.0.1 中对应:RequestStartTransaction

远程停止充电会话。

请求
字段类型要求内容
transactionIdinteger必填要停止的交易的 ID。
响应
字段类型要求内容
statusstring必填充电点是否接受该请求。取值:Accepted、Rejected。
示例
后台发送
[2, "7fb0afb2", "RemoteStopTransaction", {
  "transactionId": 4521
}]
充电桩应答
[3, "7fb0afb2", {
  "status": "Accepted"
}]

OCPP 2.0.1 中对应:RequestStopTransaction

重置充电点(硬重置或软重置)。

请求
字段类型要求内容
typestring必填要执行的重置类型。取值:Hard、Soft。
响应
字段类型要求内容
statusstring必填充电点是否接受重置。取值:Accepted、Rejected。
示例
后台发送
[2, "526d688f", "Reset", {
  "type": "Soft"
}]
充电桩应答
[3, "526d688f", {
  "status": "Accepted"
}]

OCPP 2.0.1 中对应:Reset

通知后台充电会话已开始。

请求
字段类型要求内容
connectorIdinteger必填交易开始所在的充电接口。
idTagstring必填用于启动交易的标识符。最多 20 个字符。
meterStartinteger必填交易开始时的电表数值(Wh)。
timestampstring必填交易开始的时间戳。值为日期时间。
reservationIdinteger可选所使用的预约的 ID。
响应
字段类型要求内容
idTagInfoobject必填该 idTag 的授权信息。
statusstring必填授权状态。取值:Accepted、Blocked、Expired、Invalid、ConcurrentTx。
expiryDatestring可选idTag 被视为过期的时间点。值为日期时间。
parentIdTagstring可选用于组授权的父级 idTag。最多 20 个字符。
transactionIdinteger必填由中央系统分配的交易 ID。
示例
充电桩发送
[2, "2410a6a5", "StartTransaction", {
  "connectorId": 1,
  "idTag": "04A2B3C4D5E6F7",
  "meterStart": 12500,
  "timestamp": "2026-10-06T09:30:00Z"
}]
后台应答
[3, "2410a6a5", {
  "idTagInfo": {
    "status": "Accepted"
  },
  "transactionId": 4521
}]

OCPP 2.0.1 中对应:TransactionEvent

报告充电接口的当前状态和错误。

请求
字段类型要求内容
connectorIdinteger必填所报告状态对应的充电接口。
errorCodestring必填错误代码(无错误时为 NoError)。取值:ConnectorLockFailure、EVCommunicationError、GroundFailure、HighTemperature、InternalError、LocalListConflict、NoError、OtherError、OverCurrentFailure、PowerMeterFailure、PowerSwitchFailure、ReaderFailure、ResetFailure、UnderVoltage、OverVoltage、WeakSignal。
statusstring必填充电接口的当前状态。取值:Available、Preparing、Charging、SuspendedEVSE、SuspendedEV、Finishing、Reserved、Unavailable、Faulted。
infostring可选关于状态的附加自由文本信息。最多 50 个字符。
timestampstring可选状态变化的时间戳。值为日期时间。
vendorIdstring可选厂商自定义的标识符。最多 255 个字符。
vendorErrorCodestring可选厂商自定义的错误代码。最多 50 个字符。
响应

没有字段:响应为空。

示例
充电桩发送
[2, "d9b0420e", "StatusNotification", {
  "connectorId": 1,
  "errorCode": "NoError",
  "status": "Available"
}]
后台应答
[3, "d9b0420e", {}]

OCPP 2.0.1 中对应:StatusNotification

通知后台充电会话已停止。

请求
字段类型要求内容
transactionIdinteger必填正在停止的交易的 ID。
timestampstring必填交易停止的时间戳。值为日期时间。
meterStopinteger必填交易结束时的电表数值(Wh)。
idTagstring可选请求停止的标识符。最多 20 个字符。
reasonstring可选停止交易的原因。取值:EmergencyStop、EVDisconnected、HardReset、Local、Other、PowerLoss、Reboot、Remote、SoftReset、UnlockCommand、DeAuthorized。
transactionDataarray可选MeterValue 对象数组(结构与 MeterValues.meterValue 相同)。
timestampstring必填电表数值的时间戳。值为日期时间。
sampledValuearray必填一个或多个采样值。
valuestring必填测得的值。
contextstring可选读数的上下文。取值:Interruption.Begin、Interruption.End、Sample.Clock、Sample.Periodic、Transaction.Begin、Transaction.End、Trigger、Other。
formatstring可选值的格式。取值:Raw、SignedData。
measurandstring可选测量类型。取值:Energy.Active.Export.Register、Energy.Active.Import.Register、Energy.Reactive.Export.Register、Energy.Reactive.Import.Register、Energy.Active.Export.Interval、Energy.Active.Import.Interval、Energy.Reactive.Export.Interval、Energy.Reactive.Import.Interval、Power.Active.Export、Power.Active.Import、Power.Offered、Power.Reactive.Export、Power.Reactive.Import、Power.Factor、Current.Import、Current.Export、Current.Offered、Voltage、Frequency、Temperature、SoC、RPM。
phasestring可选测量所对应的相。取值:L1、L2、L3、N、L1-N、L2-N、L3-N、L1-L2、L2-L3、L3-L1。
locationstring可选测量位置。取值:Cable、EV、Inlet、Outlet、Body。
unitstring可选测量单位。取值:Wh、kWh、varh、kvarh、W、kW、VA、kVA、var、kvar、A、V、K、Celcius、Celsius、Fahrenheit、Percent。
响应
字段类型要求内容
idTagInfoobject可选该 idTag 的授权信息。
statusstring必填授权状态。取值:Accepted、Blocked、Expired、Invalid、ConcurrentTx。
expiryDatestring可选idTag 被视为过期的时间点。值为日期时间。
parentIdTagstring可选用于组授权的父级 idTag。最多 20 个字符。
示例
充电桩发送
[2, "b380dc07", "StopTransaction", {
  "transactionId": 4521,
  "timestamp": "2026-10-06T09:30:00Z",
  "meterStop": 19840,
  "idTag": "04A2B3C4D5E6F7"
}]
后台应答
[3, "b380dc07", {
  "idTagInfo": {
    "status": "Accepted"
  }
}]

OCPP 2.0.1 中对应:TransactionEvent

远程解锁充电接口。

请求
字段类型要求内容
connectorIdinteger必填要解锁的充电接口。
响应
字段类型要求内容
statusstring必填解锁请求的结果。取值:Unlocked、UnlockFailed、NotSupported。
示例
后台发送
[2, "882ccab0", "UnlockConnector", {
  "connectorId": 1
}]
充电桩应答
[3, "882ccab0", {
  "status": "Unlocked"
}]

OCPP 2.0.1 中对应:UnlockConnector

固件管理

固件更新和诊断上传,用于充电点的远程维护。

请求充电桩上传诊断日志。

请求
字段类型要求内容
locationstring必填诊断文件的上传地址。值为地址(URI)。
retriesinteger可选上传的重试次数。
retryIntervalinteger可选两次重试之间的秒数。
startTimestring可选日志收集时间范围的开始。值为日期时间。
stopTimestring可选日志收集时间范围的结束。值为日期时间。
响应
字段类型要求内容
fileNamestring可选诊断文件的名称。最多 255 个字符。
示例
后台发送
[2, "da7920cd", "GetDiagnostics", {
  "location": "ftp://files.example.com/diagnostics/"
}]
充电桩应答
[3, "da7920cd", {}]

OCPP 2.0.1 中对应:GetLog

报告诊断上传的状态。

请求
字段类型要求内容
statusstring必填诊断上传的当前状态。取值:Idle、Uploaded、UploadFailed、Uploading。
响应

没有字段:响应为空。

示例
充电桩发送
[2, "d1c853b4", "DiagnosticsStatusNotification", {
  "status": "Uploaded"
}]
后台应答
[3, "d1c853b4", {}]

OCPP 2.0.1 中对应:LogStatusNotification

报告固件更新的状态。

请求
字段类型要求内容
statusstring必填固件更新的当前状态。取值:Downloaded、DownloadFailed、Downloading、Idle、InstallationFailed、Installing、Installed。
响应

没有字段:响应为空。

示例
充电桩发送
[2, "dc9afcb2", "FirmwareStatusNotification", {
  "status": "Installed"
}]
后台应答
[3, "dc9afcb2", {}]

OCPP 2.0.1 中对应:FirmwareStatusNotification

指示充电桩下载并安装新固件。

请求
字段类型要求内容
locationstring必填固件的下载地址。值为地址(URI)。
retrieveDatestring必填充电桩开始获取固件的日期时间。值为日期时间。
retriesinteger可选下载的重试次数。
retryIntervalinteger可选两次重试之间的秒数。
响应

没有字段:响应为空。

示例
后台发送
[2, "a57cc6a2", "UpdateFirmware", {
  "location": "ftp://files.example.com/fw-1.4.3.bin",
  "retrieveDate": "2026-10-07T02:00:00Z"
}]
充电桩应答
[3, "a57cc6a2", {}]

OCPP 2.0.1 中对应:UpdateFirmware

本地授权列表

管理充电点上的本地授权列表,用于离线身份验证。

读取本地授权列表的版本号。

请求

没有字段:请求为空。

响应
字段类型要求内容
listVersioninteger必填本地授权列表的当前版本号。
示例
后台发送
[2, "ccf23a29", "GetLocalListVersion", {}]
充电桩应答
[3, "ccf23a29", {
  "listVersion": 1
}]

OCPP 2.0.1 中对应:GetLocalListVersion

向本地授权列表发送完整或部分更新。

请求
字段类型要求内容
listVersioninteger必填本次列表更新的版本号。
updateTypestring必填这是完整替换还是差异更新。取值:Differential、Full。
localAuthorizationListarray可选授权条目列表。
idTagstring必填要授权的标识符。最多 20 个字符。
idTagInfoobject可选该 idTag 的授权信息。
statusstring必填授权状态。取值:Accepted、Blocked、Expired、Invalid、ConcurrentTx。
expiryDatestring可选idTag 被视为过期的时间点。值为日期时间。
parentIdTagstring可选用于组授权的父级 idTag。最多 20 个字符。
响应
字段类型要求内容
statusstring必填本地列表更新的结果。取值:Accepted、Failed、NotSupported、VersionMismatch。
示例
后台发送
[2, "a23c9563", "SendLocalList", {
  "listVersion": 1,
  "updateType": "Full",
  "localAuthorizationList": [
    {
      "idTag": "04A2B3C4D5E6F7",
      "idTagInfo": {
        "status": "Accepted"
      }
    }
  ]
}]
充电桩应答
[3, "a23c9563", {
  "status": "Accepted"
}]

OCPP 2.0.1 中对应:SendLocalList

预约

为特定用户提前预留充电接口。

取消现有预约。

请求
字段类型要求内容
reservationIdinteger必填要取消的预约的 ID。
响应
字段类型要求内容
statusstring必填预约是否已取消。取值:Accepted、Rejected。
示例
后台发送
[2, "63258356", "CancelReservation", {
  "reservationId": 7
}]
充电桩应答
[3, "63258356", {
  "status": "Accepted"
}]

OCPP 2.0.1 中对应:CancelReservation

在指定充电接口上创建预约。

请求
字段类型要求内容
connectorIdinteger必填要预约的充电接口(0 表示不指定充电接口)。
expiryDatestring必填预约的到期日期时间。值为日期时间。
idTagstring必填为其进行预约的标识符。最多 20 个字符。
reservationIdinteger必填本次预约的唯一 ID。
parentIdTagstring可选用于组预约的父级 idTag。最多 20 个字符。
响应
字段类型要求内容
statusstring必填预约请求的结果。取值:Accepted、Faulted、Occupied、Rejected、Unavailable。
示例
后台发送
[2, "62a25d78", "ReserveNow", {
  "connectorId": 1,
  "expiryDate": "2026-10-06T10:00:00Z",
  "idTag": "04A2B3C4D5E6F7",
  "reservationId": 7
}]
充电桩应答
[3, "62a25d78", {
  "status": "Accepted"
}]

OCPP 2.0.1 中对应:ReserveNow

智能充电

设置和管理充电配置文件,用于负载均衡、光伏集成和定时充电。

从充电桩上移除一个或多个充电配置文件。

请求
字段类型要求内容
idinteger可选要清除的充电配置文件的 ID。
connectorIdinteger可选要清除其配置文件的充电接口。
chargingProfilePurposestring可选要清除的配置文件的用途。取值:ChargePointMaxProfile、TxDefaultProfile、TxProfile。
stackLevelinteger可选要清除的配置文件的堆栈级别。
响应
字段类型要求内容
statusstring必填是否清除了任何配置文件。取值:Accepted、Unknown。
示例
后台发送
[2, "2c436739", "ClearChargingProfile", {}]
充电桩应答
[3, "2c436739", {
  "status": "Accepted"
}]

OCPP 2.0.1 中对应:ClearChargingProfile

请求某个充电接口的合成充电计划。

请求
字段类型要求内容
connectorIdinteger必填要获取其计划的充电接口。
durationinteger必填所请求计划的时长,单位为秒。
chargingRateUnitstring可选计划的首选单位。取值:A、W。
响应
字段类型要求内容
statusstring必填充电点能否提供该计划。取值:Accepted、Rejected。
connectorIdinteger可选该计划所适用的充电接口。
scheduleStartstring可选合成计划的开始日期时间。值为日期时间。
chargingScheduleobject可选合成充电计划。
chargingRateUnitstring必填充电速率的单位(安培或瓦特)。取值:A、W。
chargingSchedulePeriodarray必填计划时段列表。
startPeriodinteger必填时段的开始时间,从计划开始起算的秒数。
limitnumber必填该时段内的功率或电流限值。步长为 0.1。
numberPhasesinteger可选充电使用的相数。
durationinteger可选计划的时长,单位为秒。
startSchedulestring可选计划的开始日期时间。值为日期时间。
minChargingRatenumber可选支持的最低充电速率。步长为 0.1。
示例
后台发送
[2, "50bc203f", "GetCompositeSchedule", {
  "connectorId": 1,
  "duration": 3600
}]
充电桩应答
[3, "50bc203f", {
  "status": "Accepted"
}]

OCPP 2.0.1 中对应:GetCompositeSchedule

向充电桩发送充电配置文件。

请求
字段类型要求内容
connectorIdinteger必填该配置文件所适用的充电接口。
csChargingProfilesobject必填要安装的充电配置文件。
chargingProfileIdinteger必填该充电配置文件的唯一标识符。
stackLevelinteger必填配置文件的优先级(数值越高,优先级越高)。
chargingProfilePurposestring必填充电配置文件的用途。取值:ChargePointMaxProfile、TxDefaultProfile、TxProfile。
chargingProfileKindstring必填计划的类型。取值:Absolute、Recurring、Relative。
chargingScheduleobject必填充电计划。
chargingRateUnitstring必填充电速率的单位(安培或瓦特)。取值:A、W。
chargingSchedulePeriodarray必填计划时段列表。
startPeriodinteger必填时段的开始时间,从计划开始起算的秒数。
limitnumber必填该时段内的功率或电流限值。步长为 0.1。
numberPhasesinteger可选充电使用的相数。
durationinteger可选计划的时长,单位为秒。
startSchedulestring可选计划的开始日期时间。值为日期时间。
minChargingRatenumber可选支持的最低充电速率。步长为 0.1。
transactionIdinteger可选该配置文件所适用的交易。
recurrencyKindstring可选循环配置文件的重复周期。取值:Daily、Weekly。
validFromstring可选配置文件开始生效的日期时间。值为日期时间。
validTostring可选配置文件失效的日期时间。值为日期时间。
响应
字段类型要求内容
statusstring必填配置文件是否被接受。取值:Accepted、Rejected、NotSupported。
示例
后台发送
[2, "01be9b20", "SetChargingProfile", {
  "connectorId": 1,
  "csChargingProfiles": {
    "chargingProfileId": 10,
    "stackLevel": 0,
    "chargingProfilePurpose": "TxDefaultProfile",
    "chargingProfileKind": "Relative",
    "chargingSchedule": {
      "chargingRateUnit": "A",
      "chargingSchedulePeriod": [
        {
          "startPeriod": 0,
          "limit": 16.0
        }
      ]
    }
  }
}]
充电桩应答
[3, "01be9b20", {
  "status": "Accepted"
}]

OCPP 2.0.1 中对应:SetChargingProfile

远程触发

按需请求充电点发送特定消息。

请求充电点立即发送特定消息。

请求
字段类型要求内容
requestedMessagestring必填充电点应发送的消息。取值:BootNotification、DiagnosticsStatusNotification、FirmwareStatusNotification、Heartbeat、MeterValues、StatusNotification。
connectorIdinteger可选应为其发送消息的充电接口。
响应
字段类型要求内容
statusstring必填充电点是否会发送该消息。取值:Accepted、Rejected、NotImplemented。
示例
后台发送
[2, "4c736efd", "TriggerMessage", {
  "requestedMessage": "StatusNotification"
}]
充电桩应答
[3, "4c736efd", {
  "status": "Accepted"
}]

OCPP 2.0.1 中对应:TriggerMessage

OCPP 1.6 配置键

ChangeConfiguration 每次在充电桩上设置一个键,GetConfiguration 将它们读回。充电桩在实际使用中的大部分行为都在这里决定:电表数值多久上报一次、包含哪些内容、充电会话能否撑过网络中断、充电线如何解锁。

调用的行为方式

  • 每个值都是字符串数字和布尔值也一样:"60"、"true"。JSON 数字不符合消息的 schema,会校验 schema 的充电桩将返回 CallError。
  • 按规范拼写键名规范规定键名不区分大小写,但并非所有充电桩都遵循这一点,所以请写 MeterValuesSampledData,而不是 metervaluessampleddata。
  • 部分键需要重启充电桩会应答 RebootRequired,发送 Reset 则由您负责。
  • 制造商会添加自己的键使用空键列表调用 GetConfiguration 会返回充电桩支持的所有键,包括制造商自己的键。您按名称请求但充电桩无法识别的键,会在 unknownKey 中返回。

四种应答

Accepted
该键已设置,并且现在生效。
Rejected
该键存在,但值被拒绝:超出范围、格式错误,或在这台充电桩上为只读。
RebootRequired
值已保存,但要等充电桩重启后才生效。
NotSupported
充电桩完全没有实现这个键。

全部 43 个键,按功能配置文件分组

键类型访问权限作用
核心34
AllowOfflineTxForUnknownId规范中为可选boolean读写充电桩离线时是否为未知 idTag 启动交易。设为 true 可让场地在网络中断期间继续充电,代价是部分充电会话可能无法向任何人计费。
AuthorizationCacheEnabled规范中为可选boolean读写充电桩是否缓存之前 Authorize 调用的结果。它与本地授权列表不同:缓存根据实际授权自动填充,列表则由后台推送。
AuthorizeRemoteTxRequestsboolean只读充电桩在启动前是否对 RemoteStartTransaction 中的 idTag 进行授权。设为 true 时,从 App 远程启动仍需要一次 Authorize 往返,因此无效的 idTag 会导致启动失败。
BlinkRepeat规范中为可选integer读写在一次闪烁序列中,充电桩指示灯闪烁的次数。
ClockAlignedDataIntervalinteger读写按时钟对齐的电表数值的间隔,从午夜起算。设为 0 时禁用。设为 900 时,每个整刻钟产生一个读数。MeterValuesAlignedData 的数据就由它触发,无论是否接入车辆都会运行。
ConnectionTimeOutinteger读写授权后,充电桩等待驾驶员插上充电枪的时长,超时后释放该充电接口。
ConnectorPhaseRotationCSL读写每个充电接口的相序,采用 connectorId.RST 表示法,例如 0.RST、1.RST、2.RTS。这里设置错误,会导致分相电表数值错误和单相负载均衡错误。任何三相场地都值得检查一下。
ConnectorPhaseRotationMaxLength规范中为可选integer只读ConnectorPhaseRotation 中的最大项数。
GetConfigurationMaxKeysinteger只读单个 GetConfiguration 请求最多可以请求的键数。超过这个数量,充电桩可能会返回错误。发送不含任何键的 GetConfiguration,即可获取它支持的全部键。
HeartbeatIntervalinteger读写没有其他通信时,充电桩发送 Heartbeat 的频率。BootNotification 的响应可以覆盖此值。在按流量计费的 SIM 卡上,过短的心跳间隔会悄悄累积流量费用。
LightIntensity规范中为可选integer读写充电桩灯光的亮度,以百分比表示。
LocalAuthorizeOfflineboolean读写充电桩离线时是否根据本地列表或缓存进行授权。
LocalPreAuthorizeboolean读写充电桩在线时是否根据本地列表或缓存启动交易,而不等待后台。可以缩短在充电桩前的等待时间,代价是后台不再对每次启动拥有最终决定权。
MaxEnergyOnInvalidId规范中为可选integer读写授权被证实无效后,充电桩仍会输出的电量。
MeterValuesAlignedDataCSL读写按 ClockAlignedDataInterval 在按时钟对齐的 MeterValues 中发送的测量量。测量量词汇与 MeterValuesSampledData 相同,触发方式不同:按时钟,而不是按充电会话。
MeterValuesAlignedDataMaxLength规范中为可选integer只读MeterValuesAlignedData 中测量量的最大数量。
MeterValuesSampledDataCSL读写交易期间按 MeterValueSampleInterval 采样、并在 MeterValues 中发送的测量量。本页最有用的一个键。详见下文的深入讲解。
MeterValuesSampledDataMaxLength规范中为可选integer只读MeterValuesSampledData 中测量量的最大数量。在编写长列表之前先读取它:一旦超出,充电桩会拒绝整个列表。
MeterValueSampleIntervalinteger读写交易期间充电桩对 MeterValuesSampledData 采样的频率。设为 0 时禁用采样。60 是合理的默认值。低于 30 并配合长测量量列表时,会产生大量流量,却几乎得不到额外的信息。
MinimumStatusDuration规范中为可选integer读写充电桩在一种状态下至少停留多久,才会报告下一种状态。可用于抑制在 Preparing 和 Available 之间来回切换的充电桩的状态抖动。
NumberOfConnectorsinteger只读这台充电桩上实体充电接口的数量。
ResetRetriesinteger读写重置失败时充电桩重试的次数。
StopTransactionOnEVSideDisconnectboolean读写在车辆一侧拔下充电枪是否会停止正在进行的交易。设为 false 时,拔下线缆后充电会话仍保持打开,永不结束的充电会话就是这样产生的。
StopTransactionOnInvalidIdboolean读写后台拒绝 idTag 时,充电桩是否停止交易。
StopTxnAlignedDataCSL读写添加到 StopTransaction 的 transactionData 中的按时钟对齐的测量量。
StopTxnAlignedDataMaxLength规范中为可选integer只读StopTxnAlignedData 中测量量的最大数量。
StopTxnSampledDataCSL读写添加到 StopTransaction 的 transactionData 中的采样测量量。请保持简短。其中的每一项都会针对整个充电会话的每次采样,重复放进同一个 StopTransaction 负载中,充电桩就是这样产生出被后台拒绝的数兆字节停止消息。
StopTxnSampledDataMaxLength规范中为可选integer只读StopTxnSampledData 中测量量的最大数量。
SupportedFeatureProfilesCSL只读这台充电桩实现的功能配置文件,例如 Core、FirmwareManagement、SmartCharging。它如实回答了充电桩能做什么。在向客户承诺智能充电之前,请先读取它。
SupportedFeatureProfilesMaxLength规范中为可选integer只读SupportedFeatureProfiles 中的最大项数。
TransactionMessageAttemptsinteger读写后台未确认交易消息时,充电桩重新发送该消息的次数。
TransactionMessageRetryIntervalinteger读写这些重试之间的基础等待时间。充电桩会将其乘以尝试次数。
UnlockConnectorOnEVSideDisconnectboolean读写在车辆一侧拔下线缆时,充电桩一侧的线缆是否解锁。
WebSocketPingInterval规范中为可选integer读写OCPP-J 连接上 WebSocket ping 帧的间隔。充电桩位于会关闭空闲连接的 NAT 或防火墙之后、频繁掉线时,用它就能解决。
本地授权列表3
LocalAuthListEnabledboolean读写是否使用本地授权列表。
LocalAuthListMaxLengthinteger只读本地授权列表可容纳的条目数。
SendLocalListMaxLengthinteger只读单条 SendLocalList 消息可容纳的条目数。超过这个数量的列表必须分成多次差异更新发送。
预约1
ReserveConnectorZeroSupported规范中为可选boolean只读充电桩是否接受在充电接口 0(即任一充电接口)上的预约。
智能充电5
ChargeProfileMaxStackLevelinteger只读充电桩在充电配置文件上接受的最高堆栈级别。级别越高越优先。
ChargingScheduleAllowedChargingRateUnitCSL只读充电桩在充电计划中接受哪些单位:Current(A)、Power(W)或两者。向只接受安培的充电桩发送以瓦特为单位的配置文件,会被拒绝。这个键会告诉您该用哪种单位。
ChargingScheduleMaxPeriodsinteger只读一个充电计划中时段的最大数量。
ConnectorSwitch3to1PhaseSupported规范中为可选boolean只读充电桩能否在三相和单相充电之间切换。它决定了您能否把功率降到三相最低值以下继续充电,而不必完全暂停。
MaxChargingProfilesInstalledinteger只读可同时安装的充电配置文件数量。

MeterValuesSampledData:充电桩测量什么

一个键 MeterValuesSampledData 决定了您能从一次充电会话中获得哪些遥测数据。它是一个以逗号分隔的测量量列表,充电桩按 MeterValueSampleInterval 设定的间隔对其中每一项进行采样,然后在 MeterValues 消息中发送。保持默认值,您只会得到一个累计电能读数,足以计费,此外什么都没有:没有功率曲线,没有分相电流,没有电压,也无法看出智能充电限值是否已生效。

它从不单独起作用。MeterValueSampleInterval 设定采样频率,MeterValuesSampledDataMaxLength 限制可列出的测量量数量,StopTxnSampledData 决定其中哪些会在 StopTransaction 中重复发送,而 MeterValuesAlignedData 使用同一套词汇,只是按时钟计划而不是按充电会话采样。

测量量

以下任何一项都可以出现在列表中。充电桩支持哪些取决于其硬件:交流壁挂式充电桩通常不会上报荷电状态,基础款充电桩可能只有电能寄存器。

测量量单位通常见于提供的信息
Energy.Active.Import.RegisterWh交流和直流从电网取用的累计电能,直接从电表寄存器读取。MeterValuesSampledData 为空时的默认值,也是几乎所有计费计算的基础。
Energy.Active.Export.RegisterWh支持 V2G回馈的累计电能,适用于双向配置。
Energy.Active.Import.IntervalWh交流和直流自上次采样以来输入的电能,而不是累计总量。
Energy.Reactive.Import.Registervarh取决于电表输入的累计无功电能。
Power.Active.ImportW交流和直流瞬时有功功率。用它绘制充电曲线,负载管理也根据它做出调整。
Power.OfferedW交流和直流充电桩当前向车辆提供的功率。将它与 Power.Active.Import 对比,即可看出限值是否真的生效。
Power.Reactive.Importvar取决于电表瞬时无功功率。
Power.Factor比值取决于电表有功功率与视在功率之比。
Current.ImportA交流和直流取用的电流。通常按相上报,因此这一个测量量每次采样可能对应三个值。
Current.OfferedA交流和直流充电桩向车辆发出的电流限值信号。可直接看出您的智能充电配置文件是否已生效。
Current.ExportA支持 V2G回馈的电流,适用于双向配置。
VoltageV交流和直流供电电压,三相充电桩按相上报。可用于发现缺相或接触不良。
FrequencyHz取决于电表电网频率。注意,规范没有为它定义单位字段。
Temperature摄氏度取决于充电桩充电桩或充电接口处的温度。它可以解释炎热天气下的降额,免得被误报为故障。
SoC%直流,或交流上的 ISO 15118车辆电池的荷电状态。只有车辆真的上报时才会出现,而在普通交流充电中,车辆通常不会上报。
RPMrpm少见风扇转速,仅限会上报它的充电桩。

可用的列表

把其中一个复制到 ChangeConfiguration 调用的值中。先从少量开始,充电桩接受后再添加测量量。

  • 仅计费

    仍能生成正确发票的最低配置。大多数充电桩的默认设置。

    Energy.Active.Import.Register
  • 标准遥测

    适合受管理交流场地的合理默认值:功率曲线,以及用于诊断的分相电流和电压。

    Energy.Active.Import.Register, Power.Active.Import, Current.Import, Voltage
  • 智能充电

    增加提供值,让您看到配置文件是否真的被应用,而不是靠猜测。

    Energy.Active.Import.Register, Power.Active.Import, Power.Offered, Current.Import, Current.Offered, Voltage
  • 直流快充

    增加荷电状态和温度,直流充电桩确实会上报这些数据,而它们可以解释大多数降额。

    Energy.Active.Import.Register, Power.Active.Import, Current.Import, Voltage, SoC, Temperature

容易出错的地方

  • 一个错误的测量量会让整个列表被拒绝

    充电桩把列表作为一个整体来校验。只要有一项不受支持,整个列表都会得到 Rejected 或 NotSupported,而且不会指出是哪一项出错。逐个设置测量量来找出问题项,或者先查看 MeterValuesSampledDataMaxLength 和厂商文档。

  • 一个测量量可能对应三个值

    Current.Import 和 Voltage 按相上报,因此在三相充电桩上,它们各自以三个 sampledValue 条目到达,并标记为 L1、L2、L3 或 L1-N 等。一个包含六个测量量的列表,每次采样很容易就有十几个值。负载大小的增长比列表长度看起来要快。

  • Wh 与 kWh

    电能寄存器默认单位是 Wh,但单位字段也可能写成 kWh,有些固件就是这样做的。请读取单位而不是假设,否则发票会相差一千倍。

  • 短间隔是有代价的

    MeterValueSampleInterval 设为 10 秒并配一个长列表,意味着每次充电会话有数百条消息。在按流量计费的 SIM 卡上,这是实打实的费用;在大型场地上,这是实打实的后台负载。60 秒是一个好的默认值,只需要曲线形状的场地可以用 300 秒。

  • StopTxnSampledData 是负载陷阱

    这里列出的所有内容,会把整个充电会话的每一次采样都重复放进一条 StopTransaction 消息中。充电会话长、列表也长时,产生的负载大到足以被后台拒绝或截断,交易随后就无法正常关闭。除非有明确理由,否则只保留电能寄存器。

  • 去掉电能寄存器,计费就会出错

    如果 Energy.Active.Import.Register 不在列表中,周期性电表数值就不包含累计总量。大多数后台随后会退而使用交易消息中的 meterStart 和 meterStop,任何缺失 StopTransaction 的充电会话都将无法计费。请始终把它保留在列表中。

  • 交流充电通常无法获取 SoC

    荷电状态来自车辆,通过 ISO 15118 或直流充电协议传递。在没有 Plug and Charge 的普通交流壁挂式充电桩上,车辆不会上报它,因此请求 SoC 要么被拒绝,要么返回不了有用的信息。

  • 读取 context 字段

    每个 sampledValue 都带有一个 context:Sample.Periodic、Transaction.Begin、Transaction.End、Sample.Clock 或 Trigger。Transaction.Begin 时的值是起始读数,不是消耗量。把每次采样都当作周期性采样,充电会话就会被重复计算。

关于 OCPP 1.6J 的问题

OCPP 1.6J 是开放充电点协议 1.6 版的 JSON 形式。充电桩向其后台建立一条 WebSocket 连接,双方通过它发送 JSON 消息。开放充电联盟于 2015 年发布了 1.6 版,大多数充电桩至今仍支持它:在我们的充电桩数据库中,已知 OCPP 版本的 495 款充电桩里有 483 款支持 1.6。

两者传送的消息相同,方式不同。1.6J 通过充电桩保持打开的 WebSocket 发送 JSON,因此充电桩只需要一条出站连接。1.6S 通过 HTTP 发送 SOAP,这时后台也必须能够访问到充电桩。

2.0.1 是较新的版本,有自己的一套消息。它用设备模型描述充电桩的设置,内置安全配置文件,用 TransactionEvent 取代 StartTransaction 和 StopTransaction,并增加了用于 Plug and Charge(ISO 15118)的消息。两者不能混用:充电桩与其后台在建立连接时商定使用一个版本。在我们的充电桩数据库中,有 102 款充电桩列有 2.0.1,与 1.6 并存或取代 1.6。全部 2.0.1 和 2.1 消息见 OCPP 2.0.1 和 2.1 参考。

开放充电联盟在其网站上免费发布该规范,并附有每条消息的 JSON schema。本参考依据该规范编写。两者不一致时,以规范为准。

通过智能充电(Smart Charging)功能配置文件。后台发送 SetChargingProfile,其中包含以安培或瓦特为单位的限值计划。ChargePointMaxProfile 限制整台充电桩,TxDefaultProfile 适用于每个新的充电会话,TxProfile 适用于某个正在进行的充电会话。当两个用途相同的配置文件重叠时,stackLevel 较高的那个生效。Plugchoice 如何使用这些功能,请参阅智能充电页面。

在充电桩数据库中查一查:其中有 775 款充电桩,列出了我们已知的 OCPP 版本及每条信息的来源。充电桩的数据手册通常也会注明,常写作 OCPP 1.6J 或 OCPP 1.6 JSON。

在充电桩的设置中(通常在安装商 App 或其本地网页上),输入后台的 WebSocket URL(以 ws:// 或 wss:// 开头)和充电桩的 ID,即 charge point identity。充电桩建立连接并发送 BootNotification。后台应答 Accepted 后,充电桩即上线,并为每个充电接口发送 StatusNotification。

Plugchoice 与 OCPP

  • 免费的后台连接 OCPP 1.6J 充电桩,并在 Web 门户中管理它。
  • App所有者和安装商用手机控制同一台充电桩。
  • OCPP 代理一台充电桩同时连接多个后台。
  • 后台连接充电桩时可从列表中选择的后台。

延伸阅读

  1. 什么是 OCPP?

    博客 | 3 分钟阅读

  2. 什么是 OCPP 后台?

    博客 | 2 分钟阅读

供 AI 助手阅读的本页内容

完整参考,包括每条消息和每个配置键,汇总为一个纯文本文件,助手可以一次读完。

纯文本版参考

在 Plugchoice 上运行您的 OCPP 充电桩

将您的 OCPP 1.6J 充电桩免费连接到 Plugchoice,在 Web 门户、App 中以及通过 API 管理它们。