From b2b09b3010b75ec5cfae6142a934b2984c673d25 Mon Sep 17 00:00:00 2001 From: zbeacon Date: Wed, 20 Jan 2021 10:32:32 +0200 Subject: [PATCH] Improvements --- .../mqtt/session/GatewayDeviceSessionCtx.java | 11 ----- .../mqtt/session/GatewaySessionHandler.java | 3 -- .../transport/auth/SessionInfoCreator.java | 22 ++++++++-- .../service/DefaultTransportService.java | 41 +++++++++++++++++-- 4 files changed, 55 insertions(+), 22 deletions(-) diff --git a/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/GatewayDeviceSessionCtx.java b/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/GatewayDeviceSessionCtx.java index db9ea66c44..60a2503225 100644 --- a/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/GatewayDeviceSessionCtx.java +++ b/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/GatewayDeviceSessionCtx.java @@ -15,8 +15,6 @@ */ package org.thingsboard.server.transport.mqtt.session; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; import lombok.extern.slf4j.Slf4j; import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.transport.SessionMsgListener; @@ -39,14 +37,6 @@ public class GatewayDeviceSessionCtx extends MqttDeviceAwareSessionContext imple DeviceProfile deviceProfile, ConcurrentMap mqttQoSMap) { super(UUID.randomUUID(), mqttQoSMap); this.parent = parent; - JsonParser parser = new JsonParser(); - boolean activityTimeFromGatewayDevice = Boolean.FALSE; - if (this.parent.getDeviceInfo().getAdditionalInfo() != null && !"null".equals(this.parent.getDeviceInfo().getAdditionalInfo())) { - JsonObject additionalInfo = parser.parse(this.parent.getDeviceInfo().getAdditionalInfo()).getAsJsonObject(); - if (additionalInfo.get("activityTimeFromGatewayDevice") != null) { - activityTimeFromGatewayDevice = additionalInfo.get("activityTimeFromGatewayDevice").getAsBoolean(); - } - } setSessionInfo(SessionInfoProto.newBuilder() .setNodeId(parent.getNodeId()) .setSessionIdMSB(sessionId.getMostSignificantBits()) @@ -61,7 +51,6 @@ public class GatewayDeviceSessionCtx extends MqttDeviceAwareSessionContext imple .setGwSessionIdLSB(parent.getSessionId().getLeastSignificantBits()) .setDeviceProfileIdMSB(deviceInfo.getDeviceProfileId().getId().getMostSignificantBits()) .setDeviceProfileIdLSB(deviceInfo.getDeviceProfileId().getId().getLeastSignificantBits()) - .setActivityTimeFromGatewayDevice(activityTimeFromGatewayDevice) .build()); setDeviceInfo(deviceInfo); setDeviceProfile(deviceProfile); diff --git a/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/GatewaySessionHandler.java b/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/GatewaySessionHandler.java index 15986b930e..73c7347039 100644 --- a/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/GatewaySessionHandler.java +++ b/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/GatewaySessionHandler.java @@ -34,7 +34,6 @@ import io.netty.handler.codec.mqtt.MqttPublishMessage; import lombok.extern.slf4j.Slf4j; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; -import org.thingsboard.server.common.data.DeviceInfo; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.transport.TransportService; import org.thingsboard.server.common.transport.TransportServiceCallback; @@ -180,8 +179,6 @@ public class GatewaySessionHandler { return deviceSessionCtx.getPayloadAdaptor(); } - public TransportDeviceInfo getDeviceInfo() { return deviceSessionCtx.getDeviceInfo(); } - void deregisterSession(String deviceName) { GatewayDeviceSessionCtx deviceSessionCtx = devices.remove(deviceName); if (deviceSessionCtx != null) { diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/auth/SessionInfoCreator.java b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/auth/SessionInfoCreator.java index 235ae6b3a3..cf07f65010 100644 --- a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/auth/SessionInfoCreator.java +++ b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/auth/SessionInfoCreator.java @@ -15,16 +15,20 @@ */ package org.thingsboard.server.common.transport.auth; +import com.fasterxml.jackson.databind.JsonNode; +import lombok.extern.slf4j.Slf4j; import org.thingsboard.server.common.transport.TransportContext; import org.thingsboard.server.gen.transport.TransportProtos; +import java.io.IOException; import java.util.UUID; +@Slf4j public class SessionInfoCreator { public static TransportProtos.SessionInfoProto create(ValidateDeviceCredentialsResponse msg, TransportContext context, UUID sessionId) { - return TransportProtos.SessionInfoProto.newBuilder() - .setNodeId(context.getNodeId()) + TransportProtos.SessionInfoProto.Builder builder = TransportProtos.SessionInfoProto.newBuilder(); + builder.setNodeId(context.getNodeId()) .setSessionIdMSB(sessionId.getMostSignificantBits()) .setSessionIdLSB(sessionId.getLeastSignificantBits()) .setDeviceIdMSB(msg.getDeviceInfo().getDeviceId().getId().getMostSignificantBits()) @@ -34,8 +38,18 @@ public class SessionInfoCreator { .setDeviceName(msg.getDeviceInfo().getDeviceName()) .setDeviceType(msg.getDeviceInfo().getDeviceType()) .setDeviceProfileIdMSB(msg.getDeviceInfo().getDeviceProfileId().getId().getMostSignificantBits()) - .setDeviceProfileIdLSB(msg.getDeviceInfo().getDeviceProfileId().getId().getLeastSignificantBits()) - .build(); + .setDeviceProfileIdLSB(msg.getDeviceInfo().getDeviceProfileId().getId().getLeastSignificantBits()); + if (!"null".equals(msg.getDeviceInfo().getAdditionalInfo())) { + try { + JsonNode infoNode = context.getMapper().readTree(msg.getDeviceInfo().getAdditionalInfo()); + if (infoNode.get("gateway").asBoolean()) { + builder.setActivityTimeFromGatewayDevice(infoNode.get("activityTimeFromGatewayDevice").asBoolean()); + } + } catch (IOException e) { + log.trace("[{}][{}] Failed to fetch device additional info", sessionId, msg.getDeviceInfo().getDeviceName(), e); + } + } + return builder.build(); } } diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java index 472cffef30..df1807cc0d 100644 --- a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java +++ b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java @@ -61,6 +61,7 @@ import org.thingsboard.server.common.transport.util.JsonUtils; import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos.ProvisionDeviceRequestMsg; import org.thingsboard.server.gen.transport.TransportProtos.ProvisionDeviceResponseMsg; +import org.thingsboard.server.gen.transport.TransportProtos.SessionInfoProto; import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg; @@ -510,10 +511,9 @@ public class DefaultTransportService implements TransportService { long lastActivityTime = sessionMD.getLastActivityTime(); TransportProtos.SessionInfoProto sessionInfo = sessionMD.getSessionInfo(); if (sessionInfo.getGwSessionIdMSB() != 0 && - sessionInfo.getGwSessionIdLSB() != 0 && - sessionInfo.getActivityTimeFromGatewayDevice()) { + sessionInfo.getGwSessionIdLSB() != 0) { SessionMetaData gwMetaData = sessions.get(new UUID(sessionInfo.getGwSessionIdMSB(), sessionInfo.getGwSessionIdLSB())); - if (gwMetaData != null) { + if (gwMetaData != null && gwMetaData.getSessionInfo().getActivityTimeFromGatewayDevice()) { lastActivityTime = Math.max(gwMetaData.getLastActivityTime(), lastActivityTime); } } @@ -647,7 +647,40 @@ public class DefaultTransportService implements TransportService { } } else if (EntityType.DEVICE.equals(entityType)) { Optional deviceOpt = dataDecodingEncodingService.decode(msg.getData().toByteArray()); - deviceOpt.ifPresent(this::onDeviceUpdate); + if (deviceOpt.isPresent()) { + Device device = deviceOpt.get(); + if (device.getAdditionalInfo() != null) { + if (device.getAdditionalInfo().get("gateway") != null + && device.getAdditionalInfo().get("gateway").asBoolean()) { + sessions.forEach((uuid, currentMD) -> { + if (device.getId().equals(new DeviceId(new UUID(currentMD.getSessionInfo().getDeviceIdMSB(), currentMD.getSessionInfo().getDeviceIdLSB())))) { + boolean newActivityTimeFromGatewayDevice = device.getAdditionalInfo().get("activityTimeFromGatewayDevice").asBoolean(); + if (currentMD.getSessionInfo().getActivityTimeFromGatewayDevice() != newActivityTimeFromGatewayDevice) { + SessionInfoProto currentSessionInfo = currentMD.getSessionInfo(); + SessionInfoProto newSessionInfo = SessionInfoProto.newBuilder() + .setNodeId(currentSessionInfo.getNodeId()) + .setSessionIdMSB(currentSessionInfo.getSessionIdMSB()) + .setSessionIdLSB(currentSessionInfo.getSessionIdLSB()) + .setDeviceIdMSB(currentSessionInfo.getDeviceIdMSB()) + .setDeviceIdLSB(currentSessionInfo.getDeviceIdLSB()) + .setTenantIdMSB(currentSessionInfo.getTenantIdMSB()) + .setTenantIdLSB(currentSessionInfo.getTenantIdLSB()) + .setDeviceName(currentSessionInfo.getDeviceName()) + .setDeviceType(currentSessionInfo.getDeviceType()) + .setGwSessionIdMSB(currentSessionInfo.getGwSessionIdMSB()) + .setGwSessionIdLSB(currentSessionInfo.getGwSessionIdLSB()) + .setDeviceProfileIdMSB(currentSessionInfo.getDeviceProfileIdMSB()) + .setDeviceProfileIdLSB(currentSessionInfo.getDeviceProfileIdLSB()) + .setActivityTimeFromGatewayDevice(newActivityTimeFromGatewayDevice) + .build(); + currentMD.setSessionInfo(newSessionInfo); + } + } + }); + } + } + onDeviceUpdate(device); + } } } else if (toSessionMsg.hasEntityDeleteMsg()) { TransportProtos.EntityDeleteMsg msg = toSessionMsg.getEntityDeleteMsg();