Showing
19 changed files
with
242 additions
and
107 deletions
@@ -291,6 +291,9 @@ public class ActorSystemContext { | @@ -291,6 +291,9 @@ public class ActorSystemContext { | ||
291 | @Getter | 291 | @Getter |
292 | private long statisticsPersistFrequency; | 292 | private long statisticsPersistFrequency; |
293 | 293 | ||
294 | + @Value("${edges.rpc.enabled}") | ||
295 | + @Getter | ||
296 | + private boolean edgesRpcEnabled; | ||
294 | 297 | ||
295 | @Scheduled(fixedDelayString = "${actors.statistics.js_print_interval_ms}") | 298 | @Scheduled(fixedDelayString = "${actors.statistics.js_print_interval_ms}") |
296 | public void printStats() { | 299 | public void printStats() { |
@@ -87,7 +87,9 @@ public class AppActor extends ContextAwareActor { | @@ -87,7 +87,9 @@ public class AppActor extends ContextAwareActor { | ||
87 | case DEVICE_ATTRIBUTES_UPDATE_TO_DEVICE_ACTOR_MSG: | 87 | case DEVICE_ATTRIBUTES_UPDATE_TO_DEVICE_ACTOR_MSG: |
88 | case DEVICE_CREDENTIALS_UPDATE_TO_DEVICE_ACTOR_MSG: | 88 | case DEVICE_CREDENTIALS_UPDATE_TO_DEVICE_ACTOR_MSG: |
89 | case DEVICE_NAME_OR_TYPE_UPDATE_TO_DEVICE_ACTOR_MSG: | 89 | case DEVICE_NAME_OR_TYPE_UPDATE_TO_DEVICE_ACTOR_MSG: |
90 | + case DEVICE_EDGE_UPDATE_TO_DEVICE_ACTOR_MSG: | ||
90 | case DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG: | 91 | case DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG: |
92 | + case DEVICE_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG: | ||
91 | case SERVER_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG: | 93 | case SERVER_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG: |
92 | onToDeviceActorMsg((TenantAwareMsg) msg, true); | 94 | onToDeviceActorMsg((TenantAwareMsg) msg, true); |
93 | break; | 95 | break; |
@@ -17,6 +17,7 @@ package org.thingsboard.server.actors.device; | @@ -17,6 +17,7 @@ package org.thingsboard.server.actors.device; | ||
17 | 17 | ||
18 | import lombok.extern.slf4j.Slf4j; | 18 | import lombok.extern.slf4j.Slf4j; |
19 | import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg; | 19 | import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg; |
20 | +import org.thingsboard.rule.engine.api.msg.DeviceEdgeUpdateMsg; | ||
20 | import org.thingsboard.rule.engine.api.msg.DeviceNameOrTypeUpdateMsg; | 21 | import org.thingsboard.rule.engine.api.msg.DeviceNameOrTypeUpdateMsg; |
21 | import org.thingsboard.server.actors.ActorSystemContext; | 22 | import org.thingsboard.server.actors.ActorSystemContext; |
22 | import org.thingsboard.server.actors.TbActorCtx; | 23 | import org.thingsboard.server.actors.TbActorCtx; |
@@ -26,6 +27,7 @@ import org.thingsboard.server.common.data.id.DeviceId; | @@ -26,6 +27,7 @@ import org.thingsboard.server.common.data.id.DeviceId; | ||
26 | import org.thingsboard.server.common.data.id.TenantId; | 27 | import org.thingsboard.server.common.data.id.TenantId; |
27 | import org.thingsboard.server.common.msg.TbActorMsg; | 28 | import org.thingsboard.server.common.msg.TbActorMsg; |
28 | import org.thingsboard.server.common.msg.timeout.DeviceActorServerSideRpcTimeoutMsg; | 29 | import org.thingsboard.server.common.msg.timeout.DeviceActorServerSideRpcTimeoutMsg; |
30 | +import org.thingsboard.server.service.rpc.FromDeviceRpcResponseActorMsg; | ||
29 | import org.thingsboard.server.service.rpc.ToDeviceRpcRequestActorMsg; | 31 | import org.thingsboard.server.service.rpc.ToDeviceRpcRequestActorMsg; |
30 | import org.thingsboard.server.service.transport.msg.TransportToDeviceActorMsgWrapper; | 32 | import org.thingsboard.server.service.transport.msg.TransportToDeviceActorMsgWrapper; |
31 | 33 | ||
@@ -70,12 +72,18 @@ public class DeviceActor extends ContextAwareActor { | @@ -70,12 +72,18 @@ public class DeviceActor extends ContextAwareActor { | ||
70 | case DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG: | 72 | case DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG: |
71 | processor.processRpcRequest(ctx, (ToDeviceRpcRequestActorMsg) msg); | 73 | processor.processRpcRequest(ctx, (ToDeviceRpcRequestActorMsg) msg); |
72 | break; | 74 | break; |
75 | + case DEVICE_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG: | ||
76 | + processor.processRpcResponsesFromEdge(ctx, (FromDeviceRpcResponseActorMsg) msg); | ||
77 | + break; | ||
73 | case DEVICE_ACTOR_SERVER_SIDE_RPC_TIMEOUT_MSG: | 78 | case DEVICE_ACTOR_SERVER_SIDE_RPC_TIMEOUT_MSG: |
74 | processor.processServerSideRpcTimeout(ctx, (DeviceActorServerSideRpcTimeoutMsg) msg); | 79 | processor.processServerSideRpcTimeout(ctx, (DeviceActorServerSideRpcTimeoutMsg) msg); |
75 | break; | 80 | break; |
76 | case SESSION_TIMEOUT_MSG: | 81 | case SESSION_TIMEOUT_MSG: |
77 | processor.checkSessionsTimeout(); | 82 | processor.checkSessionsTimeout(); |
78 | break; | 83 | break; |
84 | + case DEVICE_EDGE_UPDATE_TO_DEVICE_ACTOR_MSG: | ||
85 | + processor.processEdgeUpdate((DeviceEdgeUpdateMsg) msg); | ||
86 | + break; | ||
79 | default: | 87 | default: |
80 | return false; | 88 | return false; |
81 | } | 89 | } |
@@ -15,6 +15,7 @@ | @@ -15,6 +15,7 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.server.actors.device; | 16 | package org.thingsboard.server.actors.device; |
17 | 17 | ||
18 | +import com.fasterxml.jackson.databind.node.ObjectNode; | ||
18 | import com.google.common.util.concurrent.FutureCallback; | 19 | import com.google.common.util.concurrent.FutureCallback; |
19 | import com.google.common.util.concurrent.Futures; | 20 | import com.google.common.util.concurrent.Futures; |
20 | import com.google.common.util.concurrent.ListenableFuture; | 21 | import com.google.common.util.concurrent.ListenableFuture; |
@@ -24,17 +25,24 @@ import lombok.extern.slf4j.Slf4j; | @@ -24,17 +25,24 @@ import lombok.extern.slf4j.Slf4j; | ||
24 | import org.apache.commons.collections.CollectionUtils; | 25 | import org.apache.commons.collections.CollectionUtils; |
25 | import org.thingsboard.rule.engine.api.RpcError; | 26 | import org.thingsboard.rule.engine.api.RpcError; |
26 | import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg; | 27 | import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg; |
28 | +import org.thingsboard.rule.engine.api.msg.DeviceEdgeUpdateMsg; | ||
27 | import org.thingsboard.rule.engine.api.msg.DeviceNameOrTypeUpdateMsg; | 29 | import org.thingsboard.rule.engine.api.msg.DeviceNameOrTypeUpdateMsg; |
28 | import org.thingsboard.server.actors.ActorSystemContext; | 30 | import org.thingsboard.server.actors.ActorSystemContext; |
29 | import org.thingsboard.server.actors.TbActorCtx; | 31 | import org.thingsboard.server.actors.TbActorCtx; |
30 | import org.thingsboard.server.actors.shared.AbstractContextAwareMsgProcessor; | 32 | import org.thingsboard.server.actors.shared.AbstractContextAwareMsgProcessor; |
31 | import org.thingsboard.server.common.data.DataConstants; | 33 | import org.thingsboard.server.common.data.DataConstants; |
32 | import org.thingsboard.server.common.data.Device; | 34 | import org.thingsboard.server.common.data.Device; |
35 | +import org.thingsboard.server.common.data.edge.EdgeEvent; | ||
36 | +import org.thingsboard.server.common.data.edge.EdgeEventActionType; | ||
37 | +import org.thingsboard.server.common.data.edge.EdgeEventType; | ||
33 | import org.thingsboard.server.common.data.id.DeviceId; | 38 | import org.thingsboard.server.common.data.id.DeviceId; |
39 | +import org.thingsboard.server.common.data.id.EdgeId; | ||
34 | import org.thingsboard.server.common.data.id.TenantId; | 40 | import org.thingsboard.server.common.data.id.TenantId; |
35 | import org.thingsboard.server.common.data.kv.AttributeKey; | 41 | import org.thingsboard.server.common.data.kv.AttributeKey; |
36 | import org.thingsboard.server.common.data.kv.AttributeKvEntry; | 42 | import org.thingsboard.server.common.data.kv.AttributeKvEntry; |
37 | import org.thingsboard.server.common.data.kv.KvEntry; | 43 | import org.thingsboard.server.common.data.kv.KvEntry; |
44 | +import org.thingsboard.server.common.data.relation.EntityRelation; | ||
45 | +import org.thingsboard.server.common.data.relation.RelationTypeGroup; | ||
38 | import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody; | 46 | import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody; |
39 | import org.thingsboard.server.common.msg.TbMsgMetaData; | 47 | import org.thingsboard.server.common.msg.TbMsgMetaData; |
40 | import org.thingsboard.server.common.msg.queue.TbCallback; | 48 | import org.thingsboard.server.common.msg.queue.TbCallback; |
@@ -63,6 +71,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg; | @@ -63,6 +71,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg; | ||
63 | import org.thingsboard.server.gen.transport.TransportProtos.TransportToDeviceActorMsg; | 71 | import org.thingsboard.server.gen.transport.TransportProtos.TransportToDeviceActorMsg; |
64 | import org.thingsboard.server.gen.transport.TransportProtos.TsKvProto; | 72 | import org.thingsboard.server.gen.transport.TransportProtos.TsKvProto; |
65 | import org.thingsboard.server.service.rpc.FromDeviceRpcResponse; | 73 | import org.thingsboard.server.service.rpc.FromDeviceRpcResponse; |
74 | +import org.thingsboard.server.service.rpc.FromDeviceRpcResponseActorMsg; | ||
66 | import org.thingsboard.server.service.rpc.ToDeviceRpcRequestActorMsg; | 75 | import org.thingsboard.server.service.rpc.ToDeviceRpcRequestActorMsg; |
67 | import org.thingsboard.server.service.transport.msg.TransportToDeviceActorMsgWrapper; | 76 | import org.thingsboard.server.service.transport.msg.TransportToDeviceActorMsgWrapper; |
68 | 77 | ||
@@ -98,6 +107,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { | @@ -98,6 +107,7 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { | ||
98 | private String deviceName; | 107 | private String deviceName; |
99 | private String deviceType; | 108 | private String deviceType; |
100 | private TbMsgMetaData defaultMetaData; | 109 | private TbMsgMetaData defaultMetaData; |
110 | + private EdgeId edgeId; | ||
101 | 111 | ||
102 | DeviceActorMessageProcessor(ActorSystemContext systemContext, TenantId tenantId, DeviceId deviceId) { | 112 | DeviceActorMessageProcessor(ActorSystemContext systemContext, TenantId tenantId, DeviceId deviceId) { |
103 | super(systemContext); | 113 | super(systemContext); |
@@ -120,12 +130,27 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { | @@ -120,12 +130,27 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { | ||
120 | this.defaultMetaData = new TbMsgMetaData(); | 130 | this.defaultMetaData = new TbMsgMetaData(); |
121 | this.defaultMetaData.putValue("deviceName", deviceName); | 131 | this.defaultMetaData.putValue("deviceName", deviceName); |
122 | this.defaultMetaData.putValue("deviceType", deviceType); | 132 | this.defaultMetaData.putValue("deviceType", deviceType); |
133 | + if (systemContext.isEdgesRpcEnabled()) { | ||
134 | + this.edgeId = findRelatedEdgeId(); | ||
135 | + } | ||
123 | return true; | 136 | return true; |
124 | } else { | 137 | } else { |
125 | return false; | 138 | return false; |
126 | } | 139 | } |
127 | } | 140 | } |
128 | 141 | ||
142 | + private EdgeId findRelatedEdgeId() { | ||
143 | + List<EntityRelation> result = | ||
144 | + systemContext.getRelationService().findByToAndType(tenantId, deviceId, EntityRelation.EDGE_TYPE, RelationTypeGroup.COMMON); | ||
145 | + if (result != null && result.size() > 0) { | ||
146 | + EntityRelation relationToEdge = result.get(0); | ||
147 | + if (relationToEdge.getFrom() != null && relationToEdge.getFrom().getId() != null) { | ||
148 | + return new EdgeId(relationToEdge.getFrom().getId()); | ||
149 | + } | ||
150 | + } | ||
151 | + return null; | ||
152 | + } | ||
153 | + | ||
129 | void processRpcRequest(TbActorCtx context, ToDeviceRpcRequestActorMsg msg) { | 154 | void processRpcRequest(TbActorCtx context, ToDeviceRpcRequestActorMsg msg) { |
130 | ToDeviceRpcRequest request = msg.getMsg(); | 155 | ToDeviceRpcRequest request = msg.getMsg(); |
131 | ToDeviceRpcRequestBody body = request.getBody(); | 156 | ToDeviceRpcRequestBody body = request.getBody(); |
@@ -138,15 +163,21 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { | @@ -138,15 +163,21 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { | ||
138 | return; | 163 | return; |
139 | } | 164 | } |
140 | 165 | ||
141 | - boolean sent = rpcSubscriptions.size() > 0; | ||
142 | - Set<UUID> syncSessionSet = new HashSet<>(); | ||
143 | - rpcSubscriptions.forEach((key, value) -> { | ||
144 | - sendToTransport(rpcRequest, key, value.getNodeId()); | ||
145 | - if (SessionType.SYNC == value.getType()) { | ||
146 | - syncSessionSet.add(key); | ||
147 | - } | ||
148 | - }); | ||
149 | - syncSessionSet.forEach(rpcSubscriptions::remove); | 166 | + boolean sent; |
167 | + if (systemContext.isEdgesRpcEnabled() && edgeId != null) { | ||
168 | + saveRpcRequestToEdgeQueue(request, rpcRequest.getRequestId()); | ||
169 | + sent = true; | ||
170 | + } else { | ||
171 | + sent = rpcSubscriptions.size() > 0; | ||
172 | + Set<UUID> syncSessionSet = new HashSet<>(); | ||
173 | + rpcSubscriptions.forEach((key, value) -> { | ||
174 | + sendToTransport(rpcRequest, key, value.getNodeId()); | ||
175 | + if (SessionType.SYNC == value.getType()) { | ||
176 | + syncSessionSet.add(key); | ||
177 | + } | ||
178 | + }); | ||
179 | + syncSessionSet.forEach(rpcSubscriptions::remove); | ||
180 | + } | ||
150 | 181 | ||
151 | if (request.isOneway() && sent) { | 182 | if (request.isOneway() && sent) { |
152 | log.debug("[{}] Rpc command response sent [{}]!", deviceId, request.getId()); | 183 | log.debug("[{}] Rpc command response sent [{}]!", deviceId, request.getId()); |
@@ -161,6 +192,17 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { | @@ -161,6 +192,17 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { | ||
161 | } | 192 | } |
162 | } | 193 | } |
163 | 194 | ||
195 | + void processRpcResponsesFromEdge(TbActorCtx context, FromDeviceRpcResponseActorMsg responseMsg) { | ||
196 | + log.debug("[{}] Processing rpc command response from edge session", deviceId); | ||
197 | + ToDeviceRpcRequestMetadata requestMd = toDeviceRpcPendingMap.remove(responseMsg.getRequestId()); | ||
198 | + boolean success = requestMd != null; | ||
199 | + if (success) { | ||
200 | + systemContext.getTbCoreDeviceRpcService().processRpcResponseFromDeviceActor(responseMsg.getMsg()); | ||
201 | + } else { | ||
202 | + log.debug("[{}] Rpc command response [{}] is stale!", deviceId, responseMsg.getRequestId()); | ||
203 | + } | ||
204 | + } | ||
205 | + | ||
164 | private void registerPendingRpcRequest(TbActorCtx context, ToDeviceRpcRequestActorMsg msg, boolean sent, ToDeviceRpcRequestMsg rpcRequest, long timeout) { | 206 | private void registerPendingRpcRequest(TbActorCtx context, ToDeviceRpcRequestActorMsg msg, boolean sent, ToDeviceRpcRequestMsg rpcRequest, long timeout) { |
165 | toDeviceRpcPendingMap.put(rpcRequest.getRequestId(), new ToDeviceRpcRequestMetadata(msg, sent)); | 207 | toDeviceRpcPendingMap.put(rpcRequest.getRequestId(), new ToDeviceRpcRequestMetadata(msg, sent)); |
166 | DeviceActorServerSideRpcTimeoutMsg timeoutMsg = new DeviceActorServerSideRpcTimeoutMsg(rpcRequest.getRequestId(), timeout); | 208 | DeviceActorServerSideRpcTimeoutMsg timeoutMsg = new DeviceActorServerSideRpcTimeoutMsg(rpcRequest.getRequestId(), timeout); |
@@ -473,6 +515,10 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { | @@ -473,6 +515,10 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { | ||
473 | this.defaultMetaData.putValue("deviceType", deviceType); | 515 | this.defaultMetaData.putValue("deviceType", deviceType); |
474 | } | 516 | } |
475 | 517 | ||
518 | + void processEdgeUpdate(DeviceEdgeUpdateMsg msg) { | ||
519 | + this.edgeId = msg.getEdgeId(); | ||
520 | + } | ||
521 | + | ||
476 | private void sendToTransport(GetAttributeResponseMsg responseMsg, SessionInfoProto sessionInfo) { | 522 | private void sendToTransport(GetAttributeResponseMsg responseMsg, SessionInfoProto sessionInfo) { |
477 | ToTransportMsg msg = ToTransportMsg.newBuilder() | 523 | ToTransportMsg msg = ToTransportMsg.newBuilder() |
478 | .setSessionIdMSB(sessionInfo.getSessionIdMSB()) | 524 | .setSessionIdMSB(sessionInfo.getSessionIdMSB()) |
@@ -505,6 +551,25 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { | @@ -505,6 +551,25 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { | ||
505 | systemContext.getTbCoreToTransportService().process(nodeId, msg); | 551 | systemContext.getTbCoreToTransportService().process(nodeId, msg); |
506 | } | 552 | } |
507 | 553 | ||
554 | + private void saveRpcRequestToEdgeQueue(ToDeviceRpcRequest msg, Integer requestId) { | ||
555 | + EdgeEvent edgeEvent = new EdgeEvent(); | ||
556 | + edgeEvent.setTenantId(tenantId); | ||
557 | + edgeEvent.setAction(EdgeEventActionType.RPC_CALL); | ||
558 | + edgeEvent.setEntityId(deviceId.getId()); | ||
559 | + edgeEvent.setType(EdgeEventType.DEVICE); | ||
560 | + | ||
561 | + ObjectNode body = mapper.createObjectNode(); | ||
562 | + body.put("requestId", requestId); | ||
563 | + body.put("requestUUID", msg.getId().toString()); | ||
564 | + body.put("oneway", msg.isOneway()); | ||
565 | + body.put("expirationTime", msg.getExpirationTime()); | ||
566 | + body.put("method", msg.getBody().getMethod()); | ||
567 | + body.put("params", msg.getBody().getParams()); | ||
568 | + edgeEvent.setBody(body); | ||
569 | + | ||
570 | + edgeEvent.setEdgeId(edgeId); | ||
571 | + systemContext.getEdgeEventService().saveAsync(edgeEvent); | ||
572 | + } | ||
508 | 573 | ||
509 | private List<TsKvProto> toTsKvProtos(@Nullable List<AttributeKvEntry> result) { | 574 | private List<TsKvProto> toTsKvProtos(@Nullable List<AttributeKvEntry> result) { |
510 | List<TsKvProto> clientAttributes; | 575 | List<TsKvProto> clientAttributes; |
@@ -148,7 +148,9 @@ public class TenantActor extends RuleChainManagerActor { | @@ -148,7 +148,9 @@ public class TenantActor extends RuleChainManagerActor { | ||
148 | case DEVICE_ATTRIBUTES_UPDATE_TO_DEVICE_ACTOR_MSG: | 148 | case DEVICE_ATTRIBUTES_UPDATE_TO_DEVICE_ACTOR_MSG: |
149 | case DEVICE_CREDENTIALS_UPDATE_TO_DEVICE_ACTOR_MSG: | 149 | case DEVICE_CREDENTIALS_UPDATE_TO_DEVICE_ACTOR_MSG: |
150 | case DEVICE_NAME_OR_TYPE_UPDATE_TO_DEVICE_ACTOR_MSG: | 150 | case DEVICE_NAME_OR_TYPE_UPDATE_TO_DEVICE_ACTOR_MSG: |
151 | + case DEVICE_EDGE_UPDATE_TO_DEVICE_ACTOR_MSG: | ||
151 | case DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG: | 152 | case DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG: |
153 | + case DEVICE_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG: | ||
152 | case SERVER_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG: | 154 | case SERVER_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG: |
153 | onToDeviceActorMsg((DeviceAwareMsg) msg, true); | 155 | onToDeviceActorMsg((DeviceAwareMsg) msg, true); |
154 | break; | 156 | break; |
@@ -223,7 +223,7 @@ public abstract class BaseController { | @@ -223,7 +223,7 @@ public abstract class BaseController { | ||
223 | 223 | ||
224 | @Value("${edges.rpc.enabled}") | 224 | @Value("${edges.rpc.enabled}") |
225 | @Getter | 225 | @Getter |
226 | - private boolean edgesSupportEnabled; | 226 | + private boolean edgesRpcEnabled; |
227 | 227 | ||
228 | @ExceptionHandler(ThingsboardException.class) | 228 | @ExceptionHandler(ThingsboardException.class) |
229 | public void handleThingsboardException(ThingsboardException ex, HttpServletResponse response) { | 229 | public void handleThingsboardException(ThingsboardException ex, HttpServletResponse response) { |
@@ -761,7 +761,7 @@ public abstract class BaseController { | @@ -761,7 +761,7 @@ public abstract class BaseController { | ||
761 | } | 761 | } |
762 | 762 | ||
763 | protected void sendNotificationMsgToEdgeService(TenantId tenantId, EdgeId edgeId, CustomerId customerId, EdgeEventActionType action) { | 763 | protected void sendNotificationMsgToEdgeService(TenantId tenantId, EdgeId edgeId, CustomerId customerId, EdgeEventActionType action) { |
764 | - if (!edgesSupportEnabled) { | 764 | + if (!edgesRpcEnabled) { |
765 | return; | 765 | return; |
766 | } | 766 | } |
767 | try { | 767 | try { |
@@ -772,7 +772,7 @@ public abstract class BaseController { | @@ -772,7 +772,7 @@ public abstract class BaseController { | ||
772 | } | 772 | } |
773 | 773 | ||
774 | protected void sendNotificationMsgToEdgeService(TenantId tenantId, EntityId entityId, CustomerId customerId, EdgeEventActionType action) { | 774 | protected void sendNotificationMsgToEdgeService(TenantId tenantId, EntityId entityId, CustomerId customerId, EdgeEventActionType action) { |
775 | - if (!edgesSupportEnabled) { | 775 | + if (!edgesRpcEnabled) { |
776 | return; | 776 | return; |
777 | } | 777 | } |
778 | EdgeEventType type = EdgeUtils.getEdgeEventTypeByEntityType(entityId.getEntityType()); | 778 | EdgeEventType type = EdgeUtils.getEdgeEventTypeByEntityType(entityId.getEntityType()); |
@@ -786,7 +786,7 @@ public abstract class BaseController { | @@ -786,7 +786,7 @@ public abstract class BaseController { | ||
786 | } | 786 | } |
787 | 787 | ||
788 | protected void sendNotificationMsgToEdgeService(TenantId tenantId, EntityRelation relation, EdgeEventActionType action) { | 788 | protected void sendNotificationMsgToEdgeService(TenantId tenantId, EntityRelation relation, EdgeEventActionType action) { |
789 | - if (!edgesSupportEnabled) { | 789 | + if (!edgesRpcEnabled) { |
790 | return; | 790 | return; |
791 | } | 791 | } |
792 | try { | 792 | try { |
@@ -804,7 +804,7 @@ public abstract class BaseController { | @@ -804,7 +804,7 @@ public abstract class BaseController { | ||
804 | } | 804 | } |
805 | 805 | ||
806 | protected void sendNotificationMsgToEdgeService(TenantId tenantId, EdgeId edgeId, EntityId entityId, EdgeEventActionType action) { | 806 | protected void sendNotificationMsgToEdgeService(TenantId tenantId, EdgeId edgeId, EntityId entityId, EdgeEventActionType action) { |
807 | - if (!edgesSupportEnabled) { | 807 | + if (!edgesRpcEnabled) { |
808 | return; | 808 | return; |
809 | } | 809 | } |
810 | EdgeEventType type = EdgeUtils.getEdgeEventTypeByEntityType(entityId.getEntityType()); | 810 | EdgeEventType type = EdgeUtils.getEdgeEventTypeByEntityType(entityId.getEntityType()); |
@@ -32,6 +32,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; | @@ -32,6 +32,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; | ||
32 | import org.springframework.web.bind.annotation.RestController; | 32 | import org.springframework.web.bind.annotation.RestController; |
33 | import org.springframework.web.context.request.async.DeferredResult; | 33 | import org.springframework.web.context.request.async.DeferredResult; |
34 | import org.thingsboard.rule.engine.api.msg.DeviceCredentialsUpdateNotificationMsg; | 34 | import org.thingsboard.rule.engine.api.msg.DeviceCredentialsUpdateNotificationMsg; |
35 | +import org.thingsboard.rule.engine.api.msg.DeviceEdgeUpdateMsg; | ||
35 | import org.thingsboard.rule.engine.api.msg.DeviceNameOrTypeUpdateMsg; | 36 | import org.thingsboard.rule.engine.api.msg.DeviceNameOrTypeUpdateMsg; |
36 | import org.thingsboard.server.common.data.ClaimRequest; | 37 | import org.thingsboard.server.common.data.ClaimRequest; |
37 | import org.thingsboard.server.common.data.Customer; | 38 | import org.thingsboard.server.common.data.Customer; |
@@ -575,6 +576,9 @@ public class DeviceController extends BaseController { | @@ -575,6 +576,9 @@ public class DeviceController extends BaseController { | ||
575 | 576 | ||
576 | Device savedDevice = checkNotNull(deviceService.assignDeviceToEdge(getCurrentUser().getTenantId(), deviceId, edgeId)); | 577 | Device savedDevice = checkNotNull(deviceService.assignDeviceToEdge(getCurrentUser().getTenantId(), deviceId, edgeId)); |
577 | 578 | ||
579 | + tbClusterService.pushMsgToCore(new DeviceEdgeUpdateMsg(savedDevice.getTenantId(), | ||
580 | + savedDevice.getId(), edgeId), null); | ||
581 | + | ||
578 | logEntityAction(deviceId, savedDevice, | 582 | logEntityAction(deviceId, savedDevice, |
579 | savedDevice.getCustomerId(), | 583 | savedDevice.getCustomerId(), |
580 | ActionType.ASSIGNED_TO_EDGE, null, strDeviceId, strEdgeId, edge.getName()); | 584 | ActionType.ASSIGNED_TO_EDGE, null, strDeviceId, strEdgeId, edge.getName()); |
@@ -606,6 +610,9 @@ public class DeviceController extends BaseController { | @@ -606,6 +610,9 @@ public class DeviceController extends BaseController { | ||
606 | 610 | ||
607 | Device savedDevice = checkNotNull(deviceService.unassignDeviceFromEdge(getCurrentUser().getTenantId(), deviceId, edgeId)); | 611 | Device savedDevice = checkNotNull(deviceService.unassignDeviceFromEdge(getCurrentUser().getTenantId(), deviceId, edgeId)); |
608 | 612 | ||
613 | + tbClusterService.pushMsgToCore(new DeviceEdgeUpdateMsg(savedDevice.getTenantId(), | ||
614 | + savedDevice.getId(), null), null); | ||
615 | + | ||
609 | logEntityAction(deviceId, device, | 616 | logEntityAction(deviceId, device, |
610 | device.getCustomerId(), | 617 | device.getCustomerId(), |
611 | ActionType.UNASSIGNED_FROM_EDGE, null, strDeviceId, strEdgeId, edge.getName()); | 618 | ActionType.UNASSIGNED_FROM_EDGE, null, strDeviceId, strEdgeId, edge.getName()); |
@@ -416,7 +416,7 @@ public class EdgeController extends BaseController { | @@ -416,7 +416,7 @@ public class EdgeController extends BaseController { | ||
416 | public void syncEdge(@RequestBody EdgeId edgeId) throws ThingsboardException { | 416 | public void syncEdge(@RequestBody EdgeId edgeId) throws ThingsboardException { |
417 | try { | 417 | try { |
418 | edgeId = checkNotNull(edgeId); | 418 | edgeId = checkNotNull(edgeId); |
419 | - if (isEdgesSupportEnabled()) { | 419 | + if (isEdgesRpcEnabled()) { |
420 | EdgeGrpcSession session = edgeGrpcService.getEdgeGrpcSessionById(edgeId); | 420 | EdgeGrpcSession session = edgeGrpcService.getEdgeGrpcSessionById(edgeId); |
421 | Edge edge = session.getEdge(); | 421 | Edge edge = session.getEdge(); |
422 | syncEdgeService.sync(edge); | 422 | syncEdgeService.sync(edge); |
@@ -36,6 +36,7 @@ import org.thingsboard.server.common.data.kv.LongDataEntry; | @@ -36,6 +36,7 @@ import org.thingsboard.server.common.data.kv.LongDataEntry; | ||
36 | import org.thingsboard.server.gen.edge.EdgeRpcServiceGrpc; | 36 | import org.thingsboard.server.gen.edge.EdgeRpcServiceGrpc; |
37 | import org.thingsboard.server.gen.edge.RequestMsg; | 37 | import org.thingsboard.server.gen.edge.RequestMsg; |
38 | import org.thingsboard.server.gen.edge.ResponseMsg; | 38 | import org.thingsboard.server.gen.edge.ResponseMsg; |
39 | +import org.thingsboard.server.queue.util.TbCoreComponent; | ||
39 | import org.thingsboard.server.service.edge.EdgeContextComponent; | 40 | import org.thingsboard.server.service.edge.EdgeContextComponent; |
40 | import org.thingsboard.server.service.state.DefaultDeviceStateService; | 41 | import org.thingsboard.server.service.state.DefaultDeviceStateService; |
41 | import org.thingsboard.server.service.telemetry.TelemetrySubscriptionService; | 42 | import org.thingsboard.server.service.telemetry.TelemetrySubscriptionService; |
@@ -55,6 +56,7 @@ import java.util.concurrent.TimeUnit; | @@ -55,6 +56,7 @@ import java.util.concurrent.TimeUnit; | ||
55 | @Service | 56 | @Service |
56 | @Slf4j | 57 | @Slf4j |
57 | @ConditionalOnProperty(prefix = "edges.rpc", value = "enabled", havingValue = "true") | 58 | @ConditionalOnProperty(prefix = "edges.rpc", value = "enabled", havingValue = "true") |
59 | +@TbCoreComponent | ||
58 | public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase implements EdgeRpcService { | 60 | public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase implements EdgeRpcService { |
59 | 61 | ||
60 | private final Map<EdgeId, EdgeGrpcSession> sessions = new ConcurrentHashMap<>(); | 62 | private final Map<EdgeId, EdgeGrpcSession> sessions = new ConcurrentHashMap<>(); |
@@ -176,13 +178,15 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i | @@ -176,13 +178,15 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase i | ||
176 | log.trace("No sessions available, sleep for the next run"); | 178 | log.trace("No sessions available, sleep for the next run"); |
177 | try { | 179 | try { |
178 | Thread.sleep(1000); | 180 | Thread.sleep(1000); |
179 | - } catch (InterruptedException ignore) {} | 181 | + } catch (InterruptedException ignore) { |
182 | + } | ||
180 | } | 183 | } |
181 | } catch (Exception e) { | 184 | } catch (Exception e) { |
182 | log.warn("Failed to process messages handling!", e); | 185 | log.warn("Failed to process messages handling!", e); |
183 | try { | 186 | try { |
184 | Thread.sleep(1000); | 187 | Thread.sleep(1000); |
185 | - } catch (InterruptedException ignore) {} | 188 | + } catch (InterruptedException ignore) { |
189 | + } | ||
186 | } | 190 | } |
187 | } | 191 | } |
188 | }); | 192 | }); |
@@ -377,7 +377,7 @@ public final class EdgeGrpcSession implements Closeable { | @@ -377,7 +377,7 @@ public final class EdgeGrpcSession implements Closeable { | ||
377 | private DownlinkMsg processRpcCallMsg(EdgeEvent edgeEvent) { | 377 | private DownlinkMsg processRpcCallMsg(EdgeEvent edgeEvent) { |
378 | log.trace("Executing processRpcCall, edgeEvent [{}]", edgeEvent); | 378 | log.trace("Executing processRpcCall, edgeEvent [{}]", edgeEvent); |
379 | DeviceRpcCallMsg deviceRpcCallMsg = | 379 | DeviceRpcCallMsg deviceRpcCallMsg = |
380 | - ctx.getDeviceMsgConstructor().constructDeviceRpcCallMsg(edgeEvent.getBody()); | 380 | + ctx.getDeviceMsgConstructor().constructDeviceRpcCallMsg(edgeEvent.getEntityId(), edgeEvent.getBody()); |
381 | return DownlinkMsg.newBuilder() | 381 | return DownlinkMsg.newBuilder() |
382 | .addAllDeviceRpcCallMsg(Collections.singletonList(deviceRpcCallMsg)) | 382 | .addAllDeviceRpcCallMsg(Collections.singletonList(deviceRpcCallMsg)) |
383 | .build(); | 383 | .build(); |
@@ -398,7 +398,6 @@ public final class EdgeGrpcSession implements Closeable { | @@ -398,7 +398,6 @@ public final class EdgeGrpcSession implements Closeable { | ||
398 | return downlinkMsg; | 398 | return downlinkMsg; |
399 | } | 399 | } |
400 | 400 | ||
401 | - | ||
402 | private ListenableFuture<Long> getQueueStartTs() { | 401 | private ListenableFuture<Long> getQueueStartTs() { |
403 | ListenableFuture<Optional<AttributeKvEntry>> future = | 402 | ListenableFuture<Optional<AttributeKvEntry>> future = |
404 | ctx.getAttributesService().find(edge.getTenantId(), edge.getId(), DataConstants.SERVER_SCOPE, QUEUE_START_TS_ATTR_KEY); | 403 | ctx.getAttributesService().find(edge.getTenantId(), edge.getId(), DataConstants.SERVER_SCOPE, QUEUE_START_TS_ATTR_KEY); |
@@ -18,7 +18,6 @@ package org.thingsboard.server.service.edge.rpc.constructor; | @@ -18,7 +18,6 @@ package org.thingsboard.server.service.edge.rpc.constructor; | ||
18 | import com.fasterxml.jackson.databind.JsonNode; | 18 | import com.fasterxml.jackson.databind.JsonNode; |
19 | import com.fasterxml.jackson.databind.ObjectMapper; | 19 | import com.fasterxml.jackson.databind.ObjectMapper; |
20 | import org.springframework.stereotype.Component; | 20 | import org.springframework.stereotype.Component; |
21 | -import org.thingsboard.rule.engine.api.RuleEngineDeviceRpcRequest; | ||
22 | import org.thingsboard.server.common.data.Device; | 21 | import org.thingsboard.server.common.data.Device; |
23 | import org.thingsboard.server.common.data.id.CustomerId; | 22 | import org.thingsboard.server.common.data.id.CustomerId; |
24 | import org.thingsboard.server.common.data.id.DeviceId; | 23 | import org.thingsboard.server.common.data.id.DeviceId; |
@@ -31,6 +30,8 @@ import org.thingsboard.server.gen.edge.RpcRequestMsg; | @@ -31,6 +30,8 @@ import org.thingsboard.server.gen.edge.RpcRequestMsg; | ||
31 | import org.thingsboard.server.gen.edge.UpdateMsgType; | 30 | import org.thingsboard.server.gen.edge.UpdateMsgType; |
32 | import org.thingsboard.server.queue.util.TbCoreComponent; | 31 | import org.thingsboard.server.queue.util.TbCoreComponent; |
33 | 32 | ||
33 | +import java.util.UUID; | ||
34 | + | ||
34 | @Component | 35 | @Component |
35 | @TbCoreComponent | 36 | @TbCoreComponent |
36 | public class DeviceMsgConstructor { | 37 | public class DeviceMsgConstructor { |
@@ -78,22 +79,26 @@ public class DeviceMsgConstructor { | @@ -78,22 +79,26 @@ public class DeviceMsgConstructor { | ||
78 | .setIdLSB(deviceId.getId().getLeastSignificantBits()).build(); | 79 | .setIdLSB(deviceId.getId().getLeastSignificantBits()).build(); |
79 | } | 80 | } |
80 | 81 | ||
81 | - public DeviceRpcCallMsg constructDeviceRpcCallMsg(JsonNode body) { | ||
82 | - RuleEngineDeviceRpcRequest request = mapper.convertValue(body, RuleEngineDeviceRpcRequest.class); | 82 | + public DeviceRpcCallMsg constructDeviceRpcCallMsg(UUID deviceId, JsonNode body) { |
83 | + int requestId = body.get("requestId").asInt(); | ||
84 | + boolean oneway = body.get("oneway").asBoolean(); | ||
85 | + UUID requestUUID = UUID.fromString(body.get("requestUUID").asText()); | ||
86 | + long expirationTime = body.get("expirationTime").asLong(); | ||
87 | + String method = body.get("method").asText(); | ||
88 | + String params = body.get("params").asText(); | ||
89 | + | ||
83 | RpcRequestMsg.Builder requestBuilder = RpcRequestMsg.newBuilder(); | 90 | RpcRequestMsg.Builder requestBuilder = RpcRequestMsg.newBuilder(); |
84 | - requestBuilder.setMethod(request.getMethod()); | ||
85 | - requestBuilder.setParams(request.getBody()); | 91 | + requestBuilder.setMethod(method); |
92 | + requestBuilder.setParams(params); | ||
86 | DeviceRpcCallMsg.Builder builder = DeviceRpcCallMsg.newBuilder() | 93 | DeviceRpcCallMsg.Builder builder = DeviceRpcCallMsg.newBuilder() |
87 | - .setDeviceIdMSB(request.getDeviceId().getId().getMostSignificantBits()) | ||
88 | - .setDeviceIdLSB(request.getDeviceId().getId().getLeastSignificantBits()) | ||
89 | - .setRequestIdMSB(request.getRequestUUID().getMostSignificantBits()) | ||
90 | - .setRequestIdLSB(request.getRequestUUID().getLeastSignificantBits()) | ||
91 | - .setExpirationTime(request.getExpirationTime()) | ||
92 | - .setOneway(request.isOneway()) | 94 | + .setDeviceIdMSB(deviceId.getMostSignificantBits()) |
95 | + .setDeviceIdLSB(deviceId.getLeastSignificantBits()) | ||
96 | + .setRequestUuidMSB(requestUUID.getMostSignificantBits()) | ||
97 | + .setRequestUuidLSB(requestUUID.getLeastSignificantBits()) | ||
98 | + .setRequestId(requestId) | ||
99 | + .setExpirationTime(expirationTime) | ||
100 | + .setOneway(oneway) | ||
93 | .setRequestMsg(requestBuilder.build()); | 101 | .setRequestMsg(requestBuilder.build()); |
94 | - if (request.getOriginServiceId() != null) { | ||
95 | - builder.setOriginServiceId(request.getOriginServiceId()); | ||
96 | - } | ||
97 | return builder.build(); | 102 | return builder.build(); |
98 | } | 103 | } |
99 | } | 104 | } |
@@ -5,7 +5,7 @@ | @@ -5,7 +5,7 @@ | ||
5 | * you may not use this file except in compliance with the License. | 5 | * you may not use this file except in compliance with the License. |
6 | * You may obtain a copy of the License at | 6 | * You may obtain a copy of the License at |
7 | * | 7 | * |
8 | - * http://www.apache.org/licenses/LICENSE-2.0 | 8 | + * http://www.apache.org/licenses/LICENSE-2.0 |
9 | * | 9 | * |
10 | * Unless required by applicable law or agreed to in writing, software | 10 | * Unless required by applicable law or agreed to in writing, software |
11 | * distributed under the License is distributed on an "AS IS" BASIS, | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
@@ -50,6 +50,7 @@ import org.thingsboard.server.queue.TbQueueCallback; | @@ -50,6 +50,7 @@ import org.thingsboard.server.queue.TbQueueCallback; | ||
50 | import org.thingsboard.server.queue.TbQueueMsgMetadata; | 50 | import org.thingsboard.server.queue.TbQueueMsgMetadata; |
51 | import org.thingsboard.server.queue.util.TbCoreComponent; | 51 | import org.thingsboard.server.queue.util.TbCoreComponent; |
52 | import org.thingsboard.server.service.rpc.FromDeviceRpcResponse; | 52 | import org.thingsboard.server.service.rpc.FromDeviceRpcResponse; |
53 | +import org.thingsboard.server.service.rpc.FromDeviceRpcResponseActorMsg; | ||
53 | 54 | ||
54 | import java.util.UUID; | 55 | import java.util.UUID; |
55 | import java.util.concurrent.locks.ReentrantLock; | 56 | import java.util.concurrent.locks.ReentrantLock; |
@@ -223,12 +224,14 @@ public class DeviceProcessor extends BaseProcessor { | @@ -223,12 +224,14 @@ public class DeviceProcessor extends BaseProcessor { | ||
223 | public ListenableFuture<Void> processDeviceRpcCallResponseMsg(TenantId tenantId, DeviceRpcCallMsg deviceRpcCallMsg) { | 224 | public ListenableFuture<Void> processDeviceRpcCallResponseMsg(TenantId tenantId, DeviceRpcCallMsg deviceRpcCallMsg) { |
224 | log.trace("[{}] processDeviceRpcCallResponseMsg [{}]", tenantId, deviceRpcCallMsg); | 225 | log.trace("[{}] processDeviceRpcCallResponseMsg [{}]", tenantId, deviceRpcCallMsg); |
225 | SettableFuture<Void> futureToSet = SettableFuture.create(); | 226 | SettableFuture<Void> futureToSet = SettableFuture.create(); |
226 | - UUID uuid = new UUID(deviceRpcCallMsg.getRequestIdMSB(), deviceRpcCallMsg.getRequestIdLSB()); | 227 | + UUID requestUuid = new UUID(deviceRpcCallMsg.getRequestUuidMSB(), deviceRpcCallMsg.getRequestUuidLSB()); |
228 | + DeviceId deviceId = new DeviceId(new UUID(deviceRpcCallMsg.getDeviceIdMSB(), deviceRpcCallMsg.getDeviceIdLSB())); | ||
229 | + | ||
227 | FromDeviceRpcResponse response; | 230 | FromDeviceRpcResponse response; |
228 | if (!StringUtils.isEmpty(deviceRpcCallMsg.getResponseMsg().getError())) { | 231 | if (!StringUtils.isEmpty(deviceRpcCallMsg.getResponseMsg().getError())) { |
229 | - response = new FromDeviceRpcResponse(uuid, null, RpcError.valueOf(deviceRpcCallMsg.getResponseMsg().getError())); | 232 | + response = new FromDeviceRpcResponse(requestUuid, null, RpcError.valueOf(deviceRpcCallMsg.getResponseMsg().getError())); |
230 | } else { | 233 | } else { |
231 | - response = new FromDeviceRpcResponse(uuid, deviceRpcCallMsg.getResponseMsg().getResponse(), null); | 234 | + response = new FromDeviceRpcResponse(requestUuid, deviceRpcCallMsg.getResponseMsg().getResponse(), null); |
232 | } | 235 | } |
233 | TbQueueCallback callback = new TbQueueCallback() { | 236 | TbQueueCallback callback = new TbQueueCallback() { |
234 | @Override | 237 | @Override |
@@ -242,7 +245,11 @@ public class DeviceProcessor extends BaseProcessor { | @@ -242,7 +245,11 @@ public class DeviceProcessor extends BaseProcessor { | ||
242 | futureToSet.setException(t); | 245 | futureToSet.setException(t); |
243 | } | 246 | } |
244 | }; | 247 | }; |
245 | - tbClusterService.pushNotificationToCore(deviceRpcCallMsg.getOriginServiceId(), response, callback); | 248 | + FromDeviceRpcResponseActorMsg msg = |
249 | + new FromDeviceRpcResponseActorMsg(deviceRpcCallMsg.getRequestId(), | ||
250 | + tenantId, | ||
251 | + deviceId, response); | ||
252 | + tbClusterService.pushMsgToCore(msg, callback); | ||
246 | return futureToSet; | 253 | return futureToSet; |
247 | } | 254 | } |
248 | 255 |
@@ -20,6 +20,7 @@ import lombok.RequiredArgsConstructor; | @@ -20,6 +20,7 @@ import lombok.RequiredArgsConstructor; | ||
20 | import lombok.ToString; | 20 | import lombok.ToString; |
21 | import org.thingsboard.rule.engine.api.RpcError; | 21 | import org.thingsboard.rule.engine.api.RpcError; |
22 | 22 | ||
23 | +import java.io.Serializable; | ||
23 | import java.util.Optional; | 24 | import java.util.Optional; |
24 | import java.util.UUID; | 25 | import java.util.UUID; |
25 | 26 | ||
@@ -28,7 +29,7 @@ import java.util.UUID; | @@ -28,7 +29,7 @@ import java.util.UUID; | ||
28 | */ | 29 | */ |
29 | @RequiredArgsConstructor | 30 | @RequiredArgsConstructor |
30 | @ToString | 31 | @ToString |
31 | -public class FromDeviceRpcResponse { | 32 | +public class FromDeviceRpcResponse implements Serializable { |
32 | @Getter | 33 | @Getter |
33 | private final UUID id; | 34 | private final UUID id; |
34 | private final String response; | 35 | private final String response; |
application/src/main/java/org/thingsboard/server/service/rpc/FromDeviceRpcResponseActorMsg.java
0 → 100644
1 | +/** | ||
2 | + * Copyright © 2016-2020 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.thingsboard.server.service.rpc; | ||
17 | + | ||
18 | +import lombok.Getter; | ||
19 | +import lombok.RequiredArgsConstructor; | ||
20 | +import lombok.ToString; | ||
21 | +import org.thingsboard.rule.engine.api.msg.ToDeviceActorNotificationMsg; | ||
22 | +import org.thingsboard.server.common.data.id.DeviceId; | ||
23 | +import org.thingsboard.server.common.data.id.TenantId; | ||
24 | +import org.thingsboard.server.common.msg.MsgType; | ||
25 | + | ||
26 | +@ToString | ||
27 | +@RequiredArgsConstructor | ||
28 | +public class FromDeviceRpcResponseActorMsg implements ToDeviceActorNotificationMsg { | ||
29 | + | ||
30 | + @Getter | ||
31 | + private final Integer requestId; | ||
32 | + @Getter | ||
33 | + private final TenantId tenantId; | ||
34 | + @Getter | ||
35 | + private final DeviceId deviceId; | ||
36 | + | ||
37 | + @Getter | ||
38 | + private final FromDeviceRpcResponse msg; | ||
39 | + | ||
40 | + @Override | ||
41 | + public MsgType getMsgType() { | ||
42 | + return MsgType.DEVICE_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG; | ||
43 | + } | ||
44 | +} |
@@ -1281,7 +1281,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { | @@ -1281,7 +1281,7 @@ abstract public class BaseEdgeTest extends AbstractControllerTest { | ||
1281 | deviceRpcCallResponseBuilder.setDeviceIdMSB(device.getUuidId().getMostSignificantBits()); | 1281 | deviceRpcCallResponseBuilder.setDeviceIdMSB(device.getUuidId().getMostSignificantBits()); |
1282 | deviceRpcCallResponseBuilder.setDeviceIdLSB(device.getUuidId().getLeastSignificantBits()); | 1282 | deviceRpcCallResponseBuilder.setDeviceIdLSB(device.getUuidId().getLeastSignificantBits()); |
1283 | deviceRpcCallResponseBuilder.setOneway(true); | 1283 | deviceRpcCallResponseBuilder.setOneway(true); |
1284 | - deviceRpcCallResponseBuilder.setOriginServiceId("originServiceId"); | 1284 | + deviceRpcCallResponseBuilder.setRequestId(0); |
1285 | deviceRpcCallResponseBuilder.setExpirationTime(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10)); | 1285 | deviceRpcCallResponseBuilder.setExpirationTime(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10)); |
1286 | RpcResponseMsg.Builder responseBuilder = | 1286 | RpcResponseMsg.Builder responseBuilder = |
1287 | RpcResponseMsg.newBuilder().setResponse("{}"); | 1287 | RpcResponseMsg.newBuilder().setResponse("{}"); |
@@ -336,11 +336,11 @@ message DeviceCredentialsRequestMsg { | @@ -336,11 +336,11 @@ message DeviceCredentialsRequestMsg { | ||
336 | message DeviceRpcCallMsg { | 336 | message DeviceRpcCallMsg { |
337 | int64 deviceIdMSB = 1; | 337 | int64 deviceIdMSB = 1; |
338 | int64 deviceIdLSB = 2; | 338 | int64 deviceIdLSB = 2; |
339 | - int64 requestIdMSB = 3; | ||
340 | - int64 requestIdLSB = 4; | ||
341 | - int64 expirationTime = 5; | ||
342 | - bool oneway = 6; | ||
343 | - string originServiceId = 7; | 339 | + int64 requestUuidMSB = 3; |
340 | + int64 requestUuidLSB = 4; | ||
341 | + int32 requestId = 5; | ||
342 | + int64 expirationTime = 6; | ||
343 | + bool oneway = 7; | ||
344 | RpcRequestMsg requestMsg = 8; | 344 | RpcRequestMsg requestMsg = 8; |
345 | RpcResponseMsg responseMsg = 9; | 345 | RpcResponseMsg responseMsg = 9; |
346 | } | 346 | } |
@@ -82,8 +82,12 @@ public enum MsgType { | @@ -82,8 +82,12 @@ public enum MsgType { | ||
82 | 82 | ||
83 | DEVICE_NAME_OR_TYPE_UPDATE_TO_DEVICE_ACTOR_MSG, | 83 | DEVICE_NAME_OR_TYPE_UPDATE_TO_DEVICE_ACTOR_MSG, |
84 | 84 | ||
85 | + DEVICE_EDGE_UPDATE_TO_DEVICE_ACTOR_MSG, | ||
86 | + | ||
85 | DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG, | 87 | DEVICE_RPC_REQUEST_TO_DEVICE_ACTOR_MSG, |
86 | 88 | ||
89 | + DEVICE_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG, | ||
90 | + | ||
87 | SERVER_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG, | 91 | SERVER_RPC_RESPONSE_TO_DEVICE_ACTOR_MSG, |
88 | 92 | ||
89 | DEVICE_ACTOR_SERVER_SIDE_RPC_TIMEOUT_MSG, | 93 | DEVICE_ACTOR_SERVER_SIDE_RPC_TIMEOUT_MSG, |
1 | +/** | ||
2 | + * Copyright © 2016-2020 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.thingsboard.rule.engine.api.msg; | ||
17 | + | ||
18 | +import lombok.AllArgsConstructor; | ||
19 | +import lombok.Data; | ||
20 | +import org.thingsboard.server.common.data.id.DeviceId; | ||
21 | +import org.thingsboard.server.common.data.id.EdgeId; | ||
22 | +import org.thingsboard.server.common.data.id.TenantId; | ||
23 | +import org.thingsboard.server.common.msg.MsgType; | ||
24 | + | ||
25 | +@Data | ||
26 | +@AllArgsConstructor | ||
27 | +public class DeviceEdgeUpdateMsg implements ToDeviceActorNotificationMsg { | ||
28 | + | ||
29 | + private final TenantId tenantId; | ||
30 | + private final DeviceId deviceId; | ||
31 | + private final EdgeId edgeId; | ||
32 | + | ||
33 | + @Override | ||
34 | + public MsgType getMsgType() { | ||
35 | + return MsgType.DEVICE_EDGE_UPDATE_TO_DEVICE_ACTOR_MSG; | ||
36 | + } | ||
37 | +} |
@@ -16,10 +16,6 @@ | @@ -16,10 +16,6 @@ | ||
16 | package org.thingsboard.rule.engine.rpc; | 16 | package org.thingsboard.rule.engine.rpc; |
17 | 17 | ||
18 | import com.datastax.driver.core.utils.UUIDs; | 18 | import com.datastax.driver.core.utils.UUIDs; |
19 | -import com.fasterxml.jackson.databind.ObjectMapper; | ||
20 | -import com.google.common.util.concurrent.FutureCallback; | ||
21 | -import com.google.common.util.concurrent.Futures; | ||
22 | -import com.google.common.util.concurrent.ListenableFuture; | ||
23 | import com.google.gson.Gson; | 19 | import com.google.gson.Gson; |
24 | import com.google.gson.JsonElement; | 20 | import com.google.gson.JsonElement; |
25 | import com.google.gson.JsonObject; | 21 | import com.google.gson.JsonObject; |
@@ -36,18 +32,10 @@ import org.thingsboard.rule.engine.api.TbRelationTypes; | @@ -36,18 +32,10 @@ import org.thingsboard.rule.engine.api.TbRelationTypes; | ||
36 | import org.thingsboard.rule.engine.api.util.TbNodeUtils; | 32 | import org.thingsboard.rule.engine.api.util.TbNodeUtils; |
37 | import org.thingsboard.server.common.data.DataConstants; | 33 | import org.thingsboard.server.common.data.DataConstants; |
38 | import org.thingsboard.server.common.data.EntityType; | 34 | import org.thingsboard.server.common.data.EntityType; |
39 | -import org.thingsboard.server.common.data.edge.EdgeEvent; | ||
40 | -import org.thingsboard.server.common.data.edge.EdgeEventActionType; | ||
41 | -import org.thingsboard.server.common.data.edge.EdgeEventType; | ||
42 | import org.thingsboard.server.common.data.id.DeviceId; | 35 | import org.thingsboard.server.common.data.id.DeviceId; |
43 | -import org.thingsboard.server.common.data.id.EdgeId; | ||
44 | import org.thingsboard.server.common.data.plugin.ComponentType; | 36 | import org.thingsboard.server.common.data.plugin.ComponentType; |
45 | -import org.thingsboard.server.common.data.relation.EntityRelation; | ||
46 | -import org.thingsboard.server.common.data.relation.RelationTypeGroup; | ||
47 | import org.thingsboard.server.common.msg.TbMsg; | 37 | import org.thingsboard.server.common.msg.TbMsg; |
48 | 38 | ||
49 | -import javax.annotation.Nullable; | ||
50 | -import java.util.List; | ||
51 | import java.util.Random; | 39 | import java.util.Random; |
52 | import java.util.UUID; | 40 | import java.util.UUID; |
53 | import java.util.concurrent.TimeUnit; | 41 | import java.util.concurrent.TimeUnit; |
@@ -66,7 +54,6 @@ import java.util.concurrent.TimeUnit; | @@ -66,7 +54,6 @@ import java.util.concurrent.TimeUnit; | ||
66 | ) | 54 | ) |
67 | public class TbSendRPCRequestNode implements TbNode { | 55 | public class TbSendRPCRequestNode implements TbNode { |
68 | 56 | ||
69 | - private static final ObjectMapper json = new ObjectMapper(); | ||
70 | private Random random = new Random(); | 57 | private Random random = new Random(); |
71 | private Gson gson = new Gson(); | 58 | private Gson gson = new Gson(); |
72 | private JsonParser jsonParser = new JsonParser(); | 59 | private JsonParser jsonParser = new JsonParser(); |
@@ -123,59 +110,19 @@ public class TbSendRPCRequestNode implements TbNode { | @@ -123,59 +110,19 @@ public class TbSendRPCRequestNode implements TbNode { | ||
123 | .restApiCall(restApiCall) | 110 | .restApiCall(restApiCall) |
124 | .build(); | 111 | .build(); |
125 | 112 | ||
126 | - EdgeId edgeId = findRelatedEdgeId(ctx, msg); | ||
127 | - if (edgeId != null) { | ||
128 | - sendRpcRequestToEdgeDevice(ctx, msg, edgeId, request); | ||
129 | - } else { | ||
130 | - ctx.getRpcService().sendRpcRequestToDevice(request, ruleEngineDeviceRpcResponse -> { | ||
131 | - if (!ruleEngineDeviceRpcResponse.getError().isPresent()) { | ||
132 | - TbMsg next = ctx.newMsg(msg.getQueueName(), msg.getType(), msg.getOriginator(), msg.getMetaData(), ruleEngineDeviceRpcResponse.getResponse().orElse("{}")); | ||
133 | - ctx.enqueueForTellNext(next, TbRelationTypes.SUCCESS); | ||
134 | - } else { | ||
135 | - TbMsg next = ctx.newMsg(msg.getQueueName(), msg.getType(), msg.getOriginator(), msg.getMetaData(), wrap("error", ruleEngineDeviceRpcResponse.getError().get().name())); | ||
136 | - ctx.tellFailure(next, new RuntimeException(ruleEngineDeviceRpcResponse.getError().get().name())); | ||
137 | - } | ||
138 | - }); | ||
139 | - } | 113 | + ctx.getRpcService().sendRpcRequestToDevice(request, ruleEngineDeviceRpcResponse -> { |
114 | + if (!ruleEngineDeviceRpcResponse.getError().isPresent()) { | ||
115 | + TbMsg next = ctx.newMsg(msg.getQueueName(), msg.getType(), msg.getOriginator(), msg.getMetaData(), ruleEngineDeviceRpcResponse.getResponse().orElse("{}")); | ||
116 | + ctx.enqueueForTellNext(next, TbRelationTypes.SUCCESS); | ||
117 | + } else { | ||
118 | + TbMsg next = ctx.newMsg(msg.getQueueName(), msg.getType(), msg.getOriginator(), msg.getMetaData(), wrap("error", ruleEngineDeviceRpcResponse.getError().get().name())); | ||
119 | + ctx.tellFailure(next, new RuntimeException(ruleEngineDeviceRpcResponse.getError().get().name())); | ||
120 | + } | ||
121 | + }); | ||
140 | ctx.ack(msg); | 122 | ctx.ack(msg); |
141 | } | 123 | } |
142 | } | 124 | } |
143 | 125 | ||
144 | - private EdgeId findRelatedEdgeId(TbContext ctx, TbMsg msg) { | ||
145 | - List<EntityRelation> result = | ||
146 | - ctx.getRelationService().findByToAndType(ctx.getTenantId(), msg.getOriginator(), EntityRelation.EDGE_TYPE, RelationTypeGroup.COMMON); | ||
147 | - if (result != null && result.size() > 0) { | ||
148 | - EntityRelation relationToEdge = result.get(0); | ||
149 | - if (relationToEdge.getFrom() != null && relationToEdge.getFrom().getId() != null) { | ||
150 | - return new EdgeId(relationToEdge.getFrom().getId()); | ||
151 | - } | ||
152 | - } | ||
153 | - return null; | ||
154 | - } | ||
155 | - | ||
156 | - private void sendRpcRequestToEdgeDevice(TbContext ctx, TbMsg msg, EdgeId edgeId, RuleEngineDeviceRpcRequest request) { | ||
157 | - EdgeEvent edgeEvent = new EdgeEvent(); | ||
158 | - edgeEvent.setTenantId(ctx.getTenantId()); | ||
159 | - edgeEvent.setAction(EdgeEventActionType.RPC_CALL); | ||
160 | - edgeEvent.setEntityId(request.getDeviceId().getId()); | ||
161 | - edgeEvent.setType(EdgeEventType.DEVICE); | ||
162 | - edgeEvent.setBody(json.valueToTree(request)); | ||
163 | - edgeEvent.setEdgeId(edgeId); | ||
164 | - ListenableFuture<EdgeEvent> saveFuture = ctx.getEdgeEventService().saveAsync(edgeEvent); | ||
165 | - Futures.addCallback(saveFuture, new FutureCallback<EdgeEvent>() { | ||
166 | - @Override | ||
167 | - public void onSuccess(@Nullable EdgeEvent event) { | ||
168 | - ctx.tellSuccess(msg); | ||
169 | - } | ||
170 | - | ||
171 | - @Override | ||
172 | - public void onFailure(Throwable th) { | ||
173 | - log.error("Could not save edge event", th); | ||
174 | - ctx.tellFailure(msg, th); | ||
175 | - } | ||
176 | - }, ctx.getDbCallbackExecutor()); | ||
177 | - } | ||
178 | - | ||
179 | @Override | 126 | @Override |
180 | public void destroy() { | 127 | public void destroy() { |
181 | } | 128 | } |