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,7 +30,8 @@ import org.thingsboard.server.transport.lwm2m.bootstrap.secure.LwM2MBootstrapSec
30 import org.thingsboard.server.transport.lwm2m.bootstrap.secure.LwM2MInMemoryBootstrapConfigStore; 30 import org.thingsboard.server.transport.lwm2m.bootstrap.secure.LwM2MInMemoryBootstrapConfigStore;
31 import org.thingsboard.server.transport.lwm2m.bootstrap.secure.LwM2mDefaultBootstrapSessionManager; 31 import org.thingsboard.server.transport.lwm2m.bootstrap.secure.LwM2mDefaultBootstrapSessionManager;
32 import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportBootstrapConfig; 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 import java.math.BigInteger; 36 import java.math.BigInteger;
36 import java.security.AlgorithmParameters; 37 import java.security.AlgorithmParameters;
@@ -68,10 +69,10 @@ public class LwM2MTransportBootstrapServerConfiguration { @@ -68,10 +69,10 @@ public class LwM2MTransportBootstrapServerConfiguration {
68 private boolean pskMode = false; 69 private boolean pskMode = false;
69 70
70 @Autowired 71 @Autowired
71 - private LwM2MTransportContextBootstrap contextBs; 72 + private LwM2MTransportServerConfig serverConfig;
72 73
73 @Autowired 74 @Autowired
74 - private LwM2mTransportContextServer contextS; 75 + private LwM2MTransportContextBootstrap contextBs;
75 76
76 @Autowired 77 @Autowired
77 private LwM2MBootstrapSecurityStore lwM2MBootstrapSecurityStore; 78 private LwM2MBootstrapSecurityStore lwM2MBootstrapSecurityStore;
@@ -108,8 +109,8 @@ public class LwM2MTransportBootstrapServerConfiguration { @@ -108,8 +109,8 @@ public class LwM2MTransportBootstrapServerConfiguration {
108 109
109 /** Create and Set DTLS Config */ 110 /** Create and Set DTLS Config */
110 DtlsConnectorConfig.Builder dtlsConfig = new DtlsConnectorConfig.Builder(); 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 if (this.pskMode) { 114 if (this.pskMode) {
114 dtlsConfig.setSupportedCipherSuites( 115 dtlsConfig.setSupportedCipherSuites(
115 TLS_PSK_WITH_AES_128_CCM_8, 116 TLS_PSK_WITH_AES_128_CCM_8,
@@ -134,10 +135,10 @@ public class LwM2MTransportBootstrapServerConfiguration { @@ -134,10 +135,10 @@ public class LwM2MTransportBootstrapServerConfiguration {
134 135
135 private void setServerWithCredentials(LeshanBootstrapServerBuilder builder) { 136 private void setServerWithCredentials(LeshanBootstrapServerBuilder builder) {
136 try { 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 if (this.setBuilderX509(builder)) { 140 if (this.setBuilderX509(builder)) {
140 - X509Certificate rootCAX509Cert = (X509Certificate) keyStoreServer.getCertificate(this.contextS.getLwM2MTransportServerConfig().getRootCertificateAlias()); 141 + X509Certificate rootCAX509Cert = (X509Certificate) keyStoreServer.getCertificate(serverConfig.getRootCertificateAlias());
141 if (rootCAX509Cert != null) { 142 if (rootCAX509Cert != null) {
142 X509Certificate[] trustedCertificates = new X509Certificate[1]; 143 X509Certificate[] trustedCertificates = new X509Certificate[1];
143 trustedCertificates[0] = rootCAX509Cert; 144 trustedCertificates[0] = rootCAX509Cert;
@@ -168,8 +169,8 @@ public class LwM2MTransportBootstrapServerConfiguration { @@ -168,8 +169,8 @@ public class LwM2MTransportBootstrapServerConfiguration {
168 * For idea => KeyStorePathResource == common/transport/lwm2m/src/main/resources/credentials: in LwM2MTransportContextServer: credentials/serverKeyStore.jks 169 * For idea => KeyStorePathResource == common/transport/lwm2m/src/main/resources/credentials: in LwM2MTransportContextServer: credentials/serverKeyStore.jks
169 */ 170 */
170 try { 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 PublicKey publicKey = serverCertificate.getPublicKey(); 174 PublicKey publicKey = serverCertificate.getPublicKey();
174 if (privateKey != null && privateKey.getEncoded().length > 0 && publicKey != null && publicKey.getEncoded().length > 0) { 175 if (privateKey != null && privateKey.getEncoded().length > 0 && publicKey != null && publicKey.getEncoded().length > 0) {
175 builder.setPublicKey(serverCertificate.getPublicKey()); 176 builder.setPublicKey(serverCertificate.getPublicKey());
@@ -34,7 +34,8 @@ import org.thingsboard.server.transport.lwm2m.secure.LwM2MSecurityMode; @@ -34,7 +34,8 @@ import org.thingsboard.server.transport.lwm2m.secure.LwM2MSecurityMode;
34 import org.thingsboard.server.transport.lwm2m.secure.LwM2mCredentialsSecurityInfoValidator; 34 import org.thingsboard.server.transport.lwm2m.secure.LwM2mCredentialsSecurityInfoValidator;
35 import org.thingsboard.server.transport.lwm2m.secure.ReadResultSecurityStore; 35 import org.thingsboard.server.transport.lwm2m.secure.ReadResultSecurityStore;
36 import org.thingsboard.server.transport.lwm2m.server.LwM2mSessionMsgListener; 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 import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil; 39 import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil;
39 40
40 import java.io.IOException; 41 import java.io.IOException;
@@ -59,12 +60,14 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore { @@ -59,12 +60,14 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore {
59 60
60 private final LwM2mCredentialsSecurityInfoValidator lwM2MCredentialsSecurityInfoValidator; 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 this.bootstrapConfigStore = bootstrapConfigStore; 67 this.bootstrapConfigStore = bootstrapConfigStore;
66 this.lwM2MCredentialsSecurityInfoValidator = lwM2MCredentialsSecurityInfoValidator; 68 this.lwM2MCredentialsSecurityInfoValidator = lwM2MCredentialsSecurityInfoValidator;
67 this.context = context; 69 this.context = context;
  70 + this.helper = helper;
68 } 71 }
69 72
70 @Override 73 @Override
@@ -158,19 +161,19 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore { @@ -158,19 +161,19 @@ public class LwM2MBootstrapSecurityStore implements BootstrapSecurityStore {
158 LwM2MServerBootstrap profileServerBootstrap = mapper.readValue(bootstrapObject.get(BOOTSTRAP_SERVER).toString(), LwM2MServerBootstrap.class); 161 LwM2MServerBootstrap profileServerBootstrap = mapper.readValue(bootstrapObject.get(BOOTSTRAP_SERVER).toString(), LwM2MServerBootstrap.class);
159 LwM2MServerBootstrap profileLwm2mServer = mapper.readValue(bootstrapObject.get(LWM2M_SERVER).toString(), LwM2MServerBootstrap.class); 162 LwM2MServerBootstrap profileLwm2mServer = mapper.readValue(bootstrapObject.get(LWM2M_SERVER).toString(), LwM2MServerBootstrap.class);
160 UUID sessionUUiD = UUID.randomUUID(); 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 context.getTransportService().registerAsyncSession(sessionInfo, new LwM2mSessionMsgListener(null, sessionInfo)); 165 context.getTransportService().registerAsyncSession(sessionInfo, new LwM2mSessionMsgListener(null, sessionInfo));
163 if (this.getValidatedSecurityMode(lwM2MBootstrapConfig.bootstrapServer, profileServerBootstrap, lwM2MBootstrapConfig.lwm2mServer, profileLwm2mServer)) { 166 if (this.getValidatedSecurityMode(lwM2MBootstrapConfig.bootstrapServer, profileServerBootstrap, lwM2MBootstrapConfig.lwm2mServer, profileLwm2mServer)) {
164 lwM2MBootstrapConfig.bootstrapServer = new LwM2MServerBootstrap(lwM2MBootstrapConfig.bootstrapServer, profileServerBootstrap); 167 lwM2MBootstrapConfig.bootstrapServer = new LwM2MServerBootstrap(lwM2MBootstrapConfig.bootstrapServer, profileServerBootstrap);
165 lwM2MBootstrapConfig.lwm2mServer = new LwM2MServerBootstrap(lwM2MBootstrapConfig.lwm2mServer, profileLwm2mServer); 168 lwM2MBootstrapConfig.lwm2mServer = new LwM2MServerBootstrap(lwM2MBootstrapConfig.lwm2mServer, profileLwm2mServer);
166 String logMsg = String.format("%s: getParametersBootstrap: %s Access connect client with bootstrap server.", LOG_LW2M_INFO, store.getEndPoint()); 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 return lwM2MBootstrapConfig; 171 return lwM2MBootstrapConfig;
169 } else { 172 } else {
170 log.error(" [{}] Different values SecurityMode between of client and profile.", store.getEndPoint()); 173 log.error(" [{}] Different values SecurityMode between of client and profile.", store.getEndPoint());
171 log.error("{} getParametersBootstrap: [{}] Different values SecurityMode between of client and profile.", LOG_LW2M_ERROR, store.getEndPoint()); 174 log.error("{} getParametersBootstrap: [{}] Different values SecurityMode between of client and profile.", LOG_LW2M_ERROR, store.getEndPoint());
172 String logMsg = String.format("%s: getParametersBootstrap: %s Different values SecurityMode between of client and profile.", LOG_LW2M_ERROR, store.getEndPoint()); 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 return null; 177 return null;
175 } 178 }
176 } 179 }
@@ -16,6 +16,7 @@ @@ -16,6 +16,7 @@
16 package org.thingsboard.server.transport.lwm2m.secure; 16 package org.thingsboard.server.transport.lwm2m.secure;
17 17
18 import com.google.gson.JsonObject; 18 import com.google.gson.JsonObject;
  19 +import lombok.RequiredArgsConstructor;
19 import lombok.extern.slf4j.Slf4j; 20 import lombok.extern.slf4j.Slf4j;
20 import org.eclipse.leshan.core.util.Hex; 21 import org.eclipse.leshan.core.util.Hex;
21 import org.eclipse.leshan.core.util.SecurityUtil; 22 import org.eclipse.leshan.core.util.SecurityUtil;
@@ -26,7 +27,9 @@ import org.thingsboard.server.common.transport.TransportServiceCallback; @@ -26,7 +27,9 @@ import org.thingsboard.server.common.transport.TransportServiceCallback;
26 import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceCredentialsResponseMsg; 27 import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceCredentialsResponseMsg;
27 import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceLwM2MCredentialsRequestMsg; 28 import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceLwM2MCredentialsRequestMsg;
28 import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; 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 import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil; 33 import org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandlerUtil;
31 34
32 import java.io.IOException; 35 import java.io.IOException;
@@ -44,13 +47,11 @@ import static org.thingsboard.server.transport.lwm2m.secure.LwM2MSecurityMode.X5 @@ -44,13 +47,11 @@ import static org.thingsboard.server.transport.lwm2m.secure.LwM2MSecurityMode.X5
44 @Slf4j 47 @Slf4j
45 @Component 48 @Component
46 @TbLwM2mTransportComponent 49 @TbLwM2mTransportComponent
  50 +@RequiredArgsConstructor
47 public class LwM2mCredentialsSecurityInfoValidator { 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 * Request to thingsboard Response from thingsboard ValidateDeviceLwM2MCredentials 57 * Request to thingsboard Response from thingsboard ValidateDeviceLwM2MCredentials
@@ -61,7 +62,7 @@ public class LwM2mCredentialsSecurityInfoValidator { @@ -61,7 +62,7 @@ public class LwM2mCredentialsSecurityInfoValidator {
61 public ReadResultSecurityStore createAndValidateCredentialsSecurityInfo(String endpoint, LwM2mTransportHandlerUtil.LwM2mTypeServer keyValue) { 62 public ReadResultSecurityStore createAndValidateCredentialsSecurityInfo(String endpoint, LwM2mTransportHandlerUtil.LwM2mTypeServer keyValue) {
62 CountDownLatch latch = new CountDownLatch(1); 63 CountDownLatch latch = new CountDownLatch(1);
63 final ReadResultSecurityStore[] resultSecurityStore = new ReadResultSecurityStore[1]; 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 new TransportServiceCallback<>() { 66 new TransportServiceCallback<>() {
66 @Override 67 @Override
67 public void onSuccess(ValidateDeviceCredentialsResponseMsg msg) { 68 public void onSuccess(ValidateDeviceCredentialsResponseMsg msg) {
@@ -81,7 +82,7 @@ public class LwM2mCredentialsSecurityInfoValidator { @@ -81,7 +82,7 @@ public class LwM2mCredentialsSecurityInfoValidator {
81 } 82 }
82 }); 83 });
83 try { 84 try {
84 - latch.await(contextS.getLwM2MTransportServerConfig().getTimeout(), TimeUnit.MILLISECONDS); 85 + latch.await(config.getTimeout(), TimeUnit.MILLISECONDS);
85 } catch (InterruptedException e) { 86 } catch (InterruptedException e) {
86 log.error("Failed to await credentials!", e); 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,6 +54,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.AttributeUpdateNotif
54 import org.thingsboard.server.gen.transport.TransportProtos.SessionEvent; 54 import org.thingsboard.server.gen.transport.TransportProtos.SessionEvent;
55 import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto; 55 import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto;
56 import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; 56 import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
  57 +import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
57 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; 58 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient;
58 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext; 59 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext;
59 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientProfile; 60 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientProfile;
@@ -111,44 +112,43 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandle @@ -111,44 +112,43 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandle
111 @Slf4j 112 @Slf4j
112 @Service 113 @Service
113 @TbLwM2mTransportComponent 114 @TbLwM2mTransportComponent
114 -public class LwM2mTransportServiceImpl implements LwM2mTransportService { 115 +public class DefaultLwM2MTransportMsgHandler implements LwM2mTransportMsgHandler {
115 116
116 private ExecutorService executorRegistered; 117 private ExecutorService executorRegistered;
117 private ExecutorService executorUpdateRegistered; 118 private ExecutorService executorUpdateRegistered;
118 private ExecutorService executorUnRegistered; 119 private ExecutorService executorUnRegistered;
119 private LwM2mValueConverterImpl converter; 120 private LwM2mValueConverterImpl converter;
120 - private FirmwareDataCache firmwareDataCache;  
121 -  
122 121
123 private final TransportService transportService; 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 private final LwM2mClientContext lwM2mClientContext; 127 private final LwM2mClientContext lwM2mClientContext;
128 -  
129 - private final LeshanServer leshanServer;  
130 -  
131 private final LwM2mTransportRequest lwM2mTransportRequest; 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 this.transportService = transportService; 135 this.transportService = transportService;
137 - this.lwM2mTransportContextServer = lwM2mTransportContextServer; 136 + this.config = config;
  137 + this.helper = helper;
138 this.lwM2mClientContext = lwM2mClientContext; 138 this.lwM2mClientContext = lwM2mClientContext;
139 - this.leshanServer = leshanServer;  
140 this.lwM2mTransportRequest = lwM2mTransportRequest; 139 this.lwM2mTransportRequest = lwM2mTransportRequest;
141 this.firmwareDataCache = firmwareDataCache; 140 this.firmwareDataCache = firmwareDataCache;
  141 + this.context = context;
142 } 142 }
143 143
144 @PostConstruct 144 @PostConstruct
145 public void init() { 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 new NamedThreadFactory(String.format("LwM2M %s channel registered", SERVICE_CHANNEL))); 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 new NamedThreadFactory(String.format("LwM2M %s channel update registered", SERVICE_CHANNEL))); 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 new NamedThreadFactory(String.format("LwM2M %s channel un registered", SERVICE_CHANNEL))); 152 new NamedThreadFactory(String.format("LwM2M %s channel un registered", SERVICE_CHANNEL)));
153 this.converter = LwM2mValueConverterImpl.getInstance(); 153 this.converter = LwM2mValueConverterImpl.getInstance();
154 } 154 }
@@ -278,10 +278,10 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -278,10 +278,10 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
278 @Override 278 @Override
279 public void setCancelObservations(Registration registration) { 279 public void setCancelObservations(Registration registration) {
280 if (registration != null) { 280 if (registration != null) {
281 - Set<Observation> observations = leshanServer.getObservationService().getObservations(registration); 281 + Set<Observation> observations = context.getServer().getObservationService().getObservations(registration);
282 observations.forEach(observation -> lwM2mTransportRequest.sendAllRequest(registration, 282 observations.forEach(observation -> lwM2mTransportRequest.sendAllRequest(registration,
283 convertPathFromObjectIdToIdVer(observation.getPath().toString(), registration), OBSERVE_CANCEL, 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,13 +333,13 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
333 msg.getSharedUpdatedList().forEach(tsKvProto -> { 333 msg.getSharedUpdatedList().forEach(tsKvProto -> {
334 String pathName = tsKvProto.getKv().getKey(); 334 String pathName = tsKvProto.getKv().getKey();
335 String pathIdVer = this.getPresentPathIntoProfile(sessionInfo, pathName); 335 String pathIdVer = this.getPresentPathIntoProfile(sessionInfo, pathName);
336 - Object valueNew = this.lwM2mTransportContextServer.getValueFromKvProto(tsKvProto.getKv()); 336 + Object valueNew = this.helper.getValueFromKvProto(tsKvProto.getKv());
337 //TODO: react on change of the firmware name. 337 //TODO: react on change of the firmware name.
338 if (FirmwareUtil.getAttributeKey(FirmwareType.FIRMWARE, FirmwareKey.VERSION).equals(pathName) && !valueNew.equals(lwM2MClient.getFrUpdate().getCurrentFwVersion())) { 338 if (FirmwareUtil.getAttributeKey(FirmwareType.FIRMWARE, FirmwareKey.VERSION).equals(pathName) && !valueNew.equals(lwM2MClient.getFrUpdate().getCurrentFwVersion())) {
339 this.getInfoFirmwareUpdate(lwM2MClient); 339 this.getInfoFirmwareUpdate(lwM2MClient);
340 } 340 }
341 if (pathIdVer != null) { 341 if (pathIdVer != null) {
342 - ResourceModel resourceModel = lwM2MClient.getResourceModel(pathIdVer, this.lwM2mTransportContextServer.getLwM2MTransportServerConfig() 342 + ResourceModel resourceModel = lwM2MClient.getResourceModel(pathIdVer, this.config
343 .getModelProvider()); 343 .getModelProvider());
344 if (resourceModel != null && resourceModel.operations.isWritable()) { 344 if (resourceModel != null && resourceModel.operations.isWritable()) {
345 this.updateResourcesValueToClient(lwM2MClient, this.getResourceValueFormatKv(lwM2MClient, pathIdVer), valueNew, pathIdVer); 345 this.updateResourcesValueToClient(lwM2MClient, this.getResourceValueFormatKv(lwM2MClient, pathIdVer), valueNew, pathIdVer);
@@ -360,7 +360,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -360,7 +360,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
360 } else if (msg.getSharedDeletedCount() > 0) { 360 } else if (msg.getSharedDeletedCount() > 0) {
361 msg.getSharedUpdatedList().forEach(tsKvProto -> { 361 msg.getSharedUpdatedList().forEach(tsKvProto -> {
362 String pathName = tsKvProto.getKv().getKey(); 362 String pathName = tsKvProto.getKv().getKey();
363 - Object valueNew = this.lwM2mTransportContextServer.getValueFromKvProto(tsKvProto.getKv()); 363 + Object valueNew = this.helper.getValueFromKvProto(tsKvProto.getKv());
364 if (FirmwareUtil.getAttributeKey(FirmwareType.FIRMWARE, FirmwareKey.VERSION).equals(pathName) && !valueNew.equals(lwM2MClient.getFrUpdate().getCurrentFwVersion())) { 364 if (FirmwareUtil.getAttributeKey(FirmwareType.FIRMWARE, FirmwareKey.VERSION).equals(pathName) && !valueNew.equals(lwM2MClient.getFrUpdate().getCurrentFwVersion())) {
365 lwM2MClient.getFrUpdate().setCurrentFwVersion((String) valueNew); 365 lwM2MClient.getFrUpdate().setCurrentFwVersion((String) valueNew);
366 } 366 }
@@ -404,7 +404,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -404,7 +404,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
404 @Override 404 @Override
405 public void onResourceUpdate(Optional<TransportProtos.ResourceUpdateMsg> resourceUpdateMsgOpt) { 405 public void onResourceUpdate(Optional<TransportProtos.ResourceUpdateMsg> resourceUpdateMsgOpt) {
406 String idVer = resourceUpdateMsgOpt.get().getResourceKey(); 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,7 +413,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
413 @Override 413 @Override
414 public void onResourceDelete(Optional<TransportProtos.ResourceDeleteMsg> resourceDeleteMsgOpt) { 414 public void onResourceDelete(Optional<TransportProtos.ResourceDeleteMsg> resourceDeleteMsgOpt) {
415 String pathIdVer = resourceDeleteMsgOpt.get().getResourceKey(); 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 @Override 419 @Override
@@ -429,7 +429,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -429,7 +429,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
429 } else { 429 } else {
430 lwM2mTransportRequest.sendAllRequest(registration, lwm2mClientRpcRequest.getTargetIdVer(), lwm2mClientRpcRequest.getTypeOper(), lwm2mClientRpcRequest.getContentFormatName(), 430 lwM2mTransportRequest.sendAllRequest(registration, lwm2mClientRpcRequest.getTargetIdVer(), lwm2mClientRpcRequest.getTypeOper(), lwm2mClientRpcRequest.getContentFormatName(),
431 lwm2mClientRpcRequest.getValue() == null ? lwm2mClientRpcRequest.getParams() : lwm2mClientRpcRequest.getValue(), 431 lwm2mClientRpcRequest.getValue() == null ? lwm2mClientRpcRequest.getParams() : lwm2mClientRpcRequest.getValue(),
432 - this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getTimeout(), lwm2mClientRpcRequest); 432 + this.config.getTimeout(), lwm2mClientRpcRequest);
433 } 433 }
434 } catch (Exception e) { 434 } catch (Exception e) {
435 if (lwm2mClientRpcRequest == null) { 435 if (lwm2mClientRpcRequest == null) {
@@ -546,7 +546,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -546,7 +546,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
546 @Override 546 @Override
547 public void doTrigger(Registration registration, String path) { 547 public void doTrigger(Registration registration, String path) {
548 lwM2mTransportRequest.sendAllRequest(registration, path, EXECUTE, 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,7 +579,8 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
579 * 579 *
580 * @param registration - 580 * @param registration -
581 */ 581 */
582 - protected void onAwakeDev(Registration registration) { 582 + @Override
  583 + public void onAwakeDev(Registration registration) {
583 log.info("[{}] [{}] Received endpoint Awake version event", registration.getId(), registration.getEndpoint()); 584 log.info("[{}] [{}] Received endpoint Awake version event", registration.getId(), registration.getEndpoint());
584 this.sendLogsToThingsboard(LOG_LW2M_INFO + ": Client is awake!", registration.getId()); 585 this.sendLogsToThingsboard(LOG_LW2M_INFO + ": Client is awake!", registration.getId());
585 //TODO: associate endpointId with device information. 586 //TODO: associate endpointId with device information.
@@ -610,13 +611,14 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -610,13 +611,14 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
610 * @param logMsg - text msg 611 * @param logMsg - text msg
611 * @param registrationId - Id of Registration LwM2M Client 612 * @param registrationId - Id of Registration LwM2M Client
612 */ 613 */
  614 + @Override
613 public void sendLogsToThingsboard(String logMsg, String registrationId) { 615 public void sendLogsToThingsboard(String logMsg, String registrationId) {
614 SessionInfoProto sessionInfo = this.getValidateSessionInfo(registrationId); 616 SessionInfoProto sessionInfo = this.getValidateSessionInfo(registrationId);
615 if (logMsg != null && sessionInfo != null) { 617 if (logMsg != null && sessionInfo != null) {
616 if(logMsg.length() > 1024){ 618 if(logMsg.length() > 1024){
617 logMsg = logMsg.substring(0, 1024); 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,7 +642,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
640 // #2 642 // #2
641 lwM2MClient.getPendingReadRequests().addAll(clientObjects); 643 lwM2MClient.getPendingReadRequests().addAll(clientObjects);
642 clientObjects.forEach(path -> lwM2mTransportRequest.sendAllRequest(registration, path, READ, ContentFormat.TLV.getName(), 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 // #1 647 // #1
646 this.initReadAttrTelemetryObserveToClient(registration, lwM2MClient, READ, clientObjects); 648 this.initReadAttrTelemetryObserveToClient(registration, lwM2MClient, READ, clientObjects);
@@ -689,7 +691,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -689,7 +691,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
689 */ 691 */
690 private void updateResourcesValue(Registration registration, LwM2mResource lwM2mResource, String path) { 692 private void updateResourcesValue(Registration registration, LwM2mResource lwM2mResource, String path) {
691 LwM2mClient lwM2MClient = lwM2mClientContext.getLwM2mClientWithReg(registration, null); 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 .getModelProvider())) { 695 .getModelProvider())) {
694 if (FR_PATH_RESOURCE_VER_ID.equals(convertPathFromIdVerToObjectId(path)) && 696 if (FR_PATH_RESOURCE_VER_ID.equals(convertPathFromIdVerToObjectId(path)) &&
695 lwM2MClient.getFrUpdate().getCurrentFwVersion() != null 697 lwM2MClient.getFrUpdate().getCurrentFwVersion() != null
@@ -728,10 +730,10 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -728,10 +730,10 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
728 SessionInfoProto sessionInfo = this.getValidateSessionInfo(registration); 730 SessionInfoProto sessionInfo = this.getValidateSessionInfo(registration);
729 if (results != null && sessionInfo != null) { 731 if (results != null && sessionInfo != null) {
730 if (results.getResultAttributes().size() > 0) { 732 if (results.getResultAttributes().size() > 0) {
731 - this.lwM2mTransportContextServer.sendParametersOnThingsboardAttribute(results.getResultAttributes(), sessionInfo); 733 + this.helper.sendParametersOnThingsboardAttribute(results.getResultAttributes(), sessionInfo);
732 } 734 }
733 if (results.getResultTelemetries().size() > 0) { 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 } catch (Exception e) { 739 } catch (Exception e) {
@@ -780,7 +782,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -780,7 +782,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
780 ConcurrentHashMap<String, Object> finalParams = params; 782 ConcurrentHashMap<String, Object> finalParams = params;
781 pathSend.forEach(target -> { 783 pathSend.forEach(target -> {
782 lwM2mTransportRequest.sendAllRequest(registration, target, typeOper, ContentFormat.TLV.getName(), 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 if (OBSERVE.equals(typeOper)) { 787 if (OBSERVE.equals(typeOper)) {
786 lwM2MClient.initReadValue(this, null); 788 lwM2MClient.initReadValue(this, null);
@@ -865,7 +867,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -865,7 +867,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
865 LwM2mResource resourceValue = lwM2MClient != null ? getResourceValueFromLwM2MClient(lwM2MClient, pathIdVer) : null; 867 LwM2mResource resourceValue = lwM2MClient != null ? getResourceValueFromLwM2MClient(lwM2MClient, pathIdVer) : null;
866 if (resourceValue != null) { 868 if (resourceValue != null) {
867 ResourceModel.Type currentType = resourceValue.getType(); 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 Object valueKvProto = null; 871 Object valueKvProto = null;
870 if (resourceValue.isMultiInstances()) { 872 if (resourceValue.isMultiInstances()) {
871 valueKvProto = new JsonObject(); 873 valueKvProto = new JsonObject();
@@ -882,7 +884,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -882,7 +884,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
882 valueKvProto = this.converter.convertValue(resourceValue.getValue(), currentType, expectedType, 884 valueKvProto = this.converter.convertValue(resourceValue.getValue(), currentType, expectedType,
883 new LwM2mPath(convertPathFromIdVerToObjectId(pathIdVer))); 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 } catch (Exception e) { 889 } catch (Exception e) {
888 log.error("Failed to add parameters.", e); 890 log.error("Failed to add parameters.", e);
@@ -901,7 +903,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -901,7 +903,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
901 private Object getResourceValueFormatKv(LwM2mClient lwM2MClient, String pathIdVer) { 903 private Object getResourceValueFormatKv(LwM2mClient lwM2MClient, String pathIdVer) {
902 LwM2mResource resourceValue = this.getResourceValueFromLwM2MClient(lwM2MClient, pathIdVer); 904 LwM2mResource resourceValue = this.getResourceValueFromLwM2MClient(lwM2MClient, pathIdVer);
903 ResourceModel.Type currentType = resourceValue.getType(); 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 return this.converter.convertValue(resourceValue.getValue(), currentType, expectedType, 907 return this.converter.convertValue(resourceValue.getValue(), currentType, expectedType,
906 new LwM2mPath(convertPathFromIdVerToObjectId(pathIdVer))); 908 new LwM2mPath(convertPathFromIdVerToObjectId(pathIdVer)));
907 } 909 }
@@ -1094,10 +1096,10 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -1094,10 +1096,10 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1094 if (pathIds.isResource()) { 1096 if (pathIds.isResource()) {
1095 if (READ.equals(typeOper)) { 1097 if (READ.equals(typeOper)) {
1096 lwM2mTransportRequest.sendAllRequest(registration, target, typeOper, 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 } else if (OBSERVE.equals(typeOper)) { 1100 } else if (OBSERVE.equals(typeOper)) {
1099 lwM2mTransportRequest.sendAllRequest(registration, target, typeOper, 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,7 +1155,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1153 if (!pathSend.isEmpty()) { 1155 if (!pathSend.isEmpty()) {
1154 ConcurrentHashMap<String, Object> finalParams = lwm2mAttributesNew; 1156 ConcurrentHashMap<String, Object> finalParams = lwm2mAttributesNew;
1155 pathSend.forEach(target -> lwM2mTransportRequest.sendAllRequest(registration, target, WRITE_ATTRIBUTES, ContentFormat.TLV.getName(), 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,7 +1172,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1170 params.clear(); 1172 params.clear();
1171 params.put(OBJECT_VERSION, ""); 1173 params.put(OBJECT_VERSION, "");
1172 lwM2mTransportRequest.sendAllRequest(registration, target, WRITE_ATTRIBUTES, ContentFormat.TLV.getName(), 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,7 +1185,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1183 paramAnallyzer.forEach(pathIdVer -> { 1185 paramAnallyzer.forEach(pathIdVer -> {
1184 if (this.getResourceValueFromLwM2MClient(lwM2MClient, pathIdVer) != null) { 1186 if (this.getResourceValueFromLwM2MClient(lwM2MClient, pathIdVer) != null) {
1185 lwM2mTransportRequest.sendAllRequest(registration, pathIdVer, OBSERVE_CANCEL, null, 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,7 +1195,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1193 if (valueNew != null && (valueOld == null || !valueNew.toString().equals(valueOld.toString()))) { 1195 if (valueNew != null && (valueOld == null || !valueNew.toString().equals(valueOld.toString()))) {
1194 lwM2mTransportRequest.sendAllRequest(lwM2MClient.getRegistration(), path, WRITE_REPLACE, 1196 lwM2mTransportRequest.sendAllRequest(lwM2MClient.getRegistration(), path, WRITE_REPLACE,
1195 ContentFormat.TLV.getName(), valueNew, 1197 ContentFormat.TLV.getName(), valueNew,
1196 - this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getTimeout(), null); 1198 + this.config.getTimeout(), null);
1197 } else { 1199 } else {
1198 log.error("Failed update resource [{}] [{}]", path, valueNew); 1200 log.error("Failed update resource [{}] [{}]", path, valueNew);
1199 String logMsg = String.format("%s: Failed update resource path - %s value - %s. Value is not changed or bad", 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,7 +1273,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1271 // #2.1 1273 // #2.1
1272 lwM2MClient.getDelayedRequests().forEach((pathIdVer, tsKvProto) -> { 1274 lwM2MClient.getDelayedRequests().forEach((pathIdVer, tsKvProto) -> {
1273 this.updateResourcesValueToClient(lwM2MClient, this.getResourceValueFormatKv(lwM2MClient, pathIdVer), 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,7 +1290,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1288 return null; 1290 return null;
1289 } else { 1291 } else {
1290 return SessionInfoProto.newBuilder() 1292 return SessionInfoProto.newBuilder()
1291 - .setNodeId(this.lwM2mTransportContextServer.getNodeId()) 1293 + .setNodeId(this.context.getNodeId())
1292 .setSessionIdMSB(lwM2MClient.getSessionId().getMostSignificantBits()) 1294 .setSessionIdMSB(lwM2MClient.getSessionId().getMostSignificantBits())
1293 .setSessionIdLSB(lwM2MClient.getSessionId().getLeastSignificantBits()) 1295 .setSessionIdLSB(lwM2MClient.getSessionId().getLeastSignificantBits())
1294 .setDeviceIdMSB(msg.getDeviceInfo().getDeviceIdMSB()) 1296 .setDeviceIdMSB(msg.getDeviceInfo().getDeviceIdMSB())
@@ -1358,7 +1360,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -1358,7 +1360,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1358 if (keyNamesMap.values().size() > 0) { 1360 if (keyNamesMap.values().size() > 0) {
1359 try { 1361 try {
1360 //#1.2 1362 //#1.2
1361 - TransportProtos.GetAttributeRequestMsg getAttributeMsg = lwM2mTransportContextServer.getAdaptor().convertToGetAttributes(null, keyNamesMap.values()); 1363 + TransportProtos.GetAttributeRequestMsg getAttributeMsg = helper.getAdaptor().convertToGetAttributes(null, keyNamesMap.values());
1362 transportService.process(sessionInfo, getAttributeMsg, getAckCallback(lwM2MClient, getAttributeMsg.getRequestId(), DEVICE_ATTRIBUTES_REQUEST)); 1364 transportService.process(sessionInfo, getAttributeMsg, getAckCallback(lwM2MClient, getAttributeMsg.getRequestId(), DEVICE_ATTRIBUTES_REQUEST));
1363 } catch (AdaptorException e) { 1365 } catch (AdaptorException e) {
1364 log.warn("Failed to decode get attributes request", e); 1366 log.warn("Failed to decode get attributes request", e);
@@ -1406,7 +1408,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -1406,7 +1408,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1406 public void readRequestToClientFirmwareVer(Registration registration) { 1408 public void readRequestToClientFirmwareVer(Registration registration) {
1407 String pathIdVer = convertPathFromObjectIdToIdVer(FR_PATH_RESOURCE_VER_ID, registration); 1409 String pathIdVer = convertPathFromObjectIdToIdVer(FR_PATH_RESOURCE_VER_ID, registration);
1408 lwM2mTransportRequest.sendAllRequest(registration, pathIdVer, READ, ContentFormat.TLV.getName(), 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,7 +1424,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1422 String verSupportedObject = lwM2MClient.getRegistration().getSupportedObject().get(objectId); 1424 String verSupportedObject = lwM2MClient.getRegistration().getSupportedObject().get(objectId);
1423 String targetIdVer = LWM2M_SEPARATOR_PATH + objectId + LWM2M_SEPARATOR_KEY + verSupportedObject + LWM2M_SEPARATOR_PATH + 0 + LWM2M_SEPARATOR_PATH + 0; 1425 String targetIdVer = LWM2M_SEPARATOR_PATH + objectId + LWM2M_SEPARATOR_KEY + verSupportedObject + LWM2M_SEPARATOR_PATH + 0 + LWM2M_SEPARATOR_PATH + 0;
1424 lwM2mTransportRequest.sendAllRequest(lwM2MClient.getRegistration(), targetIdVer, WRITE_REPLACE, ContentFormat.OPAQUE.getName(), 1426 lwM2mTransportRequest.sendAllRequest(lwM2MClient.getRegistration(), targetIdVer, WRITE_REPLACE, ContentFormat.OPAQUE.getName(),
1425 - firmwareChunk, lwM2mTransportContextServer.getLwM2MTransportServerConfig().getTimeout(), null); 1427 + firmwareChunk, config.getTimeout(), null);
1426 log.warn("updateFirmwareClient [{}] [{}]", lwM2MClient.getFrUpdate().getCurrentFwVersion(), lwM2MClient.getFrUpdate().getClientFwVersion()); 1428 log.warn("updateFirmwareClient [{}] [{}]", lwM2MClient.getFrUpdate().getCurrentFwVersion(), lwM2MClient.getFrUpdate().getClientFwVersion());
1427 } 1429 }
1428 } 1430 }
@@ -1444,7 +1446,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -1444,7 +1446,7 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1444 } 1446 }
1445 1447
1446 private boolean validateResourceInModel(LwM2mClient lwM2mClient, String pathIdVer, boolean isWritableNotOptional) { 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 .getModelProvider()); 1450 .getModelProvider());
1449 Integer objectId = new LwM2mPath(convertPathFromIdVerToObjectId(pathIdVer)).getObjectId(); 1451 Integer objectId = new LwM2mPath(convertPathFromIdVerToObjectId(pathIdVer)).getObjectId();
1450 String objectVer = validateObjectVerFromKey(pathIdVer); 1452 String objectVer = validateObjectVerFromKey(pathIdVer);
@@ -1453,9 +1455,4 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService { @@ -1453,9 +1455,4 @@ public class LwM2mTransportServiceImpl implements LwM2mTransportService {
1453 objectId != null && objectVer != null && objectVer.equals(lwM2mClient.getRegistration().getSupportedVersion(objectId))); 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,6 +15,7 @@
15 */ 15 */
16 package org.thingsboard.server.transport.lwm2m.server; 16 package org.thingsboard.server.transport.lwm2m.server;
17 17
  18 +import lombok.RequiredArgsConstructor;
18 import lombok.extern.slf4j.Slf4j; 19 import lombok.extern.slf4j.Slf4j;
19 import org.eclipse.californium.core.network.config.NetworkConfig; 20 import org.eclipse.californium.core.network.config.NetworkConfig;
20 import org.eclipse.californium.core.network.stack.BlockwiseLayer; 21 import org.eclipse.californium.core.network.stack.BlockwiseLayer;
@@ -29,14 +30,16 @@ import org.eclipse.leshan.server.model.LwM2mModelProvider; @@ -29,14 +30,16 @@ import org.eclipse.leshan.server.model.LwM2mModelProvider;
29 import org.eclipse.leshan.server.security.DefaultAuthorizer; 30 import org.eclipse.leshan.server.security.DefaultAuthorizer;
30 import org.eclipse.leshan.server.security.EditableSecurityStore; 31 import org.eclipse.leshan.server.security.EditableSecurityStore;
31 import org.eclipse.leshan.server.security.SecurityChecker; 32 import org.eclipse.leshan.server.security.SecurityChecker;
32 -import org.springframework.context.annotation.Bean;  
33 import org.springframework.stereotype.Component; 33 import org.springframework.stereotype.Component;
34 import org.thingsboard.server.common.data.StringUtils; 34 import org.thingsboard.server.common.data.StringUtils;
35 import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; 35 import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
36 import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig; 36 import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
  37 +import org.thingsboard.server.transport.lwm2m.secure.LWM2MGenerationPSkRPkECC;
37 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext; 38 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext;
38 import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl; 39 import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl;
39 40
  41 +import javax.annotation.PostConstruct;
  42 +import javax.annotation.PreDestroy;
40 import java.math.BigInteger; 43 import java.math.BigInteger;
41 import java.security.AlgorithmParameters; 44 import java.security.AlgorithmParameters;
42 import java.security.KeyFactory; 45 import java.security.KeyFactory;
@@ -66,32 +69,53 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mNetworkConfig.g @@ -66,32 +69,53 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mNetworkConfig.g
66 @Slf4j 69 @Slf4j
67 @Component 70 @Component
68 @TbLwM2mTransportComponent 71 @TbLwM2mTransportComponent
69 -public class LwM2mTransportServerConfiguration { 72 +@RequiredArgsConstructor
  73 +public class DefaultLwM2mTransportService implements LwM2MTransportService {
  74 +
70 private PublicKey publicKey; 75 private PublicKey publicKey;
71 private PrivateKey privateKey; 76 private PrivateKey privateKey;
72 private boolean pskMode = false; 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 private final CaliforniumRegistrationStore registrationStore; 83 private final CaliforniumRegistrationStore registrationStore;
75 private final EditableSecurityStore securityStore; 84 private final EditableSecurityStore securityStore;
76 private final LwM2mClientContext lwM2mClientContext; 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 private LeshanServer getLhServer(Integer serverPortNoSec, Integer serverSecurePort) { 115 private LeshanServer getLhServer(Integer serverPortNoSec, Integer serverSecurePort) {
92 LeshanServerBuilder builder = new LeshanServerBuilder(); 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 builder.setDecoder(new DefaultLwM2mNodeDecoder()); 119 builder.setDecoder(new DefaultLwM2mNodeDecoder());
96 /** Use a magic converter to support bad type send by the UI. */ 120 /** Use a magic converter to support bad type send by the UI. */
97 builder.setEncoder(new DefaultLwM2mNodeEncoder(LwM2mValueConverterImpl.getInstance())); 121 builder.setEncoder(new DefaultLwM2mNodeEncoder(LwM2mValueConverterImpl.getInstance()));
@@ -103,8 +127,8 @@ public class LwM2mTransportServerConfiguration { @@ -103,8 +127,8 @@ public class LwM2mTransportServerConfiguration {
103 builder.setCoapConfig(getCoapConfig(serverPortNoSec, serverSecurePort)); 127 builder.setCoapConfig(getCoapConfig(serverPortNoSec, serverSecurePort));
104 128
105 /** Define model provider (Create Models )*/ 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 builder.setObjectModelProvider(modelProvider); 132 builder.setObjectModelProvider(modelProvider);
109 133
110 /** Create credentials */ 134 /** Create credentials */
@@ -118,8 +142,8 @@ public class LwM2mTransportServerConfiguration { @@ -118,8 +142,8 @@ public class LwM2mTransportServerConfiguration {
118 /** Create DTLS Config */ 142 /** Create DTLS Config */
119 DtlsConnectorConfig.Builder dtlsConfig = new DtlsConnectorConfig.Builder(); 143 DtlsConnectorConfig.Builder dtlsConfig = new DtlsConnectorConfig.Builder();
120 dtlsConfig.setServerOnly(true); 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 if (this.pskMode) { 147 if (this.pskMode) {
124 dtlsConfig.setSupportedCipherSuites( 148 dtlsConfig.setSupportedCipherSuites(
125 TLS_PSK_WITH_AES_128_CCM_8, 149 TLS_PSK_WITH_AES_128_CCM_8,
@@ -141,9 +165,9 @@ public class LwM2mTransportServerConfiguration { @@ -141,9 +165,9 @@ public class LwM2mTransportServerConfiguration {
141 165
142 private void setServerWithCredentials(LeshanServerBuilder builder) { 166 private void setServerWithCredentials(LeshanServerBuilder builder) {
143 try { 167 try {
144 - if (this.context.getLwM2MTransportServerConfig().getKeyStoreValue() != null) { 168 + if (config.getKeyStoreValue() != null) {
145 if (this.setBuilderX509(builder)) { 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 if (rootCAX509Cert != null) { 171 if (rootCAX509Cert != null) {
148 X509Certificate[] trustedCertificates = new X509Certificate[1]; 172 X509Certificate[] trustedCertificates = new X509Certificate[1];
149 trustedCertificates[0] = rootCAX509Cert; 173 trustedCertificates[0] = rootCAX509Cert;
@@ -178,8 +202,8 @@ public class LwM2mTransportServerConfiguration { @@ -178,8 +202,8 @@ public class LwM2mTransportServerConfiguration {
178 202
179 private boolean setBuilderX509(LeshanServerBuilder builder) { 203 private boolean setBuilderX509(LeshanServerBuilder builder) {
180 try { 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 PublicKey publicKey = serverCertificate.getPublicKey(); 207 PublicKey publicKey = serverCertificate.getPublicKey();
184 if (privateKey != null && privateKey.getEncoded().length > 0 && publicKey != null && publicKey.getEncoded().length > 0) { 208 if (privateKey != null && privateKey.getEncoded().length > 0 && publicKey != null && publicKey.getEncoded().length > 0) {
185 builder.setPublicKey(serverCertificate.getPublicKey()); 209 builder.setPublicKey(serverCertificate.getPublicKey());
@@ -208,7 +232,7 @@ public class LwM2mTransportServerConfiguration { @@ -208,7 +232,7 @@ public class LwM2mTransportServerConfiguration {
208 } 232 }
209 233
210 private void infoPramsUri(String mode) { 234 private void infoPramsUri(String mode) {
211 - LwM2MTransportServerConfig lwM2MTransportServerConfig = this.context.getLwM2MTransportServerConfig(); 235 + LwM2MTransportServerConfig lwM2MTransportServerConfig = config;
212 log.info("Server uses [{}]: serverNoSecureURI : [{}:{}], serverSecureURI : [{}:{}]", mode, 236 log.info("Server uses [{}]: serverNoSecureURI : [{}:{}], serverSecureURI : [{}:{}]", mode,
213 lwM2MTransportServerConfig.getHost(), 237 lwM2MTransportServerConfig.getHost(),
214 lwM2MTransportServerConfig.getPort(), 238 lwM2MTransportServerConfig.getPort(),
@@ -236,7 +260,7 @@ public class LwM2mTransportServerConfiguration { @@ -236,7 +260,7 @@ public class LwM2mTransportServerConfiguration {
236 AlgorithmParameters algoParameters = AlgorithmParameters.getInstance("EC"); 260 AlgorithmParameters algoParameters = AlgorithmParameters.getInstance("EC");
237 algoParameters.init(new ECGenParameterSpec("secp256r1")); 261 algoParameters.init(new ECGenParameterSpec("secp256r1"));
238 ECParameterSpec parameterSpec = algoParameters.getParameterSpec(ECParameterSpec.class); 262 ECParameterSpec parameterSpec = algoParameters.getParameterSpec(ECParameterSpec.class);
239 - LwM2MTransportServerConfig serverConfig = this.context.getLwM2MTransportServerConfig(); 263 + LwM2MTransportServerConfig serverConfig = config;
240 if (StringUtils.isNotEmpty(serverConfig.getPublicX()) && StringUtils.isNotEmpty(serverConfig.getPublicY())) { 264 if (StringUtils.isNotEmpty(serverConfig.getPublicX()) && StringUtils.isNotEmpty(serverConfig.getPublicY())) {
241 byte[] publicX = Hex.decodeHex(serverConfig.getPublicX().toCharArray()); 265 byte[] publicX = Hex.decodeHex(serverConfig.getPublicX().toCharArray());
242 byte[] publicY = Hex.decodeHex(serverConfig.getPublicY().toCharArray()); 266 byte[] publicY = Hex.decodeHex(serverConfig.getPublicY().toCharArray());
@@ -283,4 +307,9 @@ public class LwM2mTransportServerConfiguration { @@ -283,4 +307,9 @@ public class LwM2mTransportServerConfiguration {
283 params); 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,9 +32,9 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandle
32 @Slf4j 32 @Slf4j
33 public class LwM2mServerListener { 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 this.service = service; 38 this.service = service;
39 } 39 }
40 40
@@ -35,10 +35,10 @@ import java.util.Optional; @@ -35,10 +35,10 @@ import java.util.Optional;
35 35
36 @Slf4j 36 @Slf4j
37 public class LwM2mSessionMsgListener implements GenericFutureListener<Future<? super Void>>, SessionMsgListener { 37 public class LwM2mSessionMsgListener implements GenericFutureListener<Future<? super Void>>, SessionMsgListener {
38 - private LwM2mTransportServiceImpl service; 38 + private DefaultLwM2MTransportMsgHandler service;
39 private TransportProtos.SessionInfoProto sessionInfo; 39 private TransportProtos.SessionInfoProto sessionInfo;
40 40
41 - public LwM2mSessionMsgListener(LwM2mTransportServiceImpl service, TransportProtos.SessionInfoProto sessionInfo) { 41 + public LwM2mSessionMsgListener(DefaultLwM2MTransportMsgHandler service, TransportProtos.SessionInfoProto sessionInfo) {
42 this.service = service; 42 this.service = service;
43 this.sessionInfo = sessionInfo; 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,7 +27,7 @@ import org.thingsboard.server.transport.lwm2m.server.client.Lwm2mClientRpcReques
27 import java.util.Collection; 27 import java.util.Collection;
28 import java.util.Optional; 28 import java.util.Optional;
29 29
30 -public interface LwM2mTransportService extends TbTransportService { 30 +public interface LwM2mTransportMsgHandler {
31 31
32 void onRegistered(Registration registration, Collection<Observation> previousObsersations); 32 void onRegistered(Registration registration, Collection<Observation> previousObsersations);
33 33
@@ -60,4 +60,8 @@ public interface LwM2mTransportService extends TbTransportService { @@ -60,4 +60,8 @@ public interface LwM2mTransportService extends TbTransportService {
60 void doTrigger(Registration registration, String path); 60 void doTrigger(Registration registration, String path);
61 61
62 void doDisconnect(TransportProtos.SessionInfoProto sessionInfo); 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,6 +15,7 @@
15 */ 15 */
16 package org.thingsboard.server.transport.lwm2m.server; 16 package org.thingsboard.server.transport.lwm2m.server;
17 17
  18 +import lombok.RequiredArgsConstructor;
18 import lombok.SneakyThrows; 19 import lombok.SneakyThrows;
19 import lombok.extern.slf4j.Slf4j; 20 import lombok.extern.slf4j.Slf4j;
20 import org.eclipse.californium.core.coap.CoAP; 21 import org.eclipse.californium.core.coap.CoAP;
@@ -50,6 +51,7 @@ import org.eclipse.leshan.server.registration.Registration; @@ -50,6 +51,7 @@ import org.eclipse.leshan.server.registration.Registration;
50 import org.springframework.stereotype.Service; 51 import org.springframework.stereotype.Service;
51 import org.thingsboard.server.common.transport.TransportService; 52 import org.thingsboard.server.common.transport.TransportService;
52 import org.thingsboard.server.queue.util.TbLwM2mTransportComponent; 53 import org.thingsboard.server.queue.util.TbLwM2mTransportComponent;
  54 +import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;
53 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient; 55 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClient;
54 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext; 56 import org.thingsboard.server.transport.lwm2m.server.client.LwM2mClientContext;
55 import org.thingsboard.server.transport.lwm2m.server.client.Lwm2mClientRpcRequest; 57 import org.thingsboard.server.transport.lwm2m.server.client.Lwm2mClientRpcRequest;
@@ -82,35 +84,22 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandle @@ -82,35 +84,22 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandle
82 @Slf4j 84 @Slf4j
83 @Service 85 @Service
84 @TbLwM2mTransportComponent 86 @TbLwM2mTransportComponent
  87 +@RequiredArgsConstructor
85 public class LwM2mTransportRequest { 88 public class LwM2mTransportRequest {
86 private ExecutorService executorResponse; 89 private ExecutorService executorResponse;
87 90
88 public LwM2mValueConverterImpl converter; 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 private final LwM2mClientContext lwM2mClientContext; 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 @PostConstruct 99 @PostConstruct
111 public void init() { 100 public void init() {
112 this.converter = LwM2mValueConverterImpl.getInstance(); 101 this.converter = LwM2mValueConverterImpl.getInstance();
113 - executorResponse = Executors.newFixedThreadPool(this.lwM2mTransportContextServer.getLwM2MTransportServerConfig().getResponsePoolSize(), 102 + executorResponse = Executors.newFixedThreadPool(this.config.getResponsePoolSize(),
114 new NamedThreadFactory(String.format("LwM2M %s channel response", RESPONSE_CHANNEL))); 103 new NamedThreadFactory(String.format("LwM2M %s channel response", RESPONSE_CHANNEL)));
115 } 104 }
116 105
@@ -158,10 +147,10 @@ public class LwM2mTransportRequest { @@ -158,10 +147,10 @@ public class LwM2mTransportRequest {
158 * At server side this will not remove the observation from the observation store, to do it you need to use 147 * At server side this will not remove the observation from the observation store, to do it you need to use
159 * {@code ObservationService#cancelObservation()} 148 * {@code ObservationService#cancelObservation()}
160 */ 149 */
161 - leshanServer.getObservationService().cancelObservations(registration, target); 150 + context.getServer().getObservationService().cancelObservations(registration, target);
162 break; 151 break;
163 case EXECUTE: 152 case EXECUTE:
164 - resourceModel = lwM2MClient.getResourceModel(targetIdVer, this.lwM2mTransportContextServer.getLwM2MTransportServerConfig() 153 + resourceModel = lwM2MClient.getResourceModel(targetIdVer, this.config
165 .getModelProvider()); 154 .getModelProvider());
166 if (params != null && !resourceModel.multiple) { 155 if (params != null && !resourceModel.multiple) {
167 request = new ExecuteRequest(target, (String) this.converter.convertValue(params, resourceModel.type, ResourceModel.Type.STRING, resultIds)); 156 request = new ExecuteRequest(target, (String) this.converter.convertValue(params, resourceModel.type, ResourceModel.Type.STRING, resultIds));
@@ -171,7 +160,7 @@ public class LwM2mTransportRequest { @@ -171,7 +160,7 @@ public class LwM2mTransportRequest {
171 break; 160 break;
172 case WRITE_REPLACE: 161 case WRITE_REPLACE:
173 // Request to write a <b>String Single-Instance Resource</b> using the TLV content format. 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 .getModelProvider()); 164 .getModelProvider());
176 if (contentFormat.equals(ContentFormat.TLV)) { 165 if (contentFormat.equals(ContentFormat.TLV)) {
177 request = this.getWriteRequestSingleResource(null, resultIds.getObjectId(), 166 request = this.getWriteRequestSingleResource(null, resultIds.getObjectId(),
@@ -232,7 +221,7 @@ public class LwM2mTransportRequest { @@ -232,7 +221,7 @@ public class LwM2mTransportRequest {
232 serviceImpl.sentRpcRequest(rpcRequest, NOT_FOUND.getName(), errorMsg, LOG_LW2M_ERROR); 221 serviceImpl.sentRpcRequest(rpcRequest, NOT_FOUND.getName(), errorMsg, LOG_LW2M_ERROR);
233 } 222 }
234 } else if (OBSERVE_READ_ALL.name().equals(typeOper.name())) { 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 Set<String> observationPaths = observations.stream().map(observation -> observation.getPath().toString()).collect(Collectors.toUnmodifiableSet()); 225 Set<String> observationPaths = observations.stream().map(observation -> observation.getPath().toString()).collect(Collectors.toUnmodifiableSet());
237 String msg = String.format("%s: type operation %s observation paths - %s", LOG_LW2M_INFO, 226 String msg = String.format("%s: type operation %s observation paths - %s", LOG_LW2M_INFO,
238 OBSERVE_READ_ALL.type, observationPaths); 227 OBSERVE_READ_ALL.type, observationPaths);
@@ -259,7 +248,7 @@ public class LwM2mTransportRequest { @@ -259,7 +248,7 @@ public class LwM2mTransportRequest {
259 248
260 @SuppressWarnings("unchecked") 249 @SuppressWarnings("unchecked")
261 private void sendRequest(Registration registration, LwM2mClient lwM2MClient, DownlinkRequest request, long timeoutInMs, Lwm2mClientRpcRequest rpcRequest) { 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 if (!lwM2MClient.isInit()) { 252 if (!lwM2MClient.isInit()) {
264 lwM2MClient.initReadValue(this.serviceImpl, convertPathFromObjectIdToIdVer(request.getPath().toString(), registration)); 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,6 +31,7 @@ package org.thingsboard.server.transport.lwm2m.server;
31 */ 31 */
32 32
33 import lombok.Getter; 33 import lombok.Getter;
  34 +import lombok.RequiredArgsConstructor;
34 import lombok.extern.slf4j.Slf4j; 35 import lombok.extern.slf4j.Slf4j;
35 import org.eclipse.leshan.core.model.DDFFileParser; 36 import org.eclipse.leshan.core.model.DDFFileParser;
36 import org.eclipse.leshan.core.model.DefaultDDFFileValidator; 37 import org.eclipse.leshan.core.model.DefaultDDFFileValidator;
@@ -39,11 +40,8 @@ import org.eclipse.leshan.core.model.ObjectModel; @@ -39,11 +40,8 @@ import org.eclipse.leshan.core.model.ObjectModel;
39 import org.eclipse.leshan.core.model.ResourceModel; 40 import org.eclipse.leshan.core.model.ResourceModel;
40 import org.eclipse.leshan.core.node.codec.CodecException; 41 import org.eclipse.leshan.core.node.codec.CodecException;
41 import org.springframework.stereotype.Component; 42 import org.springframework.stereotype.Component;
42 -import org.thingsboard.server.common.transport.TransportContext;  
43 -import org.thingsboard.server.common.transport.TransportResourceCache;  
44 import org.thingsboard.server.common.transport.TransportService; 43 import org.thingsboard.server.common.transport.TransportService;
45 import org.thingsboard.server.common.transport.TransportServiceCallback; 44 import org.thingsboard.server.common.transport.TransportServiceCallback;
46 -import org.thingsboard.server.transport.lwm2m.config.LwM2MTransportServerConfig;  
47 import org.thingsboard.server.gen.transport.TransportProtos; 45 import org.thingsboard.server.gen.transport.TransportProtos;
48 import org.thingsboard.server.gen.transport.TransportProtos.PostAttributeMsg; 46 import org.thingsboard.server.gen.transport.TransportProtos.PostAttributeMsg;
49 import org.thingsboard.server.gen.transport.TransportProtos.PostTelemetryMsg; 47 import org.thingsboard.server.gen.transport.TransportProtos.PostTelemetryMsg;
@@ -62,34 +60,16 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandle @@ -62,34 +60,16 @@ import static org.thingsboard.server.transport.lwm2m.server.LwM2mTransportHandle
62 @Slf4j 60 @Slf4j
63 @Component 61 @Component
64 @TbLwM2mTransportComponent 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 private final TransportService transportService; 68 private final TransportService transportService;
71 69
72 - private final TransportResourceCache transportResourceCache;  
73 -  
74 -  
75 @Getter 70 @Getter
76 private final LwM2MJsonAdaptor adaptor; 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 * send to Thingsboard Attribute || Telemetry 74 * send to Thingsboard Attribute || Telemetry
95 * 75 *
@@ -134,7 +114,7 @@ public class LwM2mTransportContextServer extends TransportContext { @@ -134,7 +114,7 @@ public class LwM2mTransportContextServer extends TransportContext {
134 */ 114 */
135 public SessionInfoProto getValidateSessionInfo(TransportProtos.ValidateDeviceCredentialsResponseMsg msg, long mostSignificantBits, long leastSignificantBits) { 115 public SessionInfoProto getValidateSessionInfo(TransportProtos.ValidateDeviceCredentialsResponseMsg msg, long mostSignificantBits, long leastSignificantBits) {
136 return SessionInfoProto.newBuilder() 116 return SessionInfoProto.newBuilder()
137 - .setNodeId(this.getNodeId()) 117 + .setNodeId(context.getNodeId())
138 .setSessionIdMSB(mostSignificantBits) 118 .setSessionIdMSB(mostSignificantBits)
139 .setSessionIdLSB(leastSignificantBits) 119 .setSessionIdLSB(leastSignificantBits)
140 .setDeviceIdMSB(msg.getDeviceInfo().getDeviceIdMSB()) 120 .setDeviceIdMSB(msg.getDeviceInfo().getDeviceIdMSB())
@@ -165,8 +145,8 @@ public class LwM2mTransportContextServer extends TransportContext { @@ -165,8 +145,8 @@ public class LwM2mTransportContextServer extends TransportContext {
165 * @param logMsg - info about Logs 145 * @param logMsg - info about Logs
166 * @return- KeyValueProto for telemetry (Logs) 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 result.add(TransportProtos.KeyValueProto.newBuilder() 150 result.add(TransportProtos.KeyValueProto.newBuilder()
171 .setKey(LOG_LW2M_TELEMETRY) 151 .setKey(LOG_LW2M_TELEMETRY)
172 .setType(TransportProtos.KeyValueType.STRING_V) 152 .setType(TransportProtos.KeyValueType.STRING_V)
@@ -179,32 +159,31 @@ public class LwM2mTransportContextServer extends TransportContext { @@ -179,32 +159,31 @@ public class LwM2mTransportContextServer extends TransportContext {
179 * @throws CodecException - 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,7 +209,7 @@ public class LwM2mTransportContextServer extends TransportContext {
230 throw new CodecException("Invalid ResourceModel_Type for resource %s, got %s", resourcePath, currentType); 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 switch (kv.getType()) { 213 switch (kv.getType()) {
235 case BOOLEAN_V: 214 case BOOLEAN_V:
236 return kv.getBoolV(); 215 return kv.getBoolV();
@@ -30,35 +30,4 @@ import javax.annotation.PreDestroy; @@ -30,35 +30,4 @@ import javax.annotation.PreDestroy;
30 @TbLwM2mTransportComponent 30 @TbLwM2mTransportComponent
31 public class LwM2mTransportServerInitializer { 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,6 +15,7 @@
15 */ 15 */
16 package org.thingsboard.server.transport.lwm2m.server; 16 package org.thingsboard.server.transport.lwm2m.server;
17 17
  18 +import lombok.RequiredArgsConstructor;
18 import lombok.extern.slf4j.Slf4j; 19 import lombok.extern.slf4j.Slf4j;
19 import org.eclipse.leshan.core.model.DefaultDDFFileValidator; 20 import org.eclipse.leshan.core.model.DefaultDDFFileValidator;
20 import org.eclipse.leshan.core.model.LwM2mModel; 21 import org.eclipse.leshan.core.model.LwM2mModel;
@@ -37,6 +38,7 @@ import static org.thingsboard.server.common.data.ResourceType.LWM2M_MODEL; @@ -37,6 +38,7 @@ import static org.thingsboard.server.common.data.ResourceType.LWM2M_MODEL;
37 import static org.thingsboard.server.common.data.lwm2m.LwM2mConstants.LWM2M_SEPARATOR_KEY; 38 import static org.thingsboard.server.common.data.lwm2m.LwM2mConstants.LWM2M_SEPARATOR_KEY;
38 39
39 @Slf4j 40 @Slf4j
  41 +@RequiredArgsConstructor
40 public class LwM2mVersionedModelProvider implements LwM2mModelProvider { 42 public class LwM2mVersionedModelProvider implements LwM2mModelProvider {
41 43
42 /** 44 /**
@@ -46,12 +48,8 @@ public class LwM2mVersionedModelProvider implements LwM2mModelProvider { @@ -46,12 +48,8 @@ public class LwM2mVersionedModelProvider implements LwM2mModelProvider {
46 * Value = TenantId 48 * Value = TenantId
47 */ 49 */
48 private final LwM2mClientContext lwM2mClientContext; 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 private String getKeyIdVer(Integer objectId, String version) { 54 private String getKeyIdVer(Integer objectId, String version) {
57 return objectId != null ? objectId + LWM2M_SEPARATOR_KEY + ((version == null || version.isEmpty()) ? ObjectModel.DEFAULT_VERSION : version) : null; 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,11 +118,9 @@ public class LwM2mVersionedModelProvider implements LwM2mModelProvider {
120 private ObjectModel getObjectModelDynamic(Integer objectId, String version) { 118 private ObjectModel getObjectModelDynamic(Integer objectId, String version) {
121 String key = getKeyIdVer(objectId, version); 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 Base64.getDecoder().decode(resource.getData()), 124 Base64.getDecoder().decode(resource.getData()),
129 key + ".xml", 125 key + ".xml",
130 new DefaultDDFFileValidator())).orElse(null); 126 new DefaultDDFFileValidator())).orElse(null);
@@ -27,7 +27,7 @@ import org.eclipse.leshan.server.security.SecurityInfo; @@ -27,7 +27,7 @@ import org.eclipse.leshan.server.security.SecurityInfo;
27 import org.thingsboard.server.gen.transport.TransportProtos; 27 import org.thingsboard.server.gen.transport.TransportProtos;
28 import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceCredentialsResponseMsg; 28 import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceCredentialsResponseMsg;
29 import org.thingsboard.server.transport.lwm2m.server.LwM2mQueuedRequest; 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 import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl; 31 import org.thingsboard.server.transport.lwm2m.utils.LwM2mValueConverterImpl;
32 32
33 import java.util.Collection; 33 import java.util.Collection;
@@ -172,7 +172,7 @@ public class LwM2mClient implements Cloneable { @@ -172,7 +172,7 @@ public class LwM2mClient implements Cloneable {
172 .collect(Collectors.toSet()); 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 if (path != null) { 176 if (path != null) {
177 this.pendingReadRequests.remove(path); 177 this.pendingReadRequests.remove(path);
178 } 178 }
@@ -51,11 +51,13 @@ public abstract class TransportContext { @@ -51,11 +51,13 @@ public abstract class TransportContext {
51 @Getter 51 @Getter
52 private ExecutorService executor; 52 private ExecutorService executor;
53 53
54 -  
55 @Getter 54 @Getter
56 @Autowired 55 @Autowired
57 private FirmwareDataCache firmwareDataCache; 56 private FirmwareDataCache firmwareDataCache;
58 57
  58 + @Autowired
  59 + private TransportResourceCache transportResourceCache;
  60 +
59 @PostConstruct 61 @PostConstruct
60 public void init() { 62 public void init() {
61 executor = ThingsBoardExecutors.newWorkStealingPool(50, getClass()); 63 executor = ThingsBoardExecutors.newWorkStealingPool(50, getClass());