0. 문서 개요
- 표준 OCPP 2.0.1 메시지(payload 필드·enum·제약)는 OCA OCPP 2.0.1 규격(Part 2 / Part 4)을 그대로 따르므로 본 문서에서는 지원 여부만 목록화합니다(2장).
- 2.0.1에는 자사 벤더 확장(DataTransfer)이 없습니다. 그 대신 표준 메시지에 대해 CSMS가 어떻게 판정·응답하는지(처리 규칙)를 상세히 기술합니다(4장). 충전기 구현은 이 처리 규칙을 전제로 해야 합니다.
대상 독자: 충전기 펌웨어/연동 개발자 | 전제 지식: OCPP 2.0.1 규격(Part 2 메시지, Part 4 JSON/WebSocket, Security), WebSocket, JSON, TLS
0.1 OCPP 1.6 대비 용어·구조 변화
| OCPP 1.6 | OCPP 2.0.1 | 비고 |
|---|---|---|
Charge Point / chargePointIdentity | Charging Station / chargingStationId | URL 마지막 세그먼트 규칙은 동일 |
connector (connectorId) | EVSE(evseId) + connector(connectorId) | CSMS는 EVSE 단위로 상태·거래를 관리하며 어드민에는 "EVSE"로 표기 |
StartTransaction / StopTransaction / MeterValues(거래 중) | TransactionEvent(Started / Updated / Ended) | 거래 ID는 충전기가 만드는 UUID 문자열 |
RemoteStartTransaction / RemoteStopTransaction | RequestStartTransaction / RequestStopTransaction | 원격 시작에 remoteStartId·chargingProfile 동반 |
ChangeConfiguration / GetConfiguration(설정 키) | Device Model — SetVariables / GetVariables / GetBaseReport / GetReport → NotifyReport | 1.6 커스텀 설정 키(CsmsUrl 등)는 2.0.1에 없음 — SetNetworkProfile 등 표준 사용 |
idTag(문자열) | idToken { idToken, type } | type에 따라 CSMS 판정 규칙이 다름(4.2) |
| DataTransfer 벤더 확장(Bionever / AMANO / K-VAS / PnC 래핑) | 없음 — 모든 DataTransfer는 UnknownVendorId | ISO 15118(PnC)은 2.0.1 네이티브 Action 사용(4.8) |
| Security Whitepaper 확장 메시지 | 표준 본문에 포함(SignCertificate, SecurityEventNotification, SetNetworkProfile …) |
1. 연결 개요
충전기는 OCPP 2.0.1 JSON(OCPP-J) 프로토콜로 CSMS에 WebSocket 연결합니다. 연결 시 반드시 아래 규격을 따라야 합니다.
| 항목 | 값 / 설명 |
|---|---|
| 프로토콜 | OCPP 2.0.1 (JSON over WebSocket, "OCPP-J") |
| WebSocket subprotocol | ocpp2.0.1 — 핸드셰이크 시 Sec-WebSocket-Protocol: ocpp2.0.1 필수. 제시하지 않으면 CSMS가 업그레이드를 HTTP 400으로 거부합니다 |
| 엔드포인트 | wss://<csms-host>/ocpp2/<chargingStationId> — 경로 접두사 /ocpp2/에 주의(1.6은 /ocpp/) |
| chargingStationId | URL 경로 마지막 세그먼트. CSMS에 사전 등록된 식별자여야 합니다(미등록 → 소켓 종료 코드 1008 Charger not registered in API). 대소문자는 구분하지 않으며 CSMS는 대문자로 정규화합니다 |
| 전송 보안 | Security Profile 1 / 2 / 3 지원 — 1.3 참조. 운영 환경은 SP2 이상(TLS) 권장 |
| Heartbeat 주기 | BootNotification 응답의 interval(기본 300초, 운영자가 충전기별로 변경 가능) |
| 메시지 크기 | 텍스트 프레임 최대 1 MB |
| 유휴 타임아웃 | WebSocket 유휴 1시간 — interval 주기의 Heartbeat로 충분히 갱신됩니다 |
1.1 환경별 엔드포인트
| 환경 | Security Profile | URL | 비고 |
|---|---|---|---|
운영 cp2.oasis-arca.com | SP2 / SP3 (TLS) | wss://cp2.oasis-arca.com:443/ocpp2/{id} (또는 :8091) | NLB TCP 패스스루 — TLS는 CSMS 컨테이너가 직접 종단하므로 SP3 클라이언트 인증서 검증 가능 |
| 운영 | SP1 (평문) | ws://cp2.oasis-arca.com:8081/ocpp2/{id} | Basic Auth 필수(1.3) |
개발 cp2.dev.oasis-arca.com | SP1 (평문) | ws://cp2.dev.oasis-arca.com:8091/ocpp2/{id} | 연동 시험용 |
| 개발 | TLS | wss://cp2.dev.oasis-arca.com/ocpp2/{id} | 아래 주의 참조 |
wss://로 접속해도 CSMS는 SP1로 판정하며, 클라이언트 인증서(SP3)도 전달되지 않습니다. 개발 환경에서 시험할 충전기는 SP1로 등록해야 합니다 — SP2/SP3로 등록된 충전기가 개발 환경에 접속하면 "다운그레이드 거부"(1.3)로 HTTP 403이 납니다. 운영 환경은 컨테이너가 TLS를 종단하므로 이 제약이 없습니다.1.2 연결 수립 순서
- 충전기가
wss://<host>/ocpp2/<id>로 WebSocket 핸드셰이크 — subprotocolocpp2.0.1+ 보안 프로파일에 따른 인증 재료(Basic Auth 헤더 또는 클라이언트 인증서). - CSMS가 핸드셰이크 단계에서 식별자 등록 여부·보안 프로파일·자격증명을 검증합니다 (실패 시 HTTP 400/401/403으로 업그레이드 거부).
- 연결 직후 충전기가 BootNotification 전송 → CSMS가
Accepted/Pending/Rejected+interval응답(4.1). Accepted이후 충전기는interval주기로 Heartbeat, EVSE·커넥터 상태는 StatusNotification(evseId,connectorId)로 통지합니다.
Pending / Rejected 판정을 받은 접속에서 BootNotification 외의 CALL을 보내면 CSMS는 CALLERROR SecurityError로 거부합니다. 충전기는 interval 경과 후(또는 TriggerMessage(BootNotification) 수신 시) 다시 BootNotification을 보내야 합니다. Pending 중에도 CSMS가 보내는 GetVariables / SetVariables / GetBaseReport 등 CSMS 발신 명령에는 응답해야 합니다.chargingStationId에 대해 동시 접속은 1개만 허용됩니다. 기본 동작은 새 연결이 기존 세션을 대체하는 것이며, 운영 설정에 따라 신규 접속을 거부(종료 코드 1008 Charger already connected)할 수 있습니다. 이 정책은 OCPP 1.6 서버와 공유되므로 같은 식별자로 1.6 서버와 2.0.1 서버에 동시에 접속할 수 없습니다.1.3 보안 프로파일 (Security Profile)
CSMS는 접속의 전송 계층을 실측해 제시된 프로파일을 판정하고, 충전기 등록 정보(보안 프로파일 1/2/3, 기본 2 · Basic Auth 모드 기본/사용/미사용)와 대조합니다. 등록 값은 운영팀이 전달합니다.
| 프로파일 | 전송 | 인증 | CSMS 판정 근거 |
|---|---|---|---|
| SP1 | 평문 ws:// | HTTP Basic Auth | 평문 커넥터로 수신 |
| SP2 | TLS wss:// | HTTP Basic Auth + 서버 인증서 신뢰 | TLS 커넥터로 수신, 클라이언트 인증서 없음 |
| SP3 | TLS wss:// (상호 TLS) | 클라이언트 인증서 | CSMS-CA로 검증된 클라이언트 인증서 제시 |
핸드셰이크 판정 규칙
| 상황 | CSMS 응답 | 비고 |
|---|---|---|
Basic Auth 헤더 누락 / username ≠ chargingStationId / 비밀번호 불일치 | 401 + WWW-Authenticate: Basic realm="OCPP" | username은 대소문자 무관. 비밀번호는 운영팀 발급 |
| Basic Auth 미사용 모드로 등록된 충전기 | 헤더 없이 접속 허용 | 운영팀 협의 사항 |
| 등록 프로파일보다 낮은 프로파일로 접속(예: SP2 등록 → 평문 8081) | 403 (다운그레이드 거부) | 상향 접속(SP1 등록 → TLS)은 허용 |
| SP3 — 클라이언트 인증서 CN ≠ chargingStationId | 403 | CN은 대소문자 무관 |
| SP3 — 인증서가 CSMS-CA로 검증되지 않음 | 인증서 미캡처 → SP2로 판정 → SP3 등록 충전기는 401 | CSMS-CA 서명 인증서만 유효 |
| SP3로 등록되지 않은 충전기가 클라이언트 인증서 제시 | 403 | |
| 미등록 식별자 / 사용 중지 충전기 | 404 / 403 | 핸드셰이크 단계에서 거부 |
서버 인증서 · 비밀번호 · 프로파일 승격
- 서버 인증서: RSA + ECDSA(P-256) 듀얼 인증서, 발급자는 공인 CA가 아닌 사설 CSMS-CA입니다. 서버 인증서 검증을 켜는 충전기는 CSMS-CA 루트 인증서를 사전 설치해야 합니다(운영팀 제공). TLS 1.2 이상, cipher는 TLS 1.3 3종 + ECDHE(RSA/ECDSA) GCM +
TLS_RSA_WITH_AES_*(OCPP SP2/3 요구)를 지원합니다. - 비밀번호 변경: CSMS는
SetVariables(SecurityCtrlr.BasicAuthPassword)로 Basic Auth 비밀번호를 갱신합니다. 충전기가Accepted로 응답하면 CSMS도 새 비밀번호로 전환하고,Rejected면 기존 비밀번호를 유지합니다. - 프로파일 승격: CSMS는
SetNetworkProfile로 새 접속 프로파일을 내려보낼 수 있습니다(SP1→2, SP2→3). 충전기는 규격에 따라 재접속합니다.
1.4 메시지 프레임 (OCPP-J) 과 오류 응답
모든 메시지는 JSON 배열입니다.
CALL [2, "<messageId>", "<Action>", {<payload>}]
CALLRESULT [3, "<messageId>", {<payload>}]
CALLERROR [4, "<messageId>", "<errorCode>", "<description>", {<details>}]- CSMS는 관용 파싱을 합니다 — 규격이 허용하는
customData등 확장 필드가 포함되어도 거부하지 않습니다. - CSMS가 보내는
CALLERROR의errorCode는 OCPP 2.0.1 Part 4 정의를 따릅니다:
| errorCode | CSMS가 보내는 경우 |
|---|---|
NotImplemented | 지원하지 않는 Action(2.1 목록 외) |
FormatViolation | JSON 파싱 실패 |
OccurrenceConstraintViolation | 필수 필드 누락 |
TypeConstraintViolation | 필드 타입·형식 불일치 |
PropertyConstraintViolation | 값 제약 위반 |
SecurityError | 부팅 게이트(Pending/Rejected 상태에서 Boot 외 CALL) |
InternalError | CSMS 내부 처리 실패 |
예시 — Heartbeat
→ [2, "msg-001", "Heartbeat", {}]
← [3, "msg-001", {"currentTime": "2026-09-18T09:00:00Z"}]2. 표준 OCPP 2.0.1 메시지 지원 목록
아래 메시지의 payload 필드·enum·제약 조건은 OCPP 2.0.1 규격서를 그대로 따릅니다. 충전기는 규격서 기준으로 구현하면 되며, CSMS 고유의 판정·응답 규칙은 4장을 참조합니다.
2.1 Charging Station → CSMS (충전기가 전송)
| Action | 지원 | CSMS 처리 / 비고 |
|---|---|---|
| BootNotification | 지원 | Accepted / Pending / Rejected + interval — 4.1 |
| Heartbeat | 지원 | currentTime 반환, 온라인 갱신 |
| StatusNotification | 지원 | EVSE·커넥터 상태 반영 — 4.4 |
| Authorize | 지원 | idToken.type별 판정, groupIdToken, 계약 인증서(eMAID) 인가 — 4.2 |
| TransactionEvent | 지원 | Started / Updated / Ended 통합 처리, totalCost·idTokenInfo 응답 — 4.3 |
| MeterValues | 지원 | 거래 외 검침(TriggerMessage(MeterValues) 등) — 응답만 하며 저장하지 않음(4.5) |
| DataTransfer | 지원 | 벤더 확장 없음 — 항상 UnknownVendorId(3장) |
| FirmwareStatusNotification | 지원 | 펌웨어 상태 기록 |
| LogStatusNotification | 지원 | 로그 업로드 상태 기록 |
| SecurityEventNotification | 지원 | 보안 이벤트 기록 |
| SignCertificate | 지원 | CSR 접수 → CSMS-CA 서명 → CertificateSigned 발신 — 4.8 |
| Get15118EVCertificate | 지원 | ISO 15118 계약 인증서 설치/갱신 중계 — 4.8 (PnC 사용 설정 필요) |
| GetCertificateStatus | 지원 | OCSP 상태 조회 — 4.8 (PnC 사용 설정 필요) |
| NotifyReport | 지원 | GetBaseReport / GetReport 결과 조각(requestId·seqNo·tbc) 수신 — 4.11 |
| NotifyEvent | 지원 | 수신·응답 |
| NotifyMonitoringReport | 지원 | 모니터링 목록 조각 수신 — 4.11 |
| NotifyCustomerInformation | 지원 | 고객정보 조각 수신 — 4.11 |
| NotifyDisplayMessages | 지원 | 표시 메시지 목록 수신 — 4.12 |
| ReportChargingProfiles | 지원 | GetChargingProfiles 결과 조각 수신 — 4.7 |
| NotifyChargingLimit | 지원 | 외부 충전 한계 통보 수신 — 4.7 |
| ClearedChargingLimit | 지원 | 한계 해제 통보 수신 — 4.7 |
| NotifyEVChargingNeeds | 지원 | EV 충전 요구 → TxProfile 계산·전송, Accepted/Rejected — 4.7 |
| NotifyEVChargingSchedule | 지원 | EV 스케줄 대조, 초과 시 Rejected + 재협상 — 4.7 |
| ReservationStatusUpdate | 지원 | 예약 만료/소멸 반영 — 4.9 |
| PublishFirmwareStatusNotification | 미제공 | NotImplemented 응답. Local Controller 전용(현장 로컬 컨트롤러가 다른 충전기에 펌웨어를 배포한 진행 상태 보고) — 일반 충전기는 사용하지 않음 |
2.2 CSMS → Charging Station (CSMS가 전송, 충전기가 처리)
| Action | 지원 | 비고 |
|---|---|---|
| RequestStartTransaction | 지원 | remoteStartId, idToken(type 기본 ISO14443, 운영자 선택 가능), evseId, chargingProfile(선택) — 4.6 |
| RequestStopTransaction | 지원 | transactionId(UUID) |
| Reset | 지원 | Immediate / OnIdle, evseId(선택 — EVSE 단위 리셋) |
| UnlockConnector | 지원 | evseId + connectorId |
| ChangeAvailability | 지원 | operationalStatus, evse(선택 — 생략 시 충전기 전체) |
| ClearCache | 지원 | |
| TriggerMessage | 지원 | requestedMessage, evse(선택) |
| DataTransfer | 지원 | 운영 진단용 발신 가능 — 충전기는 표준대로 응답(UnknownVendorId 허용) |
| SetVariables / GetVariables | 지원 | 다중 항목 지원 |
| GetBaseReport | 지원 | ConfigurationInventory / FullInventory / SummaryInventory |
| GetReport | 지원 | componentVariable / componentCriteria 조건 조회 |
| SetNetworkProfile | 지원 | 접속 프로파일 배포(보안 프로파일 승격 포함) |
| GetLog | 지원 | DiagnosticsLog / SecurityLog |
| UpdateFirmware | 지원 | 서명 펌웨어(signingCertificate·signature) 및 retrieveDateTime / installDateTime 예약 지원 |
| SetChargingProfile | 지원 | TxDefaultProfile / TxProfile / ChargingStationMaxProfile, evseId=0 포함 — 4.7 |
| ClearChargingProfile | 지원 | chargingProfileId 또는 조건(evseId·purpose·stackLevel) |
| GetChargingProfiles | 지원 | requestId + 조건 → ReportChargingProfiles |
| GetCompositeSchedule | 지원 | evseId, duration, chargingRateUnit |
| ReserveNow | 지원 | id, expiryDateTime, idToken, evseId(선택), connectorType(선택) — 4.9 |
| CancelReservation | 지원 | |
| SendLocalList | 지원 | versionNumber, updateType, localAuthorizationList[] — 4.10 |
| GetLocalListVersion | 지원 | |
| GetTransactionStatus | 지원 | transactionId(선택) |
| SetVariableMonitoring / ClearVariableMonitoring | 지원 | 4.11 |
| GetMonitoringReport | 지원 | → NotifyMonitoringReport |
| SetMonitoringBase / SetMonitoringLevel | 지원 | |
| CustomerInformation | 지원 | report / clear, customerIdentifier · idToken · customerCertificate → NotifyCustomerInformation |
| SetDisplayMessage / GetDisplayMessages / ClearDisplayMessage | 지원 | 4.12 |
| CertificateSigned | 지원 | SignCertificate 응답 뒤에 전송(순서 보장) — 4.8 |
| InstallCertificate | 지원 | CSMSRootCertificate / ManufacturerRootCertificate / V2GRootCertificate / MORootCertificate |
| GetInstalledCertificateIds | 지원 | certificateType[] 생략 시 전체 조회 |
| DeleteCertificate | 지원 | certificateHashData |
| PublishFirmware / UnpublishFirmware | 미제공 | Local Controller 전용 — 로컬 컨트롤러에 펌웨어를 내려받아 현장 네트워크에 게시/게시 해제하라는 명령. CSMS는 UpdateFirmware로 충전기에 직접 배포하므로 사용하지 않음 |
| CostUpdated | 미제공 | 진행 요금을 CSMS가 임의 시점에 밀어 넣는 명령. CSMS는 대신 TransactionEvent 응답의 totalCost로 매 이벤트마다 요금을 전달하므로(4.3) 별도 발신하지 않음 |
2.3 기능 블록별 요약
| 기능 블록 | 지원 기능 | 관련 절 |
|---|---|---|
| Security | Basic Auth, TLS(SP2/3), 인증서 갱신, 보안 이벤트, 비밀번호 변경, 프로파일 승격 | 1.3, 4.8 |
| Provisioning | Boot(Accepted/Pending/Rejected), Device Model 조회·변경, 리포트, 네트워크 프로파일 | 4.1, 4.11 |
| Authorization | idToken 유형별 인가, 그룹(마스터패스), 계약 인증서(eMAID) 인가, 캐시 만료 | 4.2 |
| Local Authorization List | SendLocalList / GetLocalListVersion | 4.10 |
| Transactions | TransactionEvent 전 경로, 원격 시작 연계, 오프라인 거래, seqNo | 4.3 |
| Remote Control | RequestStart/Stop, TriggerMessage, UnlockConnector | 4.6 |
| Availability | ChangeAvailability(충전기/EVSE/커넥터), StatusNotification | 4.4 |
| Reservation | ReserveNow / CancelReservation / ReservationStatusUpdate | 4.9 |
| Tariff & Cost | TransactionEvent.totalCost(진행·확정) | 4.3 |
| Meter Values | 거래 검침(TransactionEvent) / 트리거 검침(MeterValues) | 4.3, 4.5 |
| Smart Charging | 프로파일 3종, 합성 스케줄, 외부 한계, ISO 15118 협상 | 4.7 |
| Firmware Management | UpdateFirmware(서명·예약), FirmwareStatusNotification | 4.11 |
| ISO 15118 Certificate Mgmt | Get15118EVCertificate, GetCertificateStatus, 인증서 설치·조회·삭제 | 4.8 |
| Diagnostics | 변수 모니터링, 이벤트 통보, 고객정보, GetLog | 4.11 |
| Display Message | SetDisplayMessage / GetDisplayMessages / ClearDisplayMessage / NotifyDisplayMessages | 4.12 |
| Data Transfer | 양방향 DataTransfer 프레임 처리(벤더 확장 없음) | 3 |
3. 프로토콜 프로파일과 DataTransfer
OCPP_201_STANDARD 하나이며, 어드민에서 OCPP 버전을 2.0.1로 등록하면 자동 지정됩니다.| 프로파일 | 대상 | DataTransfer 벤더 확장 |
|---|---|---|
OCPP_201_STANDARD | 모든 OCPP 2.0.1 충전기 | 없음 — CS → CSMS DataTransfer는 vendorId·messageId와 무관하게 status = "UnknownVendorId"로 응답 |
- 1.6의 자사 확장(Bionever
SetPaymentInfo·GetUnitPrices·SetChargePreference, AMANO, K-VAS 배터리 데이터, ChangeConfiguration 커스텀 키)은 2.0.1에 제공되지 않습니다. 해당 기능이 필요한 사업은 운영팀과 별도 협의합니다. - 1.6의 DataTransfer 래핑 PnC(
org.openchargealliance.iso15118pnc)도 2.0.1에서는 사용하지 않습니다 — 네이티브 Action(Authorize의 인증서 필드,Get15118EVCertificate,GetCertificateStatus, 인증서 관리 4종)을 사용합니다(4.8). - CSMS → CS
DataTransfer는 운영 진단 목적으로 발신될 수 있습니다. 충전기는 표준대로UnknownVendorId/UnknownMessageId를 응답하면 됩니다.
4. CSMS 처리 규칙 (2.0.1 고유)
표준 메시지에 대해 CSMS가 어떻게 판정하고 무엇을 응답하는지 정리합니다. 충전기 펌웨어는 아래 규칙을 전제로 상태 전이·화면 처리를 구현해야 합니다.
4.1 BootNotification 판정과 부팅 게이트
| 조건 | status | interval |
|---|---|---|
| 미등록 식별자 / 비활성(사용 중지) 충전기 | Rejected | 300 |
운영자가 Pending 또는 Rejected를 지정한 충전기(2.0.1 전용 설정) | 지정값 | 운영자 지정값(기본 300) |
| 그 외 | Accepted | 운영자 지정값(기본 300) |
→ [2, "b-01", "BootNotification", {"chargingStation": {"model": "EVC-200", "vendorName": "ACME"}, "reason": "PowerUp"}]
← [3, "b-01", {"currentTime": "2026-09-18T09:00:00Z", "interval": 300, "status": "Pending"}]
→ [2, "h-01", "Heartbeat", {}]
← [4, "h-01", "SecurityError", "BootNotification status is Pending", {}]- CSMS는
chargingStation.model/vendorName/reason을 기록하고 온라인 상태를 갱신합니다. - 부팅 게이트:
Pending/Rejected응답 이후 같은 접속에서 BootNotification 외의 CALL이 오면 위 예시처럼SecurityError로 거부합니다. 게이트는 접속 단위이며 소켓이 끊기면 해제됩니다. Pending은 운영자가 부팅 전 설정(GetVariables/SetVariables/GetBaseReport 등)을 마치는 용도입니다. 충전기는Pending중에도 CSMS 발신 명령에 응답해야 하며,interval경과 후 또는TriggerMessage(BootNotification)수신 시 BootNotification을 재전송합니다.
4.2 Authorize — idToken 판정
Authorize.req의 idToken.type에 따라 CSMS 판정 경로가 다릅니다.
| idToken.type | CSMS 판정 | idTokenInfo.status |
|---|---|---|
Central | CSMS가 발급한 토큰(원격 시작·그룹 토큰). 카드로 등록된 값이면 카드 그룹을 groupIdToken으로 함께 반환 | 항상 Accepted |
Local, NoAuthorization | 충전기 쪽에서 인가가 끝난 토큰 — CSMS 목록을 조회하지 않음. NoAuthorization은 idToken이 빈 문자열이어도 정상 | Accepted |
ISO14443, ISO15693, KeyCode, MacAddress | 충전카드 목록 조회 | Accepted / Blocked / Expired / Invalid(미등록) |
eMAID (+ certificate 또는 iso15118CertificateHashData) | ISO 15118 계약 인증서 인가 — 인증서 유효성(OCSP / 유효기간)으로 판정. certificateStatus·cacheExpiryDateTime 동봉. 충전기의 PnC 사용 설정이 꺼져 있으면 Invalid | Accepted / Invalid 등 |
응답 예시 — 그룹 카드
{
"idTokenInfo": {
"status": "Accepted",
"groupIdToken": { "idToken": "GROUP-A", "type": "Central" }
}
}groupIdToken: 카드에 그룹(1.6의parentIdTag)이 설정되어 있으면 위처럼type = "Central"로 반환합니다. 마스터패스·그룹 인가(같은 그룹 카드로 종료)에 사용됩니다.- Authorize 판정에는 예약 여부를 포함하지 않습니다(예약 매칭은 충전기 로컬 규칙 +
TransactionEvent.reservationId).
4.3 TransactionEvent 처리
거래 ID(transactionInfo.transactionId)는 충전기가 생성한 UUID 문자열이며 CSMS는 이 값으로 거래를 식별합니다. evse.id / evse.connectorId로 EVSE·커넥터를 식별합니다.
4.3.1 Started — 거래 시작
idToken을 4.2 규칙으로 판정합니다. 비회원 선결제 토큰은 1회용이라 재사용 시Invalid입니다.- 판정이
Accepted가 아니면 거래를 생성하지 않습니다. 응답의idTokenInfo.status가Invalid면 충전기는 규격대로 충전을 중단해야 합니다. transactionInfo.remoteStartId가 있으면 원격 시작 거래로 기록합니다. 동봉된meterValue는 저장합니다.
4.3.2 Updated — 진행 중
meterValue를 저장하고, 응답에 진행 중 요금totalCost를 싣습니다(조회 시점 계산).idToken이 실려 오면 재인가로 보고 엄격 판정해idTokenInfo를 응답합니다.seqNo가 중복이면 무시(응답은 정상), 건너뛰면 유실 경고 후 반영합니다. 이미 종료된 거래의 Updated도 무시하고 정상 응답합니다.
4.3.3 Ended — 거래 종료
- 거래를 종료하고 요금을 확정합니다(
transactionInfo.stoppedReason기록). 응답totalCost는 확정 요금입니다. - 멱등입니다 — 중복 Ended도 정상 응답하며 확정 요금을 다시 싣습니다. 존재하지 않는 거래의 Ended에도
idToken판정은 응답합니다.
응답 예시 — Updated
← [3, "t-12", {
"totalCost": 4200.0,
"idTokenInfo": { "status": "Accepted" }
}]| 항목 | 규칙 |
|---|---|
| 검침(measurand) | 정산 기준은 Energy.Active.Import.Register(Wh). measurand를 생략한 sampledValue는 전력량으로 간주. Power.Active.Import·SoC 등은 기록·화면 표시용 |
seqNo | 거래별 단조 증가를 전제로 중복·유실을 판정하므로 규격대로 채운다 |
offline | true인 거래도 동일하게 처리 — 오프라인 중 Started~Ended를 재접속 후 순서대로 전송 |
4.4 StatusNotification — EVSE·커넥터 상태
| connectorStatus | CSMS 반영 |
|---|---|
Available | 대기 |
Occupied | 충전 중 (Preparing · Charging · SuspendedEV · Finishing 포함) |
Reserved | 예약 |
Unavailable | 사용 불가 |
Faulted | 고장 |
evseId가 CSMS 커넥터 행에 대응합니다(어드민 표기 "EVSE").evseId = 0은 충전기 전체 상태로 취급하며 커넥터 행을 만들지 않습니다.- 커넥터 가용 상태 복귀는 충전기의
StatusNotification(Available)로만 반영됩니다 — 거래 종료가 상태를 선반영하지 않습니다.
4.5 MeterValues (거래 외 검침)
TriggerMessage(MeterValues) 등으로 전송되는 거래 외 MeterValues는 정상 응답만 하고 저장하지 않습니다. 정산·이력에 쓰이는 검침은 TransactionEvent의 meterValue로 보냅니다.
4.6 원격 제어 (CSMS → CS)
| Action | CSMS가 보내는 값 | 충전기 요구사항 |
|---|---|---|
RequestStartTransaction | remoteStartId(CSMS 발번), idToken{idToken, type}(type 기본 ISO14443, 운영자 선택 가능), evseId, chargingProfile(TxProfile, 선택) | Accepted 후 TransactionEvent(Started)의 transactionInfo.remoteStartId에 같은 값을 넣어야 원격 시작 거래로 연결됨 |
RequestStopTransaction | transactionId(UUID) | |
Reset | type = Immediate / OnIdle, evseId(선택) | evseId가 있으면 해당 EVSE만 리셋 |
UnlockConnector | evseId, connectorId | |
ChangeAvailability | operationalStatus, evse{id, connectorId?}(선택) | 생략 시 충전기 전체 |
TriggerMessage | requestedMessage, evse(선택) | BootNotification·Heartbeat·StatusNotification·MeterValues·TransactionEvent·LogStatusNotification·FirmwareStatusNotification·SignChargingStationCertificate 사용 |
예시 — RequestStartTransaction
← [2, "r-01", "RequestStartTransaction", {
"remoteStartId": 1024,
"idToken": { "idToken": "APP-7F3A", "type": "Central" },
"evseId": 1
}]
→ [3, "r-01", { "status": "Accepted" }]
→ [2, "t-01", "TransactionEvent", { "eventType": "Started", "triggerReason": "RemoteStart",
"transactionInfo": { "transactionId": "5f1c…", "remoteStartId": 1024 }, ... }]CSMS는 응답 status를 명령 이력에 기록하며, 세션이 없으면 명령을 보내지 않고 실패로 기록합니다.
4.7 스마트 차징
| Action | 방향 | CSMS 동작 |
|---|---|---|
SetChargingProfile | CSMS → CS | TxDefaultProfile(EVSE 또는 evseId=0 전체) / TxProfile(진행 거래, transactionId 지정) / ChargingStationMaxProfile(evseId=0). Absolute·Recurring·Relative 스케줄, chargingRateUnit W/A 모두 사용 |
ClearChargingProfile | CSMS → CS | ID 또는 evseId·chargingProfilePurpose·stackLevel 조건 |
GetChargingProfiles → ReportChargingProfiles | CSMS → CS → CSMS | requestId + 조건으로 조회, 충전기는 requestId·tbc로 보고 |
GetCompositeSchedule | CSMS → CS | 결과는 어드민 차트에 표시 |
NotifyChargingLimit / ClearedChargingLimit | CS → CSMS | 외부 한계 통보·해제를 수신·기록 |
ISO 15118 협상 (K15~K17)
| CS → CSMS | CSMS 판정 | 응답 status |
|---|---|---|
NotifyEVChargingNeeds | 해당 EVSE에 진행 중 거래가 있으면 TxProfile을 계산해 SetChargingProfile로 전송(응답 프레임이 나간 뒤). 진행 거래가 없으면 거절 — 충전기는 TxDefaultProfile로 진행 | Accepted / Rejected |
NotifyEVChargingSchedule | EV 스케줄이 마지막 TxProfile 한계 안이면 수락. 넘으면 거절하고 같은 한계의 TxProfile을 다시 내려 재협상 시작 | Accepted / Rejected |
CSMS는 위 두 경우 외에는 프로파일을 자발적으로 재전송하지 않습니다.
4.8 인증서 관리 · ISO 15118
4.8.1 충전기 인증서 갱신 (SignCertificate → CertificateSigned)
→ [2, "c-01", "SignCertificate", { "csr": "-----BEGIN CERTIFICATE REQUEST-----…", "certificateType": "ChargingStationCertificate" }]
← [3, "c-01", { "status": "Accepted" }] // ① CSR 접수 응답이 먼저
← [2, "c-02", "CertificateSigned", { "certificateChain": "-----BEGIN CERTIFICATE-----…" }] // ② CSMS-CA 서명 후 전송
→ [3, "c-02", { "status": "Accepted" }]- CSMS는 SignCertificate 응답이 소켓에 먼저 나간 뒤 CertificateSigned를 전송하도록 순서를 보장합니다.
certificateType = V2GCertificate의 CSR은Rejected입니다 — V2G 충전기 인증서는 CSMS가 발급하지 않습니다.
4.8.2 인증서 설치·조회·삭제 (CSMS → CS)
| Action | 필드 | 비고 |
|---|---|---|
InstallCertificate | certificateType, certificate | CSMSRootCertificate / ManufacturerRootCertificate / V2GRootCertificate / MORootCertificate |
GetInstalledCertificateIds | certificateType[](선택) | 생략 시 전체 타입 조회 |
DeleteCertificate | certificateHashData | |
SecurityEventNotification (CS → CSMS) | type, timestamp, techInfo | 보안 이벤트 기록 |
4.8.3 ISO 15118 (PnC) — 계약 인증서
Get15118EVCertificate / GetCertificateStatus는 status = "Failed", 계약 인증서 인가는 Invalid로 응답합니다.| CS → CSMS | 요청 필드 | CSMS 동작 / 응답 |
|---|---|---|
Get15118EVCertificate | iso15118SchemaVersion, action(Install / Update), exiRequest | 계약 인증서 발급 체계에 중계 → status(Accepted / Failed), exiResponse |
GetCertificateStatus | ocspRequestData | OCSP 조회 → status(Accepted / Failed), ocspResult |
Authorize (eMAID) | certificate(중앙 검증) 또는 iso15118CertificateHashData(로컬 검증) | 계약 인증서 인가 — 4.2 |
4.9 예약
| Action | 방향 | 필드 / CSMS 동작 |
|---|---|---|
ReserveNow | CSMS → CS | id, expiryDateTime, idToken, evseId(선택), connectorType(선택), groupIdToken(선택). 응답 status를 예약 상태에 반영 |
CancelReservation | CSMS → CS | reservationId |
ReservationStatusUpdate | CS → CSMS | reservationId, reservationUpdateStatus(Expired / Removed) → 만료·소멸 반영 |
TransactionEvent(Started) | CS → CSMS | 예약 사용 시 reservationId를 채운다 |
4.10 로컬 인가 목록
| Action | 필드 | 비고 |
|---|---|---|
SendLocalList | versionNumber, updateType(Full / Differential), localAuthorizationList[] | 항목은 idToken{idToken, type} + idTokenInfo. 1.6 형식(listVersion, idTag)은 보내지 않음 |
GetLocalListVersion | (없음) | 충전기는 versionNumber를 응답 |
4.11 장치 모델 · 진단 · 펌웨어
| Action | 방향 | 주요 필드 | CSMS 동작 |
|---|---|---|---|
GetVariables / SetVariables | CSMS → CS | getVariableData[] / setVariableData[](다중 항목) | 결과를 어드민 설정 화면에 표시 |
GetBaseReport / GetReport | CSMS → CS | requestId, reportBase / componentVariable[]·componentCriteria[] | 충전기는 NotifyReport로 보고 |
NotifyReport | CS → CSMS | requestId, generatedAt, seqNo, tbc, reportData[] | 조각을 그대로 어드민 화면에 전달(requestId·seqNo·tbc로 조립) |
SetVariableMonitoring / ClearVariableMonitoring / GetMonitoringReport / SetMonitoringBase / SetMonitoringLevel | CSMS → CS | 규격 필드 | 결과·NotifyMonitoringReport·NotifyEvent를 수신. 모니터 ID의 정본은 충전기 |
CustomerInformation | CSMS → CS | requestId, report, clear, customerIdentifier | idToken | customerCertificate | 충전기는 NotifyCustomerInformation(requestId, seqNo, tbc, data)로 보고 |
GetLog | CSMS → CS | logType, requestId, log{remoteLocation, oldestTimestamp?, latestTimestamp?} | 충전기는 LogStatusNotification으로 진행 상태 보고 |
UpdateFirmware | CSMS → CS | requestId, firmware{location, retrieveDateTime, installDateTime?, signingCertificate?, signature?}, retries?, retryInterval? | 충전기는 FirmwareStatusNotification으로 진행 상태 보고 |
SetNetworkProfile | CSMS → CS | configurationSlot, connectionData{ocppVersion, ocppTransport, ocppCsmsUrl, messageTimeout, securityProfile, ocppInterface, …} | 접속 프로파일 배포(보안 프로파일 승격 포함) |
4.12 표시 메시지
| Action | 방향 | 주요 필드 |
|---|---|---|
SetDisplayMessage | CSMS → CS | message.id, priority, state?, startDateTime?, endDateTime?, transactionId?, message{format, language?, content}, display? |
GetDisplayMessages | CSMS → CS | requestId, id[]?, priority?, state? |
NotifyDisplayMessages | CS → CSMS | requestId, tbc, messageInfo[] |
ClearDisplayMessage | CSMS → CS | id |
표시 메시지의 정본은 충전기이며 CSMS는 요청·조회 결과 표시만 합니다.
5. 운영 · 시험
5.1 어드민 등록 항목 (운영팀 수행)
| 항목 | 설명 |
|---|---|
| OCPP 버전 | 2.0.1 선택 → 프로토콜 프로파일 OCPP_201_STANDARD 자동 지정 |
| 보안 프로파일 / Basic Auth | securityProfile(1/2/3, 기본 2), Basic Auth 모드(기본/사용/미사용), 비밀번호 |
| 부팅 응답 지정 | Accepted(기본) / Pending / Rejected, 재시도 간격(초) — 2.0.1 전용 |
| PnC 사용 | ISO 15118 계약 인증서 인가·Get15118EVCertificate·GetCertificateStatus 활성화 |
| EVSE | 어드민 상세의 커넥터 영역은 2.0.1 충전기에서 "EVSE"로 표기됩니다 |
5.2 충전기 QR 생성
5.3 시험 환경
- 연동 시험은 개발 환경(
cp2.dev.oasis-arca.com)에서 진행합니다. 개발 환경은 TLS 접속도 SP1로 판정되므로 시험 충전기는 SP1로 등록합니다(1.1). - 식별자·자격증명·PnC 설정은 운영팀이 발급합니다.
- 필요 시 CSMS 시뮬레이터의 "OCPP 2.0.1 Standard" 프로파일로 메시지 형태를 대조할 수 있습니다.
6. 부록
6.1 OCPP 1.6 ↔ 2.0.1 메시지 대응
| 1.6 | 2.0.1 |
|---|---|
| StartTransaction / StopTransaction / MeterValues(거래) | TransactionEvent(Started / Ended / Updated) |
| RemoteStartTransaction / RemoteStopTransaction | RequestStartTransaction / RequestStopTransaction |
| ChangeConfiguration / GetConfiguration | SetVariables / GetVariables (+ GetBaseReport / GetReport → NotifyReport) |
| GetDiagnostics / DiagnosticsStatusNotification | GetLog / LogStatusNotification |
| ExtendedTriggerMessage | TriggerMessage |
| SignedUpdateFirmware / SignedFirmwareStatusNotification | UpdateFirmware(signingCertificate·signature) / FirmwareStatusNotification |
| DataTransfer(PnC 래핑: Authorize·Get15118EVCertificate·GetCertificateStatus·CertificateSigned·InstallCertificate·…) | 네이티브 Action |
| (없음) | SetNetworkProfile, NotifyEvent, 변수 모니터링 5종, CustomerInformation, DisplayMessage 4종, NotifyEVChargingNeeds / NotifyEVChargingSchedule, ReservationStatusUpdate, GetTransactionStatus |
| DataTransfer 벤더 확장(Bionever / AMANO / K-VAS) | (없음) |
6.2 구현 체크리스트 (제조사)
- ☐subprotocol
ocpp2.0.1로/ocpp2/<chargingStationId>에 접속한다(미제시 시 400). - ☐할당된 보안 프로파일대로 접속한다 — Basic Auth
username= chargingStationId, SP3는 CN = chargingStationId, CSMS-CA 루트 사전 설치(1.3). 개발 환경은 SP1로 시험한다(1.1). - ☐
BootNotification의Pending/Rejected와 부팅 게이트를 처리한다 — 게이트 중 Boot 외 CALL은SecurityError(4.1). - ☐
Authorize/TransactionEvent응답의idTokenInfo.status와groupIdToken을 처리한다. Started에서Invalid면 충전을 중단한다(4.2, 4.3). - ☐
TransactionEvent에seqNo를 단조 증가로 채우고,Energy.Active.Import.Register(Wh)를 반드시 포함한다.totalCost를 화면에 표시할 수 있다(4.3). - ☐거래 외 검침은 저장되지 않음을 전제로 한다 — 정산용 검침은
TransactionEvent로(4.5). - ☐
RequestStartTransaction의remoteStartId를TransactionEvent(Started)에 반영한다(4.6). - ☐DataTransfer 벤더 확장은 구현하지 않는다 — CS → CSMS DataTransfer는
UnknownVendorId를 받는다(3장). - ☐(스마트 차징) 프로파일 3종·
GetCompositeSchedule·ReportChargingProfiles와 ISO 15118 협상 응답(Accepted/Rejected후 재협상)을 구현한다(4.7). - ☐(PnC 대상)
Authorize인증서 필드,Get15118EVCertificate,GetCertificateStatus, 인증서 관리 4종을 네이티브로 구현한다.SignCertificate는ChargingStationCertificate만 CSMS가 서명한다(4.8). - ☐
SendLocalList는 2.0.1 형식(versionNumber,idToken{idToken,type})으로 받는다(4.10).
6.3 문의
식별자 등록, 보안 프로파일·Basic Auth 발급, CSMS-CA 루트 인증서, PnC 사용 설정 등은 CSMS 운영팀에 문의하십시오.
문의: axd@bionever.com