# OCPP

> OCPP 드라이버 참고 자료입니다. 내장 중앙 시스템, 충전기 인증서, 충전 커넥터 태그, 그리고 Meter, Status, Transaction 이름 규칙.

OCPP 드라이버는 Ganter Lab을 Open Charge Point Protocol을 말하는 전기차 충전기의 **중앙 시스템**으로 만듭니다. LoRaWAN에서와 마찬가지로 방향이 뒤집힙니다. 스테이션이 충전기에 접속하는 것이 아니라, **충전기가 Ganter Lab으로** WebSocket을 걸어 스스로 등록하고 자기 원격 측정값을 밀어 넣습니다.

내장 중앙 시스템은 켜진 첫 OCPP 장치가 실행 중인 커넥터에 올라올 때 시작하고, 마지막 장치가 없어지거나 꺼질 때 멈춥니다. 충전기가 하나도 설정되어 있지 않으면 그 포트에서는 아무것도 듣지 않습니다. 하나를 추가하면 애플리케이션을 다시 시작하지 않고도 되살아납니다. 설정하는 장치 하나하나가 **충전기 한 대**를 나타내며, 그 충전기가 접속할 때 쓰는 id로 구별됩니다.

## 충전기 준비 {#prepare-the-charge-point}

이 스테이션에 접속해 오는 쪽은 충전기이며, 충전기는 출고 상태에서 스테이션이 어디에 있는지 모릅니다. OCPP 장치마다 그 페이지에 **충전기 준비** 카드가 있어, 충전기의 OCPP 설정에 입력할 값을 이 스테이션에 맞춰 보여 줍니다.

| 충전기에 설정할 것 | 카드가 보여 주는 것 |
|---|---|
| 중앙 시스템 주소 | `wss://<주소>:19521/<충전기-id>`를 먼저 이 스테이션의 이름으로 만든 주소(내장 OPC UA 서버 설정의 "네트워크 이름", 비어 있는 동안은 컴퓨터 이름)로 보여 주고, 이어서 이 스테이션이 네트워크에 가진 IPv4 주소마다 하나씩, 각각 복사 버튼과 함께 보여 줍니다. 서버 이름을 확인하는 충전기에는 이름으로 만든 주소가 필요합니다. 확인하지 않는 충전기는 어느 주소든 받아들이므로, 그 경우에는 충전기와 같은 네트워크의 주소면 됩니다. |
| 충전기 식별자 | 장치의 **식별자**이며, 비어 있는 동안은 스테이션이 장치에 붙이는 이름입니다. 많은 충전기는 자기 식별자를 주소 뒤에 스스로 붙입니다. 그런 충전기에는 주소를 포트까지만 입력하고, 식별자는 별도의 칸에 입력하십시오. |
| 보안 | 클라이언트 인증서를 쓰는 TLS로, OCPP에서는 보안 프로필 3이라고 합니다. 클라이언트 인증서가 없는 프로필 1과 2는 받지 않습니다. 충전기의 인증서는 일반 이름이나 DNS 대체 이름에 충전기 식별자를 담습니다([인증서](#certificates) 참고). |
| 중앙 시스템의 루트 인증서 | 충전기가 중앙 시스템을 신뢰하려고 설치하는, 이 스테이션의 루트 인증서 `GanterLabConnector-<station>.pem`의 전체 경로입니다. **폴더 열기** 버튼은 Windows 파일 탐색기에서 그 파일을 보여 줍니다. 버튼은 스테이션 자체 창에서 작동하며, 다른 기기의 브라우저에서는 회색으로 남아 이유를 알려 줍니다. |

카드는 스테이션을 연 뒤 충전기가 한 번도 접속하지 않은 동안 열려 있고, 접속하고 나면 접힙니다. 다음에 충전기를 설정할 때를 위해 페이지에는 남아 있습니다. Windows에 설치된 루트가 인증서를 보증하지 않는 충전기는 첫 접속에서 거부되고 [현장 장비 접근](#equipment-access)에서 기다립니다.

파일은 충전기가 등록되어 중앙 시스템이 처음 시작될 때 기록되며, 그 전에는 카드가 그렇게 알려 줍니다. 이 스테이션의 모든 충전기에 같은 파일이고, 스테이션의 이름이나 주소가 바뀌어도 바뀌지 않습니다([스테이션의 루트 인증서](#the-stations-root-certificate) 참고).

**이전 버전의 파일을 받은 충전기에는 이 파일을 한 번 설치해야 합니다.** 이 버전을 처음 시작할 때, 이전 파일을 가지고 있을 수 있는 충전기가 있는 스테이션은 그 실행 동안에만 카드에 "**이 스테이션의 파일이 바뀌었습니다**"라는 알림을 보여 줍니다. 알림은 상기용일 뿐 지시 자체가 아닙니다. 이미 충전기가 있던 스테이션이라면 카드에 알림이 보이든 보이지 않든 모든 충전기에 새 파일을 한 번 설치하십시오. 서버 이름을 확인하는 충전기는 그 뒤로 이 스테이션을 받아들입니다.

## 중앙 시스템과 포트 {#central-system-and-ports}

| 무엇 | 값 |
|---|---|
| 프로토콜 버전 | 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은 충전을 관찰할 뿐 요금제나 접근을 관리하지 않습니다.

## 인증서 {#certificates}

TLS 핸드셰이크의 서버 쪽은 이 스테이션 자신의 루트로 서명된 인증서를 제시합니다([스테이션의 루트 인증서](#the-stations-root-certificate) 참고). 모든 충전기는 **클라이언트 인증서**를 제시해야 합니다.

1. 그 인증서는 두 방법 중 하나로 신뢰받아야 합니다. 이 Windows 기기에서 거기에 설치된 루트까지 유효한 체인을 이루고 TLS 정책 오류가 없거나, 이 드라이버 페이지의 **현장 장비 접근**에서 바로 그 인증서를 승인했어야 합니다(아래 참고). 어느 쪽이든 유효 기간 안에 있어야 합니다. 검사에 실패하면 연결이 거부되고, 어느 검사가 실패했는지 진단 로그가 기록합니다.
2. 그 주체 일반 이름이나 DNS 주체 대체 이름이 그 충전기가 접속할 때 쓰는 **충전기 id를 밝혀야** 합니다. 연결 경로에 있는 것과 다른 충전기를 밝히는 인증서는 승인했더라도 거부됩니다.

클라이언트 인증서 없는 핸드셰이크는 데이터가 흐르기 전에 끊깁니다.

### 스테이션의 루트 인증서 {#the-stations-root-certificate}

| 항목 | 내용 |
|---|---|
| 루트 | 프로필마다 한 번, 중앙 시스템이나 LoRaWAN 네트워크 서버가 처음 시작될 때 만들어집니다. 주체는 `Ganter Lab Connector (<station>)`이며 `<station>`은 그날의 네트워크 이름입니다. 만료되지 않고 저절로 교체되지도 않습니다. 컴퓨터 이름, 네트워크 이름, 스테이션의 주소를 바꿔도 그대로입니다. |
| 파일 | `GanterLabConnector-<station>.pem`, 공개 부분만이며 데이터 폴더의 `ua\pki\station`에 있습니다. 충전기와 LoRaWAN 게이트웨이에 같은 파일이고, 게이트웨이는 이것을 `tc.trust`로 설치합니다. |
| 중앙 시스템이 제시하는 인증서 | 이 루트로 서명됩니다. 스테이션의 네트워크 이름(내장 OPC UA 서버 설정의 "네트워크 이름", 비어 있는 동안은 컴퓨터 이름), `localhost`, 스테이션의 모든 IPv4 주소를 이름으로 담고 있어, 서버 이름을 확인하는 충전기(보안 프로필 3)도 받아들입니다. 네트워크 이름이나 주소가 바뀌면 이 인증서만 저절로 다시 발급되며, 충전기에서 할 일은 없습니다. |
| OPC UA 서버의 인증서 | 여기서는 쓰지 않습니다. 내장 OPC UA 서버는 OPC UA 클라이언트를 위한 자기 인증서를 그대로 둡니다. |

저장된 루트를 더 이상 열 수 없게 되면(예: 다른 Windows 계정이 기록한 경우) 새 루트로 교체됩니다. 그때는 모든 충전기에 새 파일이 한 번 필요하며, 카드가 그렇게 알려 줍니다.

### 현장 장비 접근 {#equipment-access}

인증서가 자체 서명되었거나 제조사 자체 인증 기관이 발급해서 Windows에 설치된 어떤 루트도 보증하지 않는 충전기라도, 그 루트를 이 컴퓨터에 설치할 필요는 없습니다. 첫 연결은 거부되고, 그 인증서는 OCPP 드라이버 페이지 끝의 **현장 장비 접근**에서 결정을 기다립니다. OPC UA 드라이버 페이지에 있는 것과 같은 카드입니다.

| 그룹 | 보여 주는 것 | 할 수 있는 일 |
|---|---|---|
| 승인 대기 중 | 거부된 인증서 하나하나가, 접속할 때 쓴 충전기 id 아래에 나옵니다. SHA-256 지문, 마지막으로 시도한 때와 횟수, 세부 정보(주체, 발급자, 도메인 이름, 유효 기간)를 보여 줍니다. | **승인**은 충전기의 다음 연결부터 그 인증서를 받아들입니다. **차단**은 여기에 다시 올리지 않고 계속 거부합니다. **대기 중인 인증서 모두 버리기**는 아무것도 승인하거나 차단하지 않고 목록을 비웁니다. |
| 승인된 현장 장비 | 승인했거나 가져온 인증서를, 누가 언제 결정했는지와 함께 보여 줍니다. | **승인 철회**는 충전기의 연결을 닫고 그 인증서를 목록으로 돌려보냅니다. **인증서 가져오기**는 충전기의 공개 인증서를 첫 연결 전에 승인합니다. |
| 차단된 현장 장비 | 차단한 인증서를 보여 줍니다. 차단한 인증서는 Windows가 신뢰하더라도 거부됩니다. | **차단 해제**는 승인하지 않은 채 그 인증서를 목록으로 돌려보냅니다. |

승인하는 것은 인증서 하나하나이며, 그 인증서에 서명한 인증 기관이 아닙니다. 그래서 같은 제조사의 두 번째 충전기는 자기 승인을 따로 기다립니다. 승인하기 전에 충전기가 알려 주는 지문과 대조하십시오. 승인해도 그 인증서가 어느 충전기인지는 바뀌지 않습니다. 인증서가 밝히는 충전기 id로만, 그리고 유효 기간 안에서만 받아들입니다. Windows가 이미 신뢰하는 인증서는 전처럼 받아들여지고 여기에는 나타나지 않습니다. 자동으로 승인되는 것은 없습니다.

결정은 스테이션의 데이터 폴더 `ua\pki\ocpp`에 저장되며 다시 시작해도 남습니다. 명령은 Connector를 구성할 수 있는 역할에게만 그려지고, 스테이션 자신의 창에서만 작동합니다. 다른 기기의 브라우저는 카드를 읽기만 하고 바꾸지 못하며, 에이전트 도구는 인증서를 승인하지 않습니다. 목록은 승인을 기다리는 인증서를 100개까지 담습니다. 가득 차면 새 인증서는 계속 거부되지만 목록에 오르지 않으며, 카드가 그렇다고 알립니다.

## 연결 칸 {#connection-fields}

| 칸 | 무엇인가 | 형식 | 기본값 |
|---|---|---|---|
| 식별자 | 이 장치가 대신하는 **충전기 id**입니다. 충전기가 자기 연결 URL 끝에 붙이고 자기 인증서에 담고 있는 바로 그 id입니다. | 자유 입력이며 대소문자를 구별하지 않고 맞춥니다. 비우면 다듬은 장치 이름으로 되돌아갑니다. | 비어 있음 |

호스트 칸도 포트 칸도 자격 증명 칸도 없습니다. 연결의 세부 사항은 충전기가 가지고 있고, 이 스테이션은 그 장치가 어느 충전기를 뜻하는지만 알면 됩니다. 읽기 주기 칸도 없습니다. OCPP는 밀어 넣는 방식이어서 충전기가 자기 일정에 따라 MeterValues와 StatusNotification 메시지를 보내고, 태그는 마지막으로 받은 데이터를 1초 고정 주기로 다시 읽습니다.

그러므로 아직 접속하지 않은 충전기나 아직 보고하지 않은 커넥터에는 실패한 읽기가 아니라 **읽기가 없습니다**. 그 태그는 비어 있는 채로 있고, 실패는 기록되지 않습니다. 충전기가 아직 보내지 않은 태그는 프로토콜이 제대로 도는 모습입니다.

### 충전기의 상태 건전성 {#the-charge-points-health}

충전기는 값이 있을 때 보내므로, 태그가 조용하다는 것만으로는 아직 보고하지 않은 충전기와 사라진 충전기를 구별할 수 없습니다. 그 상태 건전성, 곧 트리의 그 행에 있는 점과 드라이버 페이지의 **상태 건전성** 열은 그 대신 이 스테이션의 중앙 시스템과의 연결을 따릅니다.

| 상황 | 상태 건전성 |
|---|---|
| 설정했지만 스테이션을 연 뒤로 한 번도 접속하지 않음 | **오프라인** |
| 접속했고, 아직 아무것도 보내지 않음 | **온라인** |
| 접속해서 보내는 중 | **온라인**, 또는 보낸 태그 가운데 일부를 읽지 못하면 **부분 응답** |
| 떨어짐: 멈췄거나, 전원이 빠졌거나, 네트워크에서 끊김 | **오프라인**, 다시 접속할 때까지 |
| 중앙 시스템이 듣고 있지 않음 | **오프라인** |
| 사용 안 함 | **사용 안 함** |

충전기가 접속해 있는 동안에는 아직 보고하지 않은 커넥터가 그 상태를 깎지 않습니다. 충전기에 대한 변경을 저장한 뒤, 또는 Connector가 시작한 뒤 최대 10초 동안은 **아직 알 수 없음**으로 읽힙니다. 장치를 다시 들이면 중앙 시스템이 다시 시작될 수 있고, 충전기가 다시 접속하는 데 잠시 걸리기 때문입니다.

## 태그 {#tags}

OCPP 태그는 충전기의 **충전 커넥터** 하나를 읽습니다(OCPP에서 말하는 커넥터, 곧 1부터 번호가 매겨지는 플러그 자리 하나입니다). OCPP 2.0, 2.0.1, 2.1에서는 이 번호가 **EVSE**의 번호입니다. 그곳에서는 커넥터 번호가 EVSE마다 1부터 다시 매겨지기 때문입니다. 태그는 세 갈래이며, **태그 이름의 끝**으로 가려지고 그것은 검사를 받습니다.

| 태그 이름의 끝 | 읽는 것 | 알맞은 형식 |
|---|---|---|
| `Meter` | 그 커넥터가 알려 온 가장 최근의 계량 샘플 값입니다(OCPP MeterValues. OCPP 2.x에서는 충전 중에 TransactionEvent가 실어 오는 값도 포함합니다). 단위는 충전기가 보내는 그대로이며 보통 Wh입니다. 서버는 마지막 샘플 10개를 간직하고 태그는 가장 새 것을 읽습니다. 한 번도 보고하지 않은 커넥터는 0이 아니라 비어 있는 값으로 읽힙니다. | Float 또는 Double |
| `Status` | 마지막 StatusNotification이 알려 온 커넥터 상태 문구입니다(예를 들어 `Available`, `Faulted`). OCPP 2.x에서 커넥터가 둘 이상인 EVSE는 그 가운데 가장 많은 것을 말해 주는 상태로 읽힙니다. `Faulted`는 `Occupied`보다, `Occupied`는 `Reserved`보다, `Reserved`는 `Available`보다, `Available`은 `Unavailable`보다 앞섭니다. 아직 상태를 보고하지 않은 EVSE는 비어 있는 값으로 읽힙니다. | String |
| `Transaction` | 그 커넥터에서 돌고 있는 트랜잭션의 번호이며, RemoteStopTransaction과 GetTransactionStatus 명령이 요구하는 값입니다. OCPP 1.6에서는 트랜잭션이 시작될 때 이 스테이션이 준 번호, OCPP 2.x에서는 충전소 자신의 식별자를 보내온 그대로 읽습니다. 트랜잭션이 시작되면 채워지고 끝나면 비워지므로, 돌고 있는 것이 없으면 빈 텍스트로 읽힙니다. 충전기가 접속한 뒤 트랜잭션이 처음 시작되거나 끝나기 전까지는, 이미 돌고 있는 것이 있을 수 있으므로 빈 값으로 읽힙니다. | String |

이 가운데 어느 끝도 아닌 이름은 검사에서 거부됩니다. 태그 이름은 `Connector1Meter`, `Connector1Status`, `Connector1Transaction`처럼 지으십시오.

| 칸 | 하는 일 | 값 | 기본값 |
|---|---|---|---|
| 충전 커넥터 | 이 태그가 읽는 번호. OCPP 1.6에서는 커넥터 번호, OCPP 2.x에서는 EVSE 번호입니다. | 1 이상 | 1 |
| 데이터 형식 | 값이 공개될 OPC UA 형식. | Int32, Float, Double, String | Float |

OCPP 태그는 **읽기 전용**입니다. 접근 칸은 쓸 수 있는 선택을 내놓지 않고, 쓰기는 성공한 척하는 대신 거부됩니다. 충전기에 명령하는 일은 태그에 값을 쓰는 일이 아니라 그 자체로 하나의 명령이며, 바로 다음에서 설명합니다.

## 명령 {#commands}

충전기는 읽을 뿐 아니라 명령도 받습니다. OCPP 장치는 저마다 아래 명령을 이 스테이션 자신의 OPC UA 주소 공간에서 **장치의 메서드**로 담고 있으므로, 이 스테이션에 연결된 OPC UA 클라이언트가 그 메서드를 불러 명령을 냅니다.

모든 명령은 첫 인수로 **충전기 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 | 충전 전력 한계를 와트 단위로 정합니다. ConnectorId가 0이면 충전기 전체를 제한하고, 다른 번호면 그 커넥터가 충전하는 세션의 기본 한계를 정합니다. |
| SetVariables | ComponentName, VariableName, AttributeType, AttributeValue | 구성 요소 하나의 변수 하나를 정합니다(OCPP 2.x). |
| GetVariables | ComponentName, VariableName, AttributeType | 구성 요소 하나의 변수 하나를 읽습니다(OCPP 2.x). |

`AttributeType`은 `Actual`, `Target`, `MinSet`, `MaxSet` 가운데 하나입니다.

**TransactionId를 얻는 곳.** RemoteStopTransaction과 GetTransactionStatus는 번호로 가리킨 트랜잭션 하나에 작용합니다. 그 번호는 세션이 충전 중인 커넥터(OCPP 2.x에서는 EVSE)의 `Transaction` 태그, 예를 들어 `Connector1Transaction`에서 읽고, 읽은 그대로 넘기십시오. 그곳이 빈 텍스트이면 그 커넥터에서는 돌고 있는 트랜잭션이 없습니다.

**어느 버전에서나 같은 명령 목록.** 충전기가 어느 버전을 쓰든 명령은 위의 이름을 그대로 쓰고, 스테이션은 각 명령을 그 버전이 정한 형식으로 보냅니다. OCPP 2.0, 2.0.1, 2.1에서는 커넥터가 EVSE 아래에 묶여 있으며, ConnectorId로 넘긴 번호는 EVSE를 가리킵니다.

| 명령 | OCPP 1.6에서 | OCPP 2.0, 2.0.1, 2.1에서 |
|---|---|---|
| ChangeAvailability | 지정한 커넥터에 작용합니다. 0은 충전기 전체입니다. | 지정한 EVSE에 작용합니다. 0은 충전소 전체입니다. |
| RemoteStartTransaction | IdTag를 보내고, 커넥터는 충전기가 고릅니다. | RequestStartTransaction으로 나가며, IdTag를 중앙 토큰으로 삼고 자체 시작 id를 붙입니다. EVSE는 충전소가 고릅니다. |
| RemoteStopTransaction | TransactionId는 세션이 시작될 때 이 스테이션이 그 세션에 준 번호입니다. | RequestStopTransaction으로 나갑니다. TransactionId는 충전소 자신의 식별자이며 텍스트 그대로 넘깁니다. |
| Reset | 하드 리셋입니다. | 즉시 리셋입니다. |
| UnlockConnector | 지정한 커넥터를 놓아 줍니다. | 지정한 EVSE의 첫 커넥터를 놓아 줍니다. |
| SetChargingProfile | 0은 충전기의 최대 프로파일을 정하고, 다른 커넥터는 기본 프로파일을 받습니다. | 0은 충전소의 최대 프로파일을 정하고, 다른 EVSE는 기본 프로파일을 받습니다. |
| ChangeConfiguration, GetConfiguration | 위 표와 같습니다. | 이 버전들에는 없습니다. 충전소가 오류로 답하고, 명령은 실패합니다. |
| GetTransactionStatus, SetVariables, GetVariables | 이 버전에는 없습니다. 충전기가 오류로 답하고, 명령은 실패합니다. | 위 표와 같습니다. |

**답을 기다리는 일.** 명령은 스테이션이 보냈다고 끝나지 않습니다. 스테이션은 자기가 보낸 바로 그 명령에 충전기가 답할 때까지 호출을 열어 두고, 함께 다니는 상관 식별자로 그것을 맞춰 본 다음에야 성공을 알리고 답을 돌려줍니다. 그렇지 않게 끝나는 경우가 셋이며, 저마다 이유와 함께 실패로 알려집니다.

- 충전기가 접속해 있지 않거나 그 연결이 열려 있지 않습니다. 아무것도 보내지 않습니다.
- 충전기가 OCPP 오류로 답합니다. 예를 들어 구현하지 않은 명령입니다. 그 오류 코드가 이유가 됩니다.
- 아무 답도 없이 **30초**가 지납니다. 아무도 답하지 않은 명령은 결코 성공이 아니라 실패입니다.

장치가 담고 있지 않은 충전기나 접속해 있지 않은 충전기에 낸 명령은 대기열에 놓이는 대신 곧바로 거부됩니다.

## 장치 검색 {#discovery}

OCPP 드라이버의 **장치 검색**은 지금 중앙 시스템에 **접속해 있는** 충전기를 나열하며, 후보의 채널을 읽으면 그 충전기가 지금까지 알려 온 커넥터마다 `Meter` 태그, `Status` 태그, `Transaction` 태그를 하나씩 제안합니다.

**첫 충전기는 언제나 손으로 설정합니다.** 중앙 시스템이 듣기 전에는 아무것도 접속할 수 없고, 중앙 시스템은 여기에 OCPP 장치가 생겨야 비로소 듣기 시작하므로, 충전기가 하나도 설정되지 않은 설치본에서 스캔하면 아무것도 찾지 못하고 그렇게 말합니다. 충전기가 접속할 때 쓸 id로 그 첫 장치를 추가하십시오. 그다음부터는 접속한 적이 있는 충전기를 검색으로 찾을 수 있습니다. 일반적인 장치 검색 흐름은 [Connector](connector) 페이지에서 설명합니다.

id는 인증서에서도, 연결 경로에서도, 장치와 맞춰 볼 때도 **대소문자를 구별하지 않고** 맞춥니다. `CP-A`를 밝히는 인증서로 `cp-a`로 접속하는 충전기는 식별자가 `CP-A`인 장치와 같은 충전기입니다.

이미 있는 충전기는 자기 페이지에서 커넥터를 다시 읽습니다. 태그 카드 머리의 **태그 검색**은 접속해 있는 동안 알려 온 커넥터마다의 `Meter`, `Status`, `Transaction` 태그 중 장치에 아직 없는 것을 제시합니다([장치의 태그 검색](connector-discovery#discovering-a-devices-tags) 참고).
