|
|
|
@ -64,14 +64,14 @@ import org.springframework.stereotype.Service; |
|
|
|
import org.thingsboard.server.common.data.device.data.lwm2m.ObjectAttributes; |
|
|
|
import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; |
|
|
|
import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig; |
|
|
|
import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportContext; |
|
|
|
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; |
|
|
|
import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext; |
|
|
|
import org.thingsboard.server.transport.lwm2m.server.LwM2MTransportContext; |
|
|
|
import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClient; |
|
|
|
import org.thingsboard.server.transport.lwm2m.server.client.LwM2MClientContext; |
|
|
|
import org.thingsboard.server.transport.lwm2m.server.common.LwM2MExecutorAwareService; |
|
|
|
import org.thingsboard.server.transport.lwm2m.server.downlink.composite.TbLwM2MReadCompositeRequest; |
|
|
|
import org.thingsboard.server.transport.lwm2m.server.log.LwM2MTelemetryLogService; |
|
|
|
import org.thingsboard.server.transport.lwm2m.server.rpc.composite.RpcWriteCompositeRequest; |
|
|
|
import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl; |
|
|
|
import org.thingsboard.server.transport.lwm2m.utils.LwM2MValueConverterImpl; |
|
|
|
|
|
|
|
import javax.annotation.PostConstruct; |
|
|
|
import javax.annotation.PreDestroy; |
|
|
|
@ -94,29 +94,29 @@ import static org.eclipse.leshan.core.attributes.Attribute.MINIMUM_PERIOD; |
|
|
|
import static org.eclipse.leshan.core.attributes.Attribute.STEP; |
|
|
|
import static org.eclipse.leshan.core.model.ResourceModel.Type.OBJLNK; |
|
|
|
import static org.eclipse.leshan.core.model.ResourceModel.Type.OPAQUE; |
|
|
|
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.convertMultiResourceValuesFromRpcBody; |
|
|
|
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.createModelsDefault; |
|
|
|
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.fromVersionedIdToObjectId; |
|
|
|
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.getVerFromPathIdVerOrId; |
|
|
|
import static org.thingsboard.server.transport.lwm2m.utils.LwM2mTransportUtil.validateVersionedId; |
|
|
|
import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.convertMultiResourceValuesFromRpcBody; |
|
|
|
import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.createModelsDefault; |
|
|
|
import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.fromVersionedIdToObjectId; |
|
|
|
import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.getVerFromPathIdVerOrId; |
|
|
|
import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.validateVersionedId; |
|
|
|
|
|
|
|
@Slf4j |
|
|
|
@Service |
|
|
|
@TbLwM2mTransportComponent |
|
|
|
@RequiredArgsConstructor |
|
|
|
public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService implements LwM2mDownlinkMsgHandler { |
|
|
|
public class DefaultLwM2MDownlinkMsgHandler extends LwM2MExecutorAwareService implements LwM2MDownlinkMsgHandler { |
|
|
|
|
|
|
|
public LwM2mValueConverterImpl converter; |
|
|
|
public LwM2MValueConverterImpl converter; |
|
|
|
|
|
|
|
private final LwM2mTransportContext context; |
|
|
|
private final LwM2MTransportContext context; |
|
|
|
private final LwM2MTransportServerConfig config; |
|
|
|
private final LwM2MTelemetryLogService logService; |
|
|
|
private final LwM2mClientContext clientContext; |
|
|
|
private final LwM2MClientContext clientContext; |
|
|
|
|
|
|
|
@PostConstruct |
|
|
|
public void init() { |
|
|
|
super.init(); |
|
|
|
this.converter = LwM2mValueConverterImpl.getInstance(); |
|
|
|
this.converter = LwM2MValueConverterImpl.getInstance(); |
|
|
|
} |
|
|
|
|
|
|
|
@PreDestroy |
|
|
|
@ -135,7 +135,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void sendReadRequest(LwM2mClient client, TbLwM2MReadRequest request, DownlinkRequestCallback<ReadRequest, ReadResponse> callback) { |
|
|
|
public void sendReadRequest(LwM2MClient client, TbLwM2MReadRequest request, DownlinkRequestCallback<ReadRequest, ReadResponse> callback) { |
|
|
|
try { |
|
|
|
validateVersionedId(client, request); |
|
|
|
ReadRequest downlink = new ReadRequest(getReadRequestContentFormat(client, request, this.config.getModelProvider()), request.getObjectId()); |
|
|
|
@ -146,7 +146,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void sendReadCompositeRequest(LwM2mClient client, TbLwM2MReadCompositeRequest request, |
|
|
|
public void sendReadCompositeRequest(LwM2MClient client, TbLwM2MReadCompositeRequest request, |
|
|
|
DownlinkRequestCallback<ReadCompositeRequest, ReadCompositeResponse> callback, ContentFormat compositeContentFormat) { |
|
|
|
try { |
|
|
|
ReadCompositeRequest downlink = new ReadCompositeRequest(compositeContentFormat, compositeContentFormat, request.getObjectIds()); |
|
|
|
@ -157,7 +157,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void sendObserveRequest(LwM2mClient client, TbLwM2MObserveRequest request, DownlinkRequestCallback<ObserveRequest, ObserveResponse> callback) { |
|
|
|
public void sendObserveRequest(LwM2MClient client, TbLwM2MObserveRequest request, DownlinkRequestCallback<ObserveRequest, ObserveResponse> callback) { |
|
|
|
try { |
|
|
|
validateVersionedId(client, request); |
|
|
|
LwM2mPath resultIds = new LwM2mPath(request.getObjectId()); |
|
|
|
@ -183,19 +183,19 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void sendObserveAllRequest(LwM2mClient client, TbLwM2MObserveAllRequest request, DownlinkRequestCallback<TbLwM2MObserveAllRequest, Set<String>> callback) { |
|
|
|
public void sendObserveAllRequest(LwM2MClient client, TbLwM2MObserveAllRequest request, DownlinkRequestCallback<TbLwM2MObserveAllRequest, Set<String>> callback) { |
|
|
|
Set<Observation> observations = context.getServer().getObservationService().getObservations(client.getRegistration()); |
|
|
|
Set<String> paths = observations.stream().map(observation -> observation.getPath().toString()).collect(Collectors.toUnmodifiableSet()); |
|
|
|
callback.onSuccess(request, paths); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void sendDiscoverAllRequest(LwM2mClient client, TbLwM2MDiscoverAllRequest request, DownlinkRequestCallback<TbLwM2MDiscoverAllRequest, List<Link>> callback) { |
|
|
|
public void sendDiscoverAllRequest(LwM2MClient client, TbLwM2MDiscoverAllRequest request, DownlinkRequestCallback<TbLwM2MDiscoverAllRequest, List<Link>> callback) { |
|
|
|
callback.onSuccess(request, Arrays.asList(client.getRegistration().getSortedObjectLinks())); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void sendExecuteRequest(LwM2mClient client, TbLwM2MExecuteRequest request, DownlinkRequestCallback<ExecuteRequest, ExecuteResponse> callback) { |
|
|
|
public void sendExecuteRequest(LwM2MClient client, TbLwM2MExecuteRequest request, DownlinkRequestCallback<ExecuteRequest, ExecuteResponse> callback) { |
|
|
|
try { |
|
|
|
validateVersionedId(client, request); |
|
|
|
LwM2mPath pathIds = new LwM2mPath(fromVersionedIdToObjectId(request.getVersionedId())); |
|
|
|
@ -210,8 +210,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
callback.onValidationError(request.toString(), "ResourceModel with " + request.getVersionedId() + |
|
|
|
" is absent in system. Need ddd Lwm2m Model with id=" + pathIds.getObjectId() + " ver=" + |
|
|
|
getVerFromPathIdVerOrId(request.getVersionedId()) + " to profile."); |
|
|
|
} |
|
|
|
else if (resourceModelExecute.operations.isExecutable()) { |
|
|
|
} else if (resourceModelExecute.operations.isExecutable()) { |
|
|
|
ExecuteRequest downlink; |
|
|
|
if (request.getParams() != null && !resourceModelExecute.multiple) { |
|
|
|
downlink = new ExecuteRequest(request.getObjectId(), (String) this.converter.convertValue(request.getParams(), |
|
|
|
@ -220,8 +219,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
downlink = new ExecuteRequest(request.getObjectId()); |
|
|
|
} |
|
|
|
sendSimpleRequest(client, downlink, request.getTimeout(), callback); |
|
|
|
} |
|
|
|
else { |
|
|
|
} else { |
|
|
|
callback.onValidationError(request.toString(), "Resource with " + request.getVersionedId() + " is not executable."); |
|
|
|
} |
|
|
|
} catch (InvalidRequestException e) { |
|
|
|
@ -230,7 +228,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void sendDeleteRequest(LwM2mClient client, TbLwM2MDeleteRequest request, DownlinkRequestCallback<DeleteRequest, DeleteResponse> callback) { |
|
|
|
public void sendDeleteRequest(LwM2MClient client, TbLwM2MDeleteRequest request, DownlinkRequestCallback<DeleteRequest, DeleteResponse> callback) { |
|
|
|
try { |
|
|
|
validateVersionedId(client, request); |
|
|
|
sendSimpleRequest(client, new DeleteRequest(request.getObjectId()), request.getTimeout(), callback); |
|
|
|
@ -240,20 +238,20 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void sendCancelObserveRequest(LwM2mClient client, TbLwM2MCancelObserveRequest request, DownlinkRequestCallback<TbLwM2MCancelObserveRequest, Integer> callback) { |
|
|
|
public void sendCancelObserveRequest(LwM2MClient client, TbLwM2MCancelObserveRequest request, DownlinkRequestCallback<TbLwM2MCancelObserveRequest, Integer> callback) { |
|
|
|
validateVersionedId(client, request); |
|
|
|
int observeCancelCnt = context.getServer().getObservationService().cancelObservations(client.getRegistration(), request.getObjectId()); |
|
|
|
callback.onSuccess(request, observeCancelCnt); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void sendCancelAllRequest(LwM2mClient client, TbLwM2MCancelAllRequest request, DownlinkRequestCallback<TbLwM2MCancelAllRequest, Integer> callback) { |
|
|
|
public void sendCancelAllRequest(LwM2MClient client, TbLwM2MCancelAllRequest request, DownlinkRequestCallback<TbLwM2MCancelAllRequest, Integer> callback) { |
|
|
|
int observeCancelCnt = context.getServer().getObservationService().cancelObservations(client.getRegistration()); |
|
|
|
callback.onSuccess(request, observeCancelCnt); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void sendDiscoverRequest(LwM2mClient client, TbLwM2MDiscoverRequest request, DownlinkRequestCallback<DiscoverRequest, DiscoverResponse> callback) { |
|
|
|
public void sendDiscoverRequest(LwM2MClient client, TbLwM2MDiscoverRequest request, DownlinkRequestCallback<DiscoverRequest, DiscoverResponse> callback) { |
|
|
|
validateVersionedId(client, request); |
|
|
|
sendSimpleRequest(client, new DiscoverRequest(request.getObjectId()), request.getTimeout(), callback); |
|
|
|
} |
|
|
|
@ -271,7 +269,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
* addAttribute(attributes, OBJECT_VERSION, params.getVer(), StringUtils::isNotEmpty, Function.identity()); |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public void sendWriteAttributesRequest(LwM2mClient client, TbLwM2MWriteAttributesRequest request, DownlinkRequestCallback<WriteAttributesRequest, WriteAttributesResponse> callback) { |
|
|
|
public void sendWriteAttributesRequest(LwM2MClient client, TbLwM2MWriteAttributesRequest request, DownlinkRequestCallback<WriteAttributesRequest, WriteAttributesResponse> callback) { |
|
|
|
try { |
|
|
|
validateVersionedId(client, request); |
|
|
|
if (request.getAttributes() == null) { |
|
|
|
@ -292,7 +290,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void sendWriteReplaceRequest(LwM2mClient client, TbLwM2MWriteReplaceRequest request, DownlinkRequestCallback<WriteRequest, WriteResponse> callback) { |
|
|
|
public void sendWriteReplaceRequest(LwM2MClient client, TbLwM2MWriteReplaceRequest request, DownlinkRequestCallback<WriteRequest, WriteResponse> callback) { |
|
|
|
LwM2mPath resultIds = new LwM2mPath(request.getObjectId()); |
|
|
|
if (resultIds.isResource() || resultIds.isResourceInstance()) { |
|
|
|
validateVersionedId(client, request); |
|
|
|
@ -301,14 +299,15 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
ContentFormat contentFormat = getWriteRequestContentFormat(client, request, this.config.getModelProvider()); |
|
|
|
try { |
|
|
|
WriteRequest downlink = null; |
|
|
|
String msgError = ""; |
|
|
|
if (resourceModelWrite.multiple) { |
|
|
|
try { |
|
|
|
Map value = convertMultiResourceValuesFromRpcBody(request.getValue(), resourceModelWrite.type, request.getObjectId()); |
|
|
|
downlink = new WriteRequest(contentFormat, resultIds.getObjectId(), resultIds.getObjectInstanceId(), resultIds.getResourceId(), |
|
|
|
value, resourceModelWrite.type); |
|
|
|
} catch (Exception e) { |
|
|
|
callback.onValidationError(toString(request), "Resource id=" + resultIds.toString() + ", value = " + request.getValue() + |
|
|
|
", class = " + request.getValue().getClass().getSimpleName() + "is bad. Value of Multi-Instance Resource must be in Json format!"); |
|
|
|
msgError = "Resource id=" + resultIds.toString() + ", value = " + request.getValue() + |
|
|
|
", class = " + request.getValue().getClass().getSimpleName() + "is bad. Value of Multi-Instance Resource must be in Json format!"; |
|
|
|
} |
|
|
|
} else { |
|
|
|
downlink = this.getWriteRequestSingleResource(resourceModelWrite.type, contentFormat, |
|
|
|
@ -317,7 +316,10 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
if (downlink != null) { |
|
|
|
sendSimpleRequest(client, downlink, request.getTimeout(), callback); |
|
|
|
} else { |
|
|
|
callback.onValidationError(toString(request), "WriteRequest is null."); |
|
|
|
if (msgError.isEmpty()) { |
|
|
|
msgError = "WriteRequest is null."; |
|
|
|
} |
|
|
|
callback.onValidationError(toString(request), msgError); |
|
|
|
} |
|
|
|
} catch (Exception e) { |
|
|
|
callback.onError(toString(request), e); |
|
|
|
@ -332,7 +334,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void sendWriteCompositeRequest(LwM2mClient client, RpcWriteCompositeRequest rpcWriteCompositeRequest, |
|
|
|
public void sendWriteCompositeRequest(LwM2MClient client, RpcWriteCompositeRequest rpcWriteCompositeRequest, |
|
|
|
DownlinkRequestCallback<WriteCompositeRequest, WriteCompositeResponse> callback, ContentFormat contentFormatComposite) { |
|
|
|
try { |
|
|
|
WriteCompositeRequest downlink = new WriteCompositeRequest(contentFormatComposite, rpcWriteCompositeRequest.getNodes()); |
|
|
|
@ -346,57 +348,55 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public void sendWriteUpdateRequest(LwM2mClient client, TbLwM2MWriteUpdateRequest request, DownlinkRequestCallback<WriteRequest, WriteResponse> callback) { |
|
|
|
public void sendWriteUpdateRequest(LwM2MClient client, TbLwM2MWriteUpdateRequest request, DownlinkRequestCallback<WriteRequest, WriteResponse> callback) { |
|
|
|
try { |
|
|
|
LwM2mPath resultIds = new LwM2mPath(request.getObjectId()); |
|
|
|
if (resultIds.isObjectInstance() || resultIds.isResource()) { |
|
|
|
validateVersionedId(client, request); |
|
|
|
WriteRequest downlink = null; |
|
|
|
ContentFormat contentFormat = getWriteRequestContentFormat(client, request, this.config.getModelProvider()); |
|
|
|
if (resultIds.isObjectInstance()) { |
|
|
|
/* |
|
|
|
* params = "{\"id\":0,\"value\":[{\"id\":14,\"value\":\"+5\"},{\"id\":15,\"value\":\"+9\"}]}" |
|
|
|
* int rscId = resultIds.getObjectInstanceId(); |
|
|
|
* contentFormat – Format of the payload (TLV or JSON). |
|
|
|
*/ |
|
|
|
Collection<LwM2mResource> resources = client.getNewResourcesForInstance(request.getVersionedId(), |
|
|
|
request.getValue(), this.config.getModelProvider(), this.converter); |
|
|
|
if (resources.size() > 0) { |
|
|
|
downlink = new WriteRequest(WriteRequest.Mode.UPDATE, contentFormat, resultIds.getObjectId(), |
|
|
|
resultIds.getObjectInstanceId(), resources); |
|
|
|
} else { |
|
|
|
callback.onValidationError(toString(request), "No resources to update!"); |
|
|
|
} |
|
|
|
ContentFormat contentFormat = getWriteRequestContentFormat(client, request, this.config.getModelProvider()); |
|
|
|
String msgError = ""; |
|
|
|
if (resultIds.isObjectInstance()) { |
|
|
|
/* |
|
|
|
* params = "{\"id\":0,\"value\":[{\"id\":14,\"value\":\"+5\"},{\"id\":15,\"value\":\"+9\"}]}" |
|
|
|
* int rscId = resultIds.getObjectInstanceId(); |
|
|
|
* contentFormat – Format of the payload (TLV or JSON). |
|
|
|
*/ |
|
|
|
Collection<LwM2mResource> resources = client.getNewResourcesForInstance(request.getVersionedId(), |
|
|
|
request.getValue(), this.config.getModelProvider(), this.converter); |
|
|
|
if (resources.size() > 0) { |
|
|
|
downlink = new WriteRequest(WriteRequest.Mode.UPDATE, contentFormat, resultIds.getObjectId(), |
|
|
|
resultIds.getObjectInstanceId(), resources); |
|
|
|
} else { |
|
|
|
msgError = " No resources to update!"; |
|
|
|
} |
|
|
|
else if (resultIds.isResource()) { |
|
|
|
ResourceModel resourceModelWrite = client.getResourceModel(request.getVersionedId(), this.config.getModelProvider()); |
|
|
|
if (resourceModelWrite != null) { |
|
|
|
if (resourceModelWrite.multiple) { |
|
|
|
try { |
|
|
|
Map value = convertMultiResourceValuesFromRpcBody(request.getValue(), resourceModelWrite.type, request.getObjectId()); |
|
|
|
downlink = new WriteRequest(WriteRequest.Mode.UPDATE, contentFormat, resultIds.getObjectId(), |
|
|
|
resultIds.getObjectInstanceId(), resultIds.getResourceId(), |
|
|
|
value, resourceModelWrite.type); |
|
|
|
} catch (Exception e1) { |
|
|
|
callback.onValidationError(toString(request), "Resource id=" + resultIds.toString() + |
|
|
|
", class = " + request.getValue().getClass().getSimpleName() + |
|
|
|
", value = " + request.getValue() + " is bad. " + |
|
|
|
"Value of Multi-Instance Resource must be in Json format!"); |
|
|
|
} |
|
|
|
} else if (resultIds.isResource()) { |
|
|
|
ResourceModel resourceModelWrite = client.getResourceModel(request.getVersionedId(), this.config.getModelProvider()); |
|
|
|
if (resourceModelWrite != null) { |
|
|
|
if (resourceModelWrite.multiple) { |
|
|
|
try { |
|
|
|
Map value = convertMultiResourceValuesFromRpcBody(request.getValue(), resourceModelWrite.type, request.getObjectId()); |
|
|
|
downlink = new WriteRequest(WriteRequest.Mode.UPDATE, contentFormat, resultIds.getObjectId(), |
|
|
|
resultIds.getObjectInstanceId(), resultIds.getResourceId(), |
|
|
|
value, resourceModelWrite.type); |
|
|
|
} catch (Exception e1) { |
|
|
|
msgError = " Resource id=" + resultIds.toString() + |
|
|
|
", class = " + request.getValue().getClass().getSimpleName() + |
|
|
|
", value = " + request.getValue() + " is bad. " + |
|
|
|
"Value of Multi-Instance Resource must be in Json format!"; |
|
|
|
} |
|
|
|
} else { |
|
|
|
callback.onValidationError(toString(request), "Resource " + request.getVersionedId() + |
|
|
|
" is not configured in the device profile!"); |
|
|
|
} |
|
|
|
} |
|
|
|
if (downlink != null) { |
|
|
|
sendSimpleRequest(client, downlink, request.getTimeout(), callback); |
|
|
|
} else { |
|
|
|
callback.onValidationError(toString(request), "Resource " + request.getVersionedId() + |
|
|
|
". This operation can only be used for ObjectInstance or Multi-Instance Resource !"); |
|
|
|
msgError = " Resource " + request.getVersionedId() + " is not configured in the device profile!"; |
|
|
|
} |
|
|
|
} |
|
|
|
else { |
|
|
|
} |
|
|
|
if (downlink != null) { |
|
|
|
sendSimpleRequest(client, downlink, request.getTimeout(), callback); |
|
|
|
} else { |
|
|
|
callback.onValidationError(toString(request), "Resource " + request.getVersionedId() + |
|
|
|
". This operation can only be used for ObjectInstance or Multi-Instance Resource !" + msgError); |
|
|
|
} |
|
|
|
} else { |
|
|
|
callback.onValidationError(toString(request), "Resource " + request.getVersionedId() + |
|
|
|
". This operation can only be used for ObjectInstance or Resource (multiple)"); |
|
|
|
} |
|
|
|
@ -405,7 +405,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public void sendCreateRequest(LwM2mClient client, TbLwM2MCreateRequest request, DownlinkRequestCallback<CreateRequest, CreateResponse> callback) { |
|
|
|
public void sendCreateRequest(LwM2MClient client, TbLwM2MCreateRequest request, DownlinkRequestCallback<CreateRequest, CreateResponse> callback) { |
|
|
|
validateVersionedId(client, request); |
|
|
|
CreateRequest downlink = null; |
|
|
|
LwM2mPath resultIds = new LwM2mPath(request.getObjectId()); |
|
|
|
@ -454,15 +454,15 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private <R extends SimpleDownlinkRequest<T>, T extends LwM2mResponse> void sendSimpleRequest(LwM2mClient client, R request, long timeoutInMs, DownlinkRequestCallback<R, T> callback) { |
|
|
|
private <R extends SimpleDownlinkRequest<T>, T extends LwM2mResponse> void sendSimpleRequest(LwM2MClient client, R request, long timeoutInMs, DownlinkRequestCallback<R, T> callback) { |
|
|
|
sendRequest(client, request, timeoutInMs, callback, r -> request.getPath().toString()); |
|
|
|
} |
|
|
|
|
|
|
|
private <R extends CompositeDownlinkRequest<T>, T extends LwM2mResponse> void sendCompositeRequest(LwM2mClient client, R request, long timeoutInMs, DownlinkRequestCallback<R, T> callback) { |
|
|
|
private <R extends CompositeDownlinkRequest<T>, T extends LwM2mResponse> void sendCompositeRequest(LwM2MClient client, R request, long timeoutInMs, DownlinkRequestCallback<R, T> callback) { |
|
|
|
sendRequest(client, request, timeoutInMs, callback, r -> request.getPaths().toString()); |
|
|
|
} |
|
|
|
|
|
|
|
private <R extends DownlinkRequest<T>, T extends LwM2mResponse> void sendRequest(LwM2mClient client, R request, long timeoutInMs, DownlinkRequestCallback<R, T> callback, Function<R, String> pathToStringFunction) { |
|
|
|
private <R extends DownlinkRequest<T>, T extends LwM2mResponse> void sendRequest(LwM2MClient client, R request, long timeoutInMs, DownlinkRequestCallback<R, T> callback, Function<R, String> pathToStringFunction) { |
|
|
|
if (!clientContext.isDownlinkAllowed(client)) { |
|
|
|
log.trace("[{}] ignore downlink request cause client is sleeping.", client.getEndpoint()); |
|
|
|
return; |
|
|
|
@ -487,7 +487,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private <R extends SimpleDownlinkRequest<T>, T extends LwM2mResponse> void sendWriteCompositeRequest(LwM2mClient client, WriteCompositeRequest request, long timeoutInMs, DownlinkRequestCallback<WriteCompositeRequest, WriteCompositeResponse> callback) { |
|
|
|
private <R extends SimpleDownlinkRequest<T>, T extends LwM2mResponse> void sendWriteCompositeRequest(LwM2MClient client, WriteCompositeRequest request, long timeoutInMs, DownlinkRequestCallback<WriteCompositeRequest, WriteCompositeResponse> callback) { |
|
|
|
if (!clientContext.isDownlinkAllowed(client)) { |
|
|
|
log.trace("[{}] ignore downlink request cause client is sleeping.", client.getEndpoint()); |
|
|
|
return; |
|
|
|
@ -515,7 +515,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private <R extends DownlinkRequest<T>, T extends LwM2mResponse> void handleDownlinkError(LwM2mClient client, R request, DownlinkRequestCallback<R, T> callback, Exception e) { |
|
|
|
private <R extends DownlinkRequest<T>, T extends LwM2mResponse> void handleDownlinkError(LwM2MClient client, R request, DownlinkRequestCallback<R, T> callback, Exception e) { |
|
|
|
log.trace("[{}] Received downlink error: {}.", client.getEndpoint(), e); |
|
|
|
executor.submit(() -> { |
|
|
|
if (e instanceof TimeoutException || e instanceof ClientSleepingException) { |
|
|
|
@ -571,7 +571,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static <T extends HasContentFormat & HasVersionedId> ContentFormat getReadRequestContentFormat(LwM2mClient client, T request, LwM2mModelProvider modelProvider) { |
|
|
|
private static <T extends HasContentFormat & HasVersionedId> ContentFormat getReadRequestContentFormat(LwM2MClient client, T request, LwM2mModelProvider modelProvider) { |
|
|
|
if (request.getRequestContentFormat().isPresent()) { |
|
|
|
return request.getRequestContentFormat().get(); |
|
|
|
} else { |
|
|
|
@ -579,7 +579,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static ContentFormat getWriteRequestContentFormat(LwM2mClient client, TbLwM2MDownlinkRequest request, LwM2mModelProvider modelProvider) { |
|
|
|
private static ContentFormat getWriteRequestContentFormat(LwM2MClient client, TbLwM2MDownlinkRequest request, LwM2mModelProvider modelProvider) { |
|
|
|
if (request instanceof TbLwM2MWriteReplaceRequest && ((TbLwM2MWriteReplaceRequest) request).getContentFormat() != null) { |
|
|
|
return ((TbLwM2MWriteReplaceRequest) request).getContentFormat(); |
|
|
|
} else if (request instanceof TbLwM2MWriteUpdateRequest && ((TbLwM2MWriteUpdateRequest) request).getObjectContentFormat() != null) { |
|
|
|
@ -597,7 +597,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static ContentFormat getRequestContentFormat(LwM2mClient client, String versionedId, LwM2mModelProvider modelProvider) { |
|
|
|
private static ContentFormat getRequestContentFormat(LwM2MClient client, String versionedId, LwM2mModelProvider modelProvider) { |
|
|
|
LwM2mPath pathIds = new LwM2mPath(fromVersionedIdToObjectId(versionedId)); |
|
|
|
if (pathIds.isResource() || pathIds.isResourceInstance()) { |
|
|
|
ResourceModel resourceModel = client.getResourceModel(versionedId, modelProvider); |
|
|
|
@ -617,7 +617,7 @@ public class DefaultLwM2mDownlinkMsgHandler extends LwM2MExecutorAwareService im |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static ContentFormat getContentFormatForComplex(LwM2mClient client) { |
|
|
|
private static ContentFormat getContentFormatForComplex(LwM2MClient client) { |
|
|
|
if (LwM2m.Version.V1_0.equals(client.getRegistration().getLwM2mVersion())) { |
|
|
|
return ContentFormat.TLV; |
|
|
|
} else if (LwM2m.Version.V1_1.equals(client.getRegistration().getLwM2mVersion())) { |