电动汽车充电站OCPP模块规范
1. 系统概述
1.1 总体架构
graph TB
subgraph "后端基础设施"
CSMS[中央系统管理服务]
end
subgraph "电动汽车充电站"
subgraph "您的职责范围"
OCPP[OCPP通信模块]
WS[WebSocket客户端]
PARSER[消息解析器/生成器]
QUEUE[消息队列]
end
subgraph "站点系统(现有)"
STATION[站点控制器]
HARDWARE[硬件控制器]
end
end
CSMS <--> WS
WS <--> OCPP
OCPP <--> PARSER
OCPP <--> QUEUE
OCPP <--> STATION
STATION <--> HARDWARE
1.2 模块用途
主要功能: 使用OCPP 2.0.1协议提供移动充电站与CSMS之间的双向通信
使用场景: 技术员将移动充电站运送给客户或运回基地充电。通过站点控制面板或CSMS移动应用程序控制充电。
接口:
- 外部接口:与CSMS的WebSocket连接
- 内部接口:与站点系统集成的API
1.3 OCPP模块方法表
站点端需要实现的方法
| 方法 | 描述 | 调用时机 |
|---|---|---|
initialize(config) |
使用配置初始化模块 | 系统启动时 |
connect() |
建立与CSMS的连接 | 初始化后 |
disconnect() |
终止与CSMS的连接 | 关机/维护时 |
sendStationEvent(event) |
发送站点事件 | 站点状态变化时 |
sendMeterData(data) |
发送电表读数 | 充电期间每10秒 |
sendStatusUpdate(status) |
发送状态更新 | 站点状态变化时 |
handleStartCharging(params) |
处理开始充电命令 | 接收到CSMS命令时 |
handleStopCharging(transactionId) |
处理停止充电命令 | 接收到CSMS命令时 |
handleDataRequest(requestType) |
处理数据请求 | 接收到CSMS命令时 |
getStationStatus() |
获取当前站点状态 | CSMS请求时 |
getBatteryData() |
获取站点电池数据 | CSMS请求时 |
getLocationData() |
获取站点GPS坐标 | CSMS请求时 |
CSMS端需要实现的方法
| 方法 | 描述 | 调用时机 |
|---|---|---|
handleBootNotification(stationData) |
处理站点启动通知 | 站点连接时 |
handleStatusNotification(status) |
处理状态通知 | 站点状态变化时 |
handleTransactionEvent(event) |
处理交易事件 | 充电开始/结束时 |
handleMeterValues(values) |
处理电表读数 | 充电期间每10秒 |
handleNotifyEvent(event) |
处理错误通知 | 发生错误时 |
sendRemoteStart(stationId, params) |
发送远程启动命令 | 用户请求时 |
sendRemoteStop(transactionId) |
发送远程停止命令 | 用户请求时 |
requestStationData(stationId, dataType) |
请求站点数据 | 用户请求时 |
updateStationConfig(stationId, config) |
更新站点配置 | 设置变更时 |
2. 移动充电站状态
2.1 主要站点状态
stateDiagram-v2
[*] --> Standby
Standby --> CustomerCharging: 技术员开始客户充电
Standby --> StationCharging: 技术员开始站点充电
CustomerCharging --> Standby: 客户充电完成
StationCharging --> Standby: 站点充电完成
note right of Standby
站点已通电
未进行充电
准备操作
end note
note right of CustomerCharging
客户车辆充电中
每10秒发送数据
end note
note right of StationCharging
站点自充电中
每10秒发送数据
end note
2.2 按状态分类的数据
2.2.1 "待机"状态(站点已通电,未进行充电)
发送给CSMS的数据:
{
"stationStatus": "Available",
"batteryLevel": 75,
"batteryVoltage": 48.2,
"batteryTemperature": 25.5,
"location": {
"latitude": 55.7558,
"longitude": 37.6176,
"accuracy": 10
},
"signalStrength": -65,
"internalTemperature": 22.0,
"outputVoltage": 0.0,
"outputCurrent": 0.0,
"outputPower": 0.0,
"connectorStatus": "Available",
"errorCodes": [],
"lastMaintenanceDate": "2025-07-10T09:00:00Z"
}
发送频率: 状态变化时 + CSMS请求时
2.2.2 "客户充电"状态(客户车辆充电中)
每10秒发送给CSMS的数据:
{
"stationStatus": "Charging",
"transactionId": "TXN_123456",
"transactionType": "customer_charging",
"chargingStartTime": "2025-07-12T10:30:00Z",
"chargingDuration": 1800,
"energyDelivered": 5.2,
"currentPower": 7200,
"outputVoltage": 230.5,
"outputCurrent": 31.2,
"vehicleBatteryLevel": 65,
"estimatedTimeToComplete": 2400,
"batteryLevel": 68,
"batteryVoltage": 47.8,
"batteryTemperature": 28.0,
"location": {
"latitude": 55.7558,
"longitude": 37.6176,
"accuracy": 10
},
"signalStrength": -68,
"internalTemperature": 32.0,
"connectorStatus": "Occupied",
"connectorTemperature": 35.0,
"errorCodes": [],
"chargingEfficiency": 92.5
}
发送频率: 充电期间每10秒
2.2.3 "站点充电"状态(站点自充电中)
每10秒发送给CSMS的数据:
{
"stationStatus": "SelfCharging",
"transactionId": "TXN_SELF_789",
"transactionType": "station_charging",
"chargingStartTime": "2025-07-12T14:00:00Z",
"chargingDuration": 3600,
"energyReceived": 15.8,
"inputPower": 5000,
"inputVoltage": 220.0,
"inputCurrent": 22.7,
"batteryLevel": 85,
"batteryVoltage": 49.2,
"batteryTemperature": 30.0,
"estimatedTimeToComplete": 1800,
"location": {
"latitude": 55.7520,
"longitude": 37.6140,
"accuracy": 5
},
"signalStrength": -72,
"internalTemperature": 28.0,
"connectorStatus": "SelfCharging",
"chargingSource": "grid",
"errorCodes": [],
"chargingEfficiency": 94.2
}
发送频率: 充电期间每10秒
3. OCPP模块接口
3.1 与站点系统的集成API
flowchart LR
subgraph "站点系统"
CONTROLLER[站点控制器]
end
subgraph "OCPP模块API"
direction TB
IN[传入事件]
OUT[传出命令]
STATUS[状态查询]
CONFIG[配置]
end
subgraph "CSMS"
BACKEND[后端服务器]
end
CONTROLLER -->|事件| IN
OUT -->|命令| CONTROLLER
CONTROLLER -->|查询| STATUS
CONTROLLER -->|设置| CONFIG
IN -.->|OCPP消息| BACKEND
BACKEND -.->|OCPP消息| OUT
3.2 来自站点的传入事件
{
"eventType": "station_event",
"events": [
{
"type": "cable_connected",
"targetType": "customer|station",
"evseId": 1,
"connectorId": 1,
"timestamp": "2025-07-12T10:30:00Z"
},
{
"type": "charging_started",
"chargingType": "customer_charging|station_charging",
"transactionId": "TXN_123",
"evseId": 1,
"connectorId": 1,
"initiatedBy": "technician|remote",
"timestamp": "2025-07-12T10:30:00Z"
},
{
"type": "meter_reading",
"chargingType": "customer_charging|station_charging",
"evseId": 1,
"readings": {
"energy": 5.2,
"power": 7200,
"voltage": 230.5,
"current": 31.2,
"batteryLevel": 68,
"batteryTemperature": 28.0,
"vehicleBatteryLevel": 65,
"estimatedTimeToComplete": 2400
},
"timestamp": "2025-07-12T10:31:00Z"
},
{
"type": "charging_stopped",
"chargingType": "customer_charging|station_charging",
"transactionId": "TXN_123",
"reason": "technician_stopped|remote_stopped|completed|error",
"finalEnergy": 8.5,
"duration": 900,
"timestamp": "2025-07-12T10:45:00Z"
},
{
"type": "error_detected",
"errorCode": "connector_lock_failure|overheat|power_loss|communication_error",
"severity": "warning|alert|critical",
"component": "charging_connector|battery|power_system|communication",
"chargingType": "customer_charging|station_charging|none",
"timestamp": "2025-07-12T10:35:00Z"
},
{
"type": "status_changed",
"evseId": 1,
"connectorId": 1,
"newStatus": "available|preparing|charging|self_charging|faulted|unavailable",
"previousStatus": "available",
"reason": "technician_action|remote_command|auto_transition|error",
"timestamp": "2025-07-12T10:30:00Z"
},
{
"type": "location_changed",
"location": {
"latitude": 55.7558,
"longitude": 37.6176,
"accuracy": 10,
"address": "莫斯科,特维尔大街1号"
},
"movementDetected": true,
"timestamp": "2025-07-12T10:30:00Z"
}
]
}
3.3 发送给站点的传出命令
{
"commandType": "csms_command",
"commands": [
{
"type": "start_customer_charging",
"evseId": 1,
"chargingProfile": {
"maxPower": 7200,
"phases": 1,
"duration": 3600
},
"estimatedCost": 500.0,
"customerInfo": {
"customerId": "CUST_001",
"vehicleType": "Tesla Model 3"
}
},
{
"type": "start_station_charging",
"chargingSource": "grid|solar",
"maxInputPower": 5000,
"targetBatteryLevel": 100,
"chargingLocation": "base|customer_site"
},
{
"type": "stop_charging",
"transactionId": "TXN_123",
"chargingType": "customer_charging|station_charging",
"reason": "remote_stop|emergency_stop|maintenance"
},
{
"type": "request_data",
"dataType": "battery_status|location|diagnostics|transaction_history",
"requestId": "REQ_001",
"timeRange": {
"from": "2025-07-12T00:00:00Z",
"to": "2025-07-12T23:59:59Z"
}
},
{
"type": "update_configuration",
"parameters": {
"heartbeatInterval": 300,
"meterValueSampleInterval": 10,
"maxChargingPower": 7200,
"emergencyContactNumber": "+7-495-123-4567"
}
},
{
"type": "set_location",
"location": {
"latitude": 55.7558,
"longitude": 37.6176,
"address": "莫斯科,特维尔大街1号",
"locationType": "customer_site|base|service_center"
}
},
{
"type": "technician_notification",
"message": "客户充电已完成。可以断开充电线。",
"priority": "low|normal|high|urgent",
"requiresAcknowledgment": true
},
{
"type": "reset_station",
"resetType": "soft|hard",
"reason": "maintenance|error_recovery|firmware_update"
}
]
}
4. OCPP通信流程
4.1 连接建立
sequenceDiagram
participant Station as 站点系统
participant OCPP as OCPP模块
participant CSMS as CSMS服务器
Station->>OCPP: 初始化连接
Note over OCPP: 配置:服务器URL、API密钥、站点ID
OCPP->>CSMS: WebSocket连接
Note over OCPP,CSMS: wss://csms.server.com/ocpp/{stationId}<br/>Authorization: Bearer {apiKey}
CSMS->>OCPP: 连接已接受
OCPP->>CSMS: BootNotification
Note over OCPP: 站点信息、固件版本
CSMS->>OCPP: BootNotification响应
Note over CSMS: 状态:已接受,心跳间隔
OCPP->>Station: 连接已建立
loop 心跳
OCPP->>CSMS: 心跳(每个间隔)
CSMS->>OCPP: 心跳响应
end
4.2 按站点状态处理事件
4.2.1 "待机"状态(站点准备操作)
sequenceDiagram
participant Technician as 技术员
participant Station as 站点系统
participant OCPP as OCPP模块
participant CSMS as CSMS服务器
Note over Technician,CSMS: 站点已通电,等待命令
Station->>OCPP: status_changed事件(Available)
OCPP->>CSMS: StatusNotification(Available)
CSMS->>OCPP: StatusNotification响应
Note over Technician,CSMS: 技术员将充电线连接到客户车辆
Technician->>Station: 充电线连接到客户车辆
Station->>OCPP: cable_connected事件(customer)
OCPP->>CSMS: StatusNotification(Preparing)
CSMS->>OCPP: StatusNotification响应
Note over Technician,CSMS: 技术员通过控制面板开始充电
Technician->>Station: 开始客户充电
Station->>OCPP: charging_started事件(customer)
OCPP->>CSMS: TransactionEvent(Started,customer_charging)
CSMS->>OCPP: TransactionEvent响应
Note over Technician,CSMS: 替代方案:通过CSMS开始
CSMS->>OCPP: RemoteStartTransaction
OCPP->>Station: start_charging命令
Station->>OCPP: 命令已接受
OCPP->>CSMS: RemoteStartTransaction响应(Accepted)
4.2.2 "客户充电"状态(客户充电中)
sequenceDiagram
participant Station as 站点系统
participant OCPP as OCPP模块
participant CSMS as CSMS服务器
Note over Station,CSMS: 客户充电激活
loop 每10秒
Station->>OCPP: meter_reading事件(客户数据)
OCPP->>CSMS: MeterValues(客户充电数据)
Note over OCPP: 包括:energyDelivered,currentPower,<br/>outputVoltage,vehicleBatteryLevel,<br/>站点batteryLevel,location
CSMS->>OCPP: MeterValues响应
end
Note over Station,CSMS: 充电期间事件处理
alt 充电错误
Station->>OCPP: error_detected事件
OCPP->>CSMS: NotifyEvent(充电错误)
OCPP->>CSMS: StatusNotification(SuspendedEVSE)
else 技术员完成充电
Station->>OCPP: charging_stopped事件(user_stopped)
OCPP->>CSMS: TransactionEvent(Ended)
OCPP->>CSMS: StatusNotification(Available)
else 远程停止
CSMS->>OCPP: RemoteStopTransaction
OCPP->>Station: stop_charging命令
Station->>OCPP: charging_stopped事件(remote_stopped)
OCPP->>CSMS: TransactionEvent(Ended)
end
4.2.3 "站点充电"状态(站点充电中)
sequenceDiagram
participant Technician as 技术员
participant Station as 站点系统
participant OCPP as OCPP模块
participant CSMS as CSMS服务器
Note over Technician,CSMS: 技术员将站点连接到电源
Technician->>Station: 连接到充电源
Station->>OCPP: station_charging_started事件
OCPP->>CSMS: TransactionEvent(Started,station_charging)
CSMS->>OCPP: TransactionEvent响应
OCPP->>CSMS: StatusNotification(SelfCharging)
Note over Station,CSMS: 站点充电过程
loop 每10秒
Station->>OCPP: meter_reading事件(站点数据)
OCPP->>CSMS: MeterValues(站点充电数据)
Note over OCPP: 包括:energyReceived,inputPower,<br/>batteryLevel,batteryTemperature,<br/>estimatedTimeToComplete,location
CSMS->>OCPP: MeterValues响应
end
Note over Station,CSMS: 站点充电完成
alt 电池充满
Station->>OCPP: station_charging_complete事件
OCPP->>CSMS: TransactionEvent(Ended,BatteryFull)
OCPP->>CSMS: StatusNotification(Available)
else 技术员停止充电
Technician->>Station: 停止站点充电
Station->>OCPP: station_charging_stopped事件
OCPP->>CSMS: TransactionEvent(Ended,UserStopped)
OCPP->>CSMS: StatusNotification(Available)
else 充电错误
Station->>OCPP: error_detected事件(charging_fault)
OCPP->>CSMS: NotifyEvent(站点充电错误)
OCPP->>CSMS: StatusNotification(Faulted)
end
4.3 CSMS命令处理
sequenceDiagram
participant CSMS as CSMS服务器
participant OCPP as OCPP模块
participant Station as 站点系统
participant Technician as 技术员
Note over CSMS,Technician: 远程客户充电启动
CSMS->>OCPP: RemoteStartTransaction(customer_charging)
OCPP->>Station: start_customer_charging命令
Station->>OCPP: 命令已接受
OCPP->>CSMS: RemoteStartTransaction响应(Accepted)
Station->>Technician: 通知:"开始客户充电"
Note over CSMS,Technician: 站点数据请求
CSMS->>OCPP: GetReport(Battery + Location)
OCPP->>Station: request_data命令
Station->>OCPP: 数据响应(电池75%,GPS坐标)
OCPP->>CSMS: GetReport响应
OCPP->>CSMS: NotifyReport(站点数据)
Note over CSMS,Technician: 远程充电停止
CSMS->>OCPP: RemoteStopTransaction
OCPP->>Station: stop_charging命令
Station->>Technician: 通知:"调度员停止充电"
Station->>OCPP: 命令已接受
OCPP->>CSMS: RemoteStopTransaction响应(Accepted)
5. 详细OCPP消息规范
5.1 传出消息(站点 → CSMS)
BootNotification(启动时)
{
"reason": "PowerUp",
"chargingStation": {
"model": "从站点系统获取",
"vendorName": "从站点系统获取",
"firmwareVersion": "从站点系统获取",
"serialNumber": "从站点系统获取"
}
}
StatusNotification(状态变化时)
{
"timestamp": "从站点系统获取",
"connectorStatus": "Available|Preparing|Charging|SuspendedEVSE|SuspendedEV|Finishing|Reserved|Unavailable|Faulted",
"evseId": "从站点系统获取",
"connectorId": "从站点系统获取"
}
TransactionEvent(交易事件)
{
"eventType": "Started|Updated|Ended",
"timestamp": "从站点系统获取",
"triggerReason": "ChargingStateChanged|ChargingRateChanged|EnergyLimitReached|TimeLimitReached|RemoteStop|RemoteStart|TechnicianStart|TechnicianStop|StationChargingStart|StationChargingComplete",
"seqNo": "递增编号",
"transactionInfo": {
"transactionId": "从站点系统获取",
"chargingState": "Charging|EVConnected|SuspendedEV|SuspendedEVSE|Idle",
"chargingType": "customer_charging|station_charging"
},
"evse": {
"id": "从站点系统获取",
"connectorId": "从站点系统获取"
},
"customData": {
"technicianId": "从站点系统获取",
"customerInfo": "如果是客户充电则从站点系统获取",
"chargingLocation": "从站点系统获取"
},
"meterValue": [
{
"timestamp": "从站点系统获取",
"sampledValue": [
{
"value": "从站点系统获取",
"measurand": "Energy.Active.Import.Register|Power.Active.Import|Voltage|Current.Import|Temperature",
"unit": "kWh|kW|V|A|Celsius"
}
]
}
]
}
MeterValues(充电期间每10秒的遥测数据)
{
"evseId": "从站点系统获取",
"meterValue": [
{
"timestamp": "从站点系统获取",
"sampledValue": [
{
"value": "从站点系统获取",
"measurand": "Energy.Active.Import.Register|Power.Active.Import|Voltage|Current.Import|Temperature",
"unit": "kWh|kW|V|A|Celsius"
}
]
}
]
}
NotifyEvent(错误和事件)
{
"generatedAt": "当前时间",
"eventData": [
{
"eventId": "唯一ID",
"timestamp": "从站点系统获取",
"trigger": "Alerting|Delta|Periodic",
"eventType": "从站点系统获取",
"component": {
"name": "从站点系统获取"
},
"variable": {
"name": "从站点系统获取"
},
"eventNotificationType": "HardWiredNotification|HardWiredMonitor|PreconfiguredMonitor|CustomMonitor"
}
]
}
5.2 传入消息(CSMS → 站点)
RemoteStartTransaction
从CSMS接收:
{
"evseId": 1,
"chargingType": "customer_charging|station_charging",
"chargingProfile": {
"id": 1,
"stackLevel": 0,
"chargingProfilePurpose": "TxProfile",
"chargingProfileKind": "Absolute",
"chargingSchedule": [
{
"id": 1,
"startSchedule": "2025-07-12T10:30:00Z",
"duration": 3600,
"chargingRateUnit": "W",
"chargingSchedulePeriod": [
{
"startPeriod": 0,
"limit": 7200
}
]
}
]
},
"customData": {
"customerInfo": {
"customerId": "CUST_001",
"vehicleType": "Tesla Model 3"
},
"technicianId": "TECH_005",
"estimatedDuration": 3600
}
}
发送给站点系统:
{
"type": "start_customer_charging",
"evseId": 1,
"maxPower": 7200,
"duration": 3600,
"customerInfo": {
"customerId": "CUST_001",
"vehicleType": "Tesla Model 3"
},
"technicianId": "TECH_005"
}
回复给CSMS:
{
"status": "Accepted|Rejected",
"statusInfo": {
"reasonCode": "NoError|Busy|Occupied|Faulted"
}
}
RemoteStopTransaction
从CSMS接收:
{
"transactionId": "TXN_123456"
}
发送给站点系统:
{
"type": "stop_charging",
"transactionId": "TXN_123456",
"reason": "remote_stop"
}
GetReport
从CSMS接收:
{
"requestId": 1,
"componentVariable": [
{
"component": {"name": "BatteryManagement"},
"variable": {"name": "StateOfCharge"}
}
]
}
发送给站点系统:
{
"type": "request_data",
"requestId": 1,
"dataType": "battery_status"
}
从站点系统接收:
{
"requestId": 1,
"batteryLevel": 85,
"batteryVoltage": 48.2,
"batteryTemperature": 25.5
}
发送给CSMS(NotifyReport):
{
"requestId": 1,
"generatedAt": "当前时间",
"reportData": [
{
"component": {"name": "BatteryManagement"},
"variable": {"name": "StateOfCharge"},
"variableAttribute": {
"value": "85",
"unit": "Percent"
}
}
]
}
6. 错误处理和重连
6.1 重连策略
flowchart TD
DISCONNECT[连接丢失] --> LOG[记录断开事件]
LOG --> QUEUE[队列传出消息]
QUEUE --> WAIT[等待期]
WAIT --> RETRY[尝试重连]
RETRY --> SUCCESS{已连接?}
SUCCESS -->|是| BOOT[发送BootNotification]
SUCCESS -->|否| BACKOFF[增加等待期]
BACKOFF --> MAXWAIT{达到最大等待?}
MAXWAIT -->|否| WAIT
MAXWAIT -->|是| RESET[重置等待期]
RESET --> WAIT
BOOT --> SYNC[发送队列消息]
SYNC --> OPERATIONAL[操作模式]
6.2 超时处理
sequenceDiagram
participant OCPP as OCPP模块
participant CSMS as CSMS服务器
participant Station as 站点系统
OCPP->>CSMS: 请求消息
Note over OCPP: 启动30秒超时计时器
alt 收到响应
CSMS->>OCPP: 响应消息
Note over OCPP: 清除超时,处理响应
else 发生超时
Note over OCPP: 30秒已过,无响应
OCPP->>Station: 通知超时错误
OCPP->>OCPP: 队列消息重试
end
7. 模块配置
7.1 连接参数
{
"connection": {
"serverUrl": "wss://csms.example.com/ocpp",
"stationId": "STATION_001",
"apiKey": "your-api-key-here",
"reconnectInterval": 30,
"maxReconnectInterval": 300,
"messageTimeout": 30,
"heartbeatInterval": 300
},
"station": {
"model": "EV-CHARGER-V1",
"vendorName": "YourCompany",
"serialNumber": "SN123456789",
"firmwareVersion": "1.0.0"
},
"intervals": {
"meterValueSampleInterval": 10,
"clockAlignedDataInterval": 900,
"connectionTimeOut": 60
}
}
7.2 管理方法
// 模块API伪代码
class OCPPModule {
// 初始化
initialize(config) { }
// 连接管理
connect() { }
disconnect() { }
isConnected() { }
// 从站点发送事件
sendStationEvent(event) { }
// 接收站点命令(回调)
onStationCommand(callback) { }
// 模块状态
getStatus() { }
getLastError() { }
// 日志记录
enableLogging(level) { }
}
8. 与站点系统的通信协议
8.1 模块初始化
sequenceDiagram
participant Station as 站点系统
participant OCPP as OCPP模块
Station->>OCPP: Initialize(config)
OCPP->>OCPP: 加载配置
OCPP->>Station: 初始化完成
Station->>OCPP: SetEventHandler(callback)
OCPP->>Station: 处理程序已注册
Station->>OCPP: Connect()
OCPP->>OCPP: 建立WebSocket连接
OCPP->>Station: onStationCommand("connection_established")
8.2 运行时事件处理
sequenceDiagram
participant Station as 站点系统
participant OCPP as OCPP模块
participant CSMS as CSMS服务器
Note over Station,CSMS: 正常事件流
Station->>OCPP: sendStationEvent(cable_connected)
OCPP->>CSMS: StatusNotification
CSMS->>OCPP: StatusNotification响应
Note over Station,CSMS: 来自CSMS的命令
CSMS->>OCPP: RemoteStartTransaction
OCPP->>Station: onStationCommand(start_charging)
Station->>OCPP: 命令响应(已接受)
OCPP->>CSMS: RemoteStartTransaction响应
本规范定义了与充电站系统集成的OCPP通信模块要求。
No comments to display
No comments to display