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 104 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.READ;
105 105 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.LwM2mTypeOper.WRITE_ATTRIBUTES;
106 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 108 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.convertJsonArrayToSet;
108 109 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.convertPathFromIdVerToObjectId;
109 110 import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportUtil.convertPathFromObjectIdToIdVer;
... ... @@ -455,9 +456,23 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
455 456 lwm2mClientRpcRequest.setValue(rpcRequest.get(lwm2mClientRpcRequest.valueKey).getAsString());
456 457 }
457 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 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 477 lwm2mClientRpcRequest.setSessionInfo(sessionInfo);
463 478 if (OBSERVE_READ_ALL != lwm2mClientRpcRequest.getTypeOper() && lwm2mClientRpcRequest.getTargetIdVer() == null) {
... ... @@ -484,6 +499,21 @@ public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler
484 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 517 public void sentRpcRequest(Lwm2mClientRpcRequest rpcRequest, String requestCode, String msg, String typeMsg) {
488 518 rpcRequest.setResponseCode(requestCode);
489 519 if (LOG_LW2M_ERROR.equals(typeMsg)) {
... ...
... ... @@ -197,8 +197,18 @@ public class LwM2mTransportRequest {
197 197 targetIdVer, params,
198 198 this.config.getModelProvider(),
199 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 213 } else if (resultIds.getObjectId() >= 0) {
204 214 request = new ObserveRequest(resultIds.getObjectId());
... ... @@ -218,7 +228,8 @@ public class LwM2mTransportRequest {
218 228 } catch (ClientSleepingException e) {
219 229 DownlinkRequest finalRequest = request;
220 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 233 } catch (Exception e) {
223 234 log.error("[{}] [{}] [{}] Failed to send downlink.", registration.getEndpoint(), targetIdVer, typeOper.name(), e);
224 235 }
... ...
... ... @@ -107,4 +107,14 @@ public class Lwm2mClientRpcRequest {
107 107 .setRequestId(this.requestId)
108 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 }
... ...