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()); |