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