|
|
|
@ -16,6 +16,7 @@ |
|
|
|
package org.thingsboard.server.transport.mqtt.session; |
|
|
|
|
|
|
|
|
|
|
|
import com.fasterxml.jackson.databind.JsonNode; |
|
|
|
import com.google.common.util.concurrent.FutureCallback; |
|
|
|
import com.google.common.util.concurrent.Futures; |
|
|
|
import com.google.common.util.concurrent.ListenableFuture; |
|
|
|
@ -32,17 +33,21 @@ import io.netty.channel.ChannelFuture; |
|
|
|
import io.netty.channel.ChannelHandlerContext; |
|
|
|
import io.netty.handler.codec.mqtt.MqttMessage; |
|
|
|
import io.netty.handler.codec.mqtt.MqttPublishMessage; |
|
|
|
import lombok.Getter; |
|
|
|
import lombok.Setter; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.springframework.util.CollectionUtils; |
|
|
|
import org.springframework.util.ConcurrentReferenceHashMap; |
|
|
|
import org.thingsboard.server.common.adaptor.AdaptorException; |
|
|
|
import org.thingsboard.server.common.adaptor.JsonConverter; |
|
|
|
import org.thingsboard.server.common.adaptor.ProtoConverter; |
|
|
|
import org.thingsboard.server.common.data.DataConstants; |
|
|
|
import org.thingsboard.server.common.data.Device; |
|
|
|
import org.thingsboard.server.common.data.DeviceProfile; |
|
|
|
import org.thingsboard.server.common.data.StringUtils; |
|
|
|
import org.thingsboard.server.common.data.id.DeviceId; |
|
|
|
import org.thingsboard.server.common.transport.TransportService; |
|
|
|
import org.thingsboard.server.common.transport.TransportServiceCallback; |
|
|
|
import org.thingsboard.server.common.adaptor.AdaptorException; |
|
|
|
import org.thingsboard.server.common.adaptor.JsonConverter; |
|
|
|
import org.thingsboard.server.common.adaptor.ProtoConverter; |
|
|
|
import org.thingsboard.server.common.transport.auth.GetOrCreateDeviceFromGatewayResponse; |
|
|
|
import org.thingsboard.server.common.transport.auth.TransportDeviceInfo; |
|
|
|
import org.thingsboard.server.gen.transport.TransportApiProtos; |
|
|
|
@ -64,6 +69,7 @@ import java.util.Date; |
|
|
|
import java.util.HashSet; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.Optional; |
|
|
|
import java.util.Set; |
|
|
|
import java.util.UUID; |
|
|
|
import java.util.concurrent.ConcurrentHashMap; |
|
|
|
@ -101,7 +107,11 @@ public abstract class AbstractGatewaySessionHandler<T extends AbstractGatewayDev |
|
|
|
protected final ChannelHandlerContext channel; |
|
|
|
protected final DeviceSessionCtx deviceSessionCtx; |
|
|
|
|
|
|
|
public AbstractGatewaySessionHandler(DeviceSessionCtx deviceSessionCtx, UUID sessionId) { |
|
|
|
@Getter |
|
|
|
@Setter |
|
|
|
private boolean overwriteDevicesActivity = false; |
|
|
|
|
|
|
|
public AbstractGatewaySessionHandler(DeviceSessionCtx deviceSessionCtx, UUID sessionId, boolean overwriteDevicesActivity) { |
|
|
|
this.context = deviceSessionCtx.getContext(); |
|
|
|
this.transportService = context.getTransportService(); |
|
|
|
this.deviceSessionCtx = deviceSessionCtx; |
|
|
|
@ -112,6 +122,7 @@ public abstract class AbstractGatewaySessionHandler<T extends AbstractGatewayDev |
|
|
|
this.deviceCreationLockMap = createWeakMap(); |
|
|
|
this.mqttQoSMap = deviceSessionCtx.getMqttQoSMap(); |
|
|
|
this.channel = deviceSessionCtx.getChannel(); |
|
|
|
this.overwriteDevicesActivity = overwriteDevicesActivity; |
|
|
|
} |
|
|
|
|
|
|
|
ConcurrentReferenceHashMap<String, Lock> createWeakMap() { |
|
|
|
@ -164,6 +175,12 @@ public abstract class AbstractGatewaySessionHandler<T extends AbstractGatewayDev |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public void onGatewayPing() { |
|
|
|
if (overwriteDevicesActivity) { |
|
|
|
devices.forEach((deviceName, deviceSessionCtx) -> transportService.recordActivity(deviceSessionCtx.getSessionInfo())); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
public void onDevicesDisconnect() { |
|
|
|
devices.forEach(this::deregisterSession); |
|
|
|
} |
|
|
|
@ -221,6 +238,14 @@ public abstract class AbstractGatewaySessionHandler<T extends AbstractGatewayDev |
|
|
|
}, context.getExecutor()); |
|
|
|
} |
|
|
|
|
|
|
|
public void onDeviceUpdate(TransportProtos.SessionInfoProto sessionInfo, Device device, Optional<DeviceProfile> deviceProfileOpt) { |
|
|
|
log.trace("[{}][{}] onDeviceUpdate: [{}]", gateway.getTenantId(), gateway.getDeviceId(), device); |
|
|
|
JsonNode deviceAdditionalInfo = device.getAdditionalInfo(); |
|
|
|
if (deviceAdditionalInfo.has(DataConstants.GATEWAY_PARAMETER) && deviceAdditionalInfo.has(DataConstants.OVERWRITE_ACTIVITY_TIME_PARAMETER)) { |
|
|
|
overwriteDevicesActivity = deviceAdditionalInfo.get(DataConstants.OVERWRITE_ACTIVITY_TIME_PARAMETER).asBoolean(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
ListenableFuture<T> onDeviceConnect(String deviceName, String deviceType) { |
|
|
|
T result = devices.get(deviceName); |
|
|
|
if (result == null) { |
|
|
|
|