javacoapleshan

Receiving Observed object changes on Leshan server


I am building a simple prototype based upon the leshan-server-demo included with the repo. I'm attempting to receive updates from objects that have been observed. Packet captures show that the updates are making their way to the server, but I'm receiving no notice of them.

The closest answer I found is from 2015 (How to retrieve updated content on an Observed resource in Leshan?) - but subsequent changes to the Leshan codebase have made the same technique unworkable.

I've tried using the ObservationService to add an ObservationListener, but that only seems to alert me when the Observe has been requested, not when the endpoint sends up changed values.

static private void attachListener(final LeshanServer server) {
    System.out.println("Attaching Listener");
    server.getObservationService().addListener(new ObservationListener() {
        @Override
        public void newObservation(Observation observation, Registration registration) {
            System.out.println("New Observation");
        }
        @Override
        public void cancelled(Observation observation) {
            System.out.println("Observation cancellation");
        }
        @Override
        public void onResponse(Observation observation, Registration registration, ObserveResponse response) {
            System.out.println("Observation Response");
        }
        @Override
        public void onError(Observation observation, Registration registration, Exception error) {
            System.out.println("Observation Error");
        }
    });
}

How should I be listening for observed objects on the Leshan server?


Solution

  • You need to handle the onResponse: From https://github.com/eclipse/leshan/blob/f315c66602b1061175f2441c019b862946d08a55/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/EventServlet.java#L133

    @Override
    public void onResponse(Observation observation, Registration registration, ObserveResponse response) {
                if (LOG.isDebugEnabled()) {
                    LOG.debug("Received notification from [{}] containing value [{}]", observation.getPath(),
                            response.getContent().toString());
                }
    
                if (registration != null) {
                    String data = new StringBuilder("{\"ep\":\"").append(registration.getEndpoint()).append("\",\"res\":\"")
                            .append(observation.getPath().toString()).append("\",\"val\":")
                            .append(gson.toJson(response.getContent())).append("}").toString();
    
                    sendEvent(EVENT_NOTIFICATION, data, registration.getEndpoint());
                }
    }
    

    The response.getContent() contains the new value. The data json that code builds will look like { "ep": "rpitest", "res": "/3334/0", "val": { "id": 0, "resources": [{ "id": 5704, "value": 1.7929173707962036 }, { "id": 5702, "value": 0.9917597770690918 }, { "id": 5703, "value": 154.53704833984375 }] } }