Showing
6 changed files
with
30 additions
and
19 deletions
common/transport/coap/src/main/java/org/thingsboard/server/transport/coap/CoapTransportResource.java
... | ... | @@ -24,6 +24,7 @@ import org.eclipse.californium.core.network.ExchangeObserver; |
24 | 24 | import org.eclipse.californium.core.server.resources.CoapExchange; |
25 | 25 | import org.eclipse.californium.core.server.resources.Resource; |
26 | 26 | import org.springframework.util.ReflectionUtils; |
27 | +import org.thingsboard.server.common.data.DeviceTransportType; | |
27 | 28 | import org.thingsboard.server.common.data.security.DeviceTokenCredentials; |
28 | 29 | import org.thingsboard.server.common.msg.session.FeatureType; |
29 | 30 | import org.thingsboard.server.common.msg.session.SessionMsgType; |
... | ... | @@ -145,7 +146,7 @@ public class CoapTransportResource extends CoapResource { |
145 | 146 | return; |
146 | 147 | } |
147 | 148 | |
148 | - transportService.process(TransportProtos.ValidateDeviceTokenRequestMsg.newBuilder().setToken(credentials.get().getCredentialsId()).build(), | |
149 | + transportService.process(DeviceTransportType.DEFAULT, TransportProtos.ValidateDeviceTokenRequestMsg.newBuilder().setToken(credentials.get().getCredentialsId()).build(), | |
149 | 150 | new DeviceAuthCallback(transportContext, exchange, sessionInfo -> { |
150 | 151 | UUID sessionId = new UUID(sessionInfo.getSessionIdMSB(), sessionInfo.getSessionIdLSB()); |
151 | 152 | try { | ... | ... |
... | ... | @@ -30,6 +30,7 @@ import org.springframework.web.bind.annotation.RequestMethod; |
30 | 30 | import org.springframework.web.bind.annotation.RequestParam; |
31 | 31 | import org.springframework.web.bind.annotation.RestController; |
32 | 32 | import org.springframework.web.context.request.async.DeferredResult; |
33 | +import org.thingsboard.server.common.data.DeviceTransportType; | |
33 | 34 | import org.thingsboard.server.common.data.id.DeviceId; |
34 | 35 | import org.thingsboard.server.common.transport.SessionMsgListener; |
35 | 36 | import org.thingsboard.server.common.transport.TransportContext; |
... | ... | @@ -78,7 +79,7 @@ public class DeviceApiController { |
78 | 79 | @RequestParam(value = "sharedKeys", required = false, defaultValue = "") String sharedKeys, |
79 | 80 | HttpServletRequest httpRequest) { |
80 | 81 | DeferredResult<ResponseEntity> responseWriter = new DeferredResult<>(); |
81 | - transportContext.getTransportService().process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(), | |
82 | + transportContext.getTransportService().process(DeviceTransportType.DEFAULT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(), | |
82 | 83 | new DeviceAuthCallback(transportContext, responseWriter, sessionInfo -> { |
83 | 84 | GetAttributeRequestMsg.Builder request = GetAttributeRequestMsg.newBuilder().setRequestId(0); |
84 | 85 | List<String> clientKeySet = !StringUtils.isEmpty(clientKeys) ? Arrays.asList(clientKeys.split(",")) : null; |
... | ... | @@ -100,7 +101,7 @@ public class DeviceApiController { |
100 | 101 | public DeferredResult<ResponseEntity> postDeviceAttributes(@PathVariable("deviceToken") String deviceToken, |
101 | 102 | @RequestBody String json, HttpServletRequest request) { |
102 | 103 | DeferredResult<ResponseEntity> responseWriter = new DeferredResult<>(); |
103 | - transportContext.getTransportService().process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(), | |
104 | + transportContext.getTransportService().process(DeviceTransportType.DEFAULT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(), | |
104 | 105 | new DeviceAuthCallback(transportContext, responseWriter, sessionInfo -> { |
105 | 106 | TransportService transportService = transportContext.getTransportService(); |
106 | 107 | transportService.process(sessionInfo, JsonConverter.convertToAttributesProto(new JsonParser().parse(json)), |
... | ... | @@ -114,7 +115,7 @@ public class DeviceApiController { |
114 | 115 | public DeferredResult<ResponseEntity> postTelemetry(@PathVariable("deviceToken") String deviceToken, |
115 | 116 | @RequestBody String json, HttpServletRequest request) { |
116 | 117 | DeferredResult<ResponseEntity> responseWriter = new DeferredResult<ResponseEntity>(); |
117 | - transportContext.getTransportService().process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(), | |
118 | + transportContext.getTransportService().process(DeviceTransportType.DEFAULT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(), | |
118 | 119 | new DeviceAuthCallback(transportContext, responseWriter, sessionInfo -> { |
119 | 120 | TransportService transportService = transportContext.getTransportService(); |
120 | 121 | transportService.process(sessionInfo, JsonConverter.convertToTelemetryProto(new JsonParser().parse(json)), |
... | ... | @@ -128,7 +129,7 @@ public class DeviceApiController { |
128 | 129 | public DeferredResult<ResponseEntity> claimDevice(@PathVariable("deviceToken") String deviceToken, |
129 | 130 | @RequestBody(required = false) String json, HttpServletRequest request) { |
130 | 131 | DeferredResult<ResponseEntity> responseWriter = new DeferredResult<>(); |
131 | - transportContext.getTransportService().process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(), | |
132 | + transportContext.getTransportService().process(DeviceTransportType.DEFAULT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(), | |
132 | 133 | new DeviceAuthCallback(transportContext, responseWriter, sessionInfo -> { |
133 | 134 | TransportService transportService = transportContext.getTransportService(); |
134 | 135 | DeviceId deviceId = new DeviceId(new UUID(sessionInfo.getDeviceIdMSB(), sessionInfo.getDeviceIdLSB())); |
... | ... | @@ -143,7 +144,7 @@ public class DeviceApiController { |
143 | 144 | @RequestParam(value = "timeout", required = false, defaultValue = "0") long timeout, |
144 | 145 | HttpServletRequest httpRequest) { |
145 | 146 | DeferredResult<ResponseEntity> responseWriter = new DeferredResult<>(); |
146 | - transportContext.getTransportService().process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(), | |
147 | + transportContext.getTransportService().process(DeviceTransportType.DEFAULT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(), | |
147 | 148 | new DeviceAuthCallback(transportContext, responseWriter, sessionInfo -> { |
148 | 149 | TransportService transportService = transportContext.getTransportService(); |
149 | 150 | transportService.registerSyncSession(sessionInfo, new HttpSessionListener(responseWriter), |
... | ... | @@ -160,7 +161,7 @@ public class DeviceApiController { |
160 | 161 | @PathVariable("requestId") Integer requestId, |
161 | 162 | @RequestBody String json, HttpServletRequest request) { |
162 | 163 | DeferredResult<ResponseEntity> responseWriter = new DeferredResult<ResponseEntity>(); |
163 | - transportContext.getTransportService().process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(), | |
164 | + transportContext.getTransportService().process(DeviceTransportType.DEFAULT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(), | |
164 | 165 | new DeviceAuthCallback(transportContext, responseWriter, sessionInfo -> { |
165 | 166 | TransportService transportService = transportContext.getTransportService(); |
166 | 167 | transportService.process(sessionInfo, ToDeviceRpcResponseMsg.newBuilder().setRequestId(requestId).setPayload(json).build(), new HttpOkCallback(responseWriter)); |
... | ... | @@ -172,7 +173,7 @@ public class DeviceApiController { |
172 | 173 | public DeferredResult<ResponseEntity> postRpcRequest(@PathVariable("deviceToken") String deviceToken, |
173 | 174 | @RequestBody String json, HttpServletRequest httpRequest) { |
174 | 175 | DeferredResult<ResponseEntity> responseWriter = new DeferredResult<ResponseEntity>(); |
175 | - transportContext.getTransportService().process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(), | |
176 | + transportContext.getTransportService().process(DeviceTransportType.DEFAULT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(), | |
176 | 177 | new DeviceAuthCallback(transportContext, responseWriter, sessionInfo -> { |
177 | 178 | JsonObject request = new JsonParser().parse(json).getAsJsonObject(); |
178 | 179 | TransportService transportService = transportContext.getTransportService(); |
... | ... | @@ -190,7 +191,7 @@ public class DeviceApiController { |
190 | 191 | @RequestParam(value = "timeout", required = false, defaultValue = "0") long timeout, |
191 | 192 | HttpServletRequest httpRequest) { |
192 | 193 | DeferredResult<ResponseEntity> responseWriter = new DeferredResult<>(); |
193 | - transportContext.getTransportService().process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(), | |
194 | + transportContext.getTransportService().process(DeviceTransportType.DEFAULT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(deviceToken).build(), | |
194 | 195 | new DeviceAuthCallback(transportContext, responseWriter, sessionInfo -> { |
195 | 196 | TransportService transportService = transportContext.getTransportService(); |
196 | 197 | transportService.registerSyncSession(sessionInfo, new HttpSessionListener(responseWriter), | ... | ... |
... | ... | @@ -24,6 +24,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; |
24 | 24 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
25 | 25 | import org.springframework.stereotype.Component; |
26 | 26 | import org.springframework.util.StringUtils; |
27 | +import org.thingsboard.server.common.data.DeviceTransportType; | |
27 | 28 | import org.thingsboard.server.common.msg.EncryptionUtil; |
28 | 29 | import org.thingsboard.server.common.transport.TransportService; |
29 | 30 | import org.thingsboard.server.common.transport.TransportServiceCallback; |
... | ... | @@ -157,7 +158,7 @@ public class MqttSslHandlerProvider { |
157 | 158 | String sha3Hash = EncryptionUtil.getSha3Hash(strCert); |
158 | 159 | final String[] credentialsBodyHolder = new String[1]; |
159 | 160 | CountDownLatch latch = new CountDownLatch(1); |
160 | - transportService.process(TransportProtos.ValidateDeviceX509CertRequestMsg.newBuilder().setHash(sha3Hash).build(), | |
161 | + transportService.process(DeviceTransportType.MQTT, TransportProtos.ValidateDeviceX509CertRequestMsg.newBuilder().setHash(sha3Hash).build(), | |
161 | 162 | new TransportServiceCallback<ValidateDeviceCredentialsResponse>() { |
162 | 163 | @Override |
163 | 164 | public void onSuccess(ValidateDeviceCredentialsResponse msg) { | ... | ... |
... | ... | @@ -39,6 +39,7 @@ import io.netty.util.concurrent.Future; |
39 | 39 | import io.netty.util.concurrent.GenericFutureListener; |
40 | 40 | import lombok.extern.slf4j.Slf4j; |
41 | 41 | import org.springframework.util.StringUtils; |
42 | +import org.thingsboard.server.common.data.DeviceTransportType; | |
42 | 43 | import org.thingsboard.server.common.data.device.profile.MqttTopics; |
43 | 44 | import org.thingsboard.server.common.msg.EncryptionUtil; |
44 | 45 | import org.thingsboard.server.common.transport.SessionMsgListener; |
... | ... | @@ -366,7 +367,7 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement |
366 | 367 | ctx.writeAndFlush(createMqttConnAckMsg(CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD)); |
367 | 368 | ctx.close(); |
368 | 369 | } else { |
369 | - transportService.process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(userName).build(), | |
370 | + transportService.process(DeviceTransportType.MQTT, ValidateDeviceTokenRequestMsg.newBuilder().setToken(userName).build(), | |
370 | 371 | new TransportServiceCallback<ValidateDeviceCredentialsResponse>() { |
371 | 372 | @Override |
372 | 373 | public void onSuccess(ValidateDeviceCredentialsResponse msg) { |
... | ... | @@ -387,7 +388,7 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement |
387 | 388 | try { |
388 | 389 | String strCert = SslUtil.getX509CertificateString(cert); |
389 | 390 | String sha3Hash = EncryptionUtil.getSha3Hash(strCert); |
390 | - transportService.process(ValidateDeviceX509CertRequestMsg.newBuilder().setHash(sha3Hash).build(), | |
391 | + transportService.process(DeviceTransportType.MQTT, ValidateDeviceX509CertRequestMsg.newBuilder().setHash(sha3Hash).build(), | |
391 | 392 | new TransportServiceCallback<ValidateDeviceCredentialsResponse>() { |
392 | 393 | @Override |
393 | 394 | public void onSuccess(ValidateDeviceCredentialsResponse msg) { | ... | ... |
... | ... | @@ -16,6 +16,7 @@ |
16 | 16 | package org.thingsboard.server.common.transport; |
17 | 17 | |
18 | 18 | import org.thingsboard.server.common.data.DeviceProfile; |
19 | +import org.thingsboard.server.common.data.DeviceTransportType; | |
19 | 20 | import org.thingsboard.server.common.data.id.DeviceProfileId; |
20 | 21 | import org.thingsboard.server.common.transport.auth.GetOrCreateDeviceFromGatewayResponse; |
21 | 22 | import org.thingsboard.server.common.transport.auth.ValidateDeviceCredentialsResponse; |
... | ... | @@ -45,10 +46,10 @@ public interface TransportService { |
45 | 46 | |
46 | 47 | GetTenantRoutingInfoResponseMsg getRoutingInfo(GetTenantRoutingInfoRequestMsg msg); |
47 | 48 | |
48 | - void process(ValidateDeviceTokenRequestMsg msg, | |
49 | + void process(DeviceTransportType transportType, ValidateDeviceTokenRequestMsg msg, | |
49 | 50 | TransportServiceCallback<ValidateDeviceCredentialsResponse> callback); |
50 | 51 | |
51 | - void process(ValidateDeviceX509CertRequestMsg msg, | |
52 | + void process(DeviceTransportType transportType, ValidateDeviceX509CertRequestMsg msg, | |
52 | 53 | TransportServiceCallback<ValidateDeviceCredentialsResponse> callback); |
53 | 54 | |
54 | 55 | void process(GetOrCreateDeviceFromGatewayRequestMsg msg, | ... | ... |
... | ... | @@ -27,6 +27,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; |
27 | 27 | import org.springframework.stereotype.Service; |
28 | 28 | import org.thingsboard.common.util.ThingsBoardThreadFactory; |
29 | 29 | import org.thingsboard.server.common.data.DeviceProfile; |
30 | +import org.thingsboard.server.common.data.DeviceTransportType; | |
30 | 31 | import org.thingsboard.server.common.data.EntityType; |
31 | 32 | import org.thingsboard.server.common.data.id.DeviceId; |
32 | 33 | import org.thingsboard.server.common.data.id.DeviceProfileId; |
... | ... | @@ -252,20 +253,20 @@ public class DefaultTransportService implements TransportService { |
252 | 253 | } |
253 | 254 | |
254 | 255 | @Override |
255 | - public void process(TransportProtos.ValidateDeviceTokenRequestMsg msg, TransportServiceCallback<ValidateDeviceCredentialsResponse> callback) { | |
256 | + public void process(DeviceTransportType transportType, TransportProtos.ValidateDeviceTokenRequestMsg msg, TransportServiceCallback<ValidateDeviceCredentialsResponse> callback) { | |
256 | 257 | log.trace("Processing msg: {}", msg); |
257 | 258 | TbProtoQueueMsg<TransportApiRequestMsg> protoMsg = new TbProtoQueueMsg<>(UUID.randomUUID(), TransportApiRequestMsg.newBuilder().setValidateTokenRequestMsg(msg).build()); |
258 | - doProcess(protoMsg, callback); | |
259 | + doProcess(transportType, protoMsg, callback); | |
259 | 260 | } |
260 | 261 | |
261 | 262 | @Override |
262 | - public void process(TransportProtos.ValidateDeviceX509CertRequestMsg msg, TransportServiceCallback<ValidateDeviceCredentialsResponse> callback) { | |
263 | + public void process(DeviceTransportType transportType, TransportProtos.ValidateDeviceX509CertRequestMsg msg, TransportServiceCallback<ValidateDeviceCredentialsResponse> callback) { | |
263 | 264 | log.trace("Processing msg: {}", msg); |
264 | 265 | TbProtoQueueMsg<TransportApiRequestMsg> protoMsg = new TbProtoQueueMsg<>(UUID.randomUUID(), TransportApiRequestMsg.newBuilder().setValidateX509CertRequestMsg(msg).build()); |
265 | - doProcess(protoMsg, callback); | |
266 | + doProcess(transportType, protoMsg, callback); | |
266 | 267 | } |
267 | 268 | |
268 | - private void doProcess(TbProtoQueueMsg<TransportApiRequestMsg> protoMsg, TransportServiceCallback<ValidateDeviceCredentialsResponse> callback) { | |
269 | + private void doProcess(DeviceTransportType transportType, TbProtoQueueMsg<TransportApiRequestMsg> protoMsg, TransportServiceCallback<ValidateDeviceCredentialsResponse> callback) { | |
269 | 270 | ListenableFuture<ValidateDeviceCredentialsResponse> response = Futures.transform(transportApiRequestTemplate.send(protoMsg), tmp -> { |
270 | 271 | TransportProtos.ValidateDeviceCredentialsResponseMsg msg = tmp.getValue().getValidateTokenResponseMsg(); |
271 | 272 | ValidateDeviceCredentialsResponse.ValidateDeviceCredentialsResponseBuilder result = ValidateDeviceCredentialsResponse.builder(); |
... | ... | @@ -283,6 +284,11 @@ public class DefaultTransportService implements TransportService { |
283 | 284 | deviceProfiles.put(tdi.getDeviceProfileId(), profile); |
284 | 285 | } |
285 | 286 | } |
287 | + if (transportType != DeviceTransportType.DEFAULT | |
288 | + && profile != null && profile.getTransportType() != DeviceTransportType.DEFAULT && profile.getTransportType() != transportType) { | |
289 | + log.debug("[{}] Device profile [{}] has different transport type: {}, expected: {}", tdi.getDeviceId(), tdi.getDeviceProfileId(), profile.getTransportType(), transportType); | |
290 | + throw new IllegalStateException("Device profile has different transport type: " + profile.getTransportType() + ". Expected: " + transportType); | |
291 | + } | |
286 | 292 | result.deviceProfile(profile); |
287 | 293 | } |
288 | 294 | } | ... | ... |