OCPP 관련 협업 문의 kslee@u2ware.com
OCPP client sample implementation with spring-boot.
All messages for all versions of OCPP are written in Java.
If you want to customize a businiss logic, implement the corresponding client handler.
The Server side can use ocpp-boot-server
./mvnw spring-boot:run@SpringBootApplication
@EnableOcppClient( //-> 3.
version = OCPPVersion.V2_1, //-> 2.
uri = "ws://localhost:8081/ocpp" //-> 1.
)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}-
URI. websocket URI of ocpp server
-
versions. V2_1, V2_0_1, V1_6
-
automatically registers the 'ocppTransport' beans according to version: See Core Concept
import io.u2ware.ocpp.v2_1.exception.*;
import io.u2ware.ocpp.v2_1.handlers.*;
import io.u2ware.ocpp.v2_1.messaging.*;
import io.u2ware.ocpp.v2_1.model.*;
@Component //-> 2.
public class MyDataTransfer implements ChargingStationHandler { //-> 1.
@Override/** DataTransfer [1/4] */
public DataTransferRequest sendDataTransferRequest(
String id, Map<String, Object> req) {
return DataTransferRequest.builder().build();
}
@Override/** DataTransfer [3/4] */
public void receivedDataTransferResponse(
String id, DataTransferResponse res, ErrorCode err) {
}
@Override/** DataTransfer [2/4] */
public DataTransferResponse receivedDataTransferRequest(
String id, DataTransferRequest req) {
if(ObjectUtils.isEmpty(req)) { // your logic...
throw ErrorCodes.GenericError.exception("your error message"); //-> 3.
}
return DataTransferResponse.builder().build();
}
@Override/** DataTransfer [4/4] */
public void sendDataTransferResponse(
String id, DataTransferResponse res, ErrorCode err) {
}
}- Implement a Client Handler according to OCPP messages.
- Declare @Component so that scans the beans.
- OCPP CALL ERROR messages can be sent by throwing an error code.
import io.u2ware.ocpp.v2_1.exception.*;
import io.u2ware.ocpp.v2_1.handlers.*;
import io.u2ware.ocpp.v2_1.messaging.*;
import io.u2ware.ocpp.v2_1.model.*;
@SpringBootTest
class MyDataTransferHandlerTests {
protected @Autowired ApplicationContext ac;
protected @Autowired ChargingStationTransport ocppTransport;
@Test
void context1Loads() throws Exception {
/////////////////////////////////////
// Mock Object
/////////////////////////////////////
CSMSTransport mockTransport
= new CSMSTransport("mockTransport"); //-> 1.
MockWebSocketHandlerInvoker.of(ac)
.connect(ocppTransport, mockTransport); //-> 2
Thread.sleep(1000);
/////////////////////////////////////
// Test without I/O
/////////////////////////////////////
ChargingStationCommand command
= ChargingStationCommand.ALL.DataTransfer.build();
ocppTransport.offer(command); //-> 3
Thread.sleep(1000);
}
}- Make mock server object.
- Connecting mock object with your client bean.
- send client command.
import io.u2ware.ocpp.v2_1.exception.*;
import io.u2ware.ocpp.v2_1.handlers.*;
import io.u2ware.ocpp.v2_1.messaging.*;
import io.u2ware.ocpp.v2_1.model.*;
@Component
public class SecurityA02ClientHandler implements
TriggerMessage.ChargingStationHandler,
SignCertificate.ChargingStationHandler,
CertificateSigned.ChargingStationHandler
{
protected @Autowired ChargingStationTransport ocppTransport; //
@Override
public String usecase() {
return "A02"; //
}
@Override/** TriggerMessage [2/4] */
public TriggerMessageResponse receivedTriggerMessageRequest(
String id, TriggerMessageRequest req) {
return TriggerMessageResponse.builder().build();
}
@Override/** TriggerMessage [4/4] */
public void sendTriggerMessageResponse(
String id, TriggerMessageResponse res, ErrorCode err) {
///////////////////////////////////////////////////////////////
// You can send other OCPP CALL messages using 'ocppTemplate'.
///////////////////////////////////////////////////////////////
ChargingStationCommand command =
ChargingStationCommand.ALL.SignCertificate.buildWith("A02");
ocppTransport.offer(command); //
}
@Override/** SignCertificate [1/4] */
public SignCertificateRequest sendSignCertificateRequest(
String id, Map<String, Object> req) {
return SignCertificateRequest.builder().build();
}
@Override/** SignCertificate [3/4] */
public void receivedSignCertificateResponse(
String id, SignCertificateResponse res, ErrorCode err) {
}
@Override/** CertificateSigned [2/4] */
public CertificateSignedResponse receivedCertificateSignedRequest(
String id, CertificateSignedRequest req) {
return CertificateSignedResponse.builder().build();
}
@Override/** CertificateSigned [4/4] */
public void sendCertificateSignedResponse(
String id, CertificateSignedResponse res, ErrorCode err) {
}
}- v2.1
| participant | object |
|---|---|
| Offer / Answer | CSMSHandler or ChargingStationHandler |
| Sender / Receiver | CSMSSession or ChargingStationSession |
| Transport | CSMSTransport or ChargingStationTransport |
- v2.0.1
| participant | object |
|---|---|
| Offer / Answer | CSMSHandler or ChargingStationHandler |
| Sender / Receiver | CSMSSession or ChargingStationSession |
| Transport | CSMSTransport or ChargingStationTransport |
- v1.6
| participant | object |
|---|---|
| Offer / Answer | CentralSystemHandler or ChargePointHandler |
| Sender / Receiver | CentralSystemSession or ChargePointSession |
| Transport | CentralSystemTransport or ChargePointTransport |

