OCPP1.6协议字段解析 - ChangeAvailability 平台控制充电桩或指定枪口的可用状态

在 OCPP 1.6 协议中,ChangeAvailability 是中央系统(Central System,即充电平台)向充电桩(Charge Point)下发的核心控制指令之一,用于远程调整充电桩整体或单个充电枪口的可用状态,是充电运营中实现设备运维、故障隔离、排班调度的关键功能。本文将结合 OCPP 1.6 官方规范,完整拆解该指令的字段定义、枚举类型、业务场景与实现细节。
一、指令概述:ChangeAvailability.req 是什么?
ChangeAvailability.req 是中央系统 → 充电桩的请求 PDU(协议数据单元),用于通知充电桩执行可用性变更操作。
- 核心作用:远程控制充电桩整体、或指定单个充电枪口(Connector)的「可充电 / 不可充电」状态。
- 响应 PDU:充电桩收到指令后,会返回
ChangeAvailability.conf确认执行结果(本文重点解析请求字段,响应逻辑可参考协议规范)。 - 协议定位:OCPP 1.6 核心规范第 6.7 节定义,依赖第 7.4 节的
AvailabilityType枚举类型。
二、ChangeAvailability.req 字段完整解析
根据 OCPP 1.6 官方规范,ChangeAvailability.req 包含 2 个必填字段,字段定义如下表:
| 字段名 (FIELD NAME) | 字段类型 (FIELD TYPE) | cardinality (CARD.) | 描述 (DESCRIPTION) |
|---|---|---|---|
connectorId |
integer (connectorId ≥ 0) | 1..1(必填) | 目标充电接口 ID,用于指定要变更状态的对象:・取值 0:代表整个充电桩(Charge Point)及其所有充电枪口的可用性变更・取值 1,2,3...:代表指定编号的单个充电枪口(Connector)的可用性变更 |
type |
AvailabilityType(枚举) | 1..1(必填) | 可用性变更类型,指定充电桩需要执行的状态切换操作,枚举值见下文详解 |
1. connectorId:目标对象精准定位
connectorId 是指令的「作用范围标识」,是实现「全局控制 / 单枪控制」的核心:
- 全局控制场景:当
connectorId = 0时,平台要求充电桩将整台设备设为不可用 / 可用,适用于充电桩整体故障、设备离线维护、站点停运等场景。 - 单枪控制场景:当
connectorId = 1/2/...(即 > 0)时,仅对指定编号的充电枪口生效,适用于单个枪口故障、枪头损坏、单枪运维等场景,不影响其他枪口正常服务。 - 约束:
connectorId必须为非负整数,充电桩需校验 ID 合法性(如不存在的枪口 ID 需返回错误响应)。
2. type:可用性类型枚举(AvailabilityType)
type 字段是指令的「操作指令」,其值为 AvailabilityType 枚举类型,OCPP 1.6 规范中定义了 2 个合法枚举值:
| 枚举值 (VALUE) | 描述 (DESCRIPTION) | 业务场景 |
|---|---|---|
Inoperative |
Charge point is not available for charging.(充电桩 / 枪口不可用,禁止充电) | 设备故障、枪头损坏、运维检修、限流停运、临时禁用 |
Operative |
Charge point is available for charging.(充电桩 / 枪口可用,允许充电) | 故障修复、运维完成、恢复服务、重新启用 |
三、核心业务场景与交互逻辑
1. 典型应用场景
| 场景 | 指令参数示例 | 业务说明 |
|---|---|---|
| 单枪故障禁用 | connectorId=1, type=Inoperative |
1 号枪出现硬件故障,平台下发指令禁用该枪,用户无法在该枪发起充电,其他枪正常使用 |
| 整站停运维护 | connectorId=0, type=Inoperative |
充电桩所在站点进行停电检修,平台下发指令禁用整台设备,所有枪口停止服务 |
| 故障恢复启用 | connectorId=1, type=Operative |
1 号枪故障修复完成,平台下发指令恢复该枪可用,重新对外开放充电服务 |
| 整站恢复运营 | connectorId=0, type=Operative |
站点检修完成,平台下发指令恢复整台设备所有枪口的可用状态 |
2. 完整交互流程
- 平台下发指令:中央系统根据业务需求,向指定充电桩发送
ChangeAvailability.req,携带目标connectorId和目标type。 - 充电桩校验与执行:
- 校验
connectorId合法性(是否为有效 ID)、type枚举值合法性; - 执行状态变更:将对应枪口 / 整台设备的可用性状态更新为目标值;
- 若枪口正在充电,需遵循协议规范处理(通常允许完成当前充电,后续禁止新充电请求,部分场景可强制终止)。
- 校验
- 充电桩返回响应:向平台发送
ChangeAvailability.conf,携带status字段(Accepted/Rejected/Scheduled等),告知指令执行结果。 - 平台状态同步:平台根据响应结果,更新后台设备状态,同步至用户端、运营端系统。
四、开发实现关键细节与避坑指南
1. 字段校验规则
connectorId:必须为非负整数,充电桩需校验 ID 范围(如设备仅支持 2 个枪口,则connectorId只能为 0/1/2,其他值返回Rejected)。type:必须严格匹配枚举值(Operative/Inoperative),大小写敏感,非法值需返回错误响应。- cardinality 约束:两个字段均为
1..1,禁止缺失、多传或传空值,否则视为非法请求。
2. 充电中状态处理
当指令下发时,若目标枪口 / 整台设备正在进行充电,充电桩需遵循以下逻辑:
- 推荐处理:允许当前充电会话正常结束,禁止新的充电请求,状态变更对后续请求生效;
- 特殊场景:若平台要求强制终止,需结合
RemoteStartTransaction/RemoteStopTransaction指令配合实现,ChangeAvailability本身不强制终止当前充电。
3. 状态持久化
充电桩需将变更后的可用性状态持久化存储,即使设备重启、离线后重新上线,状态仍需保持,避免状态丢失导致服务异常。
4. 状态同步机制
平台需通过 StatusNotification 报文(充电桩主动上报的状态通知),校验充电桩是否成功执行了 ChangeAvailability 指令,确保平台与设备状态一致。
五、Java 代码实现示例(Spring Boot 环境)
以下是基于 OCPP 1.6 规范的 ChangeAvailability.req 实体类与枚举定义,可直接用于后端开发:
1. AvailabilityType 枚举类
/**
* OCPP 1.6 AvailabilityType 枚举
* 对应 ChangeAvailability.req 的 type 字段
*/
public enum AvailabilityType {
/**
* 不可用,禁止充电
*/
Inoperative,
/**
* 可用,允许充电
*/
Operative
}
2. ChangeAvailabilityRequest 实体类
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
/**
* OCPP 1.6 ChangeAvailability.req 请求实体
*/
public class ChangeAvailabilityRequest {
/**
* 目标接口ID,0代表整台充电桩,1,2...代表单个枪口
*/
@NotNull(message = "connectorId 不能为空")
@Min(value = 0, message = "connectorId 必须为非负整数")
private Integer connectorId;
/**
* 可用性类型
*/
@NotNull(message = "type 不能为空")
private AvailabilityType type;
// Getter & Setter
public Integer getConnectorId() {
return connectorId;
}
public void setConnectorId(Integer connectorId) {
this.connectorId = connectorId;
}
public AvailabilityType getType() {
return type;
}
public void setType(AvailabilityType type) {
this.type = type;
}
}
3. 服务层处理逻辑示例
import org.springframework.stereotype.Service;
@Service
public class ChargePointAvailabilityService {
/**
* 处理 ChangeAvailability.req 请求
* @param request 请求实体
* @param chargePointId 充电桩ID
* @return 执行结果
*/
public ChangeAvailabilityResponse handleChangeAvailability(ChangeAvailabilityRequest request, String chargePointId) {
Integer connectorId = request.getConnectorId();
AvailabilityType type = request.getType();
// 1. 校验connectorId合法性
if (!isValidConnectorId(chargePointId, connectorId)) {
return new ChangeAvailabilityResponse(AvailabilityStatus.Rejected);
}
// 2. 执行状态变更
updateAvailabilityStatus(chargePointId, connectorId, type);
// 3. 返回成功响应
return new ChangeAvailabilityResponse(AvailabilityStatus.Accepted);
}
/**
* 校验connectorId是否合法
*/
private boolean isValidConnectorId(String chargePointId, Integer connectorId) {
// 业务逻辑:根据充电桩配置,校验connectorId是否在有效范围内
// 示例:充电桩支持2个枪口,允许的connectorId为0,1,2
return connectorId >= 0 && connectorId <= 2;
}
/**
* 更新充电桩/枪口可用性状态
*/
private void updateAvailabilityStatus(String chargePointId, Integer connectorId, AvailabilityType type) {
// 业务逻辑:持久化状态到数据库,同步到缓存,通知设备执行状态变更
System.out.println(String.format("更新充电桩[%s] %s 状态为: %s",
chargePointId,
connectorId == 0 ? "整台设备" : String.format("%d号枪口", connectorId),
type));
}
}
六、总结
ChangeAvailability 是 OCPP 1.6 协议中平台侧远程控制设备状态的核心指令,通过 connectorId 实现「全局 / 单枪」的精准控制,通过 AvailabilityType 实现「可用 / 不可用」的状态切换,是充电运营平台实现设备运维、故障管理、服务调度的基础能力。
开发过程中需重点关注:
- 字段合法性校验,避免非法指令导致设备异常;
- 充电中状态的兼容处理,保障用户充电体验;
- 状态持久化与平台 - 设备状态同步,确保数据一致性。
延伸阅读
- OCPP 1.6 官方规范:https://ocpp-spec.org/schemas/v1.6/
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)