Java-OCA-OCPP icon indicating copy to clipboard operation
Java-OCA-OCPP copied to clipboard

Using the library with a different WebSocket implementation

Open cyrilfr opened this issue 6 years ago • 6 comments

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.

cyrilfr avatar Jun 13 '19 10:06 cyrilfr

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.

TVolden avatar Jun 13 '19 14:06 TVolden

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 :)

cyrilfr avatar Jun 13 '19 15:06 cyrilfr

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.

TVolden avatar Jun 15 '19 18:06 TVolden

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());

cyrilfr avatar Jun 16 '19 15:06 cyrilfr

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?

cyrilfr avatar Aug 15 '20 12:08 cyrilfr

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

TVolden avatar Aug 17 '20 15:08 TVolden