OCPP
OCPP 드라이버 참고 자료입니다. 내장 중앙 시스템, 충전기 인증서, 충전 커넥터 태그, 그리고 Meter와 Status 이름 규칙.
OCPP 드라이버는 Ganter Lab을 Open Charge Point Protocol을 말하는 전기차 충전기의 중앙 시스템으로 만듭니다. LoRaWAN에서와 마찬가지로 방향이 뒤집힙니다. 스테이션이 충전기에 접속하는 것이 아니라, 충전기가 Ganter Lab으로 WebSocket을 걸어 스스로 등록하고 자기 원격 측정값을 밀어 넣습니다.
내장 중앙 시스템은 켜진 첫 OCPP 장치가 실행 중인 커넥터에 올라올 때 시작하고, 마지막 장치가 없어지거나 꺼질 때 멈춥니다. 충전기가 하나도 설정되어 있지 않으면 그 포트에서는 아무것도 듣지 않습니다. 하나를 추가하면 애플리케이션을 다시 시작하지 않고도 되살아납니다. 설정하는 장치 하나하나가 충전기 한 대를 나타내며, 그 충전기가 접속할 때 쓰는 id로 구별됩니다.
중앙 시스템과 포트
| 무엇 | 값 |
|---|---|
| 프로토콜 버전 | OCPP 1.6, 2.0, 2.0.1, 2.1(WebSocket 하위 프로토콜 협상, JSON) |
| 수신기 | 모든 인터페이스, TCP 포트 19521, TLS 전용 |
| 충전기 주소 | wss://<station-address>:19521/<charge-point-id> |
| 신원 | WebSocket 경로의 마지막 조각이 충전기 id입니다 |
수신기는 언제나 TLS입니다. 평문 HTTP 수신기는 루프백을 뺀 어디에서도 거부되며, 루프백은 인프로세스 테스트를 위해서만 있습니다. 충전기는 자기 BootNotification으로 스스로 등록하고(하트비트 간격 60초로 답합니다), 인증을 위해 제시되는 모든 카드는 받아들여집니다. Ganter Lab은 충전을 관찰할 뿐 요금제나 접근을 관리하지 않습니다.
인증서
TLS 핸드셰이크의 서버 쪽은 애플리케이션 자신의 OPC UA 인증서를 제시합니다. 모든 충전기는 클라이언트 인증서를 제시해야 합니다.
- 그 인증서는 이 Windows 기기에서 유효한 체인을 이루어야 하며 TLS 정책 오류가 없어야 합니다. 검사에 실패하면 연결이 거부되고, 어느 검사가 실패했는지 진단 로그가 기록합니다.
- 그 주체 일반 이름이나 DNS 주체 대체 이름이 그 충전기가 접속할 때 쓰는 충전기 id를 밝혀야 합니다. 연결 경로에 있는 것과 다른 충전기를 밝히는 인증서는 거부됩니다.
클라이언트 인증서 없는 핸드셰이크는 데이터가 흐르기 전에 끊깁니다.
연결 칸
| 칸 | 무엇인가 | 형식 | 기본값 |
|---|---|---|---|
| 식별자 | 이 장치가 대신하는 충전기 id입니다. 충전기가 자기 연결 URL 끝에 붙이고 자기 인증서에 담고 있는 바로 그 id입니다. | 자유 입력이며 대소문자를 구별하지 않고 맞춥니다. 비우면 다듬은 장치 이름으로 되돌아갑니다. | 비어 있음 |
호스트 칸도 포트 칸도 자격 증명 칸도 없습니다. 연결의 세부 사항은 충전기가 가지고 있고, 이 스테이션은 그 장치가 어느 충전기를 뜻하는지만 알면 됩니다. 읽기 주기 칸도 없습니다. OCPP는 밀어 넣는 방식이어서 충전기가 자기 일정에 따라 MeterValues와 StatusNotification 메시지를 보내고, 태그는 마지막으로 받은 데이터를 1초 고정 주기로 다시 읽습니다.
그러므로 아직 접속하지 않은 충전기나 아직 보고하지 않은 커넥터에는 실패한 읽기가 아니라 읽기가 없습니다. 그 태그는 비어 있는 채로 있고, 장치는 오프라인이 되는 대신 아직 아무것도 관찰되지 않았다고 알리며, 실패는 기록되지 않습니다. 이것은 방금 설정했고 아직 도착하지 않은 충전기의 정상적인 상태입니다.
태그
OCPP 태그는 충전기의 충전 커넥터 하나를 읽습니다(OCPP에서 말하는 커넥터, 곧 1부터 번호가 매겨지는 플러그 자리 하나입니다). 태그는 두 갈래이며, 태그 이름의 끝으로 가려지고 그것은 검사를 받습니다.
| 태그 이름의 끝 | 읽는 것 | 알맞은 형식 |
|---|---|---|
Meter |
그 커넥터가 알려 온 가장 최근의 계량 표본 값입니다(OCPP MeterValues). 단위는 충전기가 보내는 그대로이며 보통 Wh입니다. 서버는 마지막 표본 10개를 간직하고 태그는 가장 새 것을 읽습니다. 한 번도 보고하지 않은 커넥터는 0이 아니라 비어 있는 값으로 읽힙니다. | Float 또는 Double |
Status |
마지막 StatusNotification이 알려 온 커넥터 상태 문구입니다(예를 들어 Available, Charging, Faulted). |
String |
둘 가운데 어느 끝도 아닌 이름은 검사에서 거부됩니다. 태그 이름은 Connector1Meter와 Connector1Status처럼 지으십시오.
| 칸 | 하는 일 | 값 | 기본값 |
|---|---|---|---|
| 충전 커넥터 | 이 태그가 읽는, 충전기의 커넥터 번호. | 1 이상 | 1 |
| 데이터 형식 | 값이 공개될 OPC UA 형식. | Int32, Float, Double, String | Float |
OCPP 태그는 읽기 전용입니다. 접근 칸은 쓸 수 있는 선택을 내놓지 않고, 쓰기는 성공한 척하는 대신 거부됩니다. 충전기에 명령하는 일은 태그에 값을 쓰는 일이 아니라 그 자체로 하나의 명령이며, 바로 다음에서 설명합니다.
명령
충전기는 읽을 뿐 아니라 명령도 받습니다. OCPP 장치는 저마다 아래 명령을 이 스테이션 자신의 OPC UA 주소 공간에서 장치의 메서드로 담고 있으므로, 메서드를 부를 수 있는 것이라면 무엇이든 명령을 낼 수 있습니다. OPC UA 클라이언트이거나, 그것을 부르는 Logic 액션입니다.
모든 명령은 첫 인수로 충전기 id를 받고, 충전기 자신의 답을 결과로 돌려줍니다.
| 명령 | 그 밖의 인수 | 하는 일 |
|---|---|---|
| ChangeAvailability | ConnectorId, Type(Operative 또는 Inoperative) |
커넥터 하나를 운전에 넣거나 뺍니다. |
| ChangeConfiguration | Key, Value | 충전기의 구성 키 하나를 정합니다(OCPP 1.6). |
| ClearCache | 없음 | 충전기의 인증 캐시를 비웁니다. |
| GetConfiguration | Key | 구성 키 하나를 읽습니다(OCPP 1.6). |
| RemoteStartTransaction | IdTag | 어떤 토큰의 충전 세션을 시작합니다. |
| RemoteStopTransaction | TransactionId | 돌고 있는 세션을 멈춥니다. |
| GetTransactionStatus | TransactionId | 트랜잭션이 아직 돌고 있는지 묻습니다(OCPP 2.x). |
| Reset | 없음 | 충전기를 다시 시작합니다. |
| UnlockConnector | ConnectorId | 커넥터에서 케이블을 놓아 줍니다. |
| SetChargingProfile | ConnectorId, Limit, NumberOfPhases | 충전 전력 한계를 정합니다. |
| SetVariables | ComponentName, VariableName, AttributeType, AttributeValue | 구성 요소 하나의 변수 하나를 정합니다(OCPP 2.x). |
| GetVariables | ComponentName, VariableName, AttributeType | 구성 요소 하나의 변수 하나를 읽습니다(OCPP 2.x). |
AttributeType은 Actual, Target, MinSet, MaxSet 가운데 하나입니다.
답을 기다리는 일. 명령은 스테이션이 보냈다고 끝나지 않습니다. 스테이션은 자기가 보낸 바로 그 명령에 충전기가 답할 때까지 호출을 열어 두고, 함께 다니는 상관 식별자로 그것을 맞춰 본 다음에야 성공을 알리고 답을 돌려줍니다. 그렇지 않게 끝나는 경우가 셋이며, 저마다 이유와 함께 실패로 알려집니다.
- 충전기가 접속해 있지 않거나 그 연결이 열려 있지 않습니다. 아무것도 보내지 않습니다.
- 충전기가 OCPP 오류로 답합니다. 예를 들어 구현하지 않은 명령입니다. 그 오류 코드가 이유가 됩니다.
- 아무 답도 없이 30초가 지납니다. 아무도 답하지 않은 명령은 결코 성공이 아니라 실패입니다.
장치가 담고 있지 않은 충전기나 접속해 있지 않은 충전기에 낸 명령은 대기열에 놓이는 대신 곧바로 거부됩니다.
장치 검색
OCPP 드라이버의 장치 검색은 지금 중앙 시스템에 접속해 있는 충전기를 나열하며, 후보의 채널을 읽으면 그 충전기가 지금까지 알려 온 커넥터마다 Meter 태그 하나와 Status 태그 하나를 제안합니다.
첫 충전기는 언제나 손으로 설정합니다. 중앙 시스템이 듣기 전에는 아무것도 접속할 수 없고, 중앙 시스템은 여기에 OCPP 장치가 생겨야 비로소 듣기 시작하므로, 충전기가 하나도 설정되지 않은 설치본에서 스캔하면 아무것도 찾지 못하고 그렇게 말합니다. 충전기가 접속할 때 쓸 id로 그 첫 장치를 추가하십시오. 그다음부터는 접속한 적이 있는 충전기를 검색으로 찾을 수 있습니다. 일반적인 장치 검색 흐름은 Connector 페이지에서 설명합니다.
id는 인증서에서도, 연결 경로에서도, 장치와 맞춰 볼 때도 대소문자를 구별하지 않고 맞춥니다. CP-A를 밝히는 인증서로 cp-a로 접속하는 충전기는 식별자가 CP-A인 장치와 같은 충전기입니다.