From b5da59e3b38e230ac50639020ab2c96b54cac5fa Mon Sep 17 00:00:00 2001 From: YevhenBondarenko Date: Tue, 28 Sep 2021 23:26:50 +0300 Subject: [PATCH] fixed double sending rpc (private network) --- .../server/transport/lwm2m/server/client/LwM2mClient.java | 4 ++++ .../lwm2m/server/rpc/DefaultLwM2MRpcRequestHandler.java | 3 +++ .../lwm2m/server/rpc/RpcDownlinkRequestCallbackProxy.java | 2 ++ 3 files changed, 9 insertions(+) diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClient.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClient.java index ff587f50c5..446f447623 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClient.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClient.java @@ -117,6 +117,10 @@ public class LwM2mClient implements Serializable { @Getter private final AtomicInteger retryAttempts; + @Getter + @Setter + private Integer lastSentRpcId; + public Object clone() throws CloneNotSupportedException { return super.clone(); } diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/DefaultLwM2MRpcRequestHandler.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/DefaultLwM2MRpcRequestHandler.java index bdc5dcc819..5fcc8a6826 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/DefaultLwM2MRpcRequestHandler.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/DefaultLwM2MRpcRequestHandler.java @@ -95,6 +95,9 @@ public class DefaultLwM2MRpcRequestHandler implements LwM2MRpcRequestHandler { this.sendErrorRpcResponse(sessionInfo, rpcRequest.getRequestId(), ResponseCode.INTERNAL_SERVER_ERROR, "Registration is empty"); return; } + if (client.getLastSentRpcId() != null && client.getLastSentRpcId().equals(rpcRequest.getRequestId())) { + log.info("[{}] Rpc has already sent!", rpcRequest.getRequestId()); + } try { if (operationType.isHasObjectId()) { String objectId = getIdFromParameters(client, rpcRequest); diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcDownlinkRequestCallbackProxy.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcDownlinkRequestCallbackProxy.java index 5361682491..dbc0b020e5 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcDownlinkRequestCallbackProxy.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/rpc/RpcDownlinkRequestCallbackProxy.java @@ -45,6 +45,7 @@ public abstract class RpcDownlinkRequestCallbackProxy implements DownlinkR @Override public void onSent(R request) { + client.setLastSentRpcId(this.request.getRequestId()); transportService.process(client.getSession(), this.request, RpcStatus.SENT, TransportServiceCallback.EMPTY); } @@ -68,6 +69,7 @@ public abstract class RpcDownlinkRequestCallbackProxy implements DownlinkR @Override public void onError(String params, Exception e) { if (e instanceof TimeoutException || e instanceof org.eclipse.leshan.core.request.exception.TimeoutException) { + client.setLastSentRpcId(null); transportService.process(client.getSession(), this.request, RpcStatus.TIMEOUT, TransportServiceCallback.EMPTY); } else if (!(e instanceof ClientSleepingException)) { sendRpcReplyOnError(e);