Commit 89c1743fa0549034767a45ee740f8f53114f0ead

Authored by nickAS21
Committed by Andrew Shvayka
1 parent a8dd25a7

Lwm2m: RPC finish

@@ -104,6 +104,7 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.L @@ -104,6 +104,7 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.L
104 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.READ; 104 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.READ;
105 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.WRITE_ATTRIBUTES; 105 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.WRITE_ATTRIBUTES;
106 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.WRITE_REPLACE; 106 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.WRITE_REPLACE;
  107 +import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.WRITE_UPDATE;
107 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.convertJsonArrayToSet; 108 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.convertJsonArrayToSet;
108 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.convertPathFromIdVerToObjectId; 109 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.convertPathFromIdVerToObjectId;
109 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.convertPathFromObjectIdToIdVer; 110 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.convertPathFromObjectIdToIdVer;
@@ -455,9 +456,23 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler @@ -455,9 +456,23 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
455 lwm2mClientRpcRequest.setValue(rpcRequest.get(lwm2mClientRpcRequest.valueKey).getAsString()); 456 lwm2mClientRpcRequest.setValue(rpcRequest.get(lwm2mClientRpcRequest.valueKey).getAsString());
456 } 457 }
457 if (rpcRequest.has(lwm2mClientRpcRequest.paramsKey) && rpcRequest.get(lwm2mClientRpcRequest.paramsKey).isJsonObject()) { 458 if (rpcRequest.has(lwm2mClientRpcRequest.paramsKey) && rpcRequest.get(lwm2mClientRpcRequest.paramsKey).isJsonObject()) {
458 - lwm2mClientRpcRequest.setParams(new Gson().fromJson(rpcRequest.get(lwm2mClientRpcRequest.paramsKey) 459 + ConcurrentHashMap<String, Object> params = new Gson().fromJson(rpcRequest.get(lwm2mClientRpcRequest.paramsKey)
459 .getAsJsonObject().toString(), new TypeToken<ConcurrentHashMap<String, Object>>() { 460 .getAsJsonObject().toString(), new TypeToken<ConcurrentHashMap<String, Object>>() {
460 - }.getType())); 461 + }.getType());
  462 + if (WRITE_UPDATE == lwm2mClientRpcRequest.getTypeOper()) {
  463 + ConcurrentHashMap<String, Object> paramsResourceId = convertParamsToResourceId (params, sessionInfo);
  464 + if (paramsResourceId.size() > 0) {
  465 + lwm2mClientRpcRequest.setParams(paramsResourceId);
  466 + }
  467 + }
  468 + else {
  469 + lwm2mClientRpcRequest.setParams(params);
  470 + }
  471 + }
  472 + else if (rpcRequest.has(lwm2mClientRpcRequest.paramsKey) && rpcRequest.get(lwm2mClientRpcRequest.paramsKey).isJsonArray()) {
  473 + new Gson().fromJson(rpcRequest.get(lwm2mClientRpcRequest.paramsKey)
  474 + .getAsJsonObject().toString(), new TypeToken<ConcurrentHashMap<String, Object>>() {
  475 + }.getType());
461 } 476 }
462 lwm2mClientRpcRequest.setSessionInfo(sessionInfo); 477 lwm2mClientRpcRequest.setSessionInfo(sessionInfo);
463 if (OBSERVE_READ_ALL != lwm2mClientRpcRequest.getTypeOper() && lwm2mClientRpcRequest.getTargetIdVer() == null) { 478 if (OBSERVE_READ_ALL != lwm2mClientRpcRequest.getTypeOper() && lwm2mClientRpcRequest.getTargetIdVer() == null) {
@@ -484,6 +499,21 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler @@ -484,6 +499,21 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
484 return lwm2mClientRpcRequest; 499 return lwm2mClientRpcRequest;
485 } 500 }
486 501
  502 + private ConcurrentHashMap<String, Object> convertParamsToResourceId (ConcurrentHashMap<String, Object> params,
  503 + SessionInfoProto sessionInfo) {
  504 + ConcurrentHashMap<String, Object> paramsIdVer = new ConcurrentHashMap<>();
  505 + params.forEach((k, v) -> {
  506 + String targetIdVer = this.getPresentPathIntoProfile(sessionInfo, k);
  507 + if (targetIdVer != null ) {
  508 + LwM2mPath targetId = new LwM2mPath(convertPathFromIdVerToObjectId(targetIdVer));
  509 + if (targetId.isResource()) {
  510 + paramsIdVer.put(String.valueOf(targetId.getResourceId()), v);
  511 + }
  512 + }
  513 + });
  514 + return paramsIdVer;
  515 + }
  516 +
487 public void sentRpcRequest(Lwm2mClientRpcRequest rpcRequest, String requestCode, String msg, String typeMsg) { 517 public void sentRpcRequest(Lwm2mClientRpcRequest rpcRequest, String requestCode, String msg, String typeMsg) {
488 rpcRequest.setResponseCode(requestCode); 518 rpcRequest.setResponseCode(requestCode);
489 if (LOG_LW2M_ERROR.equals(typeMsg)) { 519 if (LOG_LW2M_ERROR.equals(typeMsg)) {
@@ -197,8 +197,18 @@ public class LwM2mTransportRequest { @@ -197,8 +197,18 @@ public class LwM2mTransportRequest {
197 targetIdVer, params, 197 targetIdVer, params,
198 this.config.getModelProvider(), 198 this.config.getModelProvider(),
199 this.converter); 199 this.converter);
200 - request = new WriteRequest(WriteRequest.Mode.UPDATE, contentFormat, resultIds.getObjectId(),  
201 - resultIds.getObjectInstanceId(), resources); 200 + if (resources.size()>0) {
  201 + request = new WriteRequest(WriteRequest.Mode.UPDATE, contentFormat, resultIds.getObjectId(),
  202 + resultIds.getObjectInstanceId(), resources);
  203 + }
  204 + else {
  205 + Lwm2mClientRpcRequest rpcRequestClone = (Lwm2mClientRpcRequest) rpcRequest.clone();
  206 + if (rpcRequestClone != null) {
  207 + String errorMsg = String.format("Path %s params is not valid", targetIdVer);
  208 + serviceImpl.sentRpcRequest(rpcRequestClone, BAD_REQUEST.getName(), errorMsg, LOG_LW2M_ERROR);
  209 + rpcRequest = null;
  210 + }
  211 + }
202 } 212 }
203 } else if (resultIds.getObjectId() >= 0) { 213 } else if (resultIds.getObjectId() >= 0) {
204 request = new ObserveRequest(resultIds.getObjectId()); 214 request = new ObserveRequest(resultIds.getObjectId());
@@ -218,7 +228,8 @@ public class LwM2mTransportRequest { @@ -218,7 +228,8 @@ public class LwM2mTransportRequest {
218 } catch (ClientSleepingException e) { 228 } catch (ClientSleepingException e) {
219 DownlinkRequest finalRequest = request; 229 DownlinkRequest finalRequest = request;
220 long finalTimeoutInMs = timeoutInMs; 230 long finalTimeoutInMs = timeoutInMs;
221 - lwM2MClient.getQueuedRequests().add(() -> sendRequest(registration, lwM2MClient, finalRequest, finalTimeoutInMs, rpcRequest)); 231 + Lwm2mClientRpcRequest finalRpcRequest = rpcRequest;
  232 + lwM2MClient.getQueuedRequests().add(() -> sendRequest(registration, lwM2MClient, finalRequest, finalTimeoutInMs, finalRpcRequest));
222 } catch (Exception e) { 233 } catch (Exception e) {
223 log.error("[{}] [{}] [{}] Failed to send downlink.", registration.getEndpoint(), targetIdVer, typeOper.name(), e); 234 log.error("[{}] [{}] [{}] Failed to send downlink.", registration.getEndpoint(), targetIdVer, typeOper.name(), e);
224 } 235 }
@@ -107,4 +107,14 @@ public class Lwm2mClientRpcRequest { @@ -107,4 +107,14 @@ public class Lwm2mClientRpcRequest {
107 .setRequestId(this.requestId) 107 .setRequestId(this.requestId)
108 .build(); 108 .build();
109 } 109 }
  110 +
  111 + @Override
  112 + public Object clone() {
  113 + try {
  114 + return super.clone();
  115 + } catch (CloneNotSupportedException e) {
  116 + e.printStackTrace();
  117 + }
  118 + return null;
  119 + }
110 } 120 }