From b7581e08e73db708310181b2c7abacab53476726 Mon Sep 17 00:00:00 2001 From: nickAS21 Date: Tue, 6 Jan 2026 16:07:04 +0200 Subject: [PATCH] fix bug coap unicast/multicast request --- .../callback/AbstractSyncSessionCallback.java | 6 ++++++ .../coap/client/DefaultCoapClientContext.java | 17 +++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/callback/AbstractSyncSessionCallback.java b/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/callback/AbstractSyncSessionCallback.java index a1bfb004b8..24ddaadb68 100644 --- a/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/callback/AbstractSyncSessionCallback.java +++ b/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/callback/AbstractSyncSessionCallback.java @@ -78,6 +78,12 @@ public abstract class AbstractSyncSessionCallback implements SessionMsgListener return false; } } + public static boolean isMulticastRequest(TbCoapObservationState state) { + if (state != null) { + return state.getExchange().advanced().getRequest().isMulticast(); + } + return false; + } protected void respond(Response response) { response.getOptions().setContentFormat(TbCoapContentFormatUtil.getContentFormat(exchange.getRequestOptions().getContentFormat(), state.getContentFormat())); diff --git a/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/client/DefaultCoapClientContext.java b/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/client/DefaultCoapClientContext.java index 5c17cb75e8..422721f671 100644 --- a/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/client/DefaultCoapClientContext.java +++ b/common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/client/DefaultCoapClientContext.java @@ -19,6 +19,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.eclipse.californium.core.coap.CoAP; import org.eclipse.californium.core.coap.Response; +import org.eclipse.californium.core.config.CoapConfig; import org.eclipse.californium.core.observe.ObserveRelation; import org.eclipse.californium.core.server.resources.CoapExchange; import org.springframework.context.annotation.Lazy; @@ -514,7 +515,8 @@ public class DefaultCoapClientContext implements CoapClientContext { if (attrs != null) { try { boolean conRequest = AbstractSyncSessionCallback.isConRequest(state.getAttrs()); - int requestId = getNextMsgId(); + boolean isMulticastRequest = AbstractSyncSessionCallback.isMulticastRequest(state.getAttrs()); + int requestId = getNextMsgId(isMulticastRequest); Response response = state.getAdaptor().convertToPublish(msg); response.getOptions().setObserve(attrs.getObserveCounter().getAndIncrement()); response.setConfirmable(conRequest); @@ -578,7 +580,8 @@ public class DefaultCoapClientContext implements CoapClientContext { boolean sent = false; String error = null; boolean conRequest = AbstractSyncSessionCallback.isConRequest(state.getRpc()); - int requestId = getNextMsgId(); + boolean isMulticastRequest = AbstractSyncSessionCallback.isMulticastRequest(state.getRpc()); + int requestId = getNextMsgId(isMulticastRequest); try { Response response = state.getAdaptor().convertToPublish(msg, state.getConfiguration().getRpcRequestDynamicMessageBuilder()); response.getOptions().setObserve(state.getRpc().getObserveCounter().getAndIncrement()); @@ -807,8 +810,14 @@ public class DefaultCoapClientContext implements CoapClientContext { } } - protected int getNextMsgId() { - return ThreadLocalRandom.current().nextInt(NONE, MAX_MID + 1); + protected int getNextMsgId(boolean multicast) { + if (multicast) { + // Range [65000...65535] + return ThreadLocalRandom.current().nextInt(CoapConfig.DEFAULT_MULTICAST_BASE_MID, MAX_MID + 1); + } else { + // Range [0...64999] + return ThreadLocalRandom.current().nextInt(NONE, CoapConfig.DEFAULT_MULTICAST_BASE_MID); + } } private void cancelRpcSubscription(TbCoapClientState state) {