Moved lastConnectedGateway to additional info of the device, according to comments from @ashvayka
This commit is contained in:
parent
d255c8d16c
commit
d73e47b714
@ -29,15 +29,11 @@ import org.thingsboard.server.common.data.DataConstants;
|
|||||||
import org.thingsboard.server.common.data.Device;
|
import org.thingsboard.server.common.data.Device;
|
||||||
import org.thingsboard.server.common.data.id.DeviceId;
|
import org.thingsboard.server.common.data.id.DeviceId;
|
||||||
import org.thingsboard.server.common.data.id.TenantId;
|
import org.thingsboard.server.common.data.id.TenantId;
|
||||||
import org.thingsboard.server.common.data.relation.EntityRelation;
|
|
||||||
import org.thingsboard.server.common.data.relation.RelationTypeGroup;
|
|
||||||
import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody;
|
import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody;
|
||||||
import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest;
|
import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest;
|
||||||
import org.thingsboard.server.dao.device.DeviceService;
|
import org.thingsboard.server.dao.device.DeviceService;
|
||||||
import org.thingsboard.server.dao.relation.RelationService;
|
|
||||||
import org.thingsboard.server.service.rpc.TbCoreDeviceRpcService;
|
import org.thingsboard.server.service.rpc.TbCoreDeviceRpcService;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@ -47,23 +43,18 @@ public class DefaultGatewayDeviceStateService implements GatewayDeviceStateServi
|
|||||||
|
|
||||||
private final static String DEVICE_RENAMED_METHOD_NAME = "gateway_device_renamed";
|
private final static String DEVICE_RENAMED_METHOD_NAME = "gateway_device_renamed";
|
||||||
private final static String DEVICE_DELETED_METHOD_NAME = "gateway_device_deleted";
|
private final static String DEVICE_DELETED_METHOD_NAME = "gateway_device_deleted";
|
||||||
|
private final DeviceService deviceService;
|
||||||
@Value("${server.rest.server_side_rpc.min_timeout:5000}")
|
@Value("${server.rest.server_side_rpc.min_timeout:5000}")
|
||||||
protected long minTimeout;
|
protected long minTimeout;
|
||||||
|
|
||||||
@Value("${server.rest.server_side_rpc.default_timeout:10000}")
|
@Value("${server.rest.server_side_rpc.default_timeout:10000}")
|
||||||
protected long defaultTimeout;
|
protected long defaultTimeout;
|
||||||
|
|
||||||
private final RelationService relationService;
|
|
||||||
private final DeviceService deviceService;
|
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
@Autowired
|
@Autowired
|
||||||
private TbCoreDeviceRpcService deviceRpcService;
|
private TbCoreDeviceRpcService deviceRpcService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(Device device, Device oldDevice) {
|
public void update(Device device, Device oldDevice) {
|
||||||
Device gatewayDevice = findGatewayDeviceByRelationFromDevice(device);
|
Device gatewayDevice = findGatewayDeviceByAdditionalInfoInDevice(device.getTenantId(), device.getAdditionalInfo());
|
||||||
if (gatewayDevice != null) {
|
if (gatewayDevice != null) {
|
||||||
ObjectNode renamedDeviceNode = JacksonUtil.newObjectNode();
|
ObjectNode renamedDeviceNode = JacksonUtil.newObjectNode();
|
||||||
renamedDeviceNode.put(device.getName(), oldDevice.getName());
|
renamedDeviceNode.put(device.getName(), oldDevice.getName());
|
||||||
@ -77,7 +68,7 @@ public class DefaultGatewayDeviceStateService implements GatewayDeviceStateServi
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void delete(Device device) {
|
public void delete(Device device) {
|
||||||
Device gatewayDevice = findGatewayDeviceByRelationFromDevice(device);
|
Device gatewayDevice = findGatewayDeviceByAdditionalInfoInDevice(device.getTenantId(), device.getAdditionalInfo());
|
||||||
if (gatewayDevice != null) {
|
if (gatewayDevice != null) {
|
||||||
TextNode deletedDeviceNode = new TextNode(device.getName());
|
TextNode deletedDeviceNode = new TextNode(device.getName());
|
||||||
ToDeviceRpcRequest rpcRequest = formDeviceToGatewayRPCRequest(gatewayDevice, deletedDeviceNode, DEVICE_DELETED_METHOD_NAME);
|
ToDeviceRpcRequest rpcRequest = formDeviceToGatewayRPCRequest(gatewayDevice, deletedDeviceNode, DEVICE_DELETED_METHOD_NAME);
|
||||||
@ -104,11 +95,11 @@ public class DefaultGatewayDeviceStateService implements GatewayDeviceStateServi
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Device findGatewayDeviceByRelationFromDevice(Device device) {
|
private Device findGatewayDeviceByAdditionalInfoInDevice(TenantId tenantId, JsonNode deviceAdditionalInfo) {
|
||||||
List<EntityRelation> relationToGatewayList = relationService.findByFromAndType(TenantId.SYS_TENANT_ID, device.getId(), DataConstants.LAST_CONNECTED_GATEWAY, RelationTypeGroup.COMMON);
|
if (deviceAdditionalInfo != null && deviceAdditionalInfo.has(DataConstants.LAST_CONNECTED_GATEWAY)) {
|
||||||
if (!relationToGatewayList.isEmpty()) {
|
JsonNode lastConnectedGatewayIdNode = deviceAdditionalInfo.get(DataConstants.LAST_CONNECTED_GATEWAY);
|
||||||
EntityRelation relationToGateway = relationToGatewayList.get(0);
|
DeviceId gatewayId = new DeviceId(UUID.fromString(lastConnectedGatewayIdNode.asText()));
|
||||||
return deviceService.findDeviceById(device.getTenantId(), (DeviceId) relationToGateway.getTo());
|
return deviceService.findDeviceById(tenantId, gatewayId);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,6 +16,7 @@
|
|||||||
package org.thingsboard.server.service.transport;
|
package org.thingsboard.server.service.transport;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.JsonNode;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
import com.google.common.util.concurrent.Futures;
|
import com.google.common.util.concurrent.Futures;
|
||||||
@ -27,6 +28,7 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.thingsboard.common.util.JacksonUtil;
|
import org.thingsboard.common.util.JacksonUtil;
|
||||||
import org.thingsboard.server.cache.ota.OtaPackageDataCache;
|
import org.thingsboard.server.cache.ota.OtaPackageDataCache;
|
||||||
|
import org.thingsboard.server.cluster.TbClusterService;
|
||||||
import org.thingsboard.server.common.data.ApiUsageState;
|
import org.thingsboard.server.common.data.ApiUsageState;
|
||||||
import org.thingsboard.server.common.data.DataConstants;
|
import org.thingsboard.server.common.data.DataConstants;
|
||||||
import org.thingsboard.server.common.data.Device;
|
import org.thingsboard.server.common.data.Device;
|
||||||
@ -56,7 +58,6 @@ import org.thingsboard.server.common.data.ota.OtaPackageUtil;
|
|||||||
import org.thingsboard.server.common.data.page.PageData;
|
import org.thingsboard.server.common.data.page.PageData;
|
||||||
import org.thingsboard.server.common.data.page.PageLink;
|
import org.thingsboard.server.common.data.page.PageLink;
|
||||||
import org.thingsboard.server.common.data.relation.EntityRelation;
|
import org.thingsboard.server.common.data.relation.EntityRelation;
|
||||||
import org.thingsboard.server.common.data.relation.RelationTypeGroup;
|
|
||||||
import org.thingsboard.server.common.data.security.DeviceCredentials;
|
import org.thingsboard.server.common.data.security.DeviceCredentials;
|
||||||
import org.thingsboard.server.common.data.security.DeviceCredentialsType;
|
import org.thingsboard.server.common.data.security.DeviceCredentialsType;
|
||||||
import org.thingsboard.server.common.msg.EncryptionUtil;
|
import org.thingsboard.server.common.msg.EncryptionUtil;
|
||||||
@ -96,10 +97,8 @@ import org.thingsboard.server.queue.util.TbCoreComponent;
|
|||||||
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
import org.thingsboard.server.service.apiusage.TbApiUsageStateService;
|
||||||
import org.thingsboard.server.service.executors.DbCallbackExecutorService;
|
import org.thingsboard.server.service.executors.DbCallbackExecutorService;
|
||||||
import org.thingsboard.server.service.profile.TbDeviceProfileCache;
|
import org.thingsboard.server.service.profile.TbDeviceProfileCache;
|
||||||
import org.thingsboard.server.cluster.TbClusterService;
|
|
||||||
import org.thingsboard.server.service.resource.TbResourceService;
|
import org.thingsboard.server.service.resource.TbResourceService;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
@ -138,6 +137,10 @@ public class DefaultTransportApiService implements TransportApiService {
|
|||||||
|
|
||||||
private final ConcurrentMap<String, ReentrantLock> deviceCreationLocks = new ConcurrentHashMap<>();
|
private final ConcurrentMap<String, ReentrantLock> deviceCreationLocks = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
private static boolean checkIsMqttCredentials(DeviceCredentials credentials) {
|
||||||
|
return credentials != null && DeviceCredentialsType.MQTT_BASIC.equals(credentials.getCredentialsType());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ListenableFuture<TbProtoQueueMsg<TransportApiResponseMsg>> handle(TbProtoQueueMsg<TransportApiRequestMsg> tbProtoQueueMsg) {
|
public ListenableFuture<TbProtoQueueMsg<TransportApiResponseMsg>> handle(TbProtoQueueMsg<TransportApiRequestMsg> tbProtoQueueMsg) {
|
||||||
TransportApiRequestMsg transportApiRequestMsg = tbProtoQueueMsg.getValue();
|
TransportApiRequestMsg transportApiRequestMsg = tbProtoQueueMsg.getValue();
|
||||||
@ -234,10 +237,6 @@ public class DefaultTransportApiService implements TransportApiService {
|
|||||||
return getEmptyTransportApiResponseFuture();
|
return getEmptyTransportApiResponseFuture();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean checkIsMqttCredentials(DeviceCredentials credentials) {
|
|
||||||
return credentials != null && DeviceCredentialsType.MQTT_BASIC.equals(credentials.getCredentialsType());
|
|
||||||
}
|
|
||||||
|
|
||||||
private DeviceCredentials checkMqttCredentials(TransportProtos.ValidateBasicMqttCredRequestMsg clientCred, String credId) {
|
private DeviceCredentials checkMqttCredentials(TransportProtos.ValidateBasicMqttCredRequestMsg clientCred, String credId) {
|
||||||
return checkMqttCredentials(clientCred, deviceCredentialsService.findDeviceCredentialsByCredentialsId(credId));
|
return checkMqttCredentials(clientCred, deviceCredentialsService.findDeviceCredentialsByCredentialsId(credId));
|
||||||
}
|
}
|
||||||
@ -286,6 +285,9 @@ public class DefaultTransportApiService implements TransportApiService {
|
|||||||
device.setCustomerId(gateway.getCustomerId());
|
device.setCustomerId(gateway.getCustomerId());
|
||||||
DeviceProfile deviceProfile = deviceProfileCache.findOrCreateDeviceProfile(gateway.getTenantId(), requestMsg.getDeviceType());
|
DeviceProfile deviceProfile = deviceProfileCache.findOrCreateDeviceProfile(gateway.getTenantId(), requestMsg.getDeviceType());
|
||||||
device.setDeviceProfileId(deviceProfile.getId());
|
device.setDeviceProfileId(deviceProfile.getId());
|
||||||
|
ObjectNode additionalInfo = JacksonUtil.newObjectNode();
|
||||||
|
additionalInfo.put(DataConstants.LAST_CONNECTED_GATEWAY, gatewayId.toString());
|
||||||
|
device.setAdditionalInfo(additionalInfo);
|
||||||
Device savedDevice = deviceService.saveDevice(device);
|
Device savedDevice = deviceService.saveDevice(device);
|
||||||
tbClusterService.onDeviceUpdated(savedDevice, null);
|
tbClusterService.onDeviceUpdated(savedDevice, null);
|
||||||
device = savedDevice;
|
device = savedDevice;
|
||||||
@ -303,18 +305,17 @@ public class DefaultTransportApiService implements TransportApiService {
|
|||||||
ObjectNode entityNode = mapper.valueToTree(device);
|
ObjectNode entityNode = mapper.valueToTree(device);
|
||||||
TbMsg tbMsg = TbMsg.newMsg(DataConstants.ENTITY_CREATED, deviceId, customerId, metaData, TbMsgDataType.JSON, mapper.writeValueAsString(entityNode));
|
TbMsg tbMsg = TbMsg.newMsg(DataConstants.ENTITY_CREATED, deviceId, customerId, metaData, TbMsgDataType.JSON, mapper.writeValueAsString(entityNode));
|
||||||
tbClusterService.pushMsgToRuleEngine(tenantId, deviceId, tbMsg, null);
|
tbClusterService.pushMsgToRuleEngine(tenantId, deviceId, tbMsg, null);
|
||||||
}
|
|
||||||
|
|
||||||
List<EntityRelation> currentLastConnectedGatewayRelationList = relationService.findByFromAndType(TenantId.SYS_TENANT_ID, device.getId(), DataConstants.LAST_CONNECTED_GATEWAY, RelationTypeGroup.COMMON);
|
|
||||||
EntityRelation lastConnectedGatewayRelation;
|
|
||||||
if (!currentLastConnectedGatewayRelationList.isEmpty()) {
|
|
||||||
lastConnectedGatewayRelation = currentLastConnectedGatewayRelationList.get(0);
|
|
||||||
lastConnectedGatewayRelation.setTo(gateway.getId());
|
|
||||||
} else {
|
} else {
|
||||||
lastConnectedGatewayRelation = new EntityRelation(device.getId(), gateway.getId(), DataConstants.LAST_CONNECTED_GATEWAY);
|
JsonNode deviceAdditionalInfo = device.getAdditionalInfo();
|
||||||
|
if (deviceAdditionalInfo == null) {
|
||||||
|
deviceAdditionalInfo = JacksonUtil.newObjectNode();
|
||||||
|
}
|
||||||
|
if (!deviceAdditionalInfo.has(DataConstants.LAST_CONNECTED_GATEWAY) || !gatewayId.toString().equals(deviceAdditionalInfo.get(DataConstants.LAST_CONNECTED_GATEWAY).asText())) {
|
||||||
|
ObjectNode newDeviceAdditionalInfo = (ObjectNode) deviceAdditionalInfo;
|
||||||
|
newDeviceAdditionalInfo.put(DataConstants.LAST_CONNECTED_GATEWAY, gatewayId.toString());
|
||||||
|
deviceService.saveDevice(device);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
relationService.saveRelationAsync(TenantId.SYS_TENANT_ID, lastConnectedGatewayRelation);
|
|
||||||
|
|
||||||
GetOrCreateDeviceFromGatewayResponseMsg.Builder builder = GetOrCreateDeviceFromGatewayResponseMsg.newBuilder()
|
GetOrCreateDeviceFromGatewayResponseMsg.Builder builder = GetOrCreateDeviceFromGatewayResponseMsg.newBuilder()
|
||||||
.setDeviceInfo(getDeviceInfoProto(device));
|
.setDeviceInfo(getDeviceInfoProto(device));
|
||||||
DeviceProfile deviceProfile = deviceProfileCache.get(device.getTenantId(), device.getDeviceProfileId());
|
DeviceProfile deviceProfile = deviceProfileCache.get(device.getTenantId(), device.getDeviceProfileId());
|
||||||
@ -359,7 +360,8 @@ public class DefaultTransportApiService implements TransportApiService {
|
|||||||
dbCallbackExecutorService);
|
dbCallbackExecutorService);
|
||||||
}
|
}
|
||||||
|
|
||||||
private TransportApiResponseMsg getTransportApiResponseMsg(DeviceCredentials deviceCredentials, TransportProtos.ResponseStatus status) {
|
private TransportApiResponseMsg getTransportApiResponseMsg(DeviceCredentials
|
||||||
|
deviceCredentials, TransportProtos.ResponseStatus status) {
|
||||||
if (!status.equals(TransportProtos.ResponseStatus.SUCCESS)) {
|
if (!status.equals(TransportProtos.ResponseStatus.SUCCESS)) {
|
||||||
return TransportApiResponseMsg.newBuilder().setProvisionDeviceResponseMsg(TransportProtos.ProvisionDeviceResponseMsg.newBuilder().setStatus(status).build()).build();
|
return TransportApiResponseMsg.newBuilder().setProvisionDeviceResponseMsg(TransportProtos.ProvisionDeviceResponseMsg.newBuilder().setStatus(status).build()).build();
|
||||||
}
|
}
|
||||||
@ -602,7 +604,8 @@ public class DefaultTransportApiService implements TransportApiService {
|
|||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
private ListenableFuture<TransportApiResponseMsg> handleRegistration(TransportProtos.LwM2MRegistrationRequestMsg msg) {
|
private ListenableFuture<TransportApiResponseMsg> handleRegistration
|
||||||
|
(TransportProtos.LwM2MRegistrationRequestMsg msg) {
|
||||||
TenantId tenantId = new TenantId(UUID.fromString(msg.getTenantId()));
|
TenantId tenantId = new TenantId(UUID.fromString(msg.getTenantId()));
|
||||||
String deviceName = msg.getEndpoint();
|
String deviceName = msg.getEndpoint();
|
||||||
Lock deviceCreationLock = deviceCreationLocks.computeIfAbsent(deviceName, id -> new ReentrantLock());
|
Lock deviceCreationLock = deviceCreationLocks.computeIfAbsent(deviceName, id -> new ReentrantLock());
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user