Commit f5f531e716b8f168b1e03617a22c42fa6fc59e1a

Authored by Igor Kulikov
2 parents d8ae8282 d440d500

Merge branch 'develop/3.2' of github.com:thingsboard/thingsboard into develop/3.2

Showing 17 changed files with 289 additions and 119 deletions
@@ -15,30 +15,16 @@ @@ -15,30 +15,16 @@
15 */ 15 */
16 package org.thingsboard.server.common.data.device.profile; 16 package org.thingsboard.server.common.data.device.profile;
17 17
18 -import com.fasterxml.jackson.annotation.JsonAnyGetter;  
19 -import com.fasterxml.jackson.annotation.JsonAnySetter;  
20 -import com.fasterxml.jackson.annotation.JsonIgnore;  
21 import lombok.Data; 18 import lombok.Data;
22 import org.thingsboard.server.common.data.DeviceTransportType; 19 import org.thingsboard.server.common.data.DeviceTransportType;
23 20
24 -import java.util.HashMap;  
25 -import java.util.Map;  
26 -  
27 @Data 21 @Data
28 public class MqttDeviceProfileTransportConfiguration implements DeviceProfileTransportConfiguration { 22 public class MqttDeviceProfileTransportConfiguration implements DeviceProfileTransportConfiguration {
29 23
30 - @JsonIgnore  
31 - private Map<String, Object> properties = new HashMap<>();  
32 -  
33 - @JsonAnyGetter  
34 - public Map<String, Object> properties() {  
35 - return this.properties;  
36 - }  
37 -  
38 - @JsonAnySetter  
39 - public void put(String name, Object value) {  
40 - this.properties.put(name, value);  
41 - } 24 + private String deviceTelemetryTopic = MqttTopics.DEVICE_TELEMETRY_TOPIC;
  25 + private String deviceAttributesTopic = MqttTopics.DEVICE_ATTRIBUTES_TOPIC;
  26 + private String deviceRpcRequestTopic = MqttTopics.DEVICE_RPC_REQUESTS_TOPIC;
  27 + private String deviceRpcResponseTopic = MqttTopics.DEVICE_RPC_RESPONSE_TOPIC;
42 28
43 @Override 29 @Override
44 public DeviceTransportType getType() { 30 public DeviceTransportType getType() {
common/data/src/main/java/org/thingsboard/server/common/data/device/profile/MqttTopics.java renamed from common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/MqttTopics.java
@@ -13,7 +13,7 @@ @@ -13,7 +13,7 @@
13 * See the License for the specific language governing permissions and 13 * See the License for the specific language governing permissions and
14 * limitations under the License. 14 * limitations under the License.
15 */ 15 */
16 -package org.thingsboard.server.transport.mqtt; 16 +package org.thingsboard.server.common.data.device.profile;
17 17
18 /** 18 /**
19 * Created by ashvayka on 19.01.17. 19 * Created by ashvayka on 19.01.17.
@@ -32,6 +32,8 @@ import org.thingsboard.server.common.transport.TransportContext; @@ -32,6 +32,8 @@ import org.thingsboard.server.common.transport.TransportContext;
32 import org.thingsboard.server.common.transport.TransportService; 32 import org.thingsboard.server.common.transport.TransportService;
33 import org.thingsboard.server.common.transport.TransportServiceCallback; 33 import org.thingsboard.server.common.transport.TransportServiceCallback;
34 import org.thingsboard.server.common.transport.adaptor.AdaptorException; 34 import org.thingsboard.server.common.transport.adaptor.AdaptorException;
  35 +import org.thingsboard.server.common.transport.auth.SessionInfoCreator;
  36 +import org.thingsboard.server.common.transport.auth.ValidateDeviceCredentialsResponse;
35 import org.thingsboard.server.gen.transport.TransportProtos; 37 import org.thingsboard.server.gen.transport.TransportProtos;
36 38
37 import java.lang.reflect.Field; 39 import java.lang.reflect.Field;
@@ -295,7 +297,7 @@ public class CoapTransportResource extends CoapResource { @@ -295,7 +297,7 @@ public class CoapTransportResource extends CoapResource {
295 return this; 297 return this;
296 } 298 }
297 299
298 - private static class DeviceAuthCallback implements TransportServiceCallback<TransportProtos.ValidateDeviceCredentialsResponseMsg> { 300 + private static class DeviceAuthCallback implements TransportServiceCallback<ValidateDeviceCredentialsResponse> {
299 private final TransportContext transportContext; 301 private final TransportContext transportContext;
300 private final CoapExchange exchange; 302 private final CoapExchange exchange;
301 private final Consumer<TransportProtos.SessionInfoProto> onSuccess; 303 private final Consumer<TransportProtos.SessionInfoProto> onSuccess;
@@ -307,22 +309,9 @@ public class CoapTransportResource extends CoapResource { @@ -307,22 +309,9 @@ public class CoapTransportResource extends CoapResource {
307 } 309 }
308 310
309 @Override 311 @Override
310 - public void onSuccess(TransportProtos.ValidateDeviceCredentialsResponseMsg msg) { 312 + public void onSuccess(ValidateDeviceCredentialsResponse msg) {
311 if (msg.hasDeviceInfo()) { 313 if (msg.hasDeviceInfo()) {
312 - UUID sessionId = UUID.randomUUID();  
313 - TransportProtos.DeviceInfoProto deviceInfoProto = msg.getDeviceInfo();  
314 - TransportProtos.SessionInfoProto sessionInfo = TransportProtos.SessionInfoProto.newBuilder()  
315 - .setNodeId(transportContext.getNodeId())  
316 - .setTenantIdMSB(deviceInfoProto.getTenantIdMSB())  
317 - .setTenantIdLSB(deviceInfoProto.getTenantIdLSB())  
318 - .setDeviceIdMSB(deviceInfoProto.getDeviceIdMSB())  
319 - .setDeviceIdLSB(deviceInfoProto.getDeviceIdLSB())  
320 - .setSessionIdMSB(sessionId.getMostSignificantBits())  
321 - .setSessionIdLSB(sessionId.getLeastSignificantBits())  
322 - .setDeviceName(msg.getDeviceInfo().getDeviceName())  
323 - .setDeviceType(msg.getDeviceInfo().getDeviceType())  
324 - .build();  
325 - onSuccess.accept(sessionInfo); 314 + onSuccess.accept(SessionInfoCreator.create(msg, transportContext, UUID.randomUUID()));
326 } else { 315 } else {
327 exchange.respond(ResponseCode.UNAUTHORIZED); 316 exchange.respond(ResponseCode.UNAUTHORIZED);
328 } 317 }
@@ -36,6 +36,8 @@ import org.thingsboard.server.common.transport.TransportContext; @@ -36,6 +36,8 @@ import org.thingsboard.server.common.transport.TransportContext;
36 import org.thingsboard.server.common.transport.TransportService; 36 import org.thingsboard.server.common.transport.TransportService;
37 import org.thingsboard.server.common.transport.TransportServiceCallback; 37 import org.thingsboard.server.common.transport.TransportServiceCallback;
38 import org.thingsboard.server.common.transport.adaptor.JsonConverter; 38 import org.thingsboard.server.common.transport.adaptor.JsonConverter;
  39 +import org.thingsboard.server.common.transport.auth.SessionInfoCreator;
  40 +import org.thingsboard.server.common.transport.auth.ValidateDeviceCredentialsResponse;
39 import org.thingsboard.server.gen.transport.TransportProtos; 41 import org.thingsboard.server.gen.transport.TransportProtos;
40 import org.thingsboard.server.gen.transport.TransportProtos.AttributeUpdateNotificationMsg; 42 import org.thingsboard.server.gen.transport.TransportProtos.AttributeUpdateNotificationMsg;
41 import org.thingsboard.server.gen.transport.TransportProtos.DeviceInfoProto; 43 import org.thingsboard.server.gen.transport.TransportProtos.DeviceInfoProto;
@@ -200,7 +202,7 @@ public class DeviceApiController { @@ -200,7 +202,7 @@ public class DeviceApiController {
200 return responseWriter; 202 return responseWriter;
201 } 203 }
202 204
203 - private static class DeviceAuthCallback implements TransportServiceCallback<ValidateDeviceCredentialsResponseMsg> { 205 + private static class DeviceAuthCallback implements TransportServiceCallback<ValidateDeviceCredentialsResponse> {
204 private final TransportContext transportContext; 206 private final TransportContext transportContext;
205 private final DeferredResult<ResponseEntity> responseWriter; 207 private final DeferredResult<ResponseEntity> responseWriter;
206 private final Consumer<SessionInfoProto> onSuccess; 208 private final Consumer<SessionInfoProto> onSuccess;
@@ -212,22 +214,9 @@ public class DeviceApiController { @@ -212,22 +214,9 @@ public class DeviceApiController {
212 } 214 }
213 215
214 @Override 216 @Override
215 - public void onSuccess(ValidateDeviceCredentialsResponseMsg msg) { 217 + public void onSuccess(ValidateDeviceCredentialsResponse msg) {
216 if (msg.hasDeviceInfo()) { 218 if (msg.hasDeviceInfo()) {
217 - UUID sessionId = UUID.randomUUID();  
218 - DeviceInfoProto deviceInfoProto = msg.getDeviceInfo();  
219 - SessionInfoProto sessionInfo = SessionInfoProto.newBuilder()  
220 - .setNodeId(transportContext.getNodeId())  
221 - .setTenantIdMSB(deviceInfoProto.getTenantIdMSB())  
222 - .setTenantIdLSB(deviceInfoProto.getTenantIdLSB())  
223 - .setDeviceIdMSB(deviceInfoProto.getDeviceIdMSB())  
224 - .setDeviceIdLSB(deviceInfoProto.getDeviceIdLSB())  
225 - .setSessionIdMSB(sessionId.getMostSignificantBits())  
226 - .setSessionIdLSB(sessionId.getLeastSignificantBits())  
227 - .setDeviceName(msg.getDeviceInfo().getDeviceName())  
228 - .setDeviceType(msg.getDeviceInfo().getDeviceType())  
229 - .build();  
230 - onSuccess.accept(sessionInfo); 219 + onSuccess.accept(SessionInfoCreator.create(msg, transportContext, UUID.randomUUID()));
231 } else { 220 } else {
232 responseWriter.setResult(new ResponseEntity<>(HttpStatus.UNAUTHORIZED)); 221 responseWriter.setResult(new ResponseEntity<>(HttpStatus.UNAUTHORIZED));
233 } 222 }
@@ -27,6 +27,7 @@ import org.springframework.util.StringUtils; @@ -27,6 +27,7 @@ import org.springframework.util.StringUtils;
27 import org.thingsboard.server.common.msg.EncryptionUtil; 27 import org.thingsboard.server.common.msg.EncryptionUtil;
28 import org.thingsboard.server.common.transport.TransportService; 28 import org.thingsboard.server.common.transport.TransportService;
29 import org.thingsboard.server.common.transport.TransportServiceCallback; 29 import org.thingsboard.server.common.transport.TransportServiceCallback;
  30 +import org.thingsboard.server.common.transport.auth.ValidateDeviceCredentialsResponse;
30 import org.thingsboard.server.gen.transport.TransportProtos; 31 import org.thingsboard.server.gen.transport.TransportProtos;
31 import org.thingsboard.server.transport.mqtt.util.SslUtil; 32 import org.thingsboard.server.transport.mqtt.util.SslUtil;
32 33
@@ -157,11 +158,11 @@ public class MqttSslHandlerProvider { @@ -157,11 +158,11 @@ public class MqttSslHandlerProvider {
157 final String[] credentialsBodyHolder = new String[1]; 158 final String[] credentialsBodyHolder = new String[1];
158 CountDownLatch latch = new CountDownLatch(1); 159 CountDownLatch latch = new CountDownLatch(1);
159 transportService.process(TransportProtos.ValidateDeviceX509CertRequestMsg.newBuilder().setHash(sha3Hash).build(), 160 transportService.process(TransportProtos.ValidateDeviceX509CertRequestMsg.newBuilder().setHash(sha3Hash).build(),
160 - new TransportServiceCallback<TransportProtos.ValidateDeviceCredentialsResponseMsg>() { 161 + new TransportServiceCallback<ValidateDeviceCredentialsResponse>() {
161 @Override 162 @Override
162 - public void onSuccess(TransportProtos.ValidateDeviceCredentialsResponseMsg msg) {  
163 - if (!StringUtils.isEmpty(msg.getCredentialsBody())) {  
164 - credentialsBodyHolder[0] = msg.getCredentialsBody(); 163 + public void onSuccess(ValidateDeviceCredentialsResponse msg) {
  164 + if (!StringUtils.isEmpty(msg.getCredentials())) {
  165 + credentialsBodyHolder[0] = msg.getCredentials();
165 } 166 }
166 latch.countDown(); 167 latch.countDown();
167 } 168 }
@@ -39,17 +39,19 @@ import io.netty.util.concurrent.Future; @@ -39,17 +39,19 @@ import io.netty.util.concurrent.Future;
39 import io.netty.util.concurrent.GenericFutureListener; 39 import io.netty.util.concurrent.GenericFutureListener;
40 import lombok.extern.slf4j.Slf4j; 40 import lombok.extern.slf4j.Slf4j;
41 import org.springframework.util.StringUtils; 41 import org.springframework.util.StringUtils;
  42 +import org.thingsboard.server.common.data.device.profile.MqttTopics;
42 import org.thingsboard.server.common.msg.EncryptionUtil; 43 import org.thingsboard.server.common.msg.EncryptionUtil;
43 import org.thingsboard.server.common.transport.SessionMsgListener; 44 import org.thingsboard.server.common.transport.SessionMsgListener;
44 import org.thingsboard.server.common.transport.TransportService; 45 import org.thingsboard.server.common.transport.TransportService;
45 import org.thingsboard.server.common.transport.TransportServiceCallback; 46 import org.thingsboard.server.common.transport.TransportServiceCallback;
46 import org.thingsboard.server.common.transport.adaptor.AdaptorException; 47 import org.thingsboard.server.common.transport.adaptor.AdaptorException;
  48 +import org.thingsboard.server.common.transport.auth.SessionInfoCreator;
  49 +import org.thingsboard.server.common.transport.auth.TransportDeviceInfo;
  50 +import org.thingsboard.server.common.transport.auth.ValidateDeviceCredentialsResponse;
47 import org.thingsboard.server.common.transport.service.DefaultTransportService; 51 import org.thingsboard.server.common.transport.service.DefaultTransportService;
48 import org.thingsboard.server.gen.transport.TransportProtos; 52 import org.thingsboard.server.gen.transport.TransportProtos;
49 -import org.thingsboard.server.gen.transport.TransportProtos.DeviceInfoProto;  
50 import org.thingsboard.server.gen.transport.TransportProtos.SessionEvent; 53 import org.thingsboard.server.gen.transport.TransportProtos.SessionEvent;
51 import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto; 54 import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto;
52 -import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceCredentialsResponseMsg;  
53 import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceTokenRequestMsg; 55 import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceTokenRequestMsg;
54 import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceX509CertRequestMsg; 56 import org.thingsboard.server.gen.transport.TransportProtos.ValidateDeviceX509CertRequestMsg;
55 import org.thingsboard.server.transport.mqtt.adaptors.MqttTransportAdaptor; 57 import org.thingsboard.server.transport.mqtt.adaptors.MqttTransportAdaptor;
@@ -365,9 +367,9 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement @@ -365,9 +367,9 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
365 ctx.close(); 367 ctx.close();
366 } else { 368 } else {
367 transportService.process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(userName).build(), 369 transportService.process(ValidateDeviceTokenRequestMsg.newBuilder().setToken(userName).build(),
368 - new TransportServiceCallback<ValidateDeviceCredentialsResponseMsg>() { 370 + new TransportServiceCallback<ValidateDeviceCredentialsResponse>() {
369 @Override 371 @Override
370 - public void onSuccess(ValidateDeviceCredentialsResponseMsg msg) { 372 + public void onSuccess(ValidateDeviceCredentialsResponse msg) {
371 onValidateDeviceResponse(msg, ctx); 373 onValidateDeviceResponse(msg, ctx);
372 } 374 }
373 375
@@ -386,9 +388,9 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement @@ -386,9 +388,9 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
386 String strCert = SslUtil.getX509CertificateString(cert); 388 String strCert = SslUtil.getX509CertificateString(cert);
387 String sha3Hash = EncryptionUtil.getSha3Hash(strCert); 389 String sha3Hash = EncryptionUtil.getSha3Hash(strCert);
388 transportService.process(ValidateDeviceX509CertRequestMsg.newBuilder().setHash(sha3Hash).build(), 390 transportService.process(ValidateDeviceX509CertRequestMsg.newBuilder().setHash(sha3Hash).build(),
389 - new TransportServiceCallback<ValidateDeviceCredentialsResponseMsg>() { 391 + new TransportServiceCallback<ValidateDeviceCredentialsResponse>() {
390 @Override 392 @Override
391 - public void onSuccess(ValidateDeviceCredentialsResponseMsg msg) { 393 + public void onSuccess(ValidateDeviceCredentialsResponse msg) {
392 onValidateDeviceResponse(msg, ctx); 394 onValidateDeviceResponse(msg, ctx);
393 } 395 }
394 396
@@ -474,7 +476,7 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement @@ -474,7 +476,7 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
474 } 476 }
475 477
476 private void checkGatewaySession() { 478 private void checkGatewaySession() {
477 - DeviceInfoProto device = deviceSessionCtx.getDeviceInfo(); 479 + TransportDeviceInfo device = deviceSessionCtx.getDeviceInfo();
478 try { 480 try {
479 JsonNode infoNode = context.getMapper().readTree(device.getAdditionalInfo()); 481 JsonNode infoNode = context.getMapper().readTree(device.getAdditionalInfo());
480 if (infoNode != null) { 482 if (infoNode != null) {
@@ -504,25 +506,14 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement @@ -504,25 +506,14 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement
504 } 506 }
505 } 507 }
506 508
507 - private void onValidateDeviceResponse(ValidateDeviceCredentialsResponseMsg msg, ChannelHandlerContext ctx) { 509 + private void onValidateDeviceResponse(ValidateDeviceCredentialsResponse msg, ChannelHandlerContext ctx) {
508 if (!msg.hasDeviceInfo()) { 510 if (!msg.hasDeviceInfo()) {
509 ctx.writeAndFlush(createMqttConnAckMsg(CONNECTION_REFUSED_NOT_AUTHORIZED)); 511 ctx.writeAndFlush(createMqttConnAckMsg(CONNECTION_REFUSED_NOT_AUTHORIZED));
510 ctx.close(); 512 ctx.close();
511 } else { 513 } else {
512 deviceSessionCtx.setDeviceInfo(msg.getDeviceInfo()); 514 deviceSessionCtx.setDeviceInfo(msg.getDeviceInfo());
513 - sessionInfo = SessionInfoProto.newBuilder()  
514 - .setNodeId(context.getNodeId())  
515 - .setSessionIdMSB(sessionId.getMostSignificantBits())  
516 - .setSessionIdLSB(sessionId.getLeastSignificantBits())  
517 - .setDeviceIdMSB(msg.getDeviceInfo().getDeviceIdMSB())  
518 - .setDeviceIdLSB(msg.getDeviceInfo().getDeviceIdLSB())  
519 - .setTenantIdMSB(msg.getDeviceInfo().getTenantIdMSB())  
520 - .setTenantIdLSB(msg.getDeviceInfo().getTenantIdLSB())  
521 - .setDeviceName(msg.getDeviceInfo().getDeviceName())  
522 - .setDeviceType(msg.getDeviceInfo().getDeviceType())  
523 - .setDeviceProfileIdMSB(msg.getDeviceInfo().getDeviceProfileIdMSB())  
524 - .setDeviceProfileIdLSB(msg.getDeviceInfo().getDeviceProfileIdLSB())  
525 - .build(); 515 +// deviceSessionCtx.setProfile(msg.getDeviceProfile());
  516 + sessionInfo = SessionInfoCreator.create(msg, context, sessionId);
526 transportService.process(sessionInfo, DefaultTransportService.getSessionEventMsg(SessionEvent.OPEN), new TransportServiceCallback<Void>() { 517 transportService.process(sessionInfo, DefaultTransportService.getSessionEventMsg(SessionEvent.OPEN), new TransportServiceCallback<Void>() {
527 @Override 518 @Override
528 public void onSuccess(Void msg) { 519 public void onSuccess(Void msg) {
@@ -34,7 +34,7 @@ import org.springframework.util.StringUtils; @@ -34,7 +34,7 @@ import org.springframework.util.StringUtils;
34 import org.thingsboard.server.common.transport.adaptor.AdaptorException; 34 import org.thingsboard.server.common.transport.adaptor.AdaptorException;
35 import org.thingsboard.server.common.transport.adaptor.JsonConverter; 35 import org.thingsboard.server.common.transport.adaptor.JsonConverter;
36 import org.thingsboard.server.gen.transport.TransportProtos; 36 import org.thingsboard.server.gen.transport.TransportProtos;
37 -import org.thingsboard.server.transport.mqtt.MqttTopics; 37 +import org.thingsboard.server.common.data.device.profile.MqttTopics;
38 import org.thingsboard.server.transport.mqtt.session.MqttDeviceAwareSessionContext; 38 import org.thingsboard.server.transport.mqtt.session.MqttDeviceAwareSessionContext;
39 39
40 import java.nio.charset.Charset; 40 import java.nio.charset.Charset;
@@ -17,6 +17,7 @@ package org.thingsboard.server.transport.mqtt.session; @@ -17,6 +17,7 @@ package org.thingsboard.server.transport.mqtt.session;
17 17
18 import lombok.extern.slf4j.Slf4j; 18 import lombok.extern.slf4j.Slf4j;
19 import org.thingsboard.server.common.transport.SessionMsgListener; 19 import org.thingsboard.server.common.transport.SessionMsgListener;
  20 +import org.thingsboard.server.common.transport.auth.TransportDeviceInfo;
20 import org.thingsboard.server.gen.transport.TransportProtos; 21 import org.thingsboard.server.gen.transport.TransportProtos;
21 import org.thingsboard.server.gen.transport.TransportProtos.DeviceInfoProto; 22 import org.thingsboard.server.gen.transport.TransportProtos.DeviceInfoProto;
22 import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto; 23 import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto;
@@ -33,21 +34,23 @@ public class GatewayDeviceSessionCtx extends MqttDeviceAwareSessionContext imple @@ -33,21 +34,23 @@ public class GatewayDeviceSessionCtx extends MqttDeviceAwareSessionContext imple
33 private final GatewaySessionHandler parent; 34 private final GatewaySessionHandler parent;
34 private final SessionInfoProto sessionInfo; 35 private final SessionInfoProto sessionInfo;
35 36
36 - public GatewayDeviceSessionCtx(GatewaySessionHandler parent, DeviceInfoProto deviceInfo, ConcurrentMap<MqttTopicMatcher, Integer> mqttQoSMap) { 37 + public GatewayDeviceSessionCtx(GatewaySessionHandler parent, TransportDeviceInfo deviceInfo, ConcurrentMap<MqttTopicMatcher, Integer> mqttQoSMap) {
37 super(UUID.randomUUID(), mqttQoSMap); 38 super(UUID.randomUUID(), mqttQoSMap);
38 this.parent = parent; 39 this.parent = parent;
39 this.sessionInfo = SessionInfoProto.newBuilder() 40 this.sessionInfo = SessionInfoProto.newBuilder()
40 .setNodeId(parent.getNodeId()) 41 .setNodeId(parent.getNodeId())
41 .setSessionIdMSB(sessionId.getMostSignificantBits()) 42 .setSessionIdMSB(sessionId.getMostSignificantBits())
42 .setSessionIdLSB(sessionId.getLeastSignificantBits()) 43 .setSessionIdLSB(sessionId.getLeastSignificantBits())
43 - .setDeviceIdMSB(deviceInfo.getDeviceIdMSB())  
44 - .setDeviceIdLSB(deviceInfo.getDeviceIdLSB())  
45 - .setTenantIdMSB(deviceInfo.getTenantIdMSB())  
46 - .setTenantIdLSB(deviceInfo.getTenantIdLSB()) 44 + .setDeviceIdMSB(deviceInfo.getDeviceId().getId().getMostSignificantBits())
  45 + .setDeviceIdLSB(deviceInfo.getDeviceId().getId().getLeastSignificantBits())
  46 + .setTenantIdMSB(deviceInfo.getTenantId().getId().getMostSignificantBits())
  47 + .setTenantIdLSB(deviceInfo.getTenantId().getId().getLeastSignificantBits())
47 .setDeviceName(deviceInfo.getDeviceName()) 48 .setDeviceName(deviceInfo.getDeviceName())
48 .setDeviceType(deviceInfo.getDeviceType()) 49 .setDeviceType(deviceInfo.getDeviceType())
49 .setGwSessionIdMSB(parent.getSessionId().getMostSignificantBits()) 50 .setGwSessionIdMSB(parent.getSessionId().getMostSignificantBits())
50 .setGwSessionIdLSB(parent.getSessionId().getLeastSignificantBits()) 51 .setGwSessionIdLSB(parent.getSessionId().getLeastSignificantBits())
  52 + .setDeviceProfileIdMSB(deviceInfo.getDeviceProfileId().getId().getMostSignificantBits())
  53 + .setDeviceProfileIdLSB(deviceInfo.getDeviceProfileId().getId().getLeastSignificantBits())
51 .build(); 54 .build();
52 setDeviceInfo(deviceInfo); 55 setDeviceInfo(deviceInfo);
53 } 56 }
@@ -35,6 +35,8 @@ import org.thingsboard.server.common.transport.TransportService; @@ -35,6 +35,8 @@ import org.thingsboard.server.common.transport.TransportService;
35 import org.thingsboard.server.common.transport.TransportServiceCallback; 35 import org.thingsboard.server.common.transport.TransportServiceCallback;
36 import org.thingsboard.server.common.transport.adaptor.AdaptorException; 36 import org.thingsboard.server.common.transport.adaptor.AdaptorException;
37 import org.thingsboard.server.common.transport.adaptor.JsonConverter; 37 import org.thingsboard.server.common.transport.adaptor.JsonConverter;
  38 +import org.thingsboard.server.common.transport.auth.GetOrCreateDeviceFromGatewayResponse;
  39 +import org.thingsboard.server.common.transport.auth.TransportDeviceInfo;
38 import org.thingsboard.server.common.transport.service.DefaultTransportService; 40 import org.thingsboard.server.common.transport.service.DefaultTransportService;
39 import org.thingsboard.server.gen.transport.TransportProtos; 41 import org.thingsboard.server.gen.transport.TransportProtos;
40 import org.thingsboard.server.gen.transport.TransportProtos.DeviceInfoProto; 42 import org.thingsboard.server.gen.transport.TransportProtos.DeviceInfoProto;
@@ -69,7 +71,7 @@ public class GatewaySessionHandler { @@ -69,7 +71,7 @@ public class GatewaySessionHandler {
69 71
70 private final MqttTransportContext context; 72 private final MqttTransportContext context;
71 private final TransportService transportService; 73 private final TransportService transportService;
72 - private final DeviceInfoProto gateway; 74 + private final TransportDeviceInfo gateway;
73 private final UUID sessionId; 75 private final UUID sessionId;
74 private final ConcurrentMap<String, Lock> deviceCreationLockMap; 76 private final ConcurrentMap<String, Lock> deviceCreationLockMap;
75 private final ConcurrentMap<String, GatewayDeviceSessionCtx> devices; 77 private final ConcurrentMap<String, GatewayDeviceSessionCtx> devices;
@@ -140,11 +142,11 @@ public class GatewaySessionHandler { @@ -140,11 +142,11 @@ public class GatewaySessionHandler {
140 transportService.process(GetOrCreateDeviceFromGatewayRequestMsg.newBuilder() 142 transportService.process(GetOrCreateDeviceFromGatewayRequestMsg.newBuilder()
141 .setDeviceName(deviceName) 143 .setDeviceName(deviceName)
142 .setDeviceType(deviceType) 144 .setDeviceType(deviceType)
143 - .setGatewayIdMSB(gateway.getDeviceIdMSB())  
144 - .setGatewayIdLSB(gateway.getDeviceIdLSB()).build(),  
145 - new TransportServiceCallback<GetOrCreateDeviceFromGatewayResponseMsg>() { 145 + .setGatewayIdMSB(gateway.getDeviceId().getId().getMostSignificantBits())
  146 + .setGatewayIdLSB(gateway.getDeviceId().getId().getLeastSignificantBits()).build(),
  147 + new TransportServiceCallback<GetOrCreateDeviceFromGatewayResponse>() {
146 @Override 148 @Override
147 - public void onSuccess(GetOrCreateDeviceFromGatewayResponseMsg msg) { 149 + public void onSuccess(GetOrCreateDeviceFromGatewayResponse msg) {
148 GatewayDeviceSessionCtx deviceSessionCtx = new GatewayDeviceSessionCtx(GatewaySessionHandler.this, msg.getDeviceInfo(), mqttQoSMap); 150 GatewayDeviceSessionCtx deviceSessionCtx = new GatewayDeviceSessionCtx(GatewaySessionHandler.this, msg.getDeviceInfo(), mqttQoSMap);
149 if (devices.putIfAbsent(deviceName, deviceSessionCtx) == null) { 151 if (devices.putIfAbsent(deviceName, deviceSessionCtx) == null) {
150 log.trace("[{}] First got or created device [{}], type [{}] for the gateway session", sessionId, deviceName, deviceType); 152 log.trace("[{}] First got or created device [{}], type [{}] for the gateway session", sessionId, deviceName, deviceType);
@@ -218,8 +220,7 @@ public class GatewaySessionHandler { @@ -218,8 +220,7 @@ public class GatewaySessionHandler {
218 TransportProtos.PostTelemetryMsg postTelemetryMsg = JsonConverter.convertToTelemetryProto(deviceEntry.getValue().getAsJsonArray()); 220 TransportProtos.PostTelemetryMsg postTelemetryMsg = JsonConverter.convertToTelemetryProto(deviceEntry.getValue().getAsJsonArray());
219 transportService.process(deviceCtx.getSessionInfo(), postTelemetryMsg, getPubAckCallback(channel, deviceName, msgId, postTelemetryMsg)); 221 transportService.process(deviceCtx.getSessionInfo(), postTelemetryMsg, getPubAckCallback(channel, deviceName, msgId, postTelemetryMsg));
220 } catch (Throwable e) { 222 } catch (Throwable e) {
221 - UUID gatewayId = new UUID(gateway.getDeviceIdMSB(), gateway.getDeviceIdLSB());  
222 - log.warn("[{}][{}] Failed to convert telemetry: {}", gatewayId, deviceName, deviceEntry.getValue(), e); 223 + log.warn("[{}][{}] Failed to convert telemetry: {}", gateway.getDeviceId(), deviceName, deviceEntry.getValue(), e);
223 } 224 }
224 } 225 }
225 226
@@ -253,8 +254,7 @@ public class GatewaySessionHandler { @@ -253,8 +254,7 @@ public class GatewaySessionHandler {
253 TransportProtos.ClaimDeviceMsg claimDeviceMsg = JsonConverter.convertToClaimDeviceProto(deviceId, deviceEntry.getValue()); 254 TransportProtos.ClaimDeviceMsg claimDeviceMsg = JsonConverter.convertToClaimDeviceProto(deviceId, deviceEntry.getValue());
254 transportService.process(deviceCtx.getSessionInfo(), claimDeviceMsg, getPubAckCallback(channel, deviceName, msgId, claimDeviceMsg)); 255 transportService.process(deviceCtx.getSessionInfo(), claimDeviceMsg, getPubAckCallback(channel, deviceName, msgId, claimDeviceMsg));
255 } catch (Throwable e) { 256 } catch (Throwable e) {
256 - UUID gatewayId = new UUID(gateway.getDeviceIdMSB(), gateway.getDeviceIdLSB());  
257 - log.warn("[{}][{}] Failed to convert claim message: {}", gatewayId, deviceName, deviceEntry.getValue(), e); 257 + log.warn("[{}][{}] Failed to convert claim message: {}", gateway.getDeviceId(), deviceName, deviceEntry.getValue(), e);
258 } 258 }
259 } 259 }
260 260
@@ -17,6 +17,8 @@ package org.thingsboard.server.common.transport; @@ -17,6 +17,8 @@ package org.thingsboard.server.common.transport;
17 17
18 import org.thingsboard.server.common.data.DeviceProfile; 18 import org.thingsboard.server.common.data.DeviceProfile;
19 import org.thingsboard.server.common.data.id.DeviceProfileId; 19 import org.thingsboard.server.common.data.id.DeviceProfileId;
  20 +import org.thingsboard.server.common.transport.auth.GetOrCreateDeviceFromGatewayResponse;
  21 +import org.thingsboard.server.common.transport.auth.ValidateDeviceCredentialsResponse;
20 import org.thingsboard.server.gen.transport.TransportProtos.ClaimDeviceMsg; 22 import org.thingsboard.server.gen.transport.TransportProtos.ClaimDeviceMsg;
21 import org.thingsboard.server.gen.transport.TransportProtos.GetAttributeRequestMsg; 23 import org.thingsboard.server.gen.transport.TransportProtos.GetAttributeRequestMsg;
22 import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayRequestMsg; 24 import org.thingsboard.server.gen.transport.TransportProtos.GetOrCreateDeviceFromGatewayRequestMsg;
@@ -44,13 +46,13 @@ public interface TransportService { @@ -44,13 +46,13 @@ public interface TransportService {
44 GetTenantRoutingInfoResponseMsg getRoutingInfo(GetTenantRoutingInfoRequestMsg msg); 46 GetTenantRoutingInfoResponseMsg getRoutingInfo(GetTenantRoutingInfoRequestMsg msg);
45 47
46 void process(ValidateDeviceTokenRequestMsg msg, 48 void process(ValidateDeviceTokenRequestMsg msg,
47 - TransportServiceCallback<ValidateDeviceCredentialsResponseMsg> callback); 49 + TransportServiceCallback<ValidateDeviceCredentialsResponse> callback);
48 50
49 void process(ValidateDeviceX509CertRequestMsg msg, 51 void process(ValidateDeviceX509CertRequestMsg msg,
50 - TransportServiceCallback<ValidateDeviceCredentialsResponseMsg> callback); 52 + TransportServiceCallback<ValidateDeviceCredentialsResponse> callback);
51 53
52 void process(GetOrCreateDeviceFromGatewayRequestMsg msg, 54 void process(GetOrCreateDeviceFromGatewayRequestMsg msg,
53 - TransportServiceCallback<GetOrCreateDeviceFromGatewayResponseMsg> callback); 55 + TransportServiceCallback<GetOrCreateDeviceFromGatewayResponse> callback);
54 56
55 void getDeviceProfile(DeviceProfileId deviceProfileId, TransportServiceCallback<DeviceProfile> callback); 57 void getDeviceProfile(DeviceProfileId deviceProfileId, TransportServiceCallback<DeviceProfile> callback);
56 58
  1 +/**
  2 + * Copyright © 2016-2020 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.common.transport.auth;
  17 +
  18 +import org.thingsboard.server.common.data.DeviceProfile;
  19 +
  20 +public interface DeviceProfileAware {
  21 +
  22 + DeviceProfile getDeviceProfile();
  23 +
  24 +}
  1 +/**
  2 + * Copyright © 2016-2020 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.common.transport.auth;
  17 +
  18 +import lombok.Builder;
  19 +import lombok.Data;
  20 +import org.thingsboard.server.common.data.DeviceProfile;
  21 +
  22 +@Data
  23 +@Builder
  24 +public class GetOrCreateDeviceFromGatewayResponse implements DeviceProfileAware {
  25 +
  26 + private TransportDeviceInfo deviceInfo;
  27 + private DeviceProfile deviceProfile;
  28 +
  29 +}
  1 +/**
  2 + * Copyright © 2016-2020 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.common.transport.auth;
  17 +
  18 +import org.thingsboard.server.common.transport.TransportContext;
  19 +import org.thingsboard.server.gen.transport.TransportProtos;
  20 +
  21 +import java.util.UUID;
  22 +
  23 +public class SessionInfoCreator {
  24 +
  25 + public static TransportProtos.SessionInfoProto create(ValidateDeviceCredentialsResponse msg, TransportContext context, UUID sessionId) {
  26 + return TransportProtos.SessionInfoProto.newBuilder()
  27 + .setNodeId(context.getNodeId())
  28 + .setSessionIdMSB(sessionId.getMostSignificantBits())
  29 + .setSessionIdLSB(sessionId.getLeastSignificantBits())
  30 + .setDeviceIdMSB(msg.getDeviceInfo().getDeviceId().getId().getMostSignificantBits())
  31 + .setDeviceIdLSB(msg.getDeviceInfo().getDeviceId().getId().getLeastSignificantBits())
  32 + .setTenantIdMSB(msg.getDeviceInfo().getTenantId().getId().getMostSignificantBits())
  33 + .setTenantIdLSB(msg.getDeviceInfo().getTenantId().getId().getLeastSignificantBits())
  34 + .setDeviceName(msg.getDeviceInfo().getDeviceName())
  35 + .setDeviceType(msg.getDeviceInfo().getDeviceType())
  36 + .setDeviceProfileIdMSB(msg.getDeviceInfo().getDeviceProfileId().getId().getMostSignificantBits())
  37 + .setDeviceProfileIdLSB(msg.getDeviceInfo().getDeviceProfileId().getId().getLeastSignificantBits())
  38 + .build();
  39 + }
  40 +
  41 +}
  1 +/**
  2 + * Copyright © 2016-2020 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.common.transport.auth;
  17 +
  18 +import lombok.Data;
  19 +import org.thingsboard.server.common.data.id.DeviceId;
  20 +import org.thingsboard.server.common.data.id.DeviceProfileId;
  21 +import org.thingsboard.server.common.data.id.TenantId;
  22 +
  23 +@Data
  24 +public class TransportDeviceInfo {
  25 +
  26 + private TenantId tenantId;
  27 + private DeviceProfileId deviceProfileId;
  28 + private DeviceId deviceId;
  29 + private String deviceName;
  30 + private String deviceType;
  31 + private String additionalInfo;
  32 +
  33 +}
  1 +/**
  2 + * Copyright © 2016-2020 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.common.transport.auth;
  17 +
  18 +import lombok.Builder;
  19 +import lombok.Data;
  20 +import org.thingsboard.server.common.data.DeviceProfile;
  21 +
  22 +@Data
  23 +@Builder
  24 +public class ValidateDeviceCredentialsResponse implements DeviceProfileAware {
  25 +
  26 + private final TransportDeviceInfo deviceInfo;
  27 + private final DeviceProfile deviceProfile;
  28 + private final String credentials;
  29 +
  30 + public boolean hasDeviceInfo() {
  31 + return deviceInfo != null;
  32 + }
  33 +}
@@ -17,6 +17,7 @@ package org.thingsboard.server.common.transport.service; @@ -17,6 +17,7 @@ package org.thingsboard.server.common.transport.service;
17 17
18 import com.google.common.util.concurrent.Futures; 18 import com.google.common.util.concurrent.Futures;
19 import com.google.common.util.concurrent.ListenableFuture; 19 import com.google.common.util.concurrent.ListenableFuture;
  20 +import com.google.common.util.concurrent.MoreExecutors;
20 import com.google.gson.Gson; 21 import com.google.gson.Gson;
21 import com.google.gson.JsonObject; 22 import com.google.gson.JsonObject;
22 import com.google.protobuf.ByteString; 23 import com.google.protobuf.ByteString;
@@ -43,6 +44,9 @@ import org.thingsboard.server.common.msg.tools.TbRateLimitsException; @@ -43,6 +44,9 @@ import org.thingsboard.server.common.msg.tools.TbRateLimitsException;
43 import org.thingsboard.server.common.transport.SessionMsgListener; 44 import org.thingsboard.server.common.transport.SessionMsgListener;
44 import org.thingsboard.server.common.transport.TransportService; 45 import org.thingsboard.server.common.transport.TransportService;
45 import org.thingsboard.server.common.transport.TransportServiceCallback; 46 import org.thingsboard.server.common.transport.TransportServiceCallback;
  47 +import org.thingsboard.server.common.transport.auth.GetOrCreateDeviceFromGatewayResponse;
  48 +import org.thingsboard.server.common.transport.auth.TransportDeviceInfo;
  49 +import org.thingsboard.server.common.transport.auth.ValidateDeviceCredentialsResponse;
46 import org.thingsboard.server.common.transport.util.DataDecodingEncodingService; 50 import org.thingsboard.server.common.transport.util.DataDecodingEncodingService;
47 import org.thingsboard.server.common.transport.util.JsonUtils; 51 import org.thingsboard.server.common.transport.util.JsonUtils;
48 import org.thingsboard.server.gen.transport.TransportProtos; 52 import org.thingsboard.server.gen.transport.TransportProtos;
@@ -248,38 +252,82 @@ public class DefaultTransportService implements TransportService { @@ -248,38 +252,82 @@ public class DefaultTransportService implements TransportService {
248 } 252 }
249 253
250 @Override 254 @Override
251 - public void process(TransportProtos.ValidateDeviceTokenRequestMsg msg, TransportServiceCallback<TransportProtos.ValidateDeviceCredentialsResponseMsg> callback) { 255 + public void process(TransportProtos.ValidateDeviceTokenRequestMsg msg, TransportServiceCallback<ValidateDeviceCredentialsResponse> callback) {
252 log.trace("Processing msg: {}", msg); 256 log.trace("Processing msg: {}", msg);
253 TbProtoQueueMsg<TransportApiRequestMsg> protoMsg = new TbProtoQueueMsg<>(UUID.randomUUID(), TransportApiRequestMsg.newBuilder().setValidateTokenRequestMsg(msg).build()); 257 TbProtoQueueMsg<TransportApiRequestMsg> protoMsg = new TbProtoQueueMsg<>(UUID.randomUUID(), TransportApiRequestMsg.newBuilder().setValidateTokenRequestMsg(msg).build());
254 - process(callback, protoMsg); 258 + doProcess(protoMsg, callback);
255 } 259 }
256 260
257 @Override 261 @Override
258 - public void process(TransportProtos.ValidateDeviceX509CertRequestMsg msg, TransportServiceCallback<TransportProtos.ValidateDeviceCredentialsResponseMsg> callback) { 262 + public void process(TransportProtos.ValidateDeviceX509CertRequestMsg msg, TransportServiceCallback<ValidateDeviceCredentialsResponse> callback) {
259 log.trace("Processing msg: {}", msg); 263 log.trace("Processing msg: {}", msg);
260 TbProtoQueueMsg<TransportApiRequestMsg> protoMsg = new TbProtoQueueMsg<>(UUID.randomUUID(), TransportApiRequestMsg.newBuilder().setValidateX509CertRequestMsg(msg).build()); 264 TbProtoQueueMsg<TransportApiRequestMsg> protoMsg = new TbProtoQueueMsg<>(UUID.randomUUID(), TransportApiRequestMsg.newBuilder().setValidateX509CertRequestMsg(msg).build());
261 - process(callback, protoMsg);  
262 - }  
263 -  
264 - private void process(TransportServiceCallback<TransportProtos.ValidateDeviceCredentialsResponseMsg> callback, TbProtoQueueMsg<TransportApiRequestMsg> protoMsg) {  
265 - ListenableFuture<TbProtoQueueMsg<TransportApiResponseMsg>> result = extractProfile(transportApiRequestTemplate.send(protoMsg),  
266 - response -> response.getValidateTokenResponseMsg().hasDeviceInfo(),  
267 - response -> response.getValidateTokenResponseMsg().getDeviceInfo(),  
268 - response -> response.getValidateTokenResponseMsg().getProfileBody());  
269 - AsyncCallbackTemplate.withCallback(result,  
270 - response -> callback.onSuccess(response.getValue().getValidateTokenResponseMsg()), callback::onError, transportCallbackExecutor); 265 + doProcess(protoMsg, callback);
  266 + }
  267 +
  268 + private void doProcess(TbProtoQueueMsg<TransportApiRequestMsg> protoMsg, TransportServiceCallback<ValidateDeviceCredentialsResponse> callback) {
  269 + ListenableFuture<ValidateDeviceCredentialsResponse> response = Futures.transform(transportApiRequestTemplate.send(protoMsg), tmp -> {
  270 + TransportProtos.ValidateDeviceCredentialsResponseMsg msg = tmp.getValue().getValidateTokenResponseMsg();
  271 + ValidateDeviceCredentialsResponse.ValidateDeviceCredentialsResponseBuilder result = ValidateDeviceCredentialsResponse.builder();
  272 + if (msg.hasDeviceInfo()) {
  273 + result.credentials(msg.getCredentialsBody());
  274 + TransportDeviceInfo tdi = getTransportDeviceInfo(msg.getDeviceInfo());
  275 + result.deviceInfo(tdi);
  276 + ByteString profileBody = msg.getProfileBody();
  277 + if (profileBody != null && !profileBody.isEmpty()) {
  278 + DeviceProfile profile = deviceProfiles.get(tdi.getDeviceProfileId());
  279 + if (profile == null) {
  280 + Optional<DeviceProfile> deviceProfile = dataDecodingEncodingService.decode(profileBody.toByteArray());
  281 + if (deviceProfile.isPresent()) {
  282 + profile = deviceProfile.get();
  283 + deviceProfiles.put(tdi.getDeviceProfileId(), profile);
  284 + }
  285 + }
  286 + result.deviceProfile(profile);
  287 + }
  288 + }
  289 + return result.build();
  290 + }, MoreExecutors.directExecutor());
  291 + AsyncCallbackTemplate.withCallback(response, callback::onSuccess, callback::onError, transportCallbackExecutor);
271 } 292 }
272 293
273 @Override 294 @Override
274 - public void process(TransportProtos.GetOrCreateDeviceFromGatewayRequestMsg msg, TransportServiceCallback<TransportProtos.GetOrCreateDeviceFromGatewayResponseMsg> callback) {  
275 - log.trace("Processing msg: {}", msg);  
276 - TbProtoQueueMsg<TransportApiRequestMsg> protoMsg = new TbProtoQueueMsg<>(UUID.randomUUID(), TransportApiRequestMsg.newBuilder().setGetOrCreateDeviceRequestMsg(msg).build());  
277 - ListenableFuture<TbProtoQueueMsg<TransportApiResponseMsg>> result = extractProfile(transportApiRequestTemplate.send(protoMsg),  
278 - response -> response.getGetOrCreateDeviceResponseMsg().hasDeviceInfo(),  
279 - response -> response.getGetOrCreateDeviceResponseMsg().getDeviceInfo(),  
280 - response -> response.getGetOrCreateDeviceResponseMsg().getProfileBody());  
281 - AsyncCallbackTemplate.withCallback(result,  
282 - response -> callback.onSuccess(response.getValue().getGetOrCreateDeviceResponseMsg()), callback::onError, transportCallbackExecutor); 295 + public void process(TransportProtos.GetOrCreateDeviceFromGatewayRequestMsg requestMsg, TransportServiceCallback<GetOrCreateDeviceFromGatewayResponse> callback) {
  296 + TbProtoQueueMsg<TransportApiRequestMsg> protoMsg = new TbProtoQueueMsg<>(UUID.randomUUID(), TransportApiRequestMsg.newBuilder().setGetOrCreateDeviceRequestMsg(requestMsg).build());
  297 + log.trace("Processing msg: {}", requestMsg);
  298 + ListenableFuture<GetOrCreateDeviceFromGatewayResponse> response = Futures.transform(transportApiRequestTemplate.send(protoMsg), tmp -> {
  299 + TransportProtos.GetOrCreateDeviceFromGatewayResponseMsg msg = tmp.getValue().getGetOrCreateDeviceResponseMsg();
  300 + GetOrCreateDeviceFromGatewayResponse.GetOrCreateDeviceFromGatewayResponseBuilder result = GetOrCreateDeviceFromGatewayResponse.builder();
  301 + if (msg.hasDeviceInfo()) {
  302 + TransportDeviceInfo tdi = getTransportDeviceInfo(msg.getDeviceInfo());
  303 + result.deviceInfo(tdi);
  304 + ByteString profileBody = msg.getProfileBody();
  305 + if (profileBody != null && !profileBody.isEmpty()) {
  306 + DeviceProfile profile = deviceProfiles.get(tdi.getDeviceProfileId());
  307 + if (profile == null) {
  308 + Optional<DeviceProfile> deviceProfile = dataDecodingEncodingService.decode(profileBody.toByteArray());
  309 + if (deviceProfile.isPresent()) {
  310 + profile = deviceProfile.get();
  311 + deviceProfiles.put(tdi.getDeviceProfileId(), profile);
  312 + }
  313 + }
  314 + result.deviceProfile(profile);
  315 + }
  316 + }
  317 + return result.build();
  318 + }, MoreExecutors.directExecutor());
  319 + AsyncCallbackTemplate.withCallback(response, callback::onSuccess, callback::onError, transportCallbackExecutor);
  320 + }
  321 +
  322 + private TransportDeviceInfo getTransportDeviceInfo(TransportProtos.DeviceInfoProto di) {
  323 + TransportDeviceInfo tdi = new TransportDeviceInfo();
  324 + tdi.setTenantId(new TenantId(new UUID(di.getTenantIdMSB(), di.getTenantIdLSB())));
  325 + tdi.setDeviceId(new DeviceId(new UUID(di.getDeviceIdMSB(), di.getDeviceIdLSB())));
  326 + tdi.setDeviceProfileId(new DeviceProfileId(new UUID(di.getDeviceProfileIdMSB(), di.getDeviceProfileIdLSB())));
  327 + tdi.setAdditionalInfo(di.getAdditionalInfo());
  328 + tdi.setDeviceName(di.getDeviceName());
  329 + tdi.setDeviceType(di.getDeviceType());
  330 + return tdi;
283 } 331 }
284 332
285 @Override 333 @Override
@@ -19,6 +19,7 @@ import lombok.Data; @@ -19,6 +19,7 @@ import lombok.Data;
19 import lombok.Getter; 19 import lombok.Getter;
20 import org.thingsboard.server.common.data.id.DeviceId; 20 import org.thingsboard.server.common.data.id.DeviceId;
21 import org.thingsboard.server.common.msg.session.SessionContext; 21 import org.thingsboard.server.common.msg.session.SessionContext;
  22 +import org.thingsboard.server.common.transport.auth.TransportDeviceInfo;
22 import org.thingsboard.server.gen.transport.TransportProtos.DeviceInfoProto; 23 import org.thingsboard.server.gen.transport.TransportProtos.DeviceInfoProto;
23 24
24 import java.util.UUID; 25 import java.util.UUID;
@@ -34,17 +35,17 @@ public abstract class DeviceAwareSessionContext implements SessionContext { @@ -34,17 +35,17 @@ public abstract class DeviceAwareSessionContext implements SessionContext {
34 @Getter 35 @Getter
35 private volatile DeviceId deviceId; 36 private volatile DeviceId deviceId;
36 @Getter 37 @Getter
37 - private volatile DeviceInfoProto deviceInfo; 38 + private volatile TransportDeviceInfo deviceInfo;
38 private volatile boolean connected; 39 private volatile boolean connected;
39 40
40 public DeviceId getDeviceId() { 41 public DeviceId getDeviceId() {
41 return deviceId; 42 return deviceId;
42 } 43 }
43 44
44 - public void setDeviceInfo(DeviceInfoProto deviceInfo) { 45 + public void setDeviceInfo(TransportDeviceInfo deviceInfo) {
45 this.deviceInfo = deviceInfo; 46 this.deviceInfo = deviceInfo;
46 this.connected = true; 47 this.connected = true;
47 - this.deviceId = new DeviceId(new UUID(deviceInfo.getDeviceIdMSB(), deviceInfo.getDeviceIdLSB())); 48 + this.deviceId = deviceInfo.getDeviceId();
48 } 49 }
49 50
50 public boolean isConnected() { 51 public boolean isConnected() {