Skip to content

Commit

Permalink
Observe support in object and instance enablers
Browse files Browse the repository at this point in the history
Signed-off-by: Daniel Persson <daniel.p.persson@husqvarnagroup.com>
  • Loading branch information
danielhqv authored and sbernard31 committed Oct 30, 2017
1 parent cf933b6 commit ccf43d6
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

import org.eclipse.leshan.core.node.LwM2mResource;
import org.eclipse.leshan.core.response.ExecuteResponse;
import org.eclipse.leshan.core.response.ObserveResponse;
import org.eclipse.leshan.core.response.ReadResponse;
import org.eclipse.leshan.core.response.WriteResponse;

Expand Down Expand Up @@ -61,7 +62,15 @@ public ExecuteResponse execute(int resourceid, String params) {
}

@Override
public void reset(int resourceid) {
public ObserveResponse observe(int resourceid) {
// Perform a read by default
ReadResponse readResponse = this.read(resourceid);
return new ObserveResponse(readResponse.getCode(), readResponse.getContent(), null, null,
readResponse.getErrorMessage());
}

@Override
public void reset(int resourceid) {
// No default behavior
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -326,9 +326,31 @@ public synchronized DiscoverResponse discover(ServerIdentity identity, DiscoverR

@Override
public synchronized ObserveResponse observe(ServerIdentity identity, ObserveRequest request) {
LwM2mPath path = request.getPath();

// observe is not supported for bootstrap
if (identity.isLwm2mBootstrapServer())
return ObserveResponse.methodNotAllowed();

if (!identity.isSystem()) {
// observe or read of the security object is forbidden
if (id == LwM2mId.SECURITY)
return ObserveResponse.notFound();

// check if the resource is readable.
if (path.isResource()) {
ResourceModel resourceModel = objectModel.resources.get(path.getResourceId());
if (resourceModel != null && !resourceModel.operations.isReadable())
return ObserveResponse.methodNotAllowed();
}
}
return doObserve(identity, request);
}

protected ObserveResponse doObserve(ServerIdentity identity, ObserveRequest request) {
ReadResponse readResponse = this.read(identity, new ReadRequest(request.getPath().toString()));
return new ObserveResponse(readResponse.getCode(), readResponse.getContent(), null, null,
readResponse.getErrorMessage());
readResponse.getErrorMessage());
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

import org.eclipse.leshan.core.node.LwM2mResource;
import org.eclipse.leshan.core.response.ExecuteResponse;
import org.eclipse.leshan.core.response.ObserveResponse;
import org.eclipse.leshan.core.response.ReadResponse;
import org.eclipse.leshan.core.response.WriteResponse;

Expand Down Expand Up @@ -89,6 +90,13 @@ public interface LwM2mInstanceEnabler {
*/
ExecuteResponse execute(int resourceid, String params);

/**
* Performs an observe register on one of this LWM2M object instance's resources.
*
* @param resourceid the ID of the resource to set the value for
*/
ObserveResponse observe(int resourceid);

/**
* Reset the current value of one of this LWM2M object instance's resources. Only used for implementation of REPLACE
* to cleanup none mandatory resources.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,15 @@
import org.eclipse.leshan.core.request.CreateRequest;
import org.eclipse.leshan.core.request.DeleteRequest;
import org.eclipse.leshan.core.request.ExecuteRequest;
import org.eclipse.leshan.core.request.ObserveRequest;
import org.eclipse.leshan.core.request.ReadRequest;
import org.eclipse.leshan.core.request.WriteRequest;
import org.eclipse.leshan.core.request.WriteRequest.Mode;
import org.eclipse.leshan.core.response.BootstrapWriteResponse;
import org.eclipse.leshan.core.response.CreateResponse;
import org.eclipse.leshan.core.response.DeleteResponse;
import org.eclipse.leshan.core.response.ExecuteResponse;
import org.eclipse.leshan.core.response.ObserveResponse;
import org.eclipse.leshan.core.response.ReadResponse;
import org.eclipse.leshan.core.response.WriteResponse;

Expand Down Expand Up @@ -130,6 +132,30 @@ protected ReadResponse doRead(ServerIdentity identity, ReadRequest request) {
return instance.read(path.getResourceId());
}

@Override
protected ObserveResponse doObserve(final ServerIdentity identity, final ObserveRequest request) {
final LwM2mPath path = request.getPath();

// Manage Object case
if (path.isObject()) {
// TODO Enable object level observe support (if ever necessary)
return ObserveResponse.internalServerError("not implemented");
}

// Manage Instance case
final LwM2mInstanceEnabler instance = instances.get(path.getObjectInstanceId());
if (instance == null)
return ObserveResponse.notFound();

if (path.getResourceId() == null) {
// TODO Enable instance level observe support
return ObserveResponse.internalServerError("not implemented");
}

// Manage Resource case
return instance.observe(path.getResourceId());
}

LwM2mObjectInstance getLwM2mObjectInstance(int instanceid, LwM2mInstanceEnabler instance, ServerIdentity identity) {
List<LwM2mResource> resources = new ArrayList<>();
for (ResourceModel resourceModel : getObjectModel().resources.values()) {
Expand Down Expand Up @@ -243,6 +269,7 @@ protected DeleteResponse doDelete(DeleteRequest request) {

private void listenInstance(LwM2mInstanceEnabler instance, final int instanceId) {
instance.addResourceChangedListener(new ResourceChangedListener() {

@Override
public void resourcesChanged(int... resourceIds) {
NotifySender sender = getNotifySender();
Expand Down

0 comments on commit ccf43d6

Please sign in to comment.