From d06ce5555ccfdbbfbbaca236b6ef0b589442e844 Mon Sep 17 00:00:00 2001 From: Andrii Shvaika Date: Fri, 22 Jan 2021 16:06:48 +0200 Subject: [PATCH] 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",