Java-OCA-OCPP
Java-OCA-OCPP copied to clipboard
Using the library with a different WebSocket implementation
Is there a way to use the library with a different implementation of WebSocket? For example, I'd like to use the library with Play Framwork and its own WebSocket implementation.
Hi @cyrilfr
First of all thanks for the question. It been quite around here lately.
When I started out, one of my goals was to decouple the 3rd party implementation of communication. I can't say I succeeded with that, because some have tried to integrate with other Liv's and failed. It really depends on how the implementation is done.
I can try to check out the lib and give you some feedback during the weekend or so.
Hi @cyrilfr
First of all thanks for the question. It been quite around here lately.
When I started out, one of my goals was to decouple the 3rd party implementation of communication. I can't say I succeeded with that, because some have tried to integrate with other Liv's and failed. It really depends on how the implementation is done.
I can try to check out the lib and give you some feedback during the weekend or so.
That would be great thanks :)
It looks possible, but I have some concerns.
- I can't see which draft of websocket they use, which can cause compatibility problems.
- I'm not sure if wss is supported.
Play Framework uses Akka as HTTP and WebSocket implementation. Personally, I use this kind of code:
public WebSocket socket()
{
return WebSocket.Json.accept(request ->
{
// Just ignore the input
Sink<JsonNode, ?> in = Sink.ignore();
// Send a single 'Hello!' message and close
JsonNode message = Json.newObject();
message.put("foo", "Hello!");
Source<JsonNode, ?> out = Source.single(message);
return Flow.fromSinkAndSource(in, out);
});
}
WSS is fully supported. Personally, I prefer to use NGINX as a proxy for WSS.
Maybe the library should be "WebSocket implementation independant" and work with callbacks. So you can invoke the OCPP communicator with any WebSocket.
To receive a message with Play for example:
public WebSocket socket()
{
return WebSocket.Json.accept(request ->
{
Sink<JsonNode, ?> sink = Sink.foreach(message ->
{
// parse the JSON message here to get the OCPP-J request and payload
});
Source<JsonNode, ?> source = Source.<JsonNode>actorRef(256, OverflowStrategy.dropHead())
.mapMaterializedValue(actorRef ->
{
// save the actorRef to send message here
return actorRef;
})
.watchTermination((actorRef, termination) ->
{
termination.whenComplete((done, cause) ->
{
// remove the actorRef here
});
return NotUsed.getInstance();
});
return Flow.fromSinkAndSource(sink, source);
});
}
To send a message with an instance of ActorRef:
JsonNode message = Json.newObject();
// create a JSON message with OCCP-J request and payload
actorRef.tell(message, ActorRef.noSender());
To close the connection:
actorRef.tell(PoisonPill.getInstance(), ActorRef.noSender());
I'm still interested in using OCA OCPP as a standalone library (not WS or framework integration specific). Do you have any news about it? How could I help?
Hi @Cyrilfr
It's nice that you are still interested, unfortunately I don't have any news for you.
I don't have much time to spare, so I havent worked on the lib for some time now, and I don't think I will for years to come.
The case is, that I'm partaking on a masters degree this week, so I reckon I will be very busi for the next two years.
If you want to give it a try, then I'll surely assist you, anyway possible. I just don't have a lot of spare time.
Sincerely, Thomas Volden