From 27f493e7973fcaa3375cd99efb57681375c7c543 Mon Sep 17 00:00:00 2001 From: nick Date: Tue, 11 Mar 2025 07:32:13 +0200 Subject: [PATCH 1/4] @nickAS21 fix_bug_lwm2m: add resource "tbfw" and "tbsw" to root coap --- .../server/DefaultLwM2mTransportService.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2mTransportService.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2mTransportService.java index 71290ef0b0..9dcfb62914 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2mTransportService.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2mTransportService.java @@ -18,6 +18,8 @@ package org.thingsboard.server.transport.lwm2m.server; import jakarta.annotation.PreDestroy; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.eclipse.californium.core.CoapResource; +import org.eclipse.californium.core.CoapServer; import org.eclipse.californium.elements.config.Configuration; import org.eclipse.californium.scandium.config.DtlsConfig; import org.eclipse.californium.scandium.dtls.cipher.CipherSuite; @@ -58,6 +60,7 @@ import static org.eclipse.californium.scandium.dtls.cipher.CipherSuite.TLS_PSK_W import static org.eclipse.californium.scandium.dtls.cipher.CipherSuite.TLS_PSK_WITH_AES_128_CCM_8; import static org.thingsboard.server.transport.lwm2m.server.LwM2MNetworkConfig.getCoapConfig; import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FIRMWARE_UPDATE_COAP_RESOURCE; +import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SOFTWARE_UPDATE_COAP_RESOURCE; import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.setDtlsConnectorConfigCidLength; @Slf4j @@ -85,14 +88,6 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService { @AfterStartUp(order = AfterStartUp.AFTER_TRANSPORT_SERVICE) public void init() { this.server = getLhServer(); - /* - * Add a resource to the server. - * CoapResource -> - * path = FW_PACKAGE or SW_PACKAGE - * nameFile = "BC68JAR01A09_TO_BC68JAR01A10.bin" - * "coap://host:port/{path}/{token}/{nameFile}" - */ - new LwM2mTransportCoapResource(otaPackageDataCache, FIRMWARE_UPDATE_COAP_RESOURCE); this.context.setServer(server); this.startLhServer(); } @@ -168,7 +163,7 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService { serverCoapConfig.setTransient(DtlsConfig.DTLS_CONNECTION_ID_LENGTH); if (config.getDtlsCidLength() != null) { - setDtlsConnectorConfigCidLength( serverCoapConfig, config.getDtlsCidLength()); + setDtlsConnectorConfigCidLength(serverCoapConfig, config.getDtlsCidLength()); } /* Create DTLS Config */ @@ -191,6 +186,17 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService { // Create LWM2M server builder.setEndpointsProviders(endpointsBuilder.build()); + LeshanServer leshanServer = builder.build(); + CoapServer coapServer = ((CaliforniumServerEndpointsProvider) (leshanServer.getEndpointsProvider()).toArray()[0]).getCoapServer(); + if (coapServer != null) { + CoapResource root = (CoapResource) coapServer.getRoot(); + if (root == null) { + root = new CoapResource(""); + coapServer.add(root); + } + root.add(new LwM2mTransportCoapResource(otaPackageDataCache, FIRMWARE_UPDATE_COAP_RESOURCE)); + root.add(new LwM2mTransportCoapResource(otaPackageDataCache, SOFTWARE_UPDATE_COAP_RESOURCE)); + } return builder.build(); } From 6214e848acee2562771b8234a130696f1282f334 Mon Sep 17 00:00:00 2001 From: nick Date: Tue, 11 Mar 2025 16:19:43 +0200 Subject: [PATCH 2/4] fix_bug_lwm2m: refactoring --- .../transport/lwm2m/server/DefaultLwM2mTransportService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2mTransportService.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2mTransportService.java index 9dcfb62914..2ca0249b46 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2mTransportService.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2mTransportService.java @@ -197,7 +197,7 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService { root.add(new LwM2mTransportCoapResource(otaPackageDataCache, FIRMWARE_UPDATE_COAP_RESOURCE)); root.add(new LwM2mTransportCoapResource(otaPackageDataCache, SOFTWARE_UPDATE_COAP_RESOURCE)); } - return builder.build(); + return leshanServer; } private void setServerWithCredentials(LeshanServerBuilder builder) { From 730cebea6d5602b1d3f3f139fedba757eb507646 Mon Sep 17 00:00:00 2001 From: nick Date: Thu, 13 Mar 2025 15:08:14 +0200 Subject: [PATCH 3/4] fix_bug_lwm2m: add block2 condition --- .../server/DefaultLwM2mTransportService.java | 5 +-- .../server/LwM2mTransportCoapResource.java | 32 +++++++++++++------ .../lwm2m/utils/LwM2MTransportUtil.java | 7 ++++ 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2mTransportService.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2mTransportService.java index 2ca0249b46..52859eab2f 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2mTransportService.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2mTransportService.java @@ -20,6 +20,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.eclipse.californium.core.CoapResource; import org.eclipse.californium.core.CoapServer; +import org.eclipse.californium.core.config.CoapConfig; import org.eclipse.californium.elements.config.Configuration; import org.eclipse.californium.scandium.config.DtlsConfig; import org.eclipse.californium.scandium.dtls.cipher.CipherSuite; @@ -194,8 +195,8 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService { root = new CoapResource(""); coapServer.add(root); } - root.add(new LwM2mTransportCoapResource(otaPackageDataCache, FIRMWARE_UPDATE_COAP_RESOURCE)); - root.add(new LwM2mTransportCoapResource(otaPackageDataCache, SOFTWARE_UPDATE_COAP_RESOURCE)); + root.add(new LwM2mTransportCoapResource(otaPackageDataCache, FIRMWARE_UPDATE_COAP_RESOURCE, serverCoapConfig.get(CoapConfig.PREFERRED_BLOCK_SIZE), serverCoapConfig.get(CoapConfig.MAX_RESOURCE_BODY_SIZE))); + root.add(new LwM2mTransportCoapResource(otaPackageDataCache, SOFTWARE_UPDATE_COAP_RESOURCE,serverCoapConfig.get(CoapConfig.PREFERRED_BLOCK_SIZE), serverCoapConfig.get(CoapConfig.MAX_RESOURCE_BODY_SIZE))); } return leshanServer; } diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportCoapResource.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportCoapResource.java index 7e9841ea9f..c46b57fb3f 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportCoapResource.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportCoapResource.java @@ -34,16 +34,21 @@ import java.util.concurrent.atomic.AtomicInteger; import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.FIRMWARE_UPDATE_COAP_RESOURCE; import static org.thingsboard.server.transport.lwm2m.server.ota.DefaultLwM2MOtaUpdateService.SOFTWARE_UPDATE_COAP_RESOURCE; +import static org.thingsboard.server.transport.lwm2m.utils.LwM2MTransportUtil.calculateSzx; @Slf4j public class LwM2mTransportCoapResource extends AbstractLwM2mTransportResource { private final ConcurrentMap tokenToObserveRelationMap = new ConcurrentHashMap<>(); private final ConcurrentMap tokenToObserveNotificationSeqMap = new ConcurrentHashMap<>(); private final OtaPackageDataCache otaPackageDataCache; + private final int chunkSize; + private final int maxResourceBodySize; - public LwM2mTransportCoapResource(OtaPackageDataCache otaPackageDataCache, String name) { + public LwM2mTransportCoapResource(OtaPackageDataCache otaPackageDataCache, String name, int chunkSize, int maxResourceBodySize) { super(name); this.otaPackageDataCache = otaPackageDataCache; + this.chunkSize = chunkSize; + this.maxResourceBodySize = maxResourceBodySize; this.setObservable(true); // enable observing this.addObserver(new CoapResourceObserver()); } @@ -136,22 +141,29 @@ public class LwM2mTransportCoapResource extends AbstractLwM2mTransportResource { String idStr = exchange.getRequestOptions().getUriPath().get(exchange.getRequestOptions().getUriPath().size() - 1 ); UUID currentId = UUID.fromString(idStr); + log.info("Start Read ota data (path): [{}]", exchange.getRequestOptions().getUriPath().toString()); Response response = new Response(CoAP.ResponseCode.CONTENT); byte[] otaData = this.getOtaData(currentId); if (otaData != null && otaData.length > 0) { - log.debug("Read ota data (length): [{}]", otaData.length); - response.setPayload(otaData); - if (exchange.getRequestOptions().getBlock2() != null) { - int chunkSize = exchange.getRequestOptions().getBlock2().getSzx(); - boolean lastFlag = otaData.length <= chunkSize; + if (otaData.length <= this.maxResourceBodySize) { + log.info("Read ota data (length): [{}]", otaData.length); + response.setPayload(otaData); + int chunkSize = calculateSzx(this.chunkSize); + if (exchange.getRequestOptions().hasBlock2()) { + chunkSize = exchange.getRequestOptions().getBlock2().getSzx(); + } else if (exchange.getRequestOptions().hasBlock1()) { + chunkSize = exchange.getRequestOptions().getBlock1().getSzx(); + } + log.info("With block2 Send currentId: [{}], length: [{}], chunkSize [{}], moreFlag [{}]", currentId.toString(), otaData.length, chunkSize, false); + boolean lastFlag = otaData.length <= this.chunkSize; response.getOptions().setBlock2(chunkSize, lastFlag, 0); - log.trace("With block2 Send currentId: [{}], length: [{}], chunkSize [{}], moreFlag [{}]", currentId.toString(), otaData.length, chunkSize, lastFlag); + response.setType(CoAP.Type.CON); + exchange.respond(response); } else { - log.trace("With block1 Send currentId: [{}], length: [{}], ", currentId.toString(), otaData.length); + log.info("Ota package size: [{}] is larger than server's MAX_RESOURCE_BODY_SIZE [{}]", otaData.length, this.maxResourceBodySize); } - exchange.respond(response); } else { - log.trace("Ota packaged currentId: [{}] is not found.", currentId.toString()); + log.info("Ota packaged currentId: [{}] is not found.", currentId.toString()); } } diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/utils/LwM2MTransportUtil.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/utils/LwM2MTransportUtil.java index 438bb752aa..3ee83766fe 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/utils/LwM2MTransportUtil.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/utils/LwM2MTransportUtil.java @@ -393,4 +393,11 @@ public class LwM2MTransportUtil { serverCoapConfig.set(DTLS_CONNECTION_ID_NODE_ID, null); } } + + public static int calculateSzx(int size) { + if (size < 16 || size > 1024 || (size & (size - 1)) != 0) { + throw new IllegalArgumentException("Size must be a power of 2 between 16 and 1024."); + } + return (int) (Math.log(size / 16) / Math.log(2)); + } } From aec9fc68f4439c9aad5e165b4338a37b070e1d68 Mon Sep 17 00:00:00 2001 From: nick Date: Fri, 28 Mar 2025 19:19:06 +0200 Subject: [PATCH 4/4] fix_bug_lwm2m: add authorizer to lh server --- .../lwm2m/secure/LwM2mCredentialsSecurityInfoValidator.java | 2 +- .../transport/lwm2m/server/DefaultLwM2mTransportService.java | 1 + .../transport/lwm2m/server/client/LwM2mClientContextImpl.java | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/LwM2mCredentialsSecurityInfoValidator.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/LwM2mCredentialsSecurityInfoValidator.java index f518d0176f..783fe62c80 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/LwM2mCredentialsSecurityInfoValidator.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/secure/LwM2mCredentialsSecurityInfoValidator.java @@ -88,7 +88,7 @@ public class LwM2mCredentialsSecurityInfoValidator { } TbLwM2MSecurityInfo securityInfo = resultSecurityStore[0]; - if (securityInfo.getSecurityMode() == null) { + if (securityInfo != null && securityInfo.getSecurityMode() == null) { throw new LwM2MAuthException(); } return securityInfo; diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2mTransportService.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2mTransportService.java index 52859eab2f..795f40aa20 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2mTransportService.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2mTransportService.java @@ -125,6 +125,7 @@ public class DefaultLwM2mTransportService implements LwM2MTransportService { /* Set securityStore with new registrationStore */ builder.setSecurityStore(securityStore); builder.setRegistrationStore(registrationStore); + builder.setAuthorizer(authorizer); // Create Californium Endpoints Provider: diff --git a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClientContextImpl.java b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClientContextImpl.java index 882fe4fa04..6a4bc645d4 100644 --- a/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClientContextImpl.java +++ b/common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/client/LwM2mClientContextImpl.java @@ -141,7 +141,7 @@ public class LwM2mClientContextImpl implements LwM2mClientContext { } oldSession = client.getSession(); TbLwM2MSecurityInfo securityInfo = securityStore.getTbLwM2MSecurityInfoByEndpoint(client.getEndpoint()); - if (securityInfo.getSecurityMode() != null) { + if (securityInfo != null && securityInfo.getSecurityMode() != null) { if (SecurityMode.X509.equals(securityInfo.getSecurityMode())) { securityStore.registerX509(registration.getEndpoint(), registration.getId()); }