Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Using the library with a different WebSocket implementation #97

Open
cyrilfr opened this issue Jun 13, 2019 · 6 comments
Open

Using the library with a different WebSocket implementation #97

cyrilfr opened this issue Jun 13, 2019 · 6 comments

Comments

@cyrilfr
Copy link

cyrilfr commented Jun 13, 2019

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 cyrilfr changed the title Using the library with diffrent WebSocket implementation Using the library with a different WebSocket implementation Jun 13, 2019
@TVolden
Copy link
Member

TVolden commented Jun 13, 2019

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.

@cyrilfr
Copy link
Author

cyrilfr commented Jun 13, 2019

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

@TVolden
Copy link
Member

TVolden commented Jun 15, 2019

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.

@cyrilfr
Copy link
Author

cyrilfr commented Jun 16, 2019

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
Copy link
Author

cyrilfr commented Aug 15, 2020

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?

@TVolden
Copy link
Member

TVolden commented Aug 17, 2020

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants