Commit 89c1743fa0549034767a45ee740f8f53114f0ead
Committed by
Andrew Shvayka
1 parent
a8dd25a7
Lwm2m: RPC finish
Showing
3 changed files
with
56 additions
and
5 deletions
... | ... | @@ -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 | } | ... | ... |