Ack cloud messages
This commit is contained in:
		
							parent
							
								
									ab14bcb963
								
							
						
					
					
						commit
						3e42f00cf7
					
				
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -316,64 +316,62 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void processRuleChainMetadataRequestMsg(Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg) {
 | 
			
		||||
    public ListenableFuture<Void> processRuleChainMetadataRequestMsg(Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg) {
 | 
			
		||||
        if (ruleChainMetadataRequestMsg.getRuleChainIdMSB() != 0 && ruleChainMetadataRequestMsg.getRuleChainIdLSB() != 0) {
 | 
			
		||||
            RuleChainId ruleChainId = new RuleChainId(new UUID(ruleChainMetadataRequestMsg.getRuleChainIdMSB(), ruleChainMetadataRequestMsg.getRuleChainIdLSB()));
 | 
			
		||||
            saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.RULE_CHAIN_METADATA, ActionType.ADDED, ruleChainId, null);
 | 
			
		||||
            ListenableFuture<EdgeEvent> future = saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.RULE_CHAIN_METADATA, ActionType.ADDED, ruleChainId, null);
 | 
			
		||||
            return Futures.transform(future, edgeEvent -> null, dbCallbackExecutorService);
 | 
			
		||||
        }
 | 
			
		||||
        return Futures.immediateFuture(null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void processAttributesRequestMsg(Edge edge, AttributesRequestMsg attributesRequestMsg) {
 | 
			
		||||
    public ListenableFuture<Void> processAttributesRequestMsg(Edge edge, AttributesRequestMsg attributesRequestMsg) {
 | 
			
		||||
        EntityId entityId = EntityIdFactory.getByTypeAndUuid(
 | 
			
		||||
                EntityType.valueOf(attributesRequestMsg.getEntityType()),
 | 
			
		||||
                new UUID(attributesRequestMsg.getEntityIdMSB(), attributesRequestMsg.getEntityIdLSB()));
 | 
			
		||||
        final EdgeEventType edgeEventType = getEdgeQueueTypeByEntityType(entityId.getEntityType());
 | 
			
		||||
        if (edgeEventType != null) {
 | 
			
		||||
            ListenableFuture<List<AttributeKvEntry>> ssAttrFuture = attributesService.findAll(edge.getTenantId(), entityId, DataConstants.SERVER_SCOPE);
 | 
			
		||||
            Futures.addCallback(ssAttrFuture, new FutureCallback<List<AttributeKvEntry>>() {
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onSuccess(@Nullable List<AttributeKvEntry> ssAttributes) {
 | 
			
		||||
                    if (ssAttributes != null && !ssAttributes.isEmpty()) {
 | 
			
		||||
                        try {
 | 
			
		||||
                            Map<String, Object> entityData = new HashMap<>();
 | 
			
		||||
                            ObjectNode attributes = mapper.createObjectNode();
 | 
			
		||||
                            for (AttributeKvEntry attr : ssAttributes) {
 | 
			
		||||
                                if (attr.getDataType() == DataType.BOOLEAN && attr.getBooleanValue().isPresent()) {
 | 
			
		||||
                                    attributes.put(attr.getKey(), attr.getBooleanValue().get());
 | 
			
		||||
                                } else if (attr.getDataType() == DataType.DOUBLE && attr.getDoubleValue().isPresent()) {
 | 
			
		||||
                                    attributes.put(attr.getKey(), attr.getDoubleValue().get());
 | 
			
		||||
                                } else if (attr.getDataType() == DataType.LONG && attr.getLongValue().isPresent()) {
 | 
			
		||||
                                    attributes.put(attr.getKey(), attr.getLongValue().get());
 | 
			
		||||
                                } else {
 | 
			
		||||
                                    attributes.put(attr.getKey(), attr.getValueAsString());
 | 
			
		||||
                                }
 | 
			
		||||
            return Futures.transform(ssAttrFuture, ssAttributes -> {
 | 
			
		||||
                if (ssAttributes != null && !ssAttributes.isEmpty()) {
 | 
			
		||||
                    try {
 | 
			
		||||
                        Map<String, Object> entityData = new HashMap<>();
 | 
			
		||||
                        ObjectNode attributes = mapper.createObjectNode();
 | 
			
		||||
                        for (AttributeKvEntry attr : ssAttributes) {
 | 
			
		||||
                            if (attr.getDataType() == DataType.BOOLEAN && attr.getBooleanValue().isPresent()) {
 | 
			
		||||
                                attributes.put(attr.getKey(), attr.getBooleanValue().get());
 | 
			
		||||
                            } else if (attr.getDataType() == DataType.DOUBLE && attr.getDoubleValue().isPresent()) {
 | 
			
		||||
                                attributes.put(attr.getKey(), attr.getDoubleValue().get());
 | 
			
		||||
                            } else if (attr.getDataType() == DataType.LONG && attr.getLongValue().isPresent()) {
 | 
			
		||||
                                attributes.put(attr.getKey(), attr.getLongValue().get());
 | 
			
		||||
                            } else {
 | 
			
		||||
                                attributes.put(attr.getKey(), attr.getValueAsString());
 | 
			
		||||
                            }
 | 
			
		||||
                            entityData.put("kv", attributes);
 | 
			
		||||
                            entityData.put("scope", DataConstants.SERVER_SCOPE);
 | 
			
		||||
                            JsonNode entityBody = mapper.valueToTree(entityData);
 | 
			
		||||
                            log.debug("Sending attributes data msg, entityId [{}], attributes [{}]", entityId, entityBody);
 | 
			
		||||
                            saveEdgeEvent(edge.getTenantId(),
 | 
			
		||||
                                    edge.getId(),
 | 
			
		||||
                                    edgeEventType,
 | 
			
		||||
                                    ActionType.ATTRIBUTES_UPDATED,
 | 
			
		||||
                                    entityId,
 | 
			
		||||
                                    entityBody);
 | 
			
		||||
                        } catch (Exception e) {
 | 
			
		||||
                            log.error("[{}] Failed to send attribute updates to the edge", edge.getName(), e);
 | 
			
		||||
                        }
 | 
			
		||||
                        entityData.put("kv", attributes);
 | 
			
		||||
                        entityData.put("scope", DataConstants.SERVER_SCOPE);
 | 
			
		||||
                        JsonNode entityBody = mapper.valueToTree(entityData);
 | 
			
		||||
                        log.debug("Sending attributes data msg, entityId [{}], attributes [{}]", entityId, entityBody);
 | 
			
		||||
                        saveEdgeEvent(edge.getTenantId(),
 | 
			
		||||
                                edge.getId(),
 | 
			
		||||
                                edgeEventType,
 | 
			
		||||
                                ActionType.ATTRIBUTES_UPDATED,
 | 
			
		||||
                                entityId,
 | 
			
		||||
                                entityBody);
 | 
			
		||||
                    } catch (Exception e) {
 | 
			
		||||
                        log.error("[{}] Failed to send attribute updates to the edge", edge.getName(), e);
 | 
			
		||||
                        throw new RuntimeException("[" + edge.getName() + "] Failed to send attribute updates to the edge", e);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                @Override
 | 
			
		||||
                public void onFailure(Throwable t) {
 | 
			
		||||
 | 
			
		||||
                }
 | 
			
		||||
                return null;
 | 
			
		||||
            }, dbCallbackExecutorService);
 | 
			
		||||
 | 
			
		||||
            // TODO: voba - push shared attributes to edge?
 | 
			
		||||
            ListenableFuture<List<AttributeKvEntry>> shAttrFuture = attributesService.findAll(edge.getTenantId(), entityId, DataConstants.SHARED_SCOPE);
 | 
			
		||||
            ListenableFuture<List<AttributeKvEntry>> clAttrFuture = attributesService.findAll(edge.getTenantId(), entityId, DataConstants.CLIENT_SCOPE);
 | 
			
		||||
            // ListenableFuture<List<AttributeKvEntry>> shAttrFuture = attributesService.findAll(edge.getTenantId(), entityId, DataConstants.SHARED_SCOPE);
 | 
			
		||||
            // ListenableFuture<List<AttributeKvEntry>> clAttrFuture = attributesService.findAll(edge.getTenantId(), entityId, DataConstants.CLIENT_SCOPE);
 | 
			
		||||
        } else {
 | 
			
		||||
            return Futures.immediateFuture(null);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -391,7 +389,7 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void processRelationRequestMsg(Edge edge, RelationRequestMsg relationRequestMsg) {
 | 
			
		||||
    public ListenableFuture<Void> processRelationRequestMsg(Edge edge, RelationRequestMsg relationRequestMsg) {
 | 
			
		||||
        EntityId entityId = EntityIdFactory.getByTypeAndUuid(
 | 
			
		||||
                EntityType.valueOf(relationRequestMsg.getEntityType()),
 | 
			
		||||
                new UUID(relationRequestMsg.getEntityIdMSB(), relationRequestMsg.getEntityIdLSB()));
 | 
			
		||||
@ -400,39 +398,33 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
 | 
			
		||||
        futures.add(findRelationByQuery(edge, entityId, EntitySearchDirection.FROM));
 | 
			
		||||
        futures.add(findRelationByQuery(edge, entityId, EntitySearchDirection.TO));
 | 
			
		||||
        ListenableFuture<List<List<EntityRelation>>> relationsListFuture = Futures.allAsList(futures);
 | 
			
		||||
        Futures.addCallback(relationsListFuture, new FutureCallback<List<List<EntityRelation>>>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onSuccess(@Nullable List<List<EntityRelation>> relationsList) {
 | 
			
		||||
                try {
 | 
			
		||||
                    if (!relationsList.isEmpty()) {
 | 
			
		||||
                        for (List<EntityRelation> entityRelations : relationsList) {
 | 
			
		||||
                            log.trace("[{}] [{}] [{}] relation(s) are going to be pushed to edge.", edge.getId(), entityId, entityRelations.size());
 | 
			
		||||
                            for (EntityRelation relation : entityRelations) {
 | 
			
		||||
                                try {
 | 
			
		||||
                                    if (!relation.getFrom().getEntityType().equals(EntityType.EDGE) &&
 | 
			
		||||
                                            !relation.getTo().getEntityType().equals(EntityType.EDGE)) {
 | 
			
		||||
                                        saveEdgeEvent(edge.getTenantId(),
 | 
			
		||||
                                                edge.getId(),
 | 
			
		||||
                                                EdgeEventType.RELATION,
 | 
			
		||||
                                                ActionType.ADDED,
 | 
			
		||||
                                                null,
 | 
			
		||||
                                                mapper.valueToTree(relation));
 | 
			
		||||
                                    }
 | 
			
		||||
                                } catch (Exception e) {
 | 
			
		||||
                                    log.error("Exception during loading relation [{}] to edge on sync!", relation, e);
 | 
			
		||||
        return Futures.transform(relationsListFuture, relationsList -> {
 | 
			
		||||
            try {
 | 
			
		||||
                if (relationsList != null && !relationsList.isEmpty()) {
 | 
			
		||||
                    for (List<EntityRelation> entityRelations : relationsList) {
 | 
			
		||||
                        log.trace("[{}] [{}] [{}] relation(s) are going to be pushed to edge.", edge.getId(), entityId, entityRelations.size());
 | 
			
		||||
                        for (EntityRelation relation : entityRelations) {
 | 
			
		||||
                            try {
 | 
			
		||||
                                if (!relation.getFrom().getEntityType().equals(EntityType.EDGE) &&
 | 
			
		||||
                                        !relation.getTo().getEntityType().equals(EntityType.EDGE)) {
 | 
			
		||||
                                    saveEdgeEvent(edge.getTenantId(),
 | 
			
		||||
                                            edge.getId(),
 | 
			
		||||
                                            EdgeEventType.RELATION,
 | 
			
		||||
                                            ActionType.ADDED,
 | 
			
		||||
                                            null,
 | 
			
		||||
                                            mapper.valueToTree(relation));
 | 
			
		||||
                                }
 | 
			
		||||
                            } catch (Exception e) {
 | 
			
		||||
                                log.error("Exception during loading relation [{}] to edge on sync!", relation, e);
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                } catch (Exception e) {
 | 
			
		||||
                    log.error("Exception during loading relation(s) to edge on sync!", e);
 | 
			
		||||
                }
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                log.error("Exception during loading relation(s) to edge on sync!", e);
 | 
			
		||||
                throw new RuntimeException("Exception during loading relation(s) to edge on sync!", e);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onFailure(Throwable t) {
 | 
			
		||||
                log.error("Exception during loading relation(s) to edge on sync!", t);
 | 
			
		||||
            }
 | 
			
		||||
            return null;
 | 
			
		||||
        }, dbCallbackExecutorService);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -443,22 +435,26 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void processDeviceCredentialsRequestMsg(Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg) {
 | 
			
		||||
    public ListenableFuture<Void> processDeviceCredentialsRequestMsg(Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg) {
 | 
			
		||||
        if (deviceCredentialsRequestMsg.getDeviceIdMSB() != 0 && deviceCredentialsRequestMsg.getDeviceIdLSB() != 0) {
 | 
			
		||||
            DeviceId deviceId = new DeviceId(new UUID(deviceCredentialsRequestMsg.getDeviceIdMSB(), deviceCredentialsRequestMsg.getDeviceIdLSB()));
 | 
			
		||||
            saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.DEVICE, ActionType.CREDENTIALS_UPDATED, deviceId, null);
 | 
			
		||||
            ListenableFuture<EdgeEvent> future = saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.DEVICE, ActionType.CREDENTIALS_UPDATED, deviceId, null);
 | 
			
		||||
            return Futures.transform(future, edgeEvent -> null, dbCallbackExecutorService);
 | 
			
		||||
        }
 | 
			
		||||
        return Futures.immediateFuture(null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void processUserCredentialsRequestMsg(Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg) {
 | 
			
		||||
    public ListenableFuture<Void> processUserCredentialsRequestMsg(Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg) {
 | 
			
		||||
        if (userCredentialsRequestMsg.getUserIdMSB() != 0 && userCredentialsRequestMsg.getUserIdLSB() != 0) {
 | 
			
		||||
            UserId userId = new UserId(new UUID(userCredentialsRequestMsg.getUserIdMSB(), userCredentialsRequestMsg.getUserIdLSB()));
 | 
			
		||||
            saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.USER, ActionType.CREDENTIALS_UPDATED, userId, null);
 | 
			
		||||
            ListenableFuture<EdgeEvent> future = saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.USER, ActionType.CREDENTIALS_UPDATED, userId, null);
 | 
			
		||||
            return Futures.transform(future, edgeEvent -> null, dbCallbackExecutorService);
 | 
			
		||||
        }
 | 
			
		||||
        return Futures.immediateFuture(null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void saveEdgeEvent(TenantId tenantId,
 | 
			
		||||
    private ListenableFuture<EdgeEvent> saveEdgeEvent(TenantId tenantId,
 | 
			
		||||
                               EdgeId edgeId,
 | 
			
		||||
                               EdgeEventType edgeEventType,
 | 
			
		||||
                               ActionType edgeEventAction,
 | 
			
		||||
@ -476,6 +472,6 @@ public class DefaultSyncEdgeService implements SyncEdgeService {
 | 
			
		||||
            edgeEvent.setEntityId(entityId.getId());
 | 
			
		||||
        }
 | 
			
		||||
        edgeEvent.setEntityBody(entityBody);
 | 
			
		||||
        edgeEventService.saveAsync(edgeEvent);
 | 
			
		||||
        return edgeEventService.saveAsync(edgeEvent);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -15,6 +15,7 @@
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.service.edge.rpc.init;
 | 
			
		||||
 | 
			
		||||
import com.google.common.util.concurrent.ListenableFuture;
 | 
			
		||||
import org.thingsboard.server.common.data.edge.Edge;
 | 
			
		||||
import org.thingsboard.server.gen.edge.AttributesRequestMsg;
 | 
			
		||||
import org.thingsboard.server.gen.edge.DeviceCredentialsRequestMsg;
 | 
			
		||||
@ -26,13 +27,13 @@ public interface SyncEdgeService {
 | 
			
		||||
 | 
			
		||||
    void sync(Edge edge);
 | 
			
		||||
 | 
			
		||||
    void processRuleChainMetadataRequestMsg(Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg);
 | 
			
		||||
    ListenableFuture<Void> processRuleChainMetadataRequestMsg(Edge edge, RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg);
 | 
			
		||||
 | 
			
		||||
    void processAttributesRequestMsg(Edge edge, AttributesRequestMsg attributesRequestMsg);
 | 
			
		||||
    ListenableFuture<Void> processAttributesRequestMsg(Edge edge, AttributesRequestMsg attributesRequestMsg);
 | 
			
		||||
 | 
			
		||||
    void processRelationRequestMsg(Edge edge, RelationRequestMsg relationRequestMsg);
 | 
			
		||||
    ListenableFuture<Void> processRelationRequestMsg(Edge edge, RelationRequestMsg relationRequestMsg);
 | 
			
		||||
 | 
			
		||||
    void processDeviceCredentialsRequestMsg(Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg);
 | 
			
		||||
    ListenableFuture<Void> processDeviceCredentialsRequestMsg(Edge edge, DeviceCredentialsRequestMsg deviceCredentialsRequestMsg);
 | 
			
		||||
 | 
			
		||||
    void processUserCredentialsRequestMsg(Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg);
 | 
			
		||||
    ListenableFuture<Void> processUserCredentialsRequestMsg(Edge edge, UserCredentialsRequestMsg userCredentialsRequestMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -28,9 +28,9 @@ import org.thingsboard.server.gen.edge.ConnectRequestMsg;
 | 
			
		||||
import org.thingsboard.server.gen.edge.ConnectResponseCode;
 | 
			
		||||
import org.thingsboard.server.gen.edge.ConnectResponseMsg;
 | 
			
		||||
import org.thingsboard.server.gen.edge.DownlinkMsg;
 | 
			
		||||
import org.thingsboard.server.gen.edge.DownlinkResponseMsg;
 | 
			
		||||
import org.thingsboard.server.gen.edge.EdgeConfiguration;
 | 
			
		||||
import org.thingsboard.server.gen.edge.EdgeRpcServiceGrpc;
 | 
			
		||||
import org.thingsboard.server.gen.edge.EntityUpdateMsg;
 | 
			
		||||
import org.thingsboard.server.gen.edge.RequestMsg;
 | 
			
		||||
import org.thingsboard.server.gen.edge.RequestMsgType;
 | 
			
		||||
import org.thingsboard.server.gen.edge.ResponseMsg;
 | 
			
		||||
@ -41,6 +41,7 @@ import javax.net.ssl.SSLException;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.net.URISyntaxException;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
import java.util.concurrent.locks.ReentrantLock;
 | 
			
		||||
import java.util.function.Consumer;
 | 
			
		||||
 | 
			
		||||
@Service
 | 
			
		||||
@ -62,12 +63,13 @@ public class EdgeGrpcClient implements EdgeRpcClient {
 | 
			
		||||
 | 
			
		||||
    private StreamObserver<RequestMsg> inputStream;
 | 
			
		||||
 | 
			
		||||
    private static final ReentrantLock uplinkMsgLock = new ReentrantLock();
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void connect(String edgeKey,
 | 
			
		||||
                        String edgeSecret,
 | 
			
		||||
                        Consumer<UplinkResponseMsg> onUplinkResponse,
 | 
			
		||||
                        Consumer<EdgeConfiguration> onEdgeUpdate,
 | 
			
		||||
                        Consumer<EntityUpdateMsg> onEntityUpdate,
 | 
			
		||||
                        Consumer<DownlinkMsg> onDownlink,
 | 
			
		||||
                        Consumer<Exception> onError) {
 | 
			
		||||
        NettyChannelBuilder builder = NettyChannelBuilder.forAddress(rpcHost, rpcPort).usePlaintext();
 | 
			
		||||
@ -83,7 +85,7 @@ public class EdgeGrpcClient implements EdgeRpcClient {
 | 
			
		||||
        channel = builder.build();
 | 
			
		||||
        EdgeRpcServiceGrpc.EdgeRpcServiceStub stub = EdgeRpcServiceGrpc.newStub(channel);
 | 
			
		||||
        log.info("[{}] Sending a connect request to the TB!", edgeKey);
 | 
			
		||||
        this.inputStream = stub.handleMsgs(initOutputStream(edgeKey, onUplinkResponse, onEdgeUpdate, onEntityUpdate, onDownlink, onError));
 | 
			
		||||
        this.inputStream = stub.handleMsgs(initOutputStream(edgeKey, onUplinkResponse, onEdgeUpdate, onDownlink, onError));
 | 
			
		||||
        this.inputStream.onNext(RequestMsg.newBuilder()
 | 
			
		||||
                .setMsgType(RequestMsgType.CONNECT_RPC_MESSAGE)
 | 
			
		||||
                .setConnectRequestMsg(ConnectRequestMsg.newBuilder().setEdgeRoutingKey(edgeKey).setEdgeSecret(edgeSecret).build())
 | 
			
		||||
@ -110,16 +112,33 @@ public class EdgeGrpcClient implements EdgeRpcClient {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendUplinkMsg(UplinkMsg msg) {
 | 
			
		||||
        this.inputStream.onNext(RequestMsg.newBuilder()
 | 
			
		||||
                .setMsgType(RequestMsgType.UPLINK_RPC_MESSAGE)
 | 
			
		||||
                .setUplinkMsg(msg)
 | 
			
		||||
                .build());
 | 
			
		||||
        try {
 | 
			
		||||
            uplinkMsgLock.lock();
 | 
			
		||||
            this.inputStream.onNext(RequestMsg.newBuilder()
 | 
			
		||||
                    .setMsgType(RequestMsgType.UPLINK_RPC_MESSAGE)
 | 
			
		||||
                    .setUplinkMsg(msg)
 | 
			
		||||
                    .build());
 | 
			
		||||
        } finally {
 | 
			
		||||
            uplinkMsgLock.unlock();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void sendDownlinkResponseMsg(DownlinkResponseMsg downlinkResponseMsg) {
 | 
			
		||||
        try {
 | 
			
		||||
            uplinkMsgLock.lock();
 | 
			
		||||
            this.inputStream.onNext(RequestMsg.newBuilder()
 | 
			
		||||
                    .setMsgType(RequestMsgType.UPLINK_RPC_MESSAGE)
 | 
			
		||||
                    .setDownlinkResponseMsg(downlinkResponseMsg)
 | 
			
		||||
                    .build());
 | 
			
		||||
        } finally {
 | 
			
		||||
            uplinkMsgLock.unlock();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private StreamObserver<ResponseMsg> initOutputStream(String edgeKey,
 | 
			
		||||
                                                         Consumer<UplinkResponseMsg> onUplinkResponse,
 | 
			
		||||
                                                         Consumer<EdgeConfiguration> onEdgeUpdate,
 | 
			
		||||
                                                         Consumer<EntityUpdateMsg> onEntityUpdate,
 | 
			
		||||
                                                         Consumer<DownlinkMsg> onDownlink,
 | 
			
		||||
                                                         Consumer<Exception> onError) {
 | 
			
		||||
        return new StreamObserver<ResponseMsg>() {
 | 
			
		||||
@ -137,9 +156,6 @@ public class EdgeGrpcClient implements EdgeRpcClient {
 | 
			
		||||
                } else if (responseMsg.hasUplinkResponseMsg()) {
 | 
			
		||||
                    log.debug("[{}] Uplink response message received {}", edgeKey, responseMsg.getUplinkResponseMsg());
 | 
			
		||||
                    onUplinkResponse.accept(responseMsg.getUplinkResponseMsg());
 | 
			
		||||
                } else if (responseMsg.hasEntityUpdateMsg()) {
 | 
			
		||||
                    log.debug("[{}] Entity update message received {}", edgeKey, responseMsg.getEntityUpdateMsg());
 | 
			
		||||
                    onEntityUpdate.accept(responseMsg.getEntityUpdateMsg());
 | 
			
		||||
                } else if (responseMsg.hasDownlinkMsg()) {
 | 
			
		||||
                    log.debug("[{}] Downlink message received {}", edgeKey, responseMsg.getDownlinkMsg());
 | 
			
		||||
                    onDownlink.accept(responseMsg.getDownlinkMsg());
 | 
			
		||||
 | 
			
		||||
@ -16,8 +16,8 @@
 | 
			
		||||
package org.thingsboard.edge.rpc;
 | 
			
		||||
 | 
			
		||||
import org.thingsboard.server.gen.edge.DownlinkMsg;
 | 
			
		||||
import org.thingsboard.server.gen.edge.DownlinkResponseMsg;
 | 
			
		||||
import org.thingsboard.server.gen.edge.EdgeConfiguration;
 | 
			
		||||
import org.thingsboard.server.gen.edge.EntityUpdateMsg;
 | 
			
		||||
import org.thingsboard.server.gen.edge.UplinkMsg;
 | 
			
		||||
import org.thingsboard.server.gen.edge.UplinkResponseMsg;
 | 
			
		||||
 | 
			
		||||
@ -29,11 +29,12 @@ public interface EdgeRpcClient {
 | 
			
		||||
                 String integrationSecret,
 | 
			
		||||
                 Consumer<UplinkResponseMsg> onUplinkResponse,
 | 
			
		||||
                 Consumer<EdgeConfiguration> onEdgeUpdate,
 | 
			
		||||
                 Consumer<EntityUpdateMsg> onEntityUpdate,
 | 
			
		||||
                 Consumer<DownlinkMsg> onDownlink,
 | 
			
		||||
                 Consumer<Exception> onError);
 | 
			
		||||
 | 
			
		||||
    void disconnect() throws InterruptedException;
 | 
			
		||||
 | 
			
		||||
    void sendUplinkMsg(UplinkMsg uplinkMsg) throws InterruptedException;
 | 
			
		||||
    void sendUplinkMsg(UplinkMsg uplinkMsg);
 | 
			
		||||
 | 
			
		||||
    void sendDownlinkResponseMsg(DownlinkResponseMsg downlinkResponseMsg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -37,31 +37,13 @@ message RequestMsg {
 | 
			
		||||
  RequestMsgType msgType = 1;
 | 
			
		||||
  ConnectRequestMsg connectRequestMsg = 2;
 | 
			
		||||
  UplinkMsg uplinkMsg = 3;
 | 
			
		||||
  DownlinkResponseMsg downlinkResponseMsg = 4;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message ResponseMsg {
 | 
			
		||||
  ConnectResponseMsg connectResponseMsg = 1;
 | 
			
		||||
  UplinkResponseMsg uplinkResponseMsg = 2;
 | 
			
		||||
  EntityUpdateMsg entityUpdateMsg = 3;
 | 
			
		||||
  DownlinkMsg downlinkMsg = 4;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message EntityUpdateMsg {
 | 
			
		||||
  DeviceUpdateMsg deviceUpdateMsg = 1;
 | 
			
		||||
  DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg = 2;
 | 
			
		||||
  RuleChainUpdateMsg ruleChainUpdateMsg = 3;
 | 
			
		||||
  RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg = 4;
 | 
			
		||||
  DashboardUpdateMsg dashboardUpdateMsg = 5;
 | 
			
		||||
  AssetUpdateMsg assetUpdateMsg = 6;
 | 
			
		||||
  EntityViewUpdateMsg entityViewUpdateMsg = 7;
 | 
			
		||||
  AlarmUpdateMsg alarmUpdateMsg = 8;
 | 
			
		||||
  UserUpdateMsg userUpdateMsg = 9;
 | 
			
		||||
  UserCredentialsUpdateMsg userCredentialsUpdateMsg = 10;
 | 
			
		||||
  CustomerUpdateMsg customerUpdateMsg = 11;
 | 
			
		||||
  RelationUpdateMsg relationUpdateMsg = 12;
 | 
			
		||||
  WidgetsBundleUpdateMsg widgetsBundleUpdateMsg = 13;
 | 
			
		||||
  WidgetTypeUpdateMsg widgetTypeUpdateMsg = 14;
 | 
			
		||||
  AdminSettingsUpdateMsg adminSettingsUpdateMsg = 15;
 | 
			
		||||
  DownlinkMsg downlinkMsg = 3;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
enum RequestMsgType {
 | 
			
		||||
@ -360,9 +342,30 @@ message UplinkResponseMsg {
 | 
			
		||||
  string errorMsg = 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message DownlinkResponseMsg {
 | 
			
		||||
  bool success = 1;
 | 
			
		||||
  string errorMsg = 2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
message DownlinkMsg {
 | 
			
		||||
  int32 downlinkMsgId = 1;
 | 
			
		||||
  repeated EntityDataProto entityData = 2;
 | 
			
		||||
  repeated DeviceCredentialsRequestMsg deviceCredentialsRequestMsg = 3;
 | 
			
		||||
  repeated DeviceUpdateMsg deviceUpdateMsg = 4;
 | 
			
		||||
  repeated DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg = 5;
 | 
			
		||||
  repeated RuleChainUpdateMsg ruleChainUpdateMsg = 6;
 | 
			
		||||
  repeated RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg = 7;
 | 
			
		||||
  repeated DashboardUpdateMsg dashboardUpdateMsg = 8;
 | 
			
		||||
  repeated AssetUpdateMsg assetUpdateMsg = 9;
 | 
			
		||||
  repeated EntityViewUpdateMsg entityViewUpdateMsg = 10;
 | 
			
		||||
  repeated AlarmUpdateMsg alarmUpdateMsg = 11;
 | 
			
		||||
  repeated UserUpdateMsg userUpdateMsg = 12;
 | 
			
		||||
  repeated UserCredentialsUpdateMsg userCredentialsUpdateMsg = 13;
 | 
			
		||||
  repeated CustomerUpdateMsg customerUpdateMsg = 14;
 | 
			
		||||
  repeated RelationUpdateMsg relationUpdateMsg = 15;
 | 
			
		||||
  repeated WidgetsBundleUpdateMsg widgetsBundleUpdateMsg = 16;
 | 
			
		||||
  repeated WidgetTypeUpdateMsg widgetTypeUpdateMsg = 17;
 | 
			
		||||
  repeated AdminSettingsUpdateMsg adminSettingsUpdateMsg = 18;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user