From 1bdd7d69bfc3d148f275e61f3504c0b79a596157 Mon Sep 17 00:00:00 2001 From: zbeacon Date: Fri, 15 Jan 2021 18:55:35 +0200 Subject: [PATCH 1/7] Fix for lastActivityTime in devices created by gateway --- common/queue/src/main/proto/queue.proto | 1 + .../mqtt/session/GatewayDeviceSessionCtx.java | 11 +++++++++++ .../mqtt/session/GatewaySessionHandler.java | 3 +++ .../transport/service/DefaultTransportService.java | 3 ++- .../modules/home/pages/device/device.component.html | 12 +++++++++--- .../modules/home/pages/device/device.component.ts | 10 ++++++++-- ui-ngx/src/assets/locale/locale.constant-en_US.json | 2 ++ 7 files changed, 36 insertions(+), 6 deletions(-) diff --git a/common/queue/src/main/proto/queue.proto b/common/queue/src/main/proto/queue.proto index 6864259617..1d1846dfeb 100644 --- a/common/queue/src/main/proto/queue.proto +++ b/common/queue/src/main/proto/queue.proto @@ -53,6 +53,7 @@ message SessionInfoProto { int64 gwSessionIdLSB = 11; int64 deviceProfileIdMSB = 12; int64 deviceProfileIdLSB = 13; + bool activityTimeFromGatewayDevice = 14; } enum SessionEvent { 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 60a2503225..1983c3f68d 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,6 +15,8 @@ */ 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; @@ -37,6 +39,14 @@ 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 ("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()) @@ -51,6 +61,7 @@ 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 73c7347039..15986b930e 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,6 +34,7 @@ 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; @@ -179,6 +180,8 @@ 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/service/DefaultTransportService.java b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java index 5e46a77fb1..472cffef30 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 @@ -510,7 +510,8 @@ public class DefaultTransportService implements TransportService { long lastActivityTime = sessionMD.getLastActivityTime(); TransportProtos.SessionInfoProto sessionInfo = sessionMD.getSessionInfo(); if (sessionInfo.getGwSessionIdMSB() != 0 && - sessionInfo.getGwSessionIdLSB() != 0) { + sessionInfo.getGwSessionIdLSB() != 0 && + sessionInfo.getActivityTimeFromGatewayDevice()) { SessionMetaData gwMetaData = sessions.get(new UUID(sessionInfo.getGwSessionIdMSB(), sessionInfo.getGwSessionIdLSB())); if (gwMetaData != null) { lastActivityTime = Math.max(gwMetaData.getLastActivityTime(), lastActivityTime); diff --git a/ui-ngx/src/app/modules/home/pages/device/device.component.html b/ui-ngx/src/app/modules/home/pages/device/device.component.html index 7f7465a5e6..1ea3b380b9 100644 --- a/ui-ngx/src/app/modules/home/pages/device/device.component.html +++ b/ui-ngx/src/app/modules/home/pages/device/device.component.html @@ -100,9 +100,15 @@ required>
- - {{ 'device.is-gateway' | translate }} - +
+ + {{ 'device.is-gateway' | translate }} + + + {{ 'device.activity-time-from-gateway-device' | translate }} + +
device.description diff --git a/ui-ngx/src/app/modules/home/pages/device/device.component.ts b/ui-ngx/src/app/modules/home/pages/device/device.component.ts index 782ed9e23a..9d865a09af 100644 --- a/ui-ngx/src/app/modules/home/pages/device/device.component.ts +++ b/ui-ngx/src/app/modules/home/pages/device/device.component.ts @@ -84,6 +84,7 @@ export class DeviceComponent extends EntityComponent { additionalInfo: this.fb.group( { gateway: [entity && entity.additionalInfo ? entity.additionalInfo.gateway : false], + activityTimeFromGatewayDevice: [entity && entity.additionalInfo ? entity.additionalInfo.activityTimeFromGatewayDevice: false], description: [entity && entity.additionalInfo ? entity.additionalInfo.description : ''], } ) @@ -96,8 +97,13 @@ export class DeviceComponent extends EntityComponent { this.entityForm.patchValue({deviceProfileId: entity.deviceProfileId}); this.entityForm.patchValue({label: entity.label}); this.entityForm.patchValue({deviceData: entity.deviceData}); - this.entityForm.patchValue({additionalInfo: - {gateway: entity.additionalInfo ? entity.additionalInfo.gateway : false}}); + this.entityForm.patchValue({ + additionalInfo: + { + gateway: entity.additionalInfo ? entity.additionalInfo.gateway : false, + activityTimeFromGatewayDevice: entity.additionalInfo ? entity.additionalInfo.activityTimeFromGatewayDevice : false + } + }); this.entityForm.patchValue({additionalInfo: {description: entity.additionalInfo ? entity.additionalInfo.description : ''}}); } diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json index 5ebc491c49..25bf43243d 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -906,6 +906,7 @@ "unable-delete-device-alias-title": "Unable to delete device alias", "unable-delete-device-alias-text": "Device alias '{{deviceAlias}}' can't be deleted as it used by the following widget(s):
{{widgetsList}}", "is-gateway": "Is gateway", + "activity-time-from-gateway-device": "Activity time from gateway device", "public": "Public", "device-public": "Device is public", "select-device": "Select device", @@ -1721,6 +1722,7 @@ "entity-field": "Entity field", "access-token": "Access token", "isgateway": "Is Gateway", + "activity-time-from-gateway-device": "Activity time from gateway device", "description": "Description" }, "stepper-text":{ From 3b65e3c23c0dc2a3192fa0c2cee3121fa5c79166 Mon Sep 17 00:00:00 2001 From: zbeacon Date: Mon, 18 Jan 2021 13:50:00 +0200 Subject: [PATCH 2/7] Refactoring --- .../server/transport/mqtt/session/GatewayDeviceSessionCtx.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1983c3f68d..db9ea66c44 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 @@ -41,7 +41,7 @@ public class GatewayDeviceSessionCtx extends MqttDeviceAwareSessionContext imple this.parent = parent; JsonParser parser = new JsonParser(); boolean activityTimeFromGatewayDevice = Boolean.FALSE; - if ("null".equals(this.parent.getDeviceInfo().getAdditionalInfo())) { + 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(); From b2b09b3010b75ec5cfae6142a934b2984c673d25 Mon Sep 17 00:00:00 2001 From: zbeacon Date: Wed, 20 Jan 2021 10:32:32 +0200 Subject: [PATCH 3/7] 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(); From 5338d8e094c93ea69fbfdfdf9332d47724eb5226 Mon Sep 17 00:00:00 2001 From: zbeacon Date: Wed, 20 Jan 2021 11:44:27 +0200 Subject: [PATCH 4/7] Refactoring --- .../transport/auth/SessionInfoCreator.java | 8 ++- .../service/DefaultTransportService.java | 53 +++++++++---------- 2 files changed, 31 insertions(+), 30 deletions(-) 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 cf07f65010..793afa97d7 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 @@ -42,8 +42,12 @@ public class SessionInfoCreator { 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()); + if (infoNode.get("gateway").asBoolean(false)) { + boolean activityTimeFromGatewayDevice = false; + if (infoNode.get("activityTimeFromGatewayDevice") != null) { + activityTimeFromGatewayDevice = infoNode.get("activityTimeFromGatewayDevice").asBoolean(); + } + builder.setActivityTimeFromGatewayDevice(activityTimeFromGatewayDevice); } } catch (IOException e) { log.trace("[{}][{}] Failed to fetch device additional info", sessionId, msg.getDeviceInfo().getDeviceName(), e); 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 df1807cc0d..4b41313b7e 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 @@ -649,35 +649,32 @@ public class DefaultTransportService implements TransportService { Optional deviceOpt = dataDecodingEncodingService.decode(msg.getData().toByteArray()); 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); - } + 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(false); + 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); } From c24db73a37cd54296bf6258010b510918ce7363a Mon Sep 17 00:00:00 2001 From: zbeacon Date: Wed, 20 Jan 2021 12:41:35 +0200 Subject: [PATCH 5/7] Refactoring --- .../server/common/transport/auth/SessionInfoCreator.java | 4 ++-- .../common/transport/service/DefaultTransportService.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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 793afa97d7..ee4d8343a8 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 @@ -42,9 +42,9 @@ public class SessionInfoCreator { if (!"null".equals(msg.getDeviceInfo().getAdditionalInfo())) { try { JsonNode infoNode = context.getMapper().readTree(msg.getDeviceInfo().getAdditionalInfo()); - if (infoNode.get("gateway").asBoolean(false)) { + if (infoNode.get("gateway").asBoolean()) { boolean activityTimeFromGatewayDevice = false; - if (infoNode.get("activityTimeFromGatewayDevice") != null) { + if (infoNode.has("activityTimeFromGatewayDevice")) { activityTimeFromGatewayDevice = infoNode.get("activityTimeFromGatewayDevice").asBoolean(); } builder.setActivityTimeFromGatewayDevice(activityTimeFromGatewayDevice); 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 4b41313b7e..86b49f4915 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 @@ -649,10 +649,10 @@ public class DefaultTransportService implements TransportService { Optional deviceOpt = dataDecodingEncodingService.decode(msg.getData().toByteArray()); if (deviceOpt.isPresent()) { Device device = deviceOpt.get(); - if (device.getAdditionalInfo().get("gateway") != null && device.getAdditionalInfo().get("gateway").asBoolean()) { + if (device.getAdditionalInfo().has("gateway") && 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(false); + boolean newActivityTimeFromGatewayDevice = device.getAdditionalInfo().get("activityTimeFromGatewayDevice").asBoolean(); if (currentMD.getSessionInfo().getActivityTimeFromGatewayDevice() != newActivityTimeFromGatewayDevice) { SessionInfoProto currentSessionInfo = currentMD.getSessionInfo(); SessionInfoProto newSessionInfo = SessionInfoProto.newBuilder() From 2d1f9b615820394390ee9a2dbe8d00f608be8458 Mon Sep 17 00:00:00 2001 From: zbeacon Date: Fri, 22 Jan 2021 11:53:00 +0200 Subject: [PATCH 6/7] Moved code to existing processing --- .../service/DefaultTransportService.java | 46 +++++-------------- 1 file changed, 12 insertions(+), 34 deletions(-) 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 86b49f4915..7ff81610b1 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 @@ -647,37 +647,7 @@ public class DefaultTransportService implements TransportService { } } else if (EntityType.DEVICE.equals(entityType)) { Optional deviceOpt = dataDecodingEncodingService.decode(msg.getData().toByteArray()); - if (deviceOpt.isPresent()) { - Device device = deviceOpt.get(); - if (device.getAdditionalInfo().has("gateway") && 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); - } + deviceOpt.ifPresent(this::onDeviceUpdate); } } else if (toSessionMsg.hasEntityDeleteMsg()) { TransportProtos.EntityDeleteMsg msg = toSessionMsg.getEntityDeleteMsg(); @@ -733,13 +703,21 @@ public class DefaultTransportService implements TransportService { } else { newDeviceProfile = null; } - TransportProtos.SessionInfoProto newSessionInfo = TransportProtos.SessionInfoProto.newBuilder() + TransportProtos.SessionInfoProto.Builder newSessionInfoBuilder = TransportProtos.SessionInfoProto.newBuilder() .mergeFrom(md.getSessionInfo()) .setDeviceProfileIdMSB(deviceProfileIdMSB) .setDeviceProfileIdLSB(deviceProfileIdLSB) .setDeviceName(device.getName()) - .setDeviceType(device.getType()) - .build(); + .setDeviceType(device.getType()); + if (device.getAdditionalInfo().has("gateway") + && device.getAdditionalInfo().get("gateway").asBoolean() + && device.getAdditionalInfo().has("activityTimeFromGatewayDevice")) { + boolean activityTimeFromGatewayDevice = device.getAdditionalInfo().get("activityTimeFromGatewayDevice").asBoolean(); + if (md.getSessionInfo().getActivityTimeFromGatewayDevice() != activityTimeFromGatewayDevice) { + newSessionInfoBuilder.setActivityTimeFromGatewayDevice(activityTimeFromGatewayDevice); + } + } + TransportProtos.SessionInfoProto newSessionInfo = newSessionInfoBuilder.build(); md.setSessionInfo(newSessionInfo); transportCallbackExecutor.submit(() -> md.getListener().onDeviceUpdate(newSessionInfo, device, Optional.ofNullable(newDeviceProfile))); } From d06ce5555ccfdbbfbbaca236b6ef0b589442e844 Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Fri, 22 Jan 2021 16:06:48 +0200 Subject: [PATCH 7/7] Simplified implementation of the overwrite activity time flag --- common/queue/src/main/proto/queue.proto | 1 - .../transport/mqtt/MqttTransportHandler.java | 10 ++++--- .../common/transport/TransportService.java | 5 ++-- .../transport/auth/SessionInfoCreator.java | 23 +++------------- .../service/DefaultTransportService.java | 26 ++++++++++--------- .../transport/service/SessionMetaData.java | 3 ++- .../home/pages/device/device.component.html | 4 +-- .../home/pages/device/device.component.ts | 4 +-- .../assets/locale/locale.constant-en_US.json | 2 +- 9 files changed, 34 insertions(+), 44 deletions(-) diff --git a/common/queue/src/main/proto/queue.proto b/common/queue/src/main/proto/queue.proto index 1d1846dfeb..6864259617 100644 --- a/common/queue/src/main/proto/queue.proto +++ b/common/queue/src/main/proto/queue.proto @@ -53,7 +53,6 @@ message SessionInfoProto { int64 gwSessionIdLSB = 11; int64 deviceProfileIdMSB = 12; int64 deviceProfileIdLSB = 13; - bool activityTimeFromGatewayDevice = 14; } enum SessionEvent { diff --git a/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/MqttTransportHandler.java b/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/MqttTransportHandler.java index e7c295b9e6..8a8fcff2a4 100644 --- a/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/MqttTransportHandler.java +++ b/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/MqttTransportHandler.java @@ -55,6 +55,7 @@ import org.thingsboard.server.common.transport.auth.SessionInfoCreator; import org.thingsboard.server.common.transport.auth.TransportDeviceInfo; import org.thingsboard.server.common.transport.auth.ValidateDeviceCredentialsResponse; import org.thingsboard.server.common.transport.service.DefaultTransportService; +import org.thingsboard.server.common.transport.service.SessionMetaData; import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos.ProvisionDeviceResponseMsg; import org.thingsboard.server.gen.transport.TransportProtos.SessionEvent; @@ -596,7 +597,7 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement } } - private void checkGatewaySession() { + private void checkGatewaySession(SessionMetaData sessionMetaData) { TransportDeviceInfo device = deviceSessionCtx.getDeviceInfo(); try { JsonNode infoNode = context.getMapper().readTree(device.getAdditionalInfo()); @@ -604,6 +605,9 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement JsonNode gatewayNode = infoNode.get("gateway"); if (gatewayNode != null && gatewayNode.asBoolean()) { gatewaySessionHandler = new GatewaySessionHandler(deviceSessionCtx, sessionId); + if (infoNode.has(DefaultTransportService.OVERWRITE_ACTIVITY_TIME) && infoNode.get(DefaultTransportService.OVERWRITE_ACTIVITY_TIME).isBoolean()) { + sessionMetaData.setOverwriteActivityTime(infoNode.get(DefaultTransportService.OVERWRITE_ACTIVITY_TIME).asBoolean()); + } } } } catch (IOException e) { @@ -639,8 +643,8 @@ public class MqttTransportHandler extends ChannelInboundHandlerAdapter implement transportService.process(deviceSessionCtx.getSessionInfo(), DefaultTransportService.getSessionEventMsg(SessionEvent.OPEN), new TransportServiceCallback() { @Override public void onSuccess(Void msg) { - transportService.registerAsyncSession(deviceSessionCtx.getSessionInfo(), MqttTransportHandler.this); - checkGatewaySession(); + SessionMetaData sessionMetaData = transportService.registerAsyncSession(deviceSessionCtx.getSessionInfo(), MqttTransportHandler.this); + checkGatewaySession(sessionMetaData); ctx.writeAndFlush(createMqttConnAckMsg(CONNECTION_ACCEPTED, connectMessage)); log.info("[{}] Client connected!", sessionId); } diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/TransportService.java b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/TransportService.java index 6ec1337c62..1d30f561aa 100644 --- a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/TransportService.java +++ b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/TransportService.java @@ -19,6 +19,7 @@ import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceTransportType; import org.thingsboard.server.common.transport.auth.GetOrCreateDeviceFromGatewayResponse; import org.thingsboard.server.common.transport.auth.ValidateDeviceCredentialsResponse; +import org.thingsboard.server.common.transport.service.SessionMetaData; import org.thingsboard.server.gen.transport.TransportProtos.ClaimDeviceMsg; import org.thingsboard.server.gen.transport.TransportProtos.GetAttributeRequestMsg; import org.thingsboard.server.gen.transport.TransportProtos.GetEntityProfileRequestMsg; @@ -81,9 +82,9 @@ public interface TransportService { void process(SessionInfoProto sessionInfo, ClaimDeviceMsg msg, TransportServiceCallback callback); - void registerAsyncSession(SessionInfoProto sessionInfo, SessionMsgListener listener); + SessionMetaData registerAsyncSession(SessionInfoProto sessionInfo, SessionMsgListener listener); - void registerSyncSession(SessionInfoProto sessionInfo, SessionMsgListener listener, long timeout); + SessionMetaData registerSyncSession(SessionInfoProto sessionInfo, SessionMsgListener listener, long timeout); void reportActivity(SessionInfoProto sessionInfo); 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 ee4d8343a8..ab18b930f9 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,20 +15,17 @@ */ 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) { - TransportProtos.SessionInfoProto.Builder builder = TransportProtos.SessionInfoProto.newBuilder(); - builder.setNodeId(context.getNodeId()) + return TransportProtos.SessionInfoProto.newBuilder().setNodeId(context.getNodeId()) .setSessionIdMSB(sessionId.getMostSignificantBits()) .setSessionIdLSB(sessionId.getLeastSignificantBits()) .setDeviceIdMSB(msg.getDeviceInfo().getDeviceId().getId().getMostSignificantBits()) @@ -38,22 +35,8 @@ public class SessionInfoCreator { .setDeviceName(msg.getDeviceInfo().getDeviceName()) .setDeviceType(msg.getDeviceInfo().getDeviceType()) .setDeviceProfileIdMSB(msg.getDeviceInfo().getDeviceProfileId().getId().getMostSignificantBits()) - .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()) { - boolean activityTimeFromGatewayDevice = false; - if (infoNode.has("activityTimeFromGatewayDevice")) { - activityTimeFromGatewayDevice = infoNode.get("activityTimeFromGatewayDevice").asBoolean(); - } - builder.setActivityTimeFromGatewayDevice(activityTimeFromGatewayDevice); - } - } catch (IOException e) { - log.trace("[{}][{}] Failed to fetch device additional info", sessionId, msg.getDeviceInfo().getDeviceName(), e); - } - } - return builder.build(); + .setDeviceProfileIdLSB(msg.getDeviceInfo().getDeviceProfileId().getId().getLeastSignificantBits()) + .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 7ff81610b1..8ef0187342 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 @@ -108,6 +108,8 @@ import java.util.concurrent.atomic.AtomicInteger; @TbTransportComponent public class DefaultTransportService implements TransportService { + public static final String OVERWRITE_ACTIVITY_TIME = "overwriteActivityTime"; + @Value("${transport.sessions.inactivity_timeout}") private long sessionInactivityTimeout; @Value("${transport.sessions.report_timeout}") @@ -233,8 +235,10 @@ public class DefaultTransportService implements TransportService { } @Override - public void registerAsyncSession(TransportProtos.SessionInfoProto sessionInfo, SessionMsgListener listener) { - sessions.putIfAbsent(toSessionId(sessionInfo), new SessionMetaData(sessionInfo, TransportProtos.SessionType.ASYNC, listener)); + public SessionMetaData registerAsyncSession(TransportProtos.SessionInfoProto sessionInfo, SessionMsgListener listener) { + SessionMetaData newValue = new SessionMetaData(sessionInfo, TransportProtos.SessionType.ASYNC, listener); + SessionMetaData oldValue = sessions.putIfAbsent(toSessionId(sessionInfo), newValue); + return oldValue != null ? oldValue : newValue; } @Override @@ -513,7 +517,7 @@ public class DefaultTransportService implements TransportService { if (sessionInfo.getGwSessionIdMSB() != 0 && sessionInfo.getGwSessionIdLSB() != 0) { SessionMetaData gwMetaData = sessions.get(new UUID(sessionInfo.getGwSessionIdMSB(), sessionInfo.getGwSessionIdLSB())); - if (gwMetaData != null && gwMetaData.getSessionInfo().getActivityTimeFromGatewayDevice()) { + if (gwMetaData != null && gwMetaData.isOverwriteActivityTime()) { lastActivityTime = Math.max(gwMetaData.getLastActivityTime(), lastActivityTime); } } @@ -547,7 +551,7 @@ public class DefaultTransportService implements TransportService { } @Override - public void registerSyncSession(TransportProtos.SessionInfoProto sessionInfo, SessionMsgListener listener, long timeout) { + public SessionMetaData registerSyncSession(TransportProtos.SessionInfoProto sessionInfo, SessionMsgListener listener, long timeout) { SessionMetaData currentSession = new SessionMetaData(sessionInfo, TransportProtos.SessionType.SYNC, listener); sessions.putIfAbsent(toSessionId(sessionInfo), currentSession); @@ -557,6 +561,7 @@ public class DefaultTransportService implements TransportService { }, timeout, TimeUnit.MILLISECONDS); currentSession.setScheduledFuture(executorFuture); + return currentSession; } @Override @@ -703,21 +708,18 @@ public class DefaultTransportService implements TransportService { } else { newDeviceProfile = null; } - TransportProtos.SessionInfoProto.Builder newSessionInfoBuilder = TransportProtos.SessionInfoProto.newBuilder() + TransportProtos.SessionInfoProto newSessionInfo = TransportProtos.SessionInfoProto.newBuilder() .mergeFrom(md.getSessionInfo()) .setDeviceProfileIdMSB(deviceProfileIdMSB) .setDeviceProfileIdLSB(deviceProfileIdLSB) .setDeviceName(device.getName()) - .setDeviceType(device.getType()); + .setDeviceType(device.getType()).build(); if (device.getAdditionalInfo().has("gateway") && device.getAdditionalInfo().get("gateway").asBoolean() - && device.getAdditionalInfo().has("activityTimeFromGatewayDevice")) { - boolean activityTimeFromGatewayDevice = device.getAdditionalInfo().get("activityTimeFromGatewayDevice").asBoolean(); - if (md.getSessionInfo().getActivityTimeFromGatewayDevice() != activityTimeFromGatewayDevice) { - newSessionInfoBuilder.setActivityTimeFromGatewayDevice(activityTimeFromGatewayDevice); - } + && device.getAdditionalInfo().has(OVERWRITE_ACTIVITY_TIME) + && device.getAdditionalInfo().get(OVERWRITE_ACTIVITY_TIME).isBoolean()) { + md.setOverwriteActivityTime(device.getAdditionalInfo().get(OVERWRITE_ACTIVITY_TIME).asBoolean()); } - TransportProtos.SessionInfoProto newSessionInfo = newSessionInfoBuilder.build(); md.setSessionInfo(newSessionInfo); transportCallbackExecutor.submit(() -> md.getListener().onDeviceUpdate(newSessionInfo, device, Optional.ofNullable(newDeviceProfile))); } diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/SessionMetaData.java b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/SessionMetaData.java index c81ca05bc1..bb0ed7aa58 100644 --- a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/SessionMetaData.java +++ b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/SessionMetaData.java @@ -25,7 +25,7 @@ import java.util.concurrent.ScheduledFuture; * Created by ashvayka on 15.10.18. */ @Data -class SessionMetaData { +public class SessionMetaData { private volatile TransportProtos.SessionInfoProto sessionInfo; private final TransportProtos.SessionType sessionType; @@ -36,6 +36,7 @@ class SessionMetaData { private volatile long lastReportedActivityTime; private volatile boolean subscribedToAttributes; private volatile boolean subscribedToRPC; + private volatile boolean overwriteActivityTime; SessionMetaData(TransportProtos.SessionInfoProto sessionInfo, TransportProtos.SessionType sessionType, SessionMsgListener listener) { this.sessionInfo = sessionInfo; diff --git a/ui-ngx/src/app/modules/home/pages/device/device.component.html b/ui-ngx/src/app/modules/home/pages/device/device.component.html index 1ea3b380b9..b01aced285 100644 --- a/ui-ngx/src/app/modules/home/pages/device/device.component.html +++ b/ui-ngx/src/app/modules/home/pages/device/device.component.html @@ -105,8 +105,8 @@ {{ 'device.is-gateway' | translate }} - {{ 'device.activity-time-from-gateway-device' | translate }} + formControlName="overwriteActivityTime"> + {{ 'device.overwrite-activity-time' | translate }}
diff --git a/ui-ngx/src/app/modules/home/pages/device/device.component.ts b/ui-ngx/src/app/modules/home/pages/device/device.component.ts index 9d865a09af..660b6341ca 100644 --- a/ui-ngx/src/app/modules/home/pages/device/device.component.ts +++ b/ui-ngx/src/app/modules/home/pages/device/device.component.ts @@ -84,7 +84,7 @@ export class DeviceComponent extends EntityComponent { additionalInfo: this.fb.group( { gateway: [entity && entity.additionalInfo ? entity.additionalInfo.gateway : false], - activityTimeFromGatewayDevice: [entity && entity.additionalInfo ? entity.additionalInfo.activityTimeFromGatewayDevice: false], + overwriteActivityTime: [entity && entity.additionalInfo ? entity.additionalInfo.overwriteActivityTime: false], description: [entity && entity.additionalInfo ? entity.additionalInfo.description : ''], } ) @@ -101,7 +101,7 @@ export class DeviceComponent extends EntityComponent { additionalInfo: { gateway: entity.additionalInfo ? entity.additionalInfo.gateway : false, - activityTimeFromGatewayDevice: entity.additionalInfo ? entity.additionalInfo.activityTimeFromGatewayDevice : false + overwriteActivityTime: entity.additionalInfo ? entity.additionalInfo.overwriteActivityTime : false } }); this.entityForm.patchValue({additionalInfo: {description: entity.additionalInfo ? entity.additionalInfo.description : ''}}); diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json index a574435358..ea0e45cbd2 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -906,7 +906,7 @@ "unable-delete-device-alias-title": "Unable to delete device alias", "unable-delete-device-alias-text": "Device alias '{{deviceAlias}}' can't be deleted as it used by the following widget(s):
{{widgetsList}}", "is-gateway": "Is gateway", - "activity-time-from-gateway-device": "Activity time from gateway device", + "overwrite-activity-time": "Overwrite activity time for connected device", "public": "Public", "device-public": "Device is public", "select-device": "Select device",