Commit 8b3e34f0ef9d853b18eed5136d145f638c3a290d

Authored by Andrii Shvaika
1 parent a787ca9d

Refactoring of LwM2M transport

Showing 16 changed files with 251 additions and 227 deletions
... ... @@ -30,7 +30,8 @@ import org.thingsboard.server.transport.lwm2m.bootstrap.secure.LwM2MBootstrapSec
30 30 import org.thingsboard.server.transport.lwm2m.bootstrap.secure.LwM2MInMemoryBootstrapConfigStore;
31 31 import org.thingsboard.server.transport.lwm2m.bootstrap.secure.LwM2mDefaultBootstrapSessionManager;
32 32 import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportBootstrapConfig;
33   -import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportContextServer;
  33 +import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
  34 +import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportServerHelper;
34 35
35 36 import java.math.BigInteger;
36 37 import java.security.AlgorithmParameters;
... ... @@ -68,10 +69,10 @@ public class LwM2MTransportBootstrapServerConfiguration {
68 69 private boolean pskMode = false;
69 70
70 71 @Autowired
71   - private LwM2MTransportContextBootstrap contextBs;
  72 + private LwM2MTransportServerConfig serverConfig;
72 73
73 74 @Autowired
74   - private LwM2mTransportContextServer contextS;
  75 + private LwM2MTransportContextBootstrap contextBs;
75 76
76 77 @Autowired
77 78 private LwM2MBootstrapSecurityStore lwM2MBootstrapSecurityStore;
... ... @@ -108,8 +109,8 @@ public class LwM2MTransportBootstrapServerConfiguration {
108 109
109 110 /** Create and Set DTLS Config */
110 111 DtlsConnectorConfig.Builder dtlsConfig = new DtlsConnectorConfig.Builder();
111   - dtlsConfig.setRecommendedSupportedGroupsOnly(this.contextS.getLwM2MTransportServerConfig().isRecommendedSupportedGroups());
112   - dtlsConfig.setRecommendedCipherSuitesOnly(this.contextS.getLwM2MTransportServerConfig().isRecommendedCiphers());
  112 + dtlsConfig.setRecommendedSupportedGroupsOnly(serverConfig.isRecommendedSupportedGroups());
  113 + dtlsConfig.setRecommendedCipherSuitesOnly(serverConfig.isRecommendedCiphers());
113 114 if (this.pskMode) {
114 115 dtlsConfig.setSupportedCipherSuites(
115 116 TLS_PSK_WITH_AES_128_CCM_8,
... ... @@ -134,10 +135,10 @@ public class LwM2MTransportBootstrapServerConfiguration {
134 135
135 136 private void setServerWithCredentials(LeshanBootstrapServerBuilder builder) {
136 137 try {
137   - if (this.contextS.getLwM2MTransportServerConfig().getKeyStoreValue() != null) {
138   - KeyStore keyStoreServer = this.contextS.getLwM2MTransportServerConfig().getKeyStoreValue();
  138 + if (serverConfig.getKeyStoreValue() != null) {
  139 + KeyStore keyStoreServer = serverConfig.getKeyStoreValue();
139 140 if (this.setBuilderX509(builder)) {
140   - X509Certificate rootCAX509Cert = (X509Certificate) keyStoreServer.getCertificate(this.contextS.getLwM2MTransportServerConfig().getRootCertificateAlias());
  141 + X509Certificate rootCAX509Cert = (X509Certificate) keyStoreServer.getCertificate(serverConfig.getRootCertificateAlias());
141 142 if (rootCAX509Cert != null) {
142 143 X509Certificate[] trustedCertificates = new X509Certificate[1];
143 144 trustedCertificates[0] = rootCAX509Cert;
... ... @@ -168,8 +169,8 @@ public class LwM2MTransportBootstrapServerConfiguration {
168 169 * For idea => KeyStorePathResource == common/transport/lwm2m/src/main/resources/credentials: in LwM2MTransportContextServer: credentials/serverKeyStore.jks
169 170 */
170 171 try {
171   - X509Certificate serverCertificate = (X509Certificate) this.contextS.getLwM2MTransportServerConfig().getKeyStoreValue().getCertificate(this.contextBs.getCtxBootStrap().getCertificateAlias());
172   - PrivateKey privateKey = (PrivateKey) this.contextS.getLwM2MTransportServerConfig().getKeyStoreValue().getKey(this.contextBs.getCtxBootStrap().getCertificateAlias(), this.contextS.getLwM2MTransportServerConfig().getKeyStorePassword() == null ? null : this.contextS.getLwM2MTransportServerConfig().getKeyStorePassword().toCharArray());
  172 + X509Certificate serverCertificate = (X509Certificate) serverConfig.getKeyStoreValue().getCertificate(this.contextBs.getCtxBootStrap().getCertificateAlias());
  173 + PrivateKey privateKey = (PrivateKey) serverConfig.getKeyStoreValue().getKey(this.contextBs.getCtxBootStrap().getCertificateAlias(), serverConfig.getKeyStorePassword() == null ? null : serverConfig.getKeyStorePassword().toCharArray());
173 174 PublicKey publicKey = serverCertificate.getPublicKey();
174 175 if (privateKey != null && privateKey.getEncoded().length > 0 && publicKey != null && publicKey.getEncoded().length > 0) {
175 176 builder.setPublicKey(serverCertificate.getPublicKey());
... ...
... ... @@ -34,7 +34,8 @@ import org.thingsboard.server.transport.lwm2m.secure.LwM2MSecurityMode;
34 34 import org.thingsboard.server.transport.lwm2m.secure.LwM2mCredentialsSecurityInfoValidator;
35 35 import org.thingsboard.server.transport.lwm2m.secure.ReadResultSecurityStore;
36 36 import org.thingsboard.server.transport.lwm2m.server.LwM2mSessionMsgListener;
37   -import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportContextServer;
  37 +import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportContext;
  38 +import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportServerHelper;
38 39 import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil;
39 40
40 41 import java.io.IOException;
... ... @@ -59,12 +60,14 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore {
59 60
60 61 private final LwM2mCredentialsSecurityInfoValidator lwM2MCredentialsSecurityInfoValidator;
61 62
62   - private final LwM2mTransportContextServer context;
  63 + private final LwM2mTransportContext context;
  64 + private final LwM2mTransportServerHelper helper;
63 65
64   - public LwM2MBootstrapSecurityStore(EditableBootstrapConfigStore bootstrapConfigStore, LwM2mCredentialsSecurityInfoValidator lwM2MCredentialsSecurityInfoValidator, LwM2mTransportContextServer context) {
  66 + public LwM2MBootstrapSecurityStore(EditableBootstrapConfigStore bootstrapConfigStore, LwM2mCredentialsSecurityInfoValidator lwM2MCredentialsSecurityInfoValidator, LwM2mTransportContext context, LwM2mTransportServerHelper helper) {
65 67 this.bootstrapConfigStore = bootstrapConfigStore;
66 68 this.lwM2MCredentialsSecurityInfoValidator = lwM2MCredentialsSecurityInfoValidator;
67 69 this.context = context;
  70 + this.helper = helper;
68 71 }
69 72
70 73 @Override
... ... @@ -158,19 +161,19 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore {
158 161 LwM2MServerBootstrap profileServerBootstrap = mapper.readValue(bootstrapObject.get(BOOTSTRAP_SERVER).toString(), LwM2MServerBootstrap.class);
159 162 LwM2MServerBootstrap profileLwm2mServer = mapper.readValue(bootstrapObject.get(LWM2M_SERVER).toString(), LwM2MServerBootstrap.class);
160 163 UUID sessionUUiD = UUID.randomUUID();
161   - TransportProtos.SessionInfoProto sessionInfo = context.getValidateSessionInfo(store.getMsg(), sessionUUiD.getMostSignificantBits(), sessionUUiD.getLeastSignificantBits());
  164 + TransportProtos.SessionInfoProto sessionInfo = helper.getValidateSessionInfo(store.getMsg(), sessionUUiD.getMostSignificantBits(), sessionUUiD.getLeastSignificantBits());
162 165 context.getTransportService().registerAsyncSession(sessionInfo, new LwM2mSessionMsgListener(null, sessionInfo));
163 166 if (this.getValidatedSecurityMode(lwM2MBootstrapConfig.bootstrapServer, profileServerBootstrap, lwM2MBootstrapConfig.lwm2mServer, profileLwm2mServer)) {
164 167 lwM2MBootstrapConfig.bootstrapServer = new LwM2MServerBootstrap(lwM2MBootstrapConfig.bootstrapServer, profileServerBootstrap);
165 168 lwM2MBootstrapConfig.lwm2mServer = new LwM2MServerBootstrap(lwM2MBootstrapConfig.lwm2mServer, profileLwm2mServer);
166 169 String logMsg = String.format("%s: getParametersBootstrap: %s Access connect client with bootstrap server.", LOG_LW2M_INFO, store.getEndPoint());
167   - context.sendParametersOnThingsboardTelemetry(context.getKvLogyToThingsboard(logMsg), sessionInfo);
  170 + helper.sendParametersOnThingsboardTelemetry(helper.getKvLogyToThingsboard(logMsg), sessionInfo);
168 171 return lwM2MBootstrapConfig;
169 172 } else {
170 173 log.error(" [{}] Different values SecurityMode between of client and profile.", store.getEndPoint());
171 174 log.error("{} getParametersBootstrap: [{}] Different values SecurityMode between of client and profile.", LOG_LW2M_ERROR, store.getEndPoint());
172 175 String logMsg = String.format("%s: getParametersBootstrap: %s Different values SecurityMode between of client and profile.", LOG_LW2M_ERROR, store.getEndPoint());
173   - context.sendParametersOnThingsboardTelemetry(context.getKvLogyToThingsboard(logMsg), sessionInfo);
  176 + helper.sendParametersOnThingsboardTelemetry(helper.getKvLogyToThingsboard(logMsg), sessionInfo);
174 177 return null;
175 178 }
176 179 }
... ...
... ... @@ -16,6 +16,7 @@
16 16 package org.thingsboard.server.transport.lwm2m.secure;
17 17
18 18 import com.google.gson.JsonObject;
  19 +import lombok.RequiredArgsConstructor;
19 20 import lombok.extern.slf4j.Slf4j;
20 21 import org.eclipse.leshan.core.util.Hex;
21 22 import org.eclipse.leshan.core.util.SecurityUtil;
... ... @@ -26,7 +27,9 @@ import org.thingsboard.server.common.transport.TransportServiceCallback;
26 27 import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceCredentialsResponseMsg;
27 28 import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceLwM2MCredentialsRequestMsg;
28 29 import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
29   -import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportContextServer;
  30 +import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
  31 +import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportContext;
  32 +import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportServerHelper;
30 33 import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil;
31 34
32 35 import java.io.IOException;
... ... @@ -44,13 +47,11 @@ import static org.thingsboard.server.transport.lwm2m.secure.LwM2MSecurityMode.X5
44 47 @Slf4j
45 48 @Component
46 49 @TbLwM2mTransportComponent
  50 +@RequiredArgsConstructor
47 51 public class LwM2mCredentialsSecurityInfoValidator {
48 52
49   - private final LwM2mTransportContextServer contextS;
50   -
51   - public LwM2mCredentialsSecurityInfoValidator(LwM2mTransportContextServer contextS) {
52   - this.contextS = contextS;
53   - }
  53 + private final LwM2mTransportContext context;
  54 + private final LwM2MTransportServerConfig config;
54 55
55 56 /**
56 57 * Request to thingsboard Response from thingsboard ValidateDeviceLwM2MCredentials
... ... @@ -61,7 +62,7 @@ public class LwM2mCredentialsSecurityInfoValidator {
61 62 public ReadResultSecurityStore createAndValidateCredentialsSecurityInfo(String endpoint, LwM2mTransportHandlerUtil.LwM2mTypeServer keyValue) {
62 63 CountDownLatch latch = new CountDownLatch(1);
63 64 final ReadResultSecurityStore[] resultSecurityStore = new ReadResultSecurityStore[1];
64   - contextS.getTransportService().process(ValidateDeviceLwM2MCredentialsRequestMsg.newBuilder().setCredentialsId(endpoint).build(),
  65 + context.getTransportService().process(ValidateDeviceLwM2MCredentialsRequestMsg.newBuilder().setCredentialsId(endpoint).build(),
65 66 new TransportServiceCallback<>() {
66 67 @Override
67 68 public void onSuccess(ValidateDeviceCredentialsResponseMsg msg) {
... ... @@ -81,7 +82,7 @@ public class LwM2mCredentialsSecurityInfoValidator {
81 82 }
82 83 });
83 84 try {
84   - latch.await(contextS.getLwM2MTransportServerConfig().getTimeout(), TimeUnit.MILLISECONDS);
  85 + latch.await(config.getTimeout(), TimeUnit.MILLISECONDS);
85 86 } catch (InterruptedException e) {
86 87 log.error("Failed to await credentials!", e);
87 88 }
... ...
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2MTransportMsgHandler.java renamed from common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportServiceImpl.java
... ... @@ -54,6 +54,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.AttributeUpdateNotif
54 54 import org.thingsboard.server.gen.transport.TransportProtos.SessionEvent;
55 55 import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto;
56 56 import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
  57 +import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
57 58 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient;
58 59 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext;
59 60 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientProfile;
... ... @@ -111,44 +112,43 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandle
111 112 @Slf4j
112 113 @Service
113 114 @TbLwM2mTransportComponent
114   -public class LwM2mTransportServiceImpl implements LwM2mTransportService {
  115 +public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler {
115 116
116 117 private ExecutorService executorRegistered;
117 118 private ExecutorService executorUpdateRegistered;
118 119 private ExecutorService executorUnRegistered;
119 120 private LwM2mValueConverterImpl converter;
120   - private FirmwareDataCache firmwareDataCache;
121   -
122 121
123 122 private final TransportService transportService;
124   -
125   - public final LwM2mTransportContextServer lwM2mTransportContextServer;
126   -
  123 + private final LwM2mTransportContext context;
  124 + private final LwM2MTransportServerConfig config;
  125 + private final FirmwareDataCache firmwareDataCache;
  126 + private final LwM2mTransportServerHelper helper;
127 127 private final LwM2mClientContext lwM2mClientContext;
128   -
129   - private final LeshanServer leshanServer;
130   -
131 128 private final LwM2mTransportRequest lwM2mTransportRequest;
132 129
133   - public LwM2mTransportServiceImpl(TransportService transportService, LwM2mTransportContextServer lwM2mTransportContextServer,
134   - LwM2mClientContext lwM2mClientContext, LeshanServer leshanServer,
135   - @Lazy LwM2mTransportRequest lwM2mTransportRequest, FirmwareDataCache firmwareDataCache) {
  130 + public DefaultLwM2MTransportMsgHandler(TransportService transportService, LwM2MTransportServerConfig config, LwM2mTransportServerHelper helper,
  131 + LwM2mClientContext lwM2mClientContext,
  132 + @Lazy LwM2mTransportRequest lwM2mTransportRequest,
  133 + FirmwareDataCache firmwareDataCache,
  134 + LwM2mTransportContext context) {
136 135 this.transportService = transportService;
137   - this.lwM2mTransportContextServer = lwM2mTransportContextServer;
  136 + this.config = config;
  137 + this.helper = helper;
138 138 this.lwM2mClientContext = lwM2mClientContext;
139   - this.leshanServer = leshanServer;
140 139 this.lwM2mTransportRequest = lwM2mTransportRequest;
141 140 this.firmwareDataCache = firmwareDataCache;
  141 + this.context = context;
142 142 }
143 143
144 144 @PostConstruct
145 145 public void init() {
146   - this.lwM2mTransportContextServer.getScheduler().scheduleAtFixedRate(this::checkInactivityAndReportActivity, new Random().nextInt((int) lwM2mTransportContextServer.getLwM2MTransportServerConfig().getSessionReportTimeout()), lwM2mTransportContextServer.getLwM2MTransportServerConfig().getSessionReportTimeout(), TimeUnit.MILLISECONDS);
147   - this.executorRegistered = Executors.newFixedThreadPool(this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getRegisteredPoolSize(),
  146 + this.context.getScheduler().scheduleAtFixedRate(this::checkInactivityAndReportActivity, new Random().nextInt((int) config.getSessionReportTimeout()), config.getSessionReportTimeout(), TimeUnit.MILLISECONDS);
  147 + this.executorRegistered = Executors.newFixedThreadPool(this.config.getRegisteredPoolSize(),
148 148 new NamedThreadFactory(String.format("LwM2M %s channel registered", SERVICE_CHANNEL)));
149   - this.executorUpdateRegistered = Executors.newFixedThreadPool(this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getUpdateRegisteredPoolSize(),
  149 + this.executorUpdateRegistered = Executors.newFixedThreadPool(this.config.getUpdateRegisteredPoolSize(),
150 150 new NamedThreadFactory(String.format("LwM2M %s channel update registered", SERVICE_CHANNEL)));
151   - this.executorUnRegistered = Executors.newFixedThreadPool(this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getUnRegisteredPoolSize(),
  151 + this.executorUnRegistered = Executors.newFixedThreadPool(this.config.getUnRegisteredPoolSize(),
152 152 new NamedThreadFactory(String.format("LwM2M %s channel un registered", SERVICE_CHANNEL)));
153 153 this.converter = LwM2mValueConverterImpl.getInstance();
154 154 }
... ... @@ -278,10 +278,10 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
278 278 @Override
279 279 public void setCancelObservations(Registration registration) {
280 280 if (registration != null) {
281   - Set<Observation> observations = leshanServer.getObservationService().getObservations(registration);
  281 + Set<Observation> observations = context.getServer().getObservationService().getObservations(registration);
282 282 observations.forEach(observation -> lwM2mTransportRequest.sendAllRequest(registration,
283 283 convertPathFromObjectIdToIdVer(observation.getPath().toString(), registration), OBSERVE_CANCEL,
284   - null, null, this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getTimeout(), null));
  284 + null, null, this.config.getTimeout(), null));
285 285 }
286 286 }
287 287
... ... @@ -333,13 +333,13 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
333 333 msg.getSharedUpdatedList().forEach(tsKvProto -> {
334 334 String pathName = tsKvProto.getKv().getKey();
335 335 String pathIdVer = this.getPresentPathIntoProfile(sessionInfo, pathName);
336   - Object valueNew = this.lwM2mTransportContextServer.getValueFromKvProto(tsKvProto.getKv());
  336 + Object valueNew = this.helper.getValueFromKvProto(tsKvProto.getKv());
337 337 //TODO: react on change of the firmware name.
338 338 if (FirmwareUtil.getAttributeKey(FirmwareType.FIRMWARE, FirmwareKey.VERSION).equals(pathName) && !valueNew.equals(lwM2MClient.getFrUpdate().getCurrentFwVersion())) {
339 339 this.getInfoFirmwareUpdate(lwM2MClient);
340 340 }
341 341 if (pathIdVer != null) {
342   - ResourceModel resourceModel = lwM2MClient.getResourceModel(pathIdVer, this.lwM2mTransportContextServer.getLwM2MTransportServerConfig()
  342 + ResourceModel resourceModel = lwM2MClient.getResourceModel(pathIdVer, this.config
343 343 .getModelProvider());
344 344 if (resourceModel != null && resourceModel.operations.isWritable()) {
345 345 this.updateResourcesValueToClient(lwM2MClient, this.getResourceValueFormatKv(lwM2MClient, pathIdVer), valueNew, pathIdVer);
... ... @@ -360,7 +360,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
360 360 } else if (msg.getSharedDeletedCount() > 0) {
361 361 msg.getSharedUpdatedList().forEach(tsKvProto -> {
362 362 String pathName = tsKvProto.getKv().getKey();
363   - Object valueNew = this.lwM2mTransportContextServer.getValueFromKvProto(tsKvProto.getKv());
  363 + Object valueNew = this.helper.getValueFromKvProto(tsKvProto.getKv());
364 364 if (FirmwareUtil.getAttributeKey(FirmwareType.FIRMWARE, FirmwareKey.VERSION).equals(pathName) && !valueNew.equals(lwM2MClient.getFrUpdate().getCurrentFwVersion())) {
365 365 lwM2MClient.getFrUpdate().setCurrentFwVersion((String) valueNew);
366 366 }
... ... @@ -404,7 +404,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
404 404 @Override
405 405 public void onResourceUpdate(Optional<TransportProtos.ResourceUpdateMsg> resourceUpdateMsgOpt) {
406 406 String idVer = resourceUpdateMsgOpt.get().getResourceKey();
407   - lwM2mClientContext.getLwM2mClients().values().stream().forEach(e -> e.updateResourceModel(idVer, this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getModelProvider()));
  407 + lwM2mClientContext.getLwM2mClients().values().stream().forEach(e -> e.updateResourceModel(idVer, this.config.getModelProvider()));
408 408 }
409 409
410 410 /**
... ... @@ -413,7 +413,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
413 413 @Override
414 414 public void onResourceDelete(Optional<TransportProtos.ResourceDeleteMsg> resourceDeleteMsgOpt) {
415 415 String pathIdVer = resourceDeleteMsgOpt.get().getResourceKey();
416   - lwM2mClientContext.getLwM2mClients().values().stream().forEach(e -> e.deleteResources(pathIdVer, this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getModelProvider()));
  416 + lwM2mClientContext.getLwM2mClients().values().stream().forEach(e -> e.deleteResources(pathIdVer, this.config.getModelProvider()));
417 417 }
418 418
419 419 @Override
... ... @@ -429,7 +429,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
429 429 } else {
430 430 lwM2mTransportRequest.sendAllRequest(registration, lwm2mClientRpcRequest.getTargetIdVer(), lwm2mClientRpcRequest.getTypeOper(), lwm2mClientRpcRequest.getContentFormatName(),
431 431 lwm2mClientRpcRequest.getValue() == null ? lwm2mClientRpcRequest.getParams() : lwm2mClientRpcRequest.getValue(),
432   - this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getTimeout(), lwm2mClientRpcRequest);
  432 + this.config.getTimeout(), lwm2mClientRpcRequest);
433 433 }
434 434 } catch (Exception e) {
435 435 if (lwm2mClientRpcRequest == null) {
... ... @@ -546,7 +546,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
546 546 @Override
547 547 public void doTrigger(Registration registration, String path) {
548 548 lwM2mTransportRequest.sendAllRequest(registration, path, EXECUTE,
549   - ContentFormat.TLV.getName(), null, this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getTimeout(), null);
  549 + ContentFormat.TLV.getName(), null, this.config.getTimeout(), null);
550 550 }
551 551
552 552 /**
... ... @@ -579,7 +579,8 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
579 579 *
580 580 * @param registration -
581 581 */
582   - protected void onAwakeDev(Registration registration) {
  582 + @Override
  583 + public void onAwakeDev(Registration registration) {
583 584 log.info("[{}] [{}] Received endpoint Awake version event", registration.getId(), registration.getEndpoint());
584 585 this.sendLogsToThingsboard(LOG_LW2M_INFO + ": Client is awake!", registration.getId());
585 586 //TODO: associate endpointId with device information.
... ... @@ -610,13 +611,14 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
610 611 * @param logMsg - text msg
611 612 * @param registrationId - Id of Registration LwM2M Client
612 613 */
  614 + @Override
613 615 public void sendLogsToThingsboard(String logMsg, String registrationId) {
614 616 SessionInfoProto sessionInfo = this.getValidateSessionInfo(registrationId);
615 617 if (logMsg != null && sessionInfo != null) {
616 618 if(logMsg.length() > 1024){
617 619 logMsg = logMsg.substring(0, 1024);
618 620 }
619   - this.lwM2mTransportContextServer.sendParametersOnThingsboardTelemetry(this.lwM2mTransportContextServer.getKvLogyToThingsboard(logMsg), sessionInfo);
  621 + this.helper.sendParametersOnThingsboardTelemetry(this.helper.getKvLogyToThingsboard(logMsg), sessionInfo);
620 622 }
621 623 }
622 624
... ... @@ -640,7 +642,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
640 642 // #2
641 643 lwM2MClient.getPendingReadRequests().addAll(clientObjects);
642 644 clientObjects.forEach(path -> lwM2mTransportRequest.sendAllRequest(registration, path, READ, ContentFormat.TLV.getName(),
643   - null, this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getTimeout(), null));
  645 + null, this.config.getTimeout(), null));
644 646 }
645 647 // #1
646 648 this.initReadAttrTelemetryObserveToClient(registration, lwM2MClient, READ, clientObjects);
... ... @@ -689,7 +691,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
689 691 */
690 692 private void updateResourcesValue(Registration registration, LwM2mResource lwM2mResource, String path) {
691 693 LwM2mClient lwM2MClient = lwM2mClientContext.getLwM2mClientWithReg(registration, null);
692   - if (lwM2MClient.saveResourceValue(path, lwM2mResource, this.lwM2mTransportContextServer.getLwM2MTransportServerConfig()
  694 + if (lwM2MClient.saveResourceValue(path, lwM2mResource, this.config
693 695 .getModelProvider())) {
694 696 if (FR_PATH_RESOURCE_VER_ID.equals(convertPathFromIdVerToObjectId(path)) &&
695 697 lwM2MClient.getFrUpdate().getCurrentFwVersion() != null
... ... @@ -728,10 +730,10 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
728 730 SessionInfoProto sessionInfo = this.getValidateSessionInfo(registration);
729 731 if (results != null && sessionInfo != null) {
730 732 if (results.getResultAttributes().size() > 0) {
731   - this.lwM2mTransportContextServer.sendParametersOnThingsboardAttribute(results.getResultAttributes(), sessionInfo);
  733 + this.helper.sendParametersOnThingsboardAttribute(results.getResultAttributes(), sessionInfo);
732 734 }
733 735 if (results.getResultTelemetries().size() > 0) {
734   - this.lwM2mTransportContextServer.sendParametersOnThingsboardTelemetry(results.getResultTelemetries(), sessionInfo);
  736 + this.helper.sendParametersOnThingsboardTelemetry(results.getResultTelemetries(), sessionInfo);
735 737 }
736 738 }
737 739 } catch (Exception e) {
... ... @@ -780,7 +782,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
780 782 ConcurrentHashMap<String, Object> finalParams = params;
781 783 pathSend.forEach(target -> {
782 784 lwM2mTransportRequest.sendAllRequest(registration, target, typeOper, ContentFormat.TLV.getName(),
783   - finalParams != null ? finalParams.get(target) : null, this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getTimeout(), null);
  785 + finalParams != null ? finalParams.get(target) : null, this.config.getTimeout(), null);
784 786 });
785 787 if (OBSERVE.equals(typeOper)) {
786 788 lwM2MClient.initReadValue(this, null);
... ... @@ -865,7 +867,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
865 867 LwM2mResource resourceValue = lwM2MClient != null ? getResourceValueFromLwM2MClient(lwM2MClient, pathIdVer) : null;
866 868 if (resourceValue != null) {
867 869 ResourceModel.Type currentType = resourceValue.getType();
868   - ResourceModel.Type expectedType = this.lwM2mTransportContextServer.getResourceModelTypeEqualsKvProtoValueType(currentType, pathIdVer);
  870 + ResourceModel.Type expectedType = this.helper.getResourceModelTypeEqualsKvProtoValueType(currentType, pathIdVer);
869 871 Object valueKvProto = null;
870 872 if (resourceValue.isMultiInstances()) {
871 873 valueKvProto = new JsonObject();
... ... @@ -882,7 +884,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
882 884 valueKvProto = this.converter.convertValue(resourceValue.getValue(), currentType, expectedType,
883 885 new LwM2mPath(convertPathFromIdVerToObjectId(pathIdVer)));
884 886 }
885   - return valueKvProto != null ? this.lwM2mTransportContextServer.getKvAttrTelemetryToThingsboard(currentType, resourceName, valueKvProto, resourceValue.isMultiInstances()) : null;
  887 + return valueKvProto != null ? this.helper.getKvAttrTelemetryToThingsboard(currentType, resourceName, valueKvProto, resourceValue.isMultiInstances()) : null;
886 888 }
887 889 } catch (Exception e) {
888 890 log.error("Failed to add parameters.", e);
... ... @@ -901,7 +903,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
901 903 private Object getResourceValueFormatKv(LwM2mClient lwM2MClient, String pathIdVer) {
902 904 LwM2mResource resourceValue = this.getResourceValueFromLwM2MClient(lwM2MClient, pathIdVer);
903 905 ResourceModel.Type currentType = resourceValue.getType();
904   - ResourceModel.Type expectedType = this.lwM2mTransportContextServer.getResourceModelTypeEqualsKvProtoValueType(currentType, pathIdVer);
  906 + ResourceModel.Type expectedType = this.helper.getResourceModelTypeEqualsKvProtoValueType(currentType, pathIdVer);
905 907 return this.converter.convertValue(resourceValue.getValue(), currentType, expectedType,
906 908 new LwM2mPath(convertPathFromIdVerToObjectId(pathIdVer)));
907 909 }
... ... @@ -1094,10 +1096,10 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1094 1096 if (pathIds.isResource()) {
1095 1097 if (READ.equals(typeOper)) {
1096 1098 lwM2mTransportRequest.sendAllRequest(registration, target, typeOper,
1097   - ContentFormat.TLV.getName(), null, this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getTimeout(), null);
  1099 + ContentFormat.TLV.getName(), null, this.config.getTimeout(), null);
1098 1100 } else if (OBSERVE.equals(typeOper)) {
1099 1101 lwM2mTransportRequest.sendAllRequest(registration, target, typeOper,
1100   - null, null, this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getTimeout(), null);
  1102 + null, null, this.config.getTimeout(), null);
1101 1103 }
1102 1104 }
1103 1105 });
... ... @@ -1153,7 +1155,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1153 1155 if (!pathSend.isEmpty()) {
1154 1156 ConcurrentHashMap<String, Object> finalParams = lwm2mAttributesNew;
1155 1157 pathSend.forEach(target -> lwM2mTransportRequest.sendAllRequest(registration, target, WRITE_ATTRIBUTES, ContentFormat.TLV.getName(),
1156   - finalParams.get(target), this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getTimeout(), null));
  1158 + finalParams.get(target), this.config.getTimeout(), null));
1157 1159 }
1158 1160 });
1159 1161 }
... ... @@ -1170,7 +1172,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1170 1172 params.clear();
1171 1173 params.put(OBJECT_VERSION, "");
1172 1174 lwM2mTransportRequest.sendAllRequest(registration, target, WRITE_ATTRIBUTES, ContentFormat.TLV.getName(),
1173   - params, this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getTimeout(), null);
  1175 + params, this.config.getTimeout(), null);
1174 1176 });
1175 1177 }
1176 1178 });
... ... @@ -1183,7 +1185,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1183 1185 paramAnallyzer.forEach(pathIdVer -> {
1184 1186 if (this.getResourceValueFromLwM2MClient(lwM2MClient, pathIdVer) != null) {
1185 1187 lwM2mTransportRequest.sendAllRequest(registration, pathIdVer, OBSERVE_CANCEL, null,
1186   - null, this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getTimeout(), null);
  1188 + null, this.config.getTimeout(), null);
1187 1189 }
1188 1190 }
1189 1191 );
... ... @@ -1193,7 +1195,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1193 1195 if (valueNew != null && (valueOld == null || !valueNew.toString().equals(valueOld.toString()))) {
1194 1196 lwM2mTransportRequest.sendAllRequest(lwM2MClient.getRegistration(), path, WRITE_REPLACE,
1195 1197 ContentFormat.TLV.getName(), valueNew,
1196   - this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getTimeout(), null);
  1198 + this.config.getTimeout(), null);
1197 1199 } else {
1198 1200 log.error("Failed update resource [{}] [{}]", path, valueNew);
1199 1201 String logMsg = String.format("%s: Failed update resource path - %s value - %s. Value is not changed or bad",
... ... @@ -1271,7 +1273,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1271 1273 // #2.1
1272 1274 lwM2MClient.getDelayedRequests().forEach((pathIdVer, tsKvProto) -> {
1273 1275 this.updateResourcesValueToClient(lwM2MClient, this.getResourceValueFormatKv(lwM2MClient, pathIdVer),
1274   - this.lwM2mTransportContextServer.getValueFromKvProto(tsKvProto.getKv()), pathIdVer);
  1276 + this.helper.getValueFromKvProto(tsKvProto.getKv()), pathIdVer);
1275 1277 });
1276 1278 }
1277 1279
... ... @@ -1288,7 +1290,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1288 1290 return null;
1289 1291 } else {
1290 1292 return SessionInfoProto.newBuilder()
1291   - .setNodeId(this.lwM2mTransportContextServer.getNodeId())
  1293 + .setNodeId(this.context.getNodeId())
1292 1294 .setSessionIdMSB(lwM2MClient.getSessionId().getMostSignificantBits())
1293 1295 .setSessionIdLSB(lwM2MClient.getSessionId().getLeastSignificantBits())
1294 1296 .setDeviceIdMSB(msg.getDeviceInfo().getDeviceIdMSB())
... ... @@ -1358,7 +1360,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1358 1360 if (keyNamesMap.values().size() > 0) {
1359 1361 try {
1360 1362 //#1.2
1361   - TransportProtos.GetAttributeRequestMsg getAttributeMsg = lwM2mTransportContextServer.getAdaptor().convertToGetAttributes(null, keyNamesMap.values());
  1363 + TransportProtos.GetAttributeRequestMsg getAttributeMsg = helper.getAdaptor().convertToGetAttributes(null, keyNamesMap.values());
1362 1364 transportService.process(sessionInfo, getAttributeMsg, getAckCallback(lwM2MClient, getAttributeMsg.getRequestId(), DEVICE_ATTRIBUTES_REQUEST));
1363 1365 } catch (AdaptorException e) {
1364 1366 log.warn("Failed to decode get attributes request", e);
... ... @@ -1406,7 +1408,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1406 1408 public void readRequestToClientFirmwareVer(Registration registration) {
1407 1409 String pathIdVer = convertPathFromObjectIdToIdVer(FR_PATH_RESOURCE_VER_ID, registration);
1408 1410 lwM2mTransportRequest.sendAllRequest(registration, pathIdVer, READ, ContentFormat.TLV.getName(),
1409   - null, lwM2mTransportContextServer.getLwM2MTransportServerConfig().getTimeout(), null);
  1411 + null, config.getTimeout(), null);
1410 1412 }
1411 1413
1412 1414 /**
... ... @@ -1422,7 +1424,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1422 1424 String verSupportedObject = lwM2MClient.getRegistration().getSupportedObject().get(objectId);
1423 1425 String targetIdVer = LWM2M_SEPARATOR_PATH + objectId + LWM2M_SEPARATOR_KEY + verSupportedObject + LWM2M_SEPARATOR_PATH + 0 + LWM2M_SEPARATOR_PATH + 0;
1424 1426 lwM2mTransportRequest.sendAllRequest(lwM2MClient.getRegistration(), targetIdVer, WRITE_REPLACE, ContentFormat.OPAQUE.getName(),
1425   - firmwareChunk, lwM2mTransportContextServer.getLwM2MTransportServerConfig().getTimeout(), null);
  1427 + firmwareChunk, config.getTimeout(), null);
1426 1428 log.warn("updateFirmwareClient [{}] [{}]", lwM2MClient.getFrUpdate().getCurrentFwVersion(), lwM2MClient.getFrUpdate().getClientFwVersion());
1427 1429 }
1428 1430 }
... ... @@ -1444,7 +1446,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1444 1446 }
1445 1447
1446 1448 private boolean validateResourceInModel(LwM2mClient lwM2mClient, String pathIdVer, boolean isWritableNotOptional) {
1447   - ResourceModel resourceModel = lwM2mClient.getResourceModel(pathIdVer, this.lwM2mTransportContextServer.getLwM2MTransportServerConfig()
  1449 + ResourceModel resourceModel = lwM2mClient.getResourceModel(pathIdVer, this.config
1448 1450 .getModelProvider());
1449 1451 Integer objectId = new LwM2mPath(convertPathFromIdVerToObjectId(pathIdVer)).getObjectId();
1450 1452 String objectVer = validateObjectVerFromKey(pathIdVer);
... ... @@ -1453,9 +1455,4 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1453 1455 objectId != null && objectVer != null && objectVer.equals(lwM2mClient.getRegistration().getSupportedVersion(objectId)));
1454 1456 }
1455 1457
1456   - @Override
1457   - public String getName() {
1458   - return "LWM2M";
1459   - }
1460   -
1461 1458 }
... ...
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/DefaultLwM2mTransportService.java renamed from common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportServerConfiguration.java
... ... @@ -15,6 +15,7 @@
15 15 */
16 16 package org.thingsboard.server.transport.lwm2m.server;
17 17
  18 +import lombok.RequiredArgsConstructor;
18 19 import lombok.extern.slf4j.Slf4j;
19 20 import org.eclipse.californium.core.network.config.NetworkConfig;
20 21 import org.eclipse.californium.core.network.stack.BlockwiseLayer;
... ... @@ -29,14 +30,16 @@ import org.eclipse.leshan.server.model.LwM2mModelProvider;
29 30 import org.eclipse.leshan.server.security.DefaultAuthorizer;
30 31 import org.eclipse.leshan.server.security.EditableSecurityStore;
31 32 import org.eclipse.leshan.server.security.SecurityChecker;
32   -import org.springframework.context.annotation.Bean;
33 33 import org.springframework.stereotype.Component;
34 34 import org.thingsboard.server.common.data.StringUtils;
35 35 import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
36 36 import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
  37 +import org.thingsboard.server.transport.lwm2m.secure.LWM2MGenerationPSkRPkECC;
37 38 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext;
38 39 import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl;
39 40
  41 +import javax.annotation.PostConstruct;
  42 +import javax.annotation.PreDestroy;
40 43 import java.math.BigInteger;
41 44 import java.security.AlgorithmParameters;
42 45 import java.security.KeyFactory;
... ... @@ -66,32 +69,53 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mNetworkConfig.g
66 69 @Slf4j
67 70 @Component
68 71 @TbLwM2mTransportComponent
69   -public class LwM2mTransportServerConfiguration {
  72 +@RequiredArgsConstructor
  73 +public class DefaultLwM2mTransportService implements LwM2MTransportService {
  74 +
70 75 private PublicKey publicKey;
71 76 private PrivateKey privateKey;
72 77 private boolean pskMode = false;
73   - private final LwM2mTransportContextServer context;
  78 +
  79 + private final LwM2mTransportContext context;
  80 + private final LwM2MTransportServerConfig config;
  81 + private final LwM2mTransportServerHelper helper;
  82 + private final LwM2mTransportMsgHandler handler;
74 83 private final CaliforniumRegistrationStore registrationStore;
75 84 private final EditableSecurityStore securityStore;
76 85 private final LwM2mClientContext lwM2mClientContext;
77 86
78   - public LwM2mTransportServerConfiguration(LwM2mTransportContextServer context, CaliforniumRegistrationStore registrationStore, EditableSecurityStore securityStore, LwM2mClientContext lwM2mClientContext) {
79   - this.context = context;
80   - this.registrationStore = registrationStore;
81   - this.securityStore = securityStore;
82   - this.lwM2mClientContext = lwM2mClientContext;
  87 + private LeshanServer server;
  88 +
  89 + @PostConstruct
  90 + public void init() {
  91 + if (config.getEnableGenNewKeyPskRpk()) {
  92 + new LWM2MGenerationPSkRPkECC();
  93 + }
  94 + this.server = getLhServer(config.getPort(), config.getSecurePort());
  95 + this.startLhServer();
  96 + this.context.setServer(server);
  97 + }
  98 +
  99 + private void startLhServer() {
  100 + log.info("Starting LwM2M transport Server...");
  101 + this.server.start();
  102 + LwM2mServerListener lhServerCertListener = new LwM2mServerListener(handler);
  103 + this.server.getRegistrationService().addListener(lhServerCertListener.registrationListener);
  104 + this.server.getPresenceService().addListener(lhServerCertListener.presenceListener);
  105 + this.server.getObservationService().addListener(lhServerCertListener.observationListener);
83 106 }
84 107
85   - @Bean
86   - public LeshanServer getLeshanServer() {
87   - log.info("Starting LwM2M transport Server... PostConstruct");
88   - return this.getLhServer(this.context.getLwM2MTransportServerConfig().getPort(), this.context.getLwM2MTransportServerConfig().getSecurePort());
  108 + @PreDestroy
  109 + public void shutdown() {
  110 + log.info("Stopping LwM2M transport Server!");
  111 + server.destroy();
  112 + log.info("LwM2M transport Server stopped!");
89 113 }
90 114
91 115 private LeshanServer getLhServer(Integer serverPortNoSec, Integer serverSecurePort) {
92 116 LeshanServerBuilder builder = new LeshanServerBuilder();
93   - builder.setLocalAddress(this.context.getLwM2MTransportServerConfig().getHost(), serverPortNoSec);
94   - builder.setLocalSecureAddress(this.context.getLwM2MTransportServerConfig().getSecureHost(), serverSecurePort);
  117 + builder.setLocalAddress(config.getHost(), serverPortNoSec);
  118 + builder.setLocalSecureAddress(config.getSecureHost(), serverSecurePort);
95 119 builder.setDecoder(new DefaultLwM2mNodeDecoder());
96 120 /** Use a magic converter to support bad type send by the UI. */
97 121 builder.setEncoder(new DefaultLwM2mNodeEncoder(LwM2mValueConverterImpl.getInstance()));
... ... @@ -103,8 +127,8 @@ public class LwM2mTransportServerConfiguration {
103 127 builder.setCoapConfig(getCoapConfig(serverPortNoSec, serverSecurePort));
104 128
105 129 /** Define model provider (Create Models )*/
106   - LwM2mModelProvider modelProvider = new LwM2mVersionedModelProvider(this.lwM2mClientContext, this.context);
107   - this.context.getLwM2MTransportServerConfig().setModelProvider(modelProvider);
  130 + LwM2mModelProvider modelProvider = new LwM2mVersionedModelProvider(this.lwM2mClientContext, this.helper, this.context);
  131 + config.setModelProvider(modelProvider);
108 132 builder.setObjectModelProvider(modelProvider);
109 133
110 134 /** Create credentials */
... ... @@ -118,8 +142,8 @@ public class LwM2mTransportServerConfiguration {
118 142 /** Create DTLS Config */
119 143 DtlsConnectorConfig.Builder dtlsConfig = new DtlsConnectorConfig.Builder();
120 144 dtlsConfig.setServerOnly(true);
121   - dtlsConfig.setRecommendedSupportedGroupsOnly(this.context.getLwM2MTransportServerConfig().isRecommendedSupportedGroups());
122   - dtlsConfig.setRecommendedCipherSuitesOnly(this.context.getLwM2MTransportServerConfig().isRecommendedCiphers());
  145 + dtlsConfig.setRecommendedSupportedGroupsOnly(config.isRecommendedSupportedGroups());
  146 + dtlsConfig.setRecommendedCipherSuitesOnly(config.isRecommendedCiphers());
123 147 if (this.pskMode) {
124 148 dtlsConfig.setSupportedCipherSuites(
125 149 TLS_PSK_WITH_AES_128_CCM_8,
... ... @@ -141,9 +165,9 @@ public class LwM2mTransportServerConfiguration {
141 165
142 166 private void setServerWithCredentials(LeshanServerBuilder builder) {
143 167 try {
144   - if (this.context.getLwM2MTransportServerConfig().getKeyStoreValue() != null) {
  168 + if (config.getKeyStoreValue() != null) {
145 169 if (this.setBuilderX509(builder)) {
146   - X509Certificate rootCAX509Cert = (X509Certificate) this.context.getLwM2MTransportServerConfig().getKeyStoreValue().getCertificate(this.context.getLwM2MTransportServerConfig().getRootCertificateAlias());
  170 + X509Certificate rootCAX509Cert = (X509Certificate) config.getKeyStoreValue().getCertificate(config.getRootCertificateAlias());
147 171 if (rootCAX509Cert != null) {
148 172 X509Certificate[] trustedCertificates = new X509Certificate[1];
149 173 trustedCertificates[0] = rootCAX509Cert;
... ... @@ -178,8 +202,8 @@ public class LwM2mTransportServerConfiguration {
178 202
179 203 private boolean setBuilderX509(LeshanServerBuilder builder) {
180 204 try {
181   - X509Certificate serverCertificate = (X509Certificate) this.context.getLwM2MTransportServerConfig().getKeyStoreValue().getCertificate(this.context.getLwM2MTransportServerConfig().getCertificateAlias());
182   - PrivateKey privateKey = (PrivateKey) this.context.getLwM2MTransportServerConfig().getKeyStoreValue().getKey(this.context.getLwM2MTransportServerConfig().getCertificateAlias(), this.context.getLwM2MTransportServerConfig().getKeyStorePassword() == null ? null : this.context.getLwM2MTransportServerConfig().getKeyStorePassword().toCharArray());
  205 + X509Certificate serverCertificate = (X509Certificate) config.getKeyStoreValue().getCertificate(config.getCertificateAlias());
  206 + PrivateKey privateKey = (PrivateKey) config.getKeyStoreValue().getKey(config.getCertificateAlias(), config.getKeyStorePassword() == null ? null : config.getKeyStorePassword().toCharArray());
183 207 PublicKey publicKey = serverCertificate.getPublicKey();
184 208 if (privateKey != null && privateKey.getEncoded().length > 0 && publicKey != null && publicKey.getEncoded().length > 0) {
185 209 builder.setPublicKey(serverCertificate.getPublicKey());
... ... @@ -208,7 +232,7 @@ public class LwM2mTransportServerConfiguration {
208 232 }
209 233
210 234 private void infoPramsUri(String mode) {
211   - LwM2MTransportServerConfig lwM2MTransportServerConfig = this.context.getLwM2MTransportServerConfig();
  235 + LwM2MTransportServerConfig lwM2MTransportServerConfig = config;
212 236 log.info("Server uses [{}]: serverNoSecureURI : [{}:{}], serverSecureURI : [{}:{}]", mode,
213 237 lwM2MTransportServerConfig.getHost(),
214 238 lwM2MTransportServerConfig.getPort(),
... ... @@ -236,7 +260,7 @@ public class LwM2mTransportServerConfiguration {
236 260 AlgorithmParameters algoParameters = AlgorithmParameters.getInstance("EC");
237 261 algoParameters.init(new ECGenParameterSpec("secp256r1"));
238 262 ECParameterSpec parameterSpec = algoParameters.getParameterSpec(ECParameterSpec.class);
239   - LwM2MTransportServerConfig serverConfig = this.context.getLwM2MTransportServerConfig();
  263 + LwM2MTransportServerConfig serverConfig = config;
240 264 if (StringUtils.isNotEmpty(serverConfig.getPublicX()) && StringUtils.isNotEmpty(serverConfig.getPublicY())) {
241 265 byte[] publicX = Hex.decodeHex(serverConfig.getPublicX().toCharArray());
242 266 byte[] publicY = Hex.decodeHex(serverConfig.getPublicY().toCharArray());
... ... @@ -283,4 +307,9 @@ public class LwM2mTransportServerConfiguration {
283 307 params);
284 308 }
285 309
  310 + @Override
  311 + public String getName() {
  312 + return "LWM2M";
  313 + }
  314 +
286 315 }
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.lwm2m.server;
  17 +
  18 +import org.thingsboard.server.common.data.TbTransportService;
  19 +
  20 +public interface LwM2MTransportService extends TbTransportService {
  21 +
  22 +}
... ...
... ... @@ -32,9 +32,9 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandle
32 32 @Slf4j
33 33 public class LwM2mServerListener {
34 34
35   - private final LwM2mTransportServiceImpl service;
  35 + private final LwM2mTransportMsgHandler service;
36 36
37   - public LwM2mServerListener(LwM2mTransportServiceImpl service) {
  37 + public LwM2mServerListener(LwM2mTransportMsgHandler service) {
38 38 this.service = service;
39 39 }
40 40
... ...
... ... @@ -35,10 +35,10 @@ import java.util.Optional;
35 35
36 36 @Slf4j
37 37 public class LwM2mSessionMsgListener implements GenericFutureListener<Future<? super Void>>, SessionMsgListener {
38   - private LwM2mTransportServiceImpl service;
  38 + private DefaultLwM2MTransportMsgHandler service;
39 39 private TransportProtos.SessionInfoProto sessionInfo;
40 40
41   - public LwM2mSessionMsgListener(LwM2mTransportServiceImpl service, TransportProtos.SessionInfoProto sessionInfo) {
  41 + public LwM2mSessionMsgListener(DefaultLwM2MTransportMsgHandler service, TransportProtos.SessionInfoProto sessionInfo) {
42 42 this.service = service;
43 43 this.sessionInfo = sessionInfo;
44 44 }
... ...
  1 +/**
  2 + * Copyright © 2016-2021 The Thingsboard Authors
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +package org.thingsboard.server.transport.lwm2m.server;
  17 +
  18 +import lombok.Getter;
  19 +import lombok.Setter;
  20 +import org.eclipse.leshan.server.californium.LeshanServer;
  21 +import org.springframework.stereotype.Component;
  22 +import org.thingsboard.server.common.transport.TransportContext;
  23 +import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
  24 +
  25 +@Component
  26 +@TbLwM2mTransportComponent
  27 +public class LwM2mTransportContext extends TransportContext {
  28 +
  29 + @Getter @Setter
  30 + private LeshanServer server;
  31 +
  32 +}
... ...
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportMsgHandler.java renamed from common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportService.java
... ... @@ -27,7 +27,7 @@ import org.thingsboard.server.transport.lwm2m.server.client.Lwm2mClientRpcReques
27 27 import java.util.Collection;
28 28 import java.util.Optional;
29 29
30   -public interface LwM2mTransportService extends TbTransportService {
  30 +public interface LwM2mTransportMsgHandler {
31 31
32 32 void onRegistered(Registration registration, Collection<Observation> previousObsersations);
33 33
... ... @@ -60,4 +60,8 @@ public interface LwM2mTransportService extends TbTransportService {
60 60 void doTrigger(Registration registration, String path);
61 61
62 62 void doDisconnect(TransportProtos.SessionInfoProto sessionInfo);
  63 +
  64 + void onAwakeDev(Registration registration);
  65 +
  66 + void sendLogsToThingsboard(String msg, String registrationId);
63 67 }
... ...
... ... @@ -15,6 +15,7 @@
15 15 */
16 16 package org.thingsboard.server.transport.lwm2m.server;
17 17
  18 +import lombok.RequiredArgsConstructor;
18 19 import lombok.SneakyThrows;
19 20 import lombok.extern.slf4j.Slf4j;
20 21 import org.eclipse.californium.core.coap.CoAP;
... ... @@ -50,6 +51,7 @@ import org.eclipse.leshan.server.registration.Registration;
50 51 import org.springframework.stereotype.Service;
51 52 import org.thingsboard.server.common.transport.TransportService;
52 53 import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
  54 +import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
53 55 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient;
54 56 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext;
55 57 import org.thingsboard.server.transport.lwm2m.server.client.Lwm2mClientRpcRequest;
... ... @@ -82,35 +84,22 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandle
82 84 @Slf4j
83 85 @Service
84 86 @TbLwM2mTransportComponent
  87 +@RequiredArgsConstructor
85 88 public class LwM2mTransportRequest {
86 89 private ExecutorService executorResponse;
87 90
88 91 public LwM2mValueConverterImpl converter;
89 92
90   - private final LwM2mTransportContextServer lwM2mTransportContextServer;
91   -
  93 + private final LwM2mTransportContext context;
  94 + private final LwM2MTransportServerConfig config;
  95 + private final LwM2mTransportServerHelper lwM2MTransportServerHelper;
92 96 private final LwM2mClientContext lwM2mClientContext;
93   -
94   - private final LeshanServer leshanServer;
95   -
96   - private final LwM2mTransportServiceImpl serviceImpl;
97   -
98   - private final TransportService transportService;
99   -
100   - public LwM2mTransportRequest(LwM2mTransportContextServer lwM2mTransportContextServer,
101   - LwM2mClientContext lwM2mClientContext, LeshanServer leshanServer,
102   - LwM2mTransportServiceImpl serviceImpl, TransportService transportService) {
103   - this.lwM2mTransportContextServer = lwM2mTransportContextServer;
104   - this.lwM2mClientContext = lwM2mClientContext;
105   - this.leshanServer = leshanServer;
106   - this.serviceImpl = serviceImpl;
107   - this.transportService = transportService;
108   - }
  97 + private final DefaultLwM2MTransportMsgHandler serviceImpl;
109 98
110 99 @PostConstruct
111 100 public void init() {
112 101 this.converter = LwM2mValueConverterImpl.getInstance();
113   - executorResponse = Executors.newFixedThreadPool(this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getResponsePoolSize(),
  102 + executorResponse = Executors.newFixedThreadPool(this.config.getResponsePoolSize(),
114 103 new NamedThreadFactory(String.format("LwM2M %s channel response", RESPONSE_CHANNEL)));
115 104 }
116 105
... ... @@ -158,10 +147,10 @@ public class LwM2mTransportRequest {
158 147 * At server side this will not remove the observation from the observation store, to do it you need to use
159 148 * {@code ObservationService#cancelObservation()}
160 149 */
161   - leshanServer.getObservationService().cancelObservations(registration, target);
  150 + context.getServer().getObservationService().cancelObservations(registration, target);
162 151 break;
163 152 case EXECUTE:
164   - resourceModel = lwM2MClient.getResourceModel(targetIdVer, this.lwM2mTransportContextServer.getLwM2MTransportServerConfig()
  153 + resourceModel = lwM2MClient.getResourceModel(targetIdVer, this.config
165 154 .getModelProvider());
166 155 if (params != null && !resourceModel.multiple) {
167 156 request = new ExecuteRequest(target, (String) this.converter.convertValue(params, resourceModel.type, ResourceModel.Type.STRING, resultIds));
... ... @@ -171,7 +160,7 @@ public class LwM2mTransportRequest {
171 160 break;
172 161 case WRITE_REPLACE:
173 162 // Request to write a <b>String Single-Instance Resource</b> using the TLV content format.
174   - resourceModel = lwM2MClient.getResourceModel(targetIdVer, this.lwM2mTransportContextServer.getLwM2MTransportServerConfig()
  163 + resourceModel = lwM2MClient.getResourceModel(targetIdVer, this.config
175 164 .getModelProvider());
176 165 if (contentFormat.equals(ContentFormat.TLV)) {
177 166 request = this.getWriteRequestSingleResource(null, resultIds.getObjectId(),
... ... @@ -232,7 +221,7 @@ public class LwM2mTransportRequest {
232 221 serviceImpl.sentRpcRequest(rpcRequest, NOT_FOUND.getName(), errorMsg, LOG_LW2M_ERROR);
233 222 }
234 223 } else if (OBSERVE_READ_ALL.name().equals(typeOper.name())) {
235   - Set<Observation> observations = leshanServer.getObservationService().getObservations(registration);
  224 + Set<Observation> observations = context.getServer().getObservationService().getObservations(registration);
236 225 Set<String> observationPaths = observations.stream().map(observation -> observation.getPath().toString()).collect(Collectors.toUnmodifiableSet());
237 226 String msg = String.format("%s: type operation %s observation paths - %s", LOG_LW2M_INFO,
238 227 OBSERVE_READ_ALL.type, observationPaths);
... ... @@ -259,7 +248,7 @@ public class LwM2mTransportRequest {
259 248
260 249 @SuppressWarnings("unchecked")
261 250 private void sendRequest(Registration registration, LwM2mClient lwM2MClient, DownlinkRequest request, long timeoutInMs, Lwm2mClientRpcRequest rpcRequest) {
262   - leshanServer.send(registration, request, timeoutInMs, (ResponseCallback<?>) response -> {
  251 + context.getServer().send(registration, request, timeoutInMs, (ResponseCallback<?>) response -> {
263 252 if (!lwM2MClient.isInit()) {
264 253 lwM2MClient.initReadValue(this.serviceImpl, convertPathFromObjectIdToIdVer(request.getPath().toString(), registration));
265 254 }
... ...
common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportServerHelper.java renamed from common/transport/lwm2m/src/main/java/org/thingsboard/server/transport/lwm2m/server/LwM2mTransportContextServer.java
... ... @@ -31,6 +31,7 @@ package org.thingsboard.server.transport.lwm2m.server;
31 31 */
32 32
33 33 import lombok.Getter;
  34 +import lombok.RequiredArgsConstructor;
34 35 import lombok.extern.slf4j.Slf4j;
35 36 import org.eclipse.leshan.core.model.DDFFileParser;
36 37 import org.eclipse.leshan.core.model.DefaultDDFFileValidator;
... ... @@ -39,11 +40,8 @@ import org.eclipse.leshan.core.model.ObjectModel;
39 40 import org.eclipse.leshan.core.model.ResourceModel;
40 41 import org.eclipse.leshan.core.node.codec.CodecException;
41 42 import org.springframework.stereotype.Component;
42   -import org.thingsboard.server.common.transport.TransportContext;
43   -import org.thingsboard.server.common.transport.TransportResourceCache;
44 43 import org.thingsboard.server.common.transport.TransportService;
45 44 import org.thingsboard.server.common.transport.TransportServiceCallback;
46   -import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
47 45 import org.thingsboard.server.gen.transport.TransportProtos;
48 46 import org.thingsboard.server.gen.transport.TransportProtos.PostAttributeMsg;
49 47 import org.thingsboard.server.gen.transport.TransportProtos.PostTelemetryMsg;
... ... @@ -62,34 +60,16 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandle
62 60 @Slf4j
63 61 @Component
64 62 @TbLwM2mTransportComponent
65   -public class LwM2mTransportContextServer extends TransportContext {
  63 +@RequiredArgsConstructor
  64 +public class LwM2mTransportServerHelper {
66 65
67   -
68   - private final LwM2MTransportServerConfig lwM2MTransportServerConfig;
  66 + private final LwM2mTransportContext context;
69 67
70 68 private final TransportService transportService;
71 69
72   - private final TransportResourceCache transportResourceCache;
73   -
74   -
75 70 @Getter
76 71 private final LwM2MJsonAdaptor adaptor;
77 72
78   - public LwM2mTransportContextServer(LwM2MTransportServerConfig lwM2MTransportServerConfig, TransportService transportService, TransportResourceCache transportResourceCache, LwM2MJsonAdaptor adaptor) {
79   - this.lwM2MTransportServerConfig = lwM2MTransportServerConfig;
80   - this.transportService = transportService;
81   - this.transportResourceCache = transportResourceCache;
82   - this.adaptor = adaptor;
83   - }
84   -
85   - public LwM2MTransportServerConfig getLwM2MTransportServerConfig() {
86   - return this.lwM2MTransportServerConfig;
87   - }
88   -
89   - public TransportResourceCache getTransportResourceCache() {
90   - return this.transportResourceCache;
91   - }
92   -
93 73 /**
94 74 * send to Thingsboard Attribute || Telemetry
95 75 *
... ... @@ -134,7 +114,7 @@ public class LwM2mTransportContextServer extends TransportContext {
134 114 */
135 115 public SessionInfoProto getValidateSessionInfo(TransportProtos.ValidateDeviceCredentialsResponseMsg msg, long mostSignificantBits, long leastSignificantBits) {
136 116 return SessionInfoProto.newBuilder()
137   - .setNodeId(this.getNodeId())
  117 + .setNodeId(context.getNodeId())
138 118 .setSessionIdMSB(mostSignificantBits)
139 119 .setSessionIdLSB(leastSignificantBits)
140 120 .setDeviceIdMSB(msg.getDeviceInfo().getDeviceIdMSB())
... ... @@ -165,8 +145,8 @@ public class LwM2mTransportContextServer extends TransportContext {
165 145 * @param logMsg - info about Logs
166 146 * @return- KeyValueProto for telemetry (Logs)
167 147 */
168   - public List <TransportProtos.KeyValueProto> getKvLogyToThingsboard(String logMsg) {
169   - List <TransportProtos.KeyValueProto> result = new ArrayList<>();
  148 + public List<TransportProtos.KeyValueProto> getKvLogyToThingsboard(String logMsg) {
  149 + List<TransportProtos.KeyValueProto> result = new ArrayList<>();
170 150 result.add(TransportProtos.KeyValueProto.newBuilder()
171 151 .setKey(LOG_LW2M_TELEMETRY)
172 152 .setType(TransportProtos.KeyValueType.STRING_V)
... ... @@ -179,32 +159,31 @@ public class LwM2mTransportContextServer extends TransportContext {
179 159 * @throws CodecException -
180 160 */
181 161
182   - public TransportProtos.KeyValueProto getKvAttrTelemetryToThingsboard(ResourceModel.Type resourceType, String resourceName, Object value, boolean isMultiInstances) {
183   - TransportProtos.KeyValueProto.Builder kvProto = TransportProtos.KeyValueProto.newBuilder().setKey(resourceName);
184   - if (isMultiInstances) {
185   - kvProto.setType(TransportProtos.KeyValueType.JSON_V)
186   - .setJsonV((String) value);
  162 + public TransportProtos.KeyValueProto getKvAttrTelemetryToThingsboard(ResourceModel.Type resourceType, String resourceName, Object value, boolean isMultiInstances) {
  163 + TransportProtos.KeyValueProto.Builder kvProto = TransportProtos.KeyValueProto.newBuilder().setKey(resourceName);
  164 + if (isMultiInstances) {
  165 + kvProto.setType(TransportProtos.KeyValueType.JSON_V)
  166 + .setJsonV((String) value);
  167 + } else {
  168 + switch (resourceType) {
  169 + case BOOLEAN:
  170 + kvProto.setType(BOOLEAN_V).setBoolV((Boolean) value).build();
  171 + break;
  172 + case STRING:
  173 + case TIME:
  174 + case OPAQUE:
  175 + case OBJLNK:
  176 + kvProto.setType(TransportProtos.KeyValueType.STRING_V).setStringV((String) value);
  177 + break;
  178 + case INTEGER:
  179 + kvProto.setType(TransportProtos.KeyValueType.LONG_V).setLongV((Long) value);
  180 + break;
  181 + case FLOAT:
  182 + kvProto.setType(TransportProtos.KeyValueType.DOUBLE_V).setDoubleV((Double) value);
187 183 }
188   - else {
189   - switch (resourceType) {
190   - case BOOLEAN:
191   - kvProto.setType(BOOLEAN_V).setBoolV((Boolean) value).build();
192   - break;
193   - case STRING:
194   - case TIME:
195   - case OPAQUE:
196   - case OBJLNK:
197   - kvProto.setType(TransportProtos.KeyValueType.STRING_V).setStringV((String) value);
198   - break;
199   - case INTEGER:
200   - kvProto.setType(TransportProtos.KeyValueType.LONG_V).setLongV((Long) value);
201   - break;
202   - case FLOAT:
203   - kvProto.setType(TransportProtos.KeyValueType.DOUBLE_V).setDoubleV((Double) value);
204   - }
205   - }
206   - return kvProto.build();
207 184 }
  185 + return kvProto.build();
  186 + }
208 187
209 188 /**
210 189 *
... ... @@ -230,7 +209,7 @@ public class LwM2mTransportContextServer extends TransportContext {
230 209 throw new CodecException("Invalid ResourceModel_Type for resource %s, got %s", resourcePath, currentType);
231 210 }
232 211
233   - public Object getValueFromKvProto (TransportProtos.KeyValueProto kv) {
  212 + public Object getValueFromKvProto(TransportProtos.KeyValueProto kv) {
234 213 switch (kv.getType()) {
235 214 case BOOLEAN_V:
236 215 return kv.getBoolV();
... ...
... ... @@ -30,35 +30,4 @@ import javax.annotation.PreDestroy;
30 30 @TbLwM2mTransportComponent
31 31 public class LwM2mTransportServerInitializer {
32 32
33   - @Autowired
34   - private LwM2mTransportServiceImpl service;
35   -
36   - @Autowired
37   - private LeshanServer leshanServer;
38   -
39   - @Autowired
40   - private LwM2mTransportContextServer context;
41   -
42   - @PostConstruct
43   - public void init() {
44   - if (this.context.getLwM2MTransportServerConfig().getEnableGenNewKeyPskRpk()) {
45   - new LWM2MGenerationPSkRPkECC();
46   - }
47   - this.startLhServer();
48   - }
49   -
50   - private void startLhServer() {
51   - this.leshanServer.start();
52   - LwM2mServerListener lhServerCertListener = new LwM2mServerListener(service);
53   - this.leshanServer.getRegistrationService().addListener(lhServerCertListener.registrationListener);
54   - this.leshanServer.getPresenceService().addListener(lhServerCertListener.presenceListener);
55   - this.leshanServer.getObservationService().addListener(lhServerCertListener.observationListener);
56   - }
57   -
58   - @PreDestroy
59   - public void shutdown() {
60   - log.info("Stopping LwM2M transport Server!");
61   - leshanServer.destroy();
62   - log.info("LwM2M transport Server stopped!");
63   - }
64 33 }
... ...
... ... @@ -15,6 +15,7 @@
15 15 */
16 16 package org.thingsboard.server.transport.lwm2m.server;
17 17
  18 +import lombok.RequiredArgsConstructor;
18 19 import lombok.extern.slf4j.Slf4j;
19 20 import org.eclipse.leshan.core.model.DefaultDDFFileValidator;
20 21 import org.eclipse.leshan.core.model.LwM2mModel;
... ... @@ -37,6 +38,7 @@ import static org.thingsboard.server.common.data.ResourceType.LWM2M_MODEL;
37 38 import static org.thingsboard.server.common.data.lwm2m.LwM2mConstants.LWM2M_SEPARATOR_KEY;
38 39
39 40 @Slf4j
  41 +@RequiredArgsConstructor
40 42 public class LwM2mVersionedModelProvider implements LwM2mModelProvider {
41 43
42 44 /**
... ... @@ -46,12 +48,8 @@ public class LwM2mVersionedModelProvider implements LwM2mModelProvider {
46 48 * Value = TenantId
47 49 */
48 50 private final LwM2mClientContext lwM2mClientContext;
49   - private final LwM2mTransportContextServer lwM2mTransportContextServer;
50   -
51   - public LwM2mVersionedModelProvider(LwM2mClientContext lwM2mClientContext, LwM2mTransportContextServer lwM2mTransportContextServer) {
52   - this.lwM2mClientContext = lwM2mClientContext;
53   - this.lwM2mTransportContextServer = lwM2mTransportContextServer;
54   - }
  51 + private final LwM2mTransportServerHelper helper;
  52 + private final LwM2mTransportContext context;
55 53
56 54 private String getKeyIdVer(Integer objectId, String version) {
57 55 return objectId != null ? objectId + LWM2M_SEPARATOR_KEY + ((version == null || version.isEmpty()) ? ObjectModel.DEFAULT_VERSION : version) : null;
... ... @@ -120,11 +118,9 @@ public class LwM2mVersionedModelProvider implements LwM2mModelProvider {
120 118 private ObjectModel getObjectModelDynamic(Integer objectId, String version) {
121 119 String key = getKeyIdVer(objectId, version);
122 120
123   - Optional<TbResource> tbResource = lwM2mTransportContextServer
124   - .getTransportResourceCache()
125   - .get(this.tenantId, LWM2M_MODEL, key);
  121 + Optional<TbResource> tbResource = context.getTransportResourceCache().get(this.tenantId, LWM2M_MODEL, key);
126 122
127   - return tbResource.map(resource -> lwM2mTransportContextServer.parseFromXmlToObjectModel(
  123 + return tbResource.map(resource -> helper.parseFromXmlToObjectModel(
128 124 Base64.getDecoder().decode(resource.getData()),
129 125 key + ".xml",
130 126 new DefaultDDFFileValidator())).orElse(null);
... ...
... ... @@ -27,7 +27,7 @@ import org.eclipse.leshan.server.security.SecurityInfo;
27 27 import org.thingsboard.server.gen.transport.TransportProtos;
28 28 import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceCredentialsResponseMsg;
29 29 import org.thingsboard.server.transport.lwm2m.server.LwM2mQueuedRequest;
30   -import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportServiceImpl;
  30 +import org.thingsboard.server.transport.lwm2m.server.DefaultLwM2MTransportMsgHandler;
31 31 import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl;
32 32
33 33 import java.util.Collection;
... ... @@ -172,7 +172,7 @@ public class LwM2mClient implements Cloneable {
172 172 .collect(Collectors.toSet());
173 173 }
174 174
175   - public void initReadValue(LwM2mTransportServiceImpl serviceImpl, String path) {
  175 + public void initReadValue(DefaultLwM2MTransportMsgHandler serviceImpl, String path) {
176 176 if (path != null) {
177 177 this.pendingReadRequests.remove(path);
178 178 }
... ...
... ... @@ -51,11 +51,13 @@ public abstract class TransportContext {
51 51 @Getter
52 52 private ExecutorService executor;
53 53
54   -
55 54 @Getter
56 55 @Autowired
57 56 private FirmwareDataCache firmwareDataCache;
58 57
  58 + @Autowired
  59 + private TransportResourceCache transportResourceCache;
  60 +
59 61 @PostConstruct
60 62 public void init() {
61 63 executor = ThingsBoardExecutors.newWorkStealingPool(50, getClass());
... ...