Browse Source

Merge pull request #14309 from thingsboard/lwm2m_cid_tests

Set default LwM2M server CID length to 8
pull/14356/head
Viacheslav Klimov 11 months ago
committed by GitHub
parent
commit
3d78c9a72e
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 4
      application/src/main/resources/thingsboard.yml
  2. 6
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength0Test.java
  3. 40
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength16Test.java
  4. 11
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength1Test.java
  5. 39
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength2Test.java
  6. 39
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength4Test.java
  7. 5
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLengthNullTest.java
  8. 65
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLengthTest.java
  9. 19
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_0/NoSecLwM2MIntegrationDtlsCidLengthTest.java
  10. 16
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_0/PskLwm2mIntegrationDtlsCidLengthTest.java
  11. 64
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_1/PskLwm2mIntegrationDtlsCidLengthTest.java
  12. 24
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_16/NoSecLwM2MIntegrationDtlsCidLengthTest.java
  13. 64
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_16/PskLwm2mIntegrationDtlsCidLengthTest.java
  14. 23
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_2/PskLwm2mIntegrationDtlsCidLengthTest.java
  15. 63
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_4/PskLwm2mIntegrationDtlsCidLengthTest.java
  16. 21
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_null/NoSecLwM2MIntegrationDtlsCidLengthTest.java
  17. 17
      application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_null/PskLwm2mIntegrationDtlsCidLengthTest.java
  18. 2
      common/coap-server/src/main/java/org/thingsboard/server/coapserver/TbCoapDtlsSettings.java
  19. 2
      common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/config/LwM2MTransportServerConfig.java
  20. 2
      transport/coap/src/main/resources/tb-coap-transport.yml
  21. 2
      transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml

4
application/src/main/resources/thingsboard.yml

@ -1157,7 +1157,7 @@ transport:
# - A value of 0 means we accept using CID but will not generate one for foreign peer (enables support but not for incoming traffic). # - A value of 0 means we accept using CID but will not generate one for foreign peer (enables support but not for incoming traffic).
# - A value between 0 and <= 4: SingleNodeConnectionIdGenerator is used # - A value between 0 and <= 4: SingleNodeConnectionIdGenerator is used
# - A value that are > 4: MultiNodeConnectionIdGenerator is used # - A value that are > 4: MultiNodeConnectionIdGenerator is used
connection_id_length: "${LWM2M_DTLS_CONNECTION_ID_LENGTH:}" connection_id_length: "${LWM2M_DTLS_CONNECTION_ID_LENGTH:8}"
server: server:
# LwM2M Server ID # LwM2M Server ID
id: "${LWM2M_SERVER_ID:123}" id: "${LWM2M_SERVER_ID:123}"
@ -1345,7 +1345,7 @@ coap:
# - A value of 0 means we accept using CID but will not generate one for foreign peer (enables support but not for incoming traffic). # - A value of 0 means we accept using CID but will not generate one for foreign peer (enables support but not for incoming traffic).
# - A value between 0 and <= 4: SingleNodeConnectionIdGenerator is used # - A value between 0 and <= 4: SingleNodeConnectionIdGenerator is used
# - A value that are > 4: MultiNodeConnectionIdGenerator is used # - A value that are > 4: MultiNodeConnectionIdGenerator is used
connection_id_length: "${COAP_DTLS_CONNECTION_ID_LENGTH:}" connection_id_length: "${COAP_DTLS_CONNECTION_ID_LENGTH:8}"
# Specify the MTU (Maximum Transmission Unit). # Specify the MTU (Maximum Transmission Unit).
# Should be used if LAN MTU is not used, e.g. if IP tunnels are used or if the client uses a smaller value than the LAN MTU. # Should be used if LAN MTU is not used, e.g. if IP tunnels are used or if the client uses a smaller value than the LAN MTU.
# Default = 1024 # Default = 1024

6
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength0Test.java

@ -29,10 +29,12 @@ import org.thingsboard.server.dao.service.DaoSqlTest;
public abstract class AbstractSecurityLwM2MIntegrationDtlsCidLength0Test extends AbstractSecurityLwM2MIntegrationDtlsCidLengthTest { public abstract class AbstractSecurityLwM2MIntegrationDtlsCidLength0Test extends AbstractSecurityLwM2MIntegrationDtlsCidLengthTest {
private static final Integer serverDtlsCidLength = 0;
protected void testNoSecDtlsCidLength(Integer dtlsCidLength) throws Exception { protected void testNoSecDtlsCidLength(Integer dtlsCidLength) throws Exception {
testNoSecDtlsCidLength(dtlsCidLength, 0); testNoSecDtlsCidLength(dtlsCidLength, serverDtlsCidLength);
} }
protected void testPskDtlsCidLength(Integer dtlsCidLength) throws Exception { protected void testPskDtlsCidLength(Integer dtlsCidLength) throws Exception {
testPskDtlsCidLength(dtlsCidLength, 0); testPskDtlsCidLength(dtlsCidLength, serverDtlsCidLength);
} }
} }

40
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength16Test.java

@ -0,0 +1,40 @@
/**
* Copyright © 2016-2025 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.transport.lwm2m.security.cid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.test.context.TestPropertySource;
import org.thingsboard.server.dao.service.DaoSqlTest;
@TestPropertySource(properties = {
"transport.lwm2m.dtls.connection_id_length=16"
})
@DaoSqlTest
@Slf4j
public abstract class AbstractSecurityLwM2MIntegrationDtlsCidLength16Test extends AbstractSecurityLwM2MIntegrationDtlsCidLengthTest {
private static final Integer serverDtlsCidLength = 16;
protected void testNoSecDtlsCidLength(Integer clientDtlsCidLength) throws Exception {
testNoSecDtlsCidLength(clientDtlsCidLength, serverDtlsCidLength);
}
protected void testPskDtlsCidLength(Integer clientDtlsCidLength) throws Exception {
testPskDtlsCidLength(clientDtlsCidLength, serverDtlsCidLength);
}
}

11
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength3Test.java → application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength1Test.java

@ -21,17 +21,20 @@ import org.thingsboard.server.dao.service.DaoSqlTest;
@TestPropertySource(properties = { @TestPropertySource(properties = {
"transport.lwm2m.dtls.connection_id_length=3" "transport.lwm2m.dtls.connection_id_length=1"
}) })
@DaoSqlTest @DaoSqlTest
@Slf4j @Slf4j
public abstract class AbstractSecurityLwM2MIntegrationDtlsCidLength3Test extends AbstractSecurityLwM2MIntegrationDtlsCidLengthTest { public abstract class AbstractSecurityLwM2MIntegrationDtlsCidLength1Test extends AbstractSecurityLwM2MIntegrationDtlsCidLengthTest {
private static final Integer serverDtlsCidLength = 1;
protected void testNoSecDtlsCidLength(Integer dtlsCidLength) throws Exception { protected void testNoSecDtlsCidLength(Integer dtlsCidLength) throws Exception {
testNoSecDtlsCidLength(dtlsCidLength, 3); testNoSecDtlsCidLength(dtlsCidLength, serverDtlsCidLength);
} }
protected void testPskDtlsCidLength(Integer dtlsCidLength) throws Exception { protected void testPskDtlsCidLength(Integer dtlsCidLength) throws Exception {
testPskDtlsCidLength(dtlsCidLength, 3); testPskDtlsCidLength(dtlsCidLength, serverDtlsCidLength);
} }
} }

39
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength2Test.java

@ -0,0 +1,39 @@
/**
* Copyright © 2016-2025 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.transport.lwm2m.security.cid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.test.context.TestPropertySource;
import org.thingsboard.server.dao.service.DaoSqlTest;
@TestPropertySource(properties = {
"transport.lwm2m.dtls.connection_id_length=2"
})
@DaoSqlTest
@Slf4j
public abstract class AbstractSecurityLwM2MIntegrationDtlsCidLength2Test extends AbstractSecurityLwM2MIntegrationDtlsCidLengthTest {
private static final Integer serverDtlsCidLength = 2;
protected void testNoSecDtlsCidLength(Integer dtlsCidLength) throws Exception {
testNoSecDtlsCidLength(dtlsCidLength, serverDtlsCidLength);
}
protected void testPskDtlsCidLength(Integer dtlsCidLength) throws Exception {
testPskDtlsCidLength(dtlsCidLength, serverDtlsCidLength);
}
}

39
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLength4Test.java

@ -0,0 +1,39 @@
/**
* Copyright © 2016-2025 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.transport.lwm2m.security.cid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.test.context.TestPropertySource;
import org.thingsboard.server.dao.service.DaoSqlTest;
@TestPropertySource(properties = {
"transport.lwm2m.dtls.connection_id_length=4"
})
@DaoSqlTest
@Slf4j
public abstract class AbstractSecurityLwM2MIntegrationDtlsCidLength4Test extends AbstractSecurityLwM2MIntegrationDtlsCidLengthTest {
private static final Integer serverDtlsCidLength = 4;
protected void testNoSecDtlsCidLength(Integer dtlsCidLength) throws Exception {
testNoSecDtlsCidLength(dtlsCidLength, serverDtlsCidLength);
}
protected void testPskDtlsCidLength(Integer dtlsCidLength) throws Exception {
testPskDtlsCidLength(dtlsCidLength, serverDtlsCidLength);
}
}

5
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLengthNullTest.java

@ -28,11 +28,12 @@ import org.thingsboard.server.dao.service.DaoSqlTest;
@Slf4j @Slf4j
public abstract class AbstractSecurityLwM2MIntegrationDtlsCidLengthNullTest extends AbstractSecurityLwM2MIntegrationDtlsCidLengthTest { public abstract class AbstractSecurityLwM2MIntegrationDtlsCidLengthNullTest extends AbstractSecurityLwM2MIntegrationDtlsCidLengthTest {
private static final Integer serverDtlsCidLength = null;
protected void testNoSecDtlsCidLength(Integer dtlsCidLength) throws Exception { protected void testNoSecDtlsCidLength(Integer dtlsCidLength) throws Exception {
testNoSecDtlsCidLength(dtlsCidLength, null); testNoSecDtlsCidLength(dtlsCidLength, serverDtlsCidLength);
} }
protected void testPskDtlsCidLength(Integer dtlsCidLength) throws Exception { protected void testPskDtlsCidLength(Integer dtlsCidLength) throws Exception {
testPskDtlsCidLength(dtlsCidLength, null); testPskDtlsCidLength(dtlsCidLength, serverDtlsCidLength);
} }
} }

65
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/AbstractSecurityLwM2MIntegrationDtlsCidLengthTest.java

@ -17,14 +17,23 @@ package org.thingsboard.server.transport.lwm2m.security.cid;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.eclipse.californium.elements.config.Configuration; import org.eclipse.californium.elements.config.Configuration;
import org.eclipse.californium.scandium.DTLSConnector;
import org.eclipse.californium.scandium.dtls.Connection;
import org.eclipse.californium.scandium.dtls.ConnectionId;
import org.eclipse.californium.scandium.dtls.InMemoryReadWriteLockConnectionStore;
import org.eclipse.californium.scandium.dtls.ResumptionSupportingConnectionStore;
import org.eclipse.leshan.client.californium.endpoint.CaliforniumClientEndpoint; import org.eclipse.leshan.client.californium.endpoint.CaliforniumClientEndpoint;
import org.eclipse.leshan.client.californium.endpoint.CaliforniumClientEndpointsProvider; import org.eclipse.leshan.client.californium.endpoint.CaliforniumClientEndpointsProvider;
import org.eclipse.leshan.client.servers.LwM2mServer;
import org.eclipse.leshan.core.peer.IpPeer;
import org.junit.Assert; import org.junit.Assert;
import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Device;
import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceProfile;
import org.thingsboard.server.dao.service.DaoSqlTest; import org.thingsboard.server.dao.service.DaoSqlTest;
import org.thingsboard.server.transport.lwm2m.security.AbstractSecurityLwM2MIntegrationTest; import org.thingsboard.server.transport.lwm2m.security.AbstractSecurityLwM2MIntegrationTest;
import java.lang.reflect.Field;
import java.net.InetSocketAddress;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import static org.awaitility.Awaitility.await; import static org.awaitility.Awaitility.await;
@ -39,13 +48,13 @@ public abstract class AbstractSecurityLwM2MIntegrationDtlsCidLengthTest extends
protected String awaitAlias; protected String awaitAlias;
protected void testNoSecDtlsCidLength(Integer dtlsCidLength, Integer serverDtlsCidLength) throws Exception { protected void testNoSecDtlsCidLength(Integer clientDtlsCidLength, Integer serverDtlsCidLength) throws Exception {
initDeviceCredentialsNoSek(); initDeviceCredentialsNoSek();
basicTestConnectionDtlsCidLength(dtlsCidLength, serverDtlsCidLength); basicTestConnectionDtlsCidLength(clientDtlsCidLength, serverDtlsCidLength);
} }
protected void testPskDtlsCidLength(Integer dtlsCidLength, Integer serverDtlsCidLength) throws Exception { protected void testPskDtlsCidLength(Integer clientDtlsCidLength, Integer serverDtlsCidLength) throws Exception {
initDeviceCredentialsPsk(); initDeviceCredentialsPsk();
basicTestConnectionDtlsCidLength(dtlsCidLength, serverDtlsCidLength); basicTestConnectionDtlsCidLength(clientDtlsCidLength, serverDtlsCidLength);
} }
protected void basicTestConnectionDtlsCidLength(Integer clientDtlsCidLength, protected void basicTestConnectionDtlsCidLength(Integer clientDtlsCidLength,
@ -69,19 +78,55 @@ public abstract class AbstractSecurityLwM2MIntegrationDtlsCidLengthTest extends
Assert.assertTrue(lwM2MTestClient.getClientDtlsCid().isEmpty()); Assert.assertTrue(lwM2MTestClient.getClientDtlsCid().isEmpty());
} else { } else {
Assert.assertEquals(2L, lwM2MTestClient.getClientDtlsCid().size()); Assert.assertEquals(2L, lwM2MTestClient.getClientDtlsCid().size());
Assert.assertTrue(lwM2MTestClient.getClientDtlsCid().keySet().contains(ON_READ_CONNECTION_ID)); Assert.assertTrue(lwM2MTestClient.getClientDtlsCid().containsKey(ON_READ_CONNECTION_ID));
Assert.assertTrue(lwM2MTestClient.getClientDtlsCid().keySet().contains(ON_WRITE_CONNECTION_ID)); Assert.assertTrue(lwM2MTestClient.getClientDtlsCid().containsKey(ON_WRITE_CONNECTION_ID));
if (serverDtlsCidLength == null) {
LwM2mServer lwM2mServer = lwM2MTestClient.getLeshanClient().getRegisteredServers().entrySet().stream().findFirst().get().getValue();
CaliforniumClientEndpoint lwM2mClientEndpoint = (CaliforniumClientEndpoint) lwM2MTestClient.getLeshanClient().getEndpoint(lwM2mServer);
Connection connection = getConnection(lwM2mClientEndpoint, lwM2mServer);
ConnectionId clientCid = connection.getConnectionId();
ConnectionId readCid = connection.getEstablishedDtlsContext().getReadConnectionId();
ConnectionId serverCid = connection.getEstablishedDtlsContext().getWriteConnectionId();
if (serverDtlsCidLength == null || clientDtlsCidLength == null) {
// cid is not used
Assert.assertNull(lwM2MTestClient.getClientDtlsCid().get(ON_WRITE_CONNECTION_ID)); Assert.assertNull(lwM2MTestClient.getClientDtlsCid().get(ON_WRITE_CONNECTION_ID));
Assert.assertNull(lwM2MTestClient.getClientDtlsCid().get(ON_READ_CONNECTION_ID)); Assert.assertNull(lwM2MTestClient.getClientDtlsCid().get(ON_READ_CONNECTION_ID));
Assert.assertNull(readCid);
Assert.assertNull(serverCid);
} else { } else {
Assert.assertEquals(serverDtlsCidLength, lwM2MTestClient.getClientDtlsCid().get(ON_WRITE_CONNECTION_ID));
Assert.assertEquals(clientDtlsCidLength, lwM2MTestClient.getClientDtlsCid().get(ON_READ_CONNECTION_ID)); Assert.assertEquals(clientDtlsCidLength, lwM2MTestClient.getClientDtlsCid().get(ON_READ_CONNECTION_ID));
if (clientDtlsCidLength == null) { // cid used
Assert.assertNull(lwM2MTestClient.getClientDtlsCid().get(ON_READ_CONNECTION_ID)); Assert.assertNotNull(clientCid);
Assert.assertNotNull(readCid);
if (clientDtlsCidLength > 0) {
Assert.assertEquals(clientCid, readCid);
}
Assert.assertNotNull(serverCid);
int actualServerCidLength = serverCid.getBytes().length;
int expectedServerCidLength = serverDtlsCidLength;
Assert.assertEquals(expectedServerCidLength, actualServerCidLength);
}
if (clientCid != null) {
int actualClientCidLength = clientCid.getBytes().length;
int expectedClientCidLength;
if (clientDtlsCidLength == null || clientDtlsCidLength == 0) {
expectedClientCidLength = 3;
} else { } else {
Assert.assertEquals(Integer.valueOf(serverDtlsCidLength), lwM2MTestClient.getClientDtlsCid().get(ON_WRITE_CONNECTION_ID)); expectedClientCidLength = clientDtlsCidLength;
} }
Assert.assertEquals(expectedClientCidLength, actualClientCidLength);
} }
} }
} }
private static Connection getConnection(CaliforniumClientEndpoint lwM2mClientEndpoint, LwM2mServer lwM2mServer) throws NoSuchFieldException, IllegalAccessException {
DTLSConnector connector = (DTLSConnector) lwM2mClientEndpoint.getCoapEndpoint().getConnector();
Field field = DTLSConnector.class.getDeclaredField("connectionStore");
field.setAccessible(true);
ResumptionSupportingConnectionStore connectionStore = (InMemoryReadWriteLockConnectionStore) field.get(connector);
InetSocketAddress serverAddr = ((IpPeer) lwM2mServer.getTransportData()).getSocketAddress();
return connectionStore.get(serverAddr);
}
} }

19
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_0/NoSecLwM2MIntegrationDtlsCidLengthTest.java

@ -27,7 +27,7 @@ public class NoSecLwM2MIntegrationDtlsCidLengthTest extends AbstractSecurityLwM2
@Before @Before
public void setUpNoSecDtlsCidLength() { public void setUpNoSecDtlsCidLength() {
transportConfiguration = getTransportConfiguration(OBSERVE_ATTRIBUTES_WITHOUT_PARAMS, getBootstrapServerCredentialsSecure(NO_SEC, NONE)); transportConfiguration = getTransportConfiguration(OBSERVE_ATTRIBUTES_WITHOUT_PARAMS, getBootstrapServerCredentialsSecure(NO_SEC, NONE));
awaitAlias = "await on client state (NoSec_Lwm2m) DtlsCidLength = 0"; awaitAlias = "await on client state (NoSec_Lwm2m) serverDtlsCidLength = 0";
} }
@Test @Test
@ -40,8 +40,23 @@ public class NoSecLwM2MIntegrationDtlsCidLengthTest extends AbstractSecurityLwM2
testNoSecDtlsCidLength(0); testNoSecDtlsCidLength(0);
} }
@Test
public void testWithNoSecConnectLwm2mSuccessClientDtlsCidLength_1() throws Exception {
testNoSecDtlsCidLength(1);
}
@Test @Test
public void testWithNoSecConnectLwm2mSuccessClientDtlsCidLength_2() throws Exception { public void testWithNoSecConnectLwm2mSuccessClientDtlsCidLength_2() throws Exception {
testNoSecDtlsCidLength(2); testNoSecDtlsCidLength(1);
}
@Test
public void testWithNoSecConnectLwm2mSuccessClientDtlsCidLength_4() throws Exception {
testNoSecDtlsCidLength(4);
}
@Test
public void testWithNoSecConnectLwm2mSuccessClientDtlsCidLength_16() throws Exception {
testNoSecDtlsCidLength(16);
} }
} }

16
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_0/PskLwm2mIntegrationDtlsCidLengthTest.java

@ -27,7 +27,7 @@ public class PskLwm2mIntegrationDtlsCidLengthTest extends AbstractSecurityLwM2MI
@Before @Before
public void createProfileRpc() { public void createProfileRpc() {
transportConfiguration = getTransportConfiguration(OBSERVE_ATTRIBUTES_WITHOUT_PARAMS, getBootstrapServerCredentialsSecure(PSK, NONE)); transportConfiguration = getTransportConfiguration(OBSERVE_ATTRIBUTES_WITHOUT_PARAMS, getBootstrapServerCredentialsSecure(PSK, NONE));
awaitAlias = "await on client state (Psk_Lwm2m) DtlsCidLength = 0"; awaitAlias = "await on client state (Psk_Lwm2m) serverDtlsCidLength = 0";
} }
@Test @Test
@ -39,10 +39,24 @@ public class PskLwm2mIntegrationDtlsCidLengthTest extends AbstractSecurityLwM2MI
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_0() throws Exception { public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_0() throws Exception {
testPskDtlsCidLength(0); testPskDtlsCidLength(0);
} }
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_1() throws Exception {
testPskDtlsCidLength(1);
}
@Test @Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_2() throws Exception { public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_2() throws Exception {
testPskDtlsCidLength(2); testPskDtlsCidLength(2);
} }
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_4() throws Exception {
testPskDtlsCidLength(4);
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_16() throws Exception {
testPskDtlsCidLength(16);
}
} }

64
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_1/PskLwm2mIntegrationDtlsCidLengthTest.java

@ -0,0 +1,64 @@
/**
* Copyright © 2016-2025 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.transport.lwm2m.security.cid.serverDtlsCidLength_1;
import org.junit.Before;
import org.junit.Test;
import org.thingsboard.server.transport.lwm2m.security.cid.AbstractSecurityLwM2MIntegrationDtlsCidLength0Test;
import org.thingsboard.server.transport.lwm2m.security.cid.AbstractSecurityLwM2MIntegrationDtlsCidLength1Test;
import static org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MSecurityMode.PSK;
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.LwM2MProfileBootstrapConfigType.NONE;
public class PskLwm2mIntegrationDtlsCidLengthTest extends AbstractSecurityLwM2MIntegrationDtlsCidLength1Test {
@Before
public void createProfileRpc() {
transportConfiguration = getTransportConfiguration(OBSERVE_ATTRIBUTES_WITHOUT_PARAMS, getBootstrapServerCredentialsSecure(PSK, NONE));
awaitAlias = "await on client state (Psk_Lwm2m) serverDtlsCidLength = 1";
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_Null() throws Exception {
testPskDtlsCidLength(null);
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_0() throws Exception {
testPskDtlsCidLength(0);
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_1() throws Exception {
testPskDtlsCidLength(1);
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_2() throws Exception {
testPskDtlsCidLength(2);
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_4() throws Exception {
testPskDtlsCidLength(4);
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_16() throws Exception {
testPskDtlsCidLength(16);
}
}

24
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_3/NoSecLwM2MIntegrationDtlsCidLengthTest.java → application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_16/NoSecLwM2MIntegrationDtlsCidLengthTest.java

@ -13,21 +13,22 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.thingsboard.server.transport.lwm2m.security.cid.serverDtlsCidLength_3; package org.thingsboard.server.transport.lwm2m.security.cid.serverDtlsCidLength_16;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.thingsboard.server.transport.lwm2m.security.cid.AbstractSecurityLwM2MIntegrationDtlsCidLength3Test; import org.thingsboard.server.transport.lwm2m.security.cid.AbstractSecurityLwM2MIntegrationDtlsCidLength16Test;
import org.thingsboard.server.transport.lwm2m.security.cid.AbstractSecurityLwM2MIntegrationDtlsCidLength4Test;
import static org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MSecurityMode.NO_SEC; import static org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MSecurityMode.NO_SEC;
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.LwM2MProfileBootstrapConfigType.NONE; import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.LwM2MProfileBootstrapConfigType.NONE;
public class NoSecLwM2MIntegrationDtlsCidLengthTest extends AbstractSecurityLwM2MIntegrationDtlsCidLength3Test { public class NoSecLwM2MIntegrationDtlsCidLengthTest extends AbstractSecurityLwM2MIntegrationDtlsCidLength16Test {
@Before @Before
public void setUpNoSecDtlsCidLength() { public void setUpNoSecDtlsCidLength() {
transportConfiguration = getTransportConfiguration(OBSERVE_ATTRIBUTES_WITHOUT_PARAMS, getBootstrapServerCredentialsSecure(NO_SEC, NONE)); transportConfiguration = getTransportConfiguration(OBSERVE_ATTRIBUTES_WITHOUT_PARAMS, getBootstrapServerCredentialsSecure(NO_SEC, NONE));
awaitAlias = "await on client state (NoSec_Lwm2m) DtlsCidLength = 3"; awaitAlias = "await on client state (NoSec_Lwm2m) serverDtlsCidLength = 16";
} }
@Test @Test
@ -40,8 +41,23 @@ public class NoSecLwM2MIntegrationDtlsCidLengthTest extends AbstractSecurityLwM2
testNoSecDtlsCidLength(0); testNoSecDtlsCidLength(0);
} }
@Test
public void testWithNoSecConnectLwm2mSuccessClientDtlsCidLength_1() throws Exception {
testNoSecDtlsCidLength(1);
}
@Test @Test
public void testWithNoSecConnectLwm2mSuccessClientDtlsCidLength_2() throws Exception { public void testWithNoSecConnectLwm2mSuccessClientDtlsCidLength_2() throws Exception {
testNoSecDtlsCidLength(2); testNoSecDtlsCidLength(2);
} }
@Test
public void testWithNoSecConnectLwm2mSuccessClientDtlsCidLength_4() throws Exception {
testNoSecDtlsCidLength(4);
}
@Test
public void testWithNoSecConnectLwm2mSuccessClientDtlsCidLength_16() throws Exception {
testNoSecDtlsCidLength(16);
}
} }

64
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_16/PskLwm2mIntegrationDtlsCidLengthTest.java

@ -0,0 +1,64 @@
/**
* Copyright © 2016-2025 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.transport.lwm2m.security.cid.serverDtlsCidLength_16;
import org.junit.Before;
import org.junit.Test;
import org.thingsboard.server.transport.lwm2m.security.cid.AbstractSecurityLwM2MIntegrationDtlsCidLength16Test;
import org.thingsboard.server.transport.lwm2m.security.cid.AbstractSecurityLwM2MIntegrationDtlsCidLength4Test;
import static org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MSecurityMode.PSK;
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.LwM2MProfileBootstrapConfigType.NONE;
public class PskLwm2mIntegrationDtlsCidLengthTest extends AbstractSecurityLwM2MIntegrationDtlsCidLength16Test {
@Before
public void createProfileRpc() {
transportConfiguration = getTransportConfiguration(OBSERVE_ATTRIBUTES_WITHOUT_PARAMS, getBootstrapServerCredentialsSecure(PSK, NONE));
awaitAlias = "await on client state (Psk_Lwm2m) serverDtlsCidLength = 16";
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_Null() throws Exception {
testPskDtlsCidLength(null);
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_0() throws Exception {
testPskDtlsCidLength(0);
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_1() throws Exception {
testPskDtlsCidLength(1);
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_2() throws Exception {
testPskDtlsCidLength(2);
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_4() throws Exception {
testPskDtlsCidLength(4);
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_16() throws Exception {
testPskDtlsCidLength(16);
}
}

23
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_3/PskLwm2mIntegrationDtlsCidLengthTest.java → application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_2/PskLwm2mIntegrationDtlsCidLengthTest.java

@ -13,21 +13,21 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.thingsboard.server.transport.lwm2m.security.cid.serverDtlsCidLength_3; package org.thingsboard.server.transport.lwm2m.security.cid.serverDtlsCidLength_2;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.thingsboard.server.transport.lwm2m.security.cid.AbstractSecurityLwM2MIntegrationDtlsCidLength3Test; import org.thingsboard.server.transport.lwm2m.security.cid.AbstractSecurityLwM2MIntegrationDtlsCidLength2Test;
import static org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MSecurityMode.PSK; import static org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MSecurityMode.PSK;
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.LwM2MProfileBootstrapConfigType.NONE; import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.LwM2MProfileBootstrapConfigType.NONE;
public class PskLwm2mIntegrationDtlsCidLengthTest extends AbstractSecurityLwM2MIntegrationDtlsCidLength3Test { public class PskLwm2mIntegrationDtlsCidLengthTest extends AbstractSecurityLwM2MIntegrationDtlsCidLength2Test {
@Before @Before
public void createProfileRpc() { public void createProfileRpc() {
transportConfiguration = getTransportConfiguration(OBSERVE_ATTRIBUTES_WITHOUT_PARAMS, getBootstrapServerCredentialsSecure(PSK, NONE)); transportConfiguration = getTransportConfiguration(OBSERVE_ATTRIBUTES_WITHOUT_PARAMS, getBootstrapServerCredentialsSecure(PSK, NONE));
awaitAlias = "await on client state (Psk_Lwm2m) DtlsCidLength = 3"; awaitAlias = "await on client state (Psk_Lwm2m) serverDtlsCidLength = 2";
} }
@Test @Test
@ -40,9 +40,24 @@ public class PskLwm2mIntegrationDtlsCidLengthTest extends AbstractSecurityLwM2MI
testPskDtlsCidLength(0); testPskDtlsCidLength(0);
} }
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_1() throws Exception {
testPskDtlsCidLength(1);
}
@Test @Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_2() throws Exception { public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_2() throws Exception {
testPskDtlsCidLength(2); testPskDtlsCidLength(2);
} }
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_4() throws Exception {
testPskDtlsCidLength(4);
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_16() throws Exception {
testPskDtlsCidLength(16);
}
} }

63
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_4/PskLwm2mIntegrationDtlsCidLengthTest.java

@ -0,0 +1,63 @@
/**
* Copyright © 2016-2025 The Thingsboard Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.thingsboard.server.transport.lwm2m.security.cid.serverDtlsCidLength_4;
import org.junit.Before;
import org.junit.Test;
import org.thingsboard.server.transport.lwm2m.security.cid.AbstractSecurityLwM2MIntegrationDtlsCidLength4Test;
import static org.thingsboard.server.common.data.device.credentials.lwm2m.LwM2MSecurityMode.PSK;
import static org.thingsboard.server.transport.lwm2m.Lwm2mTestHelper.LwM2MProfileBootstrapConfigType.NONE;
public class PskLwm2mIntegrationDtlsCidLengthTest extends AbstractSecurityLwM2MIntegrationDtlsCidLength4Test {
@Before
public void createProfileRpc() {
transportConfiguration = getTransportConfiguration(OBSERVE_ATTRIBUTES_WITHOUT_PARAMS, getBootstrapServerCredentialsSecure(PSK, NONE));
awaitAlias = "await on client state (Psk_Lwm2m) serverDtlsCidLength = 4";
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_Null() throws Exception {
testPskDtlsCidLength(null);
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_0() throws Exception {
testPskDtlsCidLength(0);
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_1() throws Exception {
testPskDtlsCidLength(1);
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_2() throws Exception {
testPskDtlsCidLength(2);
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_4() throws Exception {
testPskDtlsCidLength(4);
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_16() throws Exception {
testPskDtlsCidLength(16);
}
}

21
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_null/NoSecLwM2MIntegrationDtlsCidLengthTest.java

@ -27,7 +27,7 @@ public class NoSecLwM2MIntegrationDtlsCidLengthTest extends AbstractSecurityLwM2
@Before @Before
public void setUpNoSecDtlsCidLength() { public void setUpNoSecDtlsCidLength() {
transportConfiguration = getTransportConfiguration(OBSERVE_ATTRIBUTES_WITHOUT_PARAMS, getBootstrapServerCredentialsSecure(NO_SEC, NONE)); transportConfiguration = getTransportConfiguration(OBSERVE_ATTRIBUTES_WITHOUT_PARAMS, getBootstrapServerCredentialsSecure(NO_SEC, NONE));
awaitAlias = "await on client state (NoSec_Lwm2m) DtlsCidLength = Null"; awaitAlias = "await on client state (NoSec_Lwm2m) serverDtlsCidLength = Null";
} }
@Test @Test
@ -41,7 +41,22 @@ public class NoSecLwM2MIntegrationDtlsCidLengthTest extends AbstractSecurityLwM2
} }
@Test @Test
public void testWithNoSecConnectLwm2mSuccessClientDtlsCidLength_2() throws Exception { public void testWithNoSecConnectLwm2mSuccessClientDtlsCidLength_1() throws Exception {
testNoSecDtlsCidLength(2); testNoSecDtlsCidLength(1);
}
@Test
public void testWithNoSecConnectLwm2mSuccessClientDtlsCidLength_4() throws Exception {
testNoSecDtlsCidLength(4);
}
@Test
public void testWithNoSecConnectLwm2mSuccessClientDtlsCidLength_8() throws Exception {
testNoSecDtlsCidLength(8);
}
@Test
public void testWithNoSecConnectLwm2mSuccessClientDtlsCidLength_16() throws Exception {
testNoSecDtlsCidLength(16);
} }
} }

17
application/src/test/java/org/thingsboard/server/transport/lwm2m/security/cid/serverDtlsCidLength_null/PskLwm2mIntegrationDtlsCidLengthTest.java

@ -27,7 +27,7 @@ public class PskLwm2mIntegrationDtlsCidLengthTest extends AbstractSecurityLwM2MI
@Before @Before
public void createProfileRpc() { public void createProfileRpc() {
transportConfiguration = getTransportConfiguration(OBSERVE_ATTRIBUTES_WITHOUT_PARAMS, getBootstrapServerCredentialsSecure(PSK, NONE)); transportConfiguration = getTransportConfiguration(OBSERVE_ATTRIBUTES_WITHOUT_PARAMS, getBootstrapServerCredentialsSecure(PSK, NONE));
awaitAlias = "await on client state (Psk_Lwm2m) DtlsCidLength = Null"; awaitAlias = "await on client state (Psk_Lwm2m) serverDtlsCidLength = Null";
} }
@Test @Test
@ -40,9 +40,24 @@ public class PskLwm2mIntegrationDtlsCidLengthTest extends AbstractSecurityLwM2MI
testPskDtlsCidLength(0); testPskDtlsCidLength(0);
} }
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_1() throws Exception {
testPskDtlsCidLength(1);
}
@Test @Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_2() throws Exception { public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_2() throws Exception {
testPskDtlsCidLength(2); testPskDtlsCidLength(2);
} }
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_4() throws Exception {
testPskDtlsCidLength(4);
}
@Test
public void testWithPskConnectLwm2mSuccessClientDtlsCidLength_16() throws Exception {
testPskDtlsCidLength(16);
}
} }

2
common/coap-server/src/main/java/org/thingsboard/server/coapserver/TbCoapDtlsSettings.java

@ -66,7 +66,7 @@ public class TbCoapDtlsSettings {
@Value("${coap.dtls.retransmission_timeout:9000}") @Value("${coap.dtls.retransmission_timeout:9000}")
private int dtlsRetransmissionTimeout; private int dtlsRetransmissionTimeout;
@Value("${coap.dtls.connection_id_length:}") @Value("${coap.dtls.connection_id_length:8}")
private Integer cIdLength; private Integer cIdLength;
@Value("${coap.dtls.max_transmission_unit:1024}") @Value("${coap.dtls.max_transmission_unit:1024}")

2
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/config/LwM2MTransportServerConfig.java

@ -43,7 +43,7 @@ public class LwM2MTransportServerConfig implements LwM2MSecureServerConfig {
private int dtlsRetransmissionTimeout; private int dtlsRetransmissionTimeout;
@Getter @Getter
@Value("${transport.lwm2m.dtls.connection_id_length:}") @Value("${transport.lwm2m.dtls.connection_id_length:8}")
private Integer dtlsCidLength; private Integer dtlsCidLength;
@Getter @Getter

2
transport/coap/src/main/resources/tb-coap-transport.yml

@ -193,7 +193,7 @@ coap:
# - A value of 0 means we accept using CID but will not generate one for foreign peer (enables support but not for incoming traffic). # - A value of 0 means we accept using CID but will not generate one for foreign peer (enables support but not for incoming traffic).
# - A value between 0 and <= 4: SingleNodeConnectionIdGenerator is used # - A value between 0 and <= 4: SingleNodeConnectionIdGenerator is used
# - A value that are > 4: MultiNodeConnectionIdGenerator is used # - A value that are > 4: MultiNodeConnectionIdGenerator is used
connection_id_length: "${COAP_DTLS_CONNECTION_ID_LENGTH:}" connection_id_length: "${COAP_DTLS_CONNECTION_ID_LENGTH:8}"
# Specify the MTU (Maximum Transmission Unit). # Specify the MTU (Maximum Transmission Unit).
# Should be used if LAN MTU is not used, e.g. if IP tunnels are used or if the client uses a smaller value than the LAN MTU. # Should be used if LAN MTU is not used, e.g. if IP tunnels are used or if the client uses a smaller value than the LAN MTU.
# Default = 1024 # Default = 1024

2
transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml

@ -173,7 +173,7 @@ transport:
# - A value of 0 means we accept using CID but will not generate one for foreign peer (enables support but not for incoming traffic). # - A value of 0 means we accept using CID but will not generate one for foreign peer (enables support but not for incoming traffic).
# - A value between 0 and <= 4: SingleNodeConnectionIdGenerator is used # - A value between 0 and <= 4: SingleNodeConnectionIdGenerator is used
# - A value that are > 4: MultiNodeConnectionIdGenerator is used # - A value that are > 4: MultiNodeConnectionIdGenerator is used
connection_id_length: "${LWM2M_DTLS_CONNECTION_ID_LENGTH:}" connection_id_length: "${LWM2M_DTLS_CONNECTION_ID_LENGTH:8}"
server: server:
# LwM2M Server ID # LwM2M Server ID
id: "${LWM2M_SERVER_ID:123}" id: "${LWM2M_SERVER_ID:123}"

Loading…
Cancel
Save