Showing
8 changed files
with
227 additions
and
136 deletions
@@ -350,6 +350,8 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh | @@ -350,6 +350,8 @@ public class RuleChainActorMessageProcessor extends ComponentMsgProcessor<RuleCh | ||
350 | case DataConstants.ENTITY_DELETED: | 350 | case DataConstants.ENTITY_DELETED: |
351 | case DataConstants.ENTITY_ASSIGNED_TO_EDGE: | 351 | case DataConstants.ENTITY_ASSIGNED_TO_EDGE: |
352 | case DataConstants.ENTITY_UNASSIGNED_FROM_EDGE: | 352 | case DataConstants.ENTITY_UNASSIGNED_FROM_EDGE: |
353 | + case DataConstants.ALARM_ACK: | ||
354 | + case DataConstants.ALARM_CLEAR: | ||
353 | edgeService.pushEventToEdge(tenantId, msg, new FutureCallback<Void>() { | 355 | edgeService.pushEventToEdge(tenantId, msg, new FutureCallback<Void>() { |
354 | @Override | 356 | @Override |
355 | public void onSuccess(@Nullable Void aVoid) { | 357 | public void onSuccess(@Nullable Void aVoid) { |
@@ -25,20 +25,9 @@ import org.springframework.beans.factory.annotation.Autowired; | @@ -25,20 +25,9 @@ import org.springframework.beans.factory.annotation.Autowired; | ||
25 | import org.springframework.beans.factory.annotation.Value; | 25 | import org.springframework.beans.factory.annotation.Value; |
26 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; | 26 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; |
27 | import org.springframework.stereotype.Service; | 27 | import org.springframework.stereotype.Service; |
28 | -import org.thingsboard.server.actors.service.ActorService; | ||
29 | -import org.thingsboard.server.common.data.Event; | ||
30 | -import org.thingsboard.server.common.data.edge.Edge; | ||
31 | -import org.thingsboard.server.common.data.id.DeviceId; | ||
32 | import org.thingsboard.server.common.data.id.EdgeId; | 28 | import org.thingsboard.server.common.data.id.EdgeId; |
29 | +import org.thingsboard.server.common.data.id.RuleChainId; | ||
33 | import org.thingsboard.server.common.data.id.TenantId; | 30 | import org.thingsboard.server.common.data.id.TenantId; |
34 | -import org.thingsboard.server.common.data.page.TimePageData; | ||
35 | -import org.thingsboard.server.common.data.page.TimePageLink; | ||
36 | -import org.thingsboard.server.dao.asset.AssetService; | ||
37 | -import org.thingsboard.server.dao.attributes.AttributesService; | ||
38 | -import org.thingsboard.server.dao.device.DeviceService; | ||
39 | -import org.thingsboard.server.dao.edge.EdgeService; | ||
40 | -import org.thingsboard.server.dao.entityview.EntityViewService; | ||
41 | -import org.thingsboard.server.dao.event.EventService; | ||
42 | import org.thingsboard.server.gen.edge.EdgeRpcServiceGrpc; | 31 | import org.thingsboard.server.gen.edge.EdgeRpcServiceGrpc; |
43 | import org.thingsboard.server.gen.edge.RequestMsg; | 32 | import org.thingsboard.server.gen.edge.RequestMsg; |
44 | import org.thingsboard.server.gen.edge.ResponseMsg; | 33 | import org.thingsboard.server.gen.edge.ResponseMsg; |
@@ -52,7 +41,6 @@ import java.util.Map; | @@ -52,7 +41,6 @@ import java.util.Map; | ||
52 | import java.util.concurrent.ConcurrentHashMap; | 41 | import java.util.concurrent.ConcurrentHashMap; |
53 | import java.util.concurrent.ExecutorService; | 42 | import java.util.concurrent.ExecutorService; |
54 | import java.util.concurrent.Executors; | 43 | import java.util.concurrent.Executors; |
55 | -import java.util.concurrent.TimeUnit; | ||
56 | 44 | ||
57 | @Service | 45 | @Service |
58 | @Slf4j | 46 | @Slf4j |
@@ -74,24 +62,6 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase { | @@ -74,24 +62,6 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase { | ||
74 | @Autowired | 62 | @Autowired |
75 | private EdgeContextComponent ctx; | 63 | private EdgeContextComponent ctx; |
76 | 64 | ||
77 | - @Autowired | ||
78 | - private EdgeService edgeService; | ||
79 | - | ||
80 | - @Autowired | ||
81 | - private AssetService assetService; | ||
82 | - | ||
83 | - @Autowired | ||
84 | - private DeviceService deviceService; | ||
85 | - | ||
86 | - @Autowired | ||
87 | - private EntityViewService entityViewService; | ||
88 | - | ||
89 | - @Autowired | ||
90 | - private AttributesService attributesService; | ||
91 | - | ||
92 | - @Autowired | ||
93 | - private ActorService actorService; | ||
94 | - | ||
95 | private Server server; | 65 | private Server server; |
96 | 66 | ||
97 | private ExecutorService executor; | 67 | private ExecutorService executor; |
@@ -156,4 +126,5 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase { | @@ -156,4 +126,5 @@ public class EdgeGrpcService extends EdgeRpcServiceGrpc.EdgeRpcServiceImplBase { | ||
156 | private void onEdgeDisconnect(EdgeId edgeId) { | 126 | private void onEdgeDisconnect(EdgeId edgeId) { |
157 | sessions.remove(edgeId); | 127 | sessions.remove(edgeId); |
158 | } | 128 | } |
129 | + | ||
159 | } | 130 | } |
@@ -31,6 +31,7 @@ import org.thingsboard.server.common.data.Device; | @@ -31,6 +31,7 @@ import org.thingsboard.server.common.data.Device; | ||
31 | import org.thingsboard.server.common.data.EntityType; | 31 | import org.thingsboard.server.common.data.EntityType; |
32 | import org.thingsboard.server.common.data.EntityView; | 32 | import org.thingsboard.server.common.data.EntityView; |
33 | import org.thingsboard.server.common.data.Event; | 33 | import org.thingsboard.server.common.data.Event; |
34 | +import org.thingsboard.server.common.data.alarm.Alarm; | ||
34 | import org.thingsboard.server.common.data.asset.Asset; | 35 | import org.thingsboard.server.common.data.asset.Asset; |
35 | import org.thingsboard.server.common.data.edge.Edge; | 36 | import org.thingsboard.server.common.data.edge.Edge; |
36 | import org.thingsboard.server.common.data.edge.EdgeQueueEntry; | 37 | import org.thingsboard.server.common.data.edge.EdgeQueueEntry; |
@@ -59,6 +60,7 @@ import org.thingsboard.server.common.msg.cluster.SendToClusterMsg; | @@ -59,6 +60,7 @@ import org.thingsboard.server.common.msg.cluster.SendToClusterMsg; | ||
59 | import org.thingsboard.server.common.msg.session.SessionMsgType; | 60 | import org.thingsboard.server.common.msg.session.SessionMsgType; |
60 | import org.thingsboard.server.common.msg.system.ServiceToRuleEngineMsg; | 61 | import org.thingsboard.server.common.msg.system.ServiceToRuleEngineMsg; |
61 | import org.thingsboard.server.dao.util.mapping.JacksonUtil; | 62 | import org.thingsboard.server.dao.util.mapping.JacksonUtil; |
63 | +import org.thingsboard.server.gen.edge.AlarmUpdateMsg; | ||
62 | import org.thingsboard.server.gen.edge.AssetUpdateMsg; | 64 | import org.thingsboard.server.gen.edge.AssetUpdateMsg; |
63 | import org.thingsboard.server.gen.edge.ConnectRequestMsg; | 65 | import org.thingsboard.server.gen.edge.ConnectRequestMsg; |
64 | import org.thingsboard.server.gen.edge.ConnectResponseCode; | 66 | import org.thingsboard.server.gen.edge.ConnectResponseCode; |
@@ -68,6 +70,7 @@ import org.thingsboard.server.gen.edge.DeviceUpdateMsg; | @@ -68,6 +70,7 @@ import org.thingsboard.server.gen.edge.DeviceUpdateMsg; | ||
68 | import org.thingsboard.server.gen.edge.DownlinkMsg; | 70 | import org.thingsboard.server.gen.edge.DownlinkMsg; |
69 | import org.thingsboard.server.gen.edge.EdgeConfiguration; | 71 | import org.thingsboard.server.gen.edge.EdgeConfiguration; |
70 | import org.thingsboard.server.gen.edge.EntityDataProto; | 72 | import org.thingsboard.server.gen.edge.EntityDataProto; |
73 | +import org.thingsboard.server.gen.edge.EntityUpdateMsg; | ||
71 | import org.thingsboard.server.gen.edge.EntityViewUpdateMsg; | 74 | import org.thingsboard.server.gen.edge.EntityViewUpdateMsg; |
72 | import org.thingsboard.server.gen.edge.NodeConnectionInfoProto; | 75 | import org.thingsboard.server.gen.edge.NodeConnectionInfoProto; |
73 | import org.thingsboard.server.gen.edge.RequestMsg; | 76 | import org.thingsboard.server.gen.edge.RequestMsg; |
@@ -140,11 +143,6 @@ public final class EdgeGrpcSession implements Cloneable { | @@ -140,11 +143,6 @@ public final class EdgeGrpcSession implements Cloneable { | ||
140 | .setUplinkResponseMsg(processUplinkMsg(requestMsg.getUplinkMsg())) | 143 | .setUplinkResponseMsg(processUplinkMsg(requestMsg.getUplinkMsg())) |
141 | .build()); | 144 | .build()); |
142 | } | 145 | } |
143 | - if (requestMsg.getMsgType().equals(RequestMsgType.DEVICE_UPDATE_RPC_MESSAGE) && requestMsg.hasDeviceUpdateMsg()) { | ||
144 | - outputStream.onNext(ResponseMsg.newBuilder() | ||
145 | - .setUplinkResponseMsg(processUplinkMsg(requestMsg.getUplinkMsg())) | ||
146 | - .build()); | ||
147 | - } | ||
148 | } | 146 | } |
149 | } | 147 | } |
150 | 148 | ||
@@ -161,6 +159,7 @@ public final class EdgeGrpcSession implements Cloneable { | @@ -161,6 +159,7 @@ public final class EdgeGrpcSession implements Cloneable { | ||
161 | }; | 159 | }; |
162 | } | 160 | } |
163 | 161 | ||
162 | + | ||
164 | void processHandleMessages() throws ExecutionException, InterruptedException { | 163 | void processHandleMessages() throws ExecutionException, InterruptedException { |
165 | Long queueStartTs = getQueueStartTs().get(); | 164 | Long queueStartTs = getQueueStartTs().get(); |
166 | // TODO: this 100 value must be changed properly | 165 | // TODO: this 100 value must be changed properly |
@@ -170,7 +169,6 @@ public final class EdgeGrpcSession implements Cloneable { | @@ -170,7 +169,6 @@ public final class EdgeGrpcSession implements Cloneable { | ||
170 | do { | 169 | do { |
171 | pageData = ctx.getEdgeService().findQueueEvents(edge.getTenantId(), edge.getId(), pageLink); | 170 | pageData = ctx.getEdgeService().findQueueEvents(edge.getTenantId(), edge.getId(), pageLink); |
172 | if (!pageData.getData().isEmpty()) { | 171 | if (!pageData.getData().isEmpty()) { |
173 | - edge = ctx.getEdgeService().findEdgeById(edge.getTenantId(), edge.getId()); | ||
174 | for (Event event : pageData.getData()) { | 172 | for (Event event : pageData.getData()) { |
175 | EdgeQueueEntry entry; | 173 | EdgeQueueEntry entry; |
176 | try { | 174 | try { |
@@ -181,6 +179,8 @@ public final class EdgeGrpcSession implements Cloneable { | @@ -181,6 +179,8 @@ public final class EdgeGrpcSession implements Cloneable { | ||
181 | case ENTITY_DELETED_RPC_MESSAGE: | 179 | case ENTITY_DELETED_RPC_MESSAGE: |
182 | case ENTITY_UPDATED_RPC_MESSAGE: | 180 | case ENTITY_UPDATED_RPC_MESSAGE: |
183 | case ENTITY_CREATED_RPC_MESSAGE: | 181 | case ENTITY_CREATED_RPC_MESSAGE: |
182 | + case ALARM_ACK_RPC_MESSAGE: | ||
183 | + case ALARM_CLEARK_RPC_MESSAGE: | ||
184 | processEntityCRUDMessage(entry, msgType); | 184 | processEntityCRUDMessage(entry, msgType); |
185 | break; | 185 | break; |
186 | case RULE_CHAIN_CUSTOM_MESSAGE: | 186 | case RULE_CHAIN_CUSTOM_MESSAGE: |
@@ -239,6 +239,10 @@ public final class EdgeGrpcSession implements Cloneable { | @@ -239,6 +239,10 @@ public final class EdgeGrpcSession implements Cloneable { | ||
239 | private void processEntityCRUDMessage(EdgeQueueEntry entry, UpdateMsgType msgType) throws java.io.IOException { | 239 | private void processEntityCRUDMessage(EdgeQueueEntry entry, UpdateMsgType msgType) throws java.io.IOException { |
240 | log.trace("Executing processEntityCRUDMessage, entry [{}], msgType [{}]", entry, msgType); | 240 | log.trace("Executing processEntityCRUDMessage, entry [{}], msgType [{}]", entry, msgType); |
241 | switch (entry.getEntityType()) { | 241 | switch (entry.getEntityType()) { |
242 | + case EDGE: | ||
243 | + Edge edge = objectMapper.readValue(entry.getData(), Edge.class); | ||
244 | + onEdgeUpdated(msgType, edge); | ||
245 | + break; | ||
242 | case DEVICE: | 246 | case DEVICE: |
243 | Device device = objectMapper.readValue(entry.getData(), Device.class); | 247 | Device device = objectMapper.readValue(entry.getData(), Device.class); |
244 | onDeviceUpdated(msgType, device); | 248 | onDeviceUpdated(msgType, device); |
@@ -263,6 +267,10 @@ public final class EdgeGrpcSession implements Cloneable { | @@ -263,6 +267,10 @@ public final class EdgeGrpcSession implements Cloneable { | ||
263 | RuleChainMetaData ruleChainMetaData = objectMapper.readValue(entry.getData(), RuleChainMetaData.class); | 267 | RuleChainMetaData ruleChainMetaData = objectMapper.readValue(entry.getData(), RuleChainMetaData.class); |
264 | onRuleChainMetadataUpdated(msgType, ruleChainMetaData); | 268 | onRuleChainMetadataUpdated(msgType, ruleChainMetaData); |
265 | break; | 269 | break; |
270 | + case ALARM: | ||
271 | + Alarm alarm = objectMapper.readValue(entry.getData(), Alarm.class); | ||
272 | + onAlarmUpdated(msgType, alarm); | ||
273 | + break; | ||
266 | } | 274 | } |
267 | } | 275 | } |
268 | 276 | ||
@@ -284,45 +292,107 @@ public final class EdgeGrpcSession implements Cloneable { | @@ -284,45 +292,107 @@ public final class EdgeGrpcSession implements Cloneable { | ||
284 | } ); | 292 | } ); |
285 | } | 293 | } |
286 | 294 | ||
295 | + private void onEdgeUpdated(UpdateMsgType msgType, Edge edge) { | ||
296 | + // TODO: voba add configuration update to edge | ||
297 | + this.edge = edge; | ||
298 | + } | ||
299 | + | ||
287 | private void onDeviceUpdated(UpdateMsgType msgType, Device device) { | 300 | private void onDeviceUpdated(UpdateMsgType msgType, Device device) { |
288 | - outputStream.onNext(ResponseMsg.newBuilder() | 301 | + EntityUpdateMsg entityUpdateMsg = EntityUpdateMsg.newBuilder() |
289 | .setDeviceUpdateMsg(constructDeviceUpdatedMsg(msgType, device)) | 302 | .setDeviceUpdateMsg(constructDeviceUpdatedMsg(msgType, device)) |
303 | + .build(); | ||
304 | + outputStream.onNext(ResponseMsg.newBuilder() | ||
305 | + .setEntityUpdateMsg(entityUpdateMsg) | ||
290 | .build()); | 306 | .build()); |
291 | } | 307 | } |
292 | 308 | ||
293 | private void onAssetUpdated(UpdateMsgType msgType, Asset asset) { | 309 | private void onAssetUpdated(UpdateMsgType msgType, Asset asset) { |
294 | - outputStream.onNext(ResponseMsg.newBuilder() | 310 | + EntityUpdateMsg entityUpdateMsg = EntityUpdateMsg.newBuilder() |
295 | .setAssetUpdateMsg(constructAssetUpdatedMsg(msgType, asset)) | 311 | .setAssetUpdateMsg(constructAssetUpdatedMsg(msgType, asset)) |
312 | + .build(); | ||
313 | + outputStream.onNext(ResponseMsg.newBuilder() | ||
314 | + .setEntityUpdateMsg(entityUpdateMsg) | ||
296 | .build()); | 315 | .build()); |
297 | } | 316 | } |
298 | 317 | ||
299 | private void onEntityViewUpdated(UpdateMsgType msgType, EntityView entityView) { | 318 | private void onEntityViewUpdated(UpdateMsgType msgType, EntityView entityView) { |
300 | - outputStream.onNext(ResponseMsg.newBuilder() | 319 | + EntityUpdateMsg entityUpdateMsg = EntityUpdateMsg.newBuilder() |
301 | .setEntityViewUpdateMsg(constructEntityViewUpdatedMsg(msgType, entityView)) | 320 | .setEntityViewUpdateMsg(constructEntityViewUpdatedMsg(msgType, entityView)) |
321 | + .build(); | ||
322 | + outputStream.onNext(ResponseMsg.newBuilder() | ||
323 | + .setEntityUpdateMsg(entityUpdateMsg) | ||
302 | .build()); | 324 | .build()); |
303 | } | 325 | } |
304 | 326 | ||
305 | private void onRuleChainUpdated(UpdateMsgType msgType, RuleChain ruleChain) { | 327 | private void onRuleChainUpdated(UpdateMsgType msgType, RuleChain ruleChain) { |
306 | - outputStream.onNext(ResponseMsg.newBuilder() | 328 | + EntityUpdateMsg entityUpdateMsg = EntityUpdateMsg.newBuilder() |
307 | .setRuleChainUpdateMsg(constructRuleChainUpdatedMsg(msgType, ruleChain)) | 329 | .setRuleChainUpdateMsg(constructRuleChainUpdatedMsg(msgType, ruleChain)) |
330 | + .build(); | ||
331 | + outputStream.onNext(ResponseMsg.newBuilder() | ||
332 | + .setEntityUpdateMsg(entityUpdateMsg) | ||
308 | .build()); | 333 | .build()); |
309 | } | 334 | } |
310 | 335 | ||
311 | private void onRuleChainMetadataUpdated(UpdateMsgType msgType, RuleChainMetaData ruleChainMetaData) { | 336 | private void onRuleChainMetadataUpdated(UpdateMsgType msgType, RuleChainMetaData ruleChainMetaData) { |
312 | RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg = constructRuleChainMetadataUpdatedMsg(msgType, ruleChainMetaData); | 337 | RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg = constructRuleChainMetadataUpdatedMsg(msgType, ruleChainMetaData); |
313 | if (ruleChainMetadataUpdateMsg != null) { | 338 | if (ruleChainMetadataUpdateMsg != null) { |
314 | - outputStream.onNext(ResponseMsg.newBuilder() | 339 | + EntityUpdateMsg entityUpdateMsg = EntityUpdateMsg.newBuilder() |
315 | .setRuleChainMetadataUpdateMsg(ruleChainMetadataUpdateMsg) | 340 | .setRuleChainMetadataUpdateMsg(ruleChainMetadataUpdateMsg) |
341 | + .build(); | ||
342 | + outputStream.onNext(ResponseMsg.newBuilder() | ||
343 | + .setEntityUpdateMsg(entityUpdateMsg) | ||
316 | .build()); | 344 | .build()); |
317 | } | 345 | } |
318 | } | 346 | } |
319 | 347 | ||
320 | private void onDashboardUpdated(UpdateMsgType msgType, Dashboard dashboard) { | 348 | private void onDashboardUpdated(UpdateMsgType msgType, Dashboard dashboard) { |
321 | - outputStream.onNext(ResponseMsg.newBuilder() | 349 | + EntityUpdateMsg entityUpdateMsg = EntityUpdateMsg.newBuilder() |
322 | .setDashboardUpdateMsg(constructDashboardUpdatedMsg(msgType, dashboard)) | 350 | .setDashboardUpdateMsg(constructDashboardUpdatedMsg(msgType, dashboard)) |
351 | + .build(); | ||
352 | + outputStream.onNext(ResponseMsg.newBuilder() | ||
353 | + .setEntityUpdateMsg(entityUpdateMsg) | ||
354 | + .build()); | ||
355 | + } | ||
356 | + | ||
357 | + private void onAlarmUpdated(UpdateMsgType msgType, Alarm alarm) { | ||
358 | + EntityUpdateMsg entityUpdateMsg = EntityUpdateMsg.newBuilder() | ||
359 | + .setAlarmUpdateMsg(constructAlarmUpdatedMsg(msgType, alarm)) | ||
360 | + .build(); | ||
361 | + outputStream.onNext(ResponseMsg.newBuilder() | ||
362 | + .setEntityUpdateMsg(entityUpdateMsg) | ||
323 | .build()); | 363 | .build()); |
324 | } | 364 | } |
325 | 365 | ||
366 | + private AlarmUpdateMsg constructAlarmUpdatedMsg(UpdateMsgType msgType, Alarm alarm) { | ||
367 | + String entityName = null; | ||
368 | + switch (alarm.getOriginator().getEntityType()) { | ||
369 | + case DEVICE: | ||
370 | + entityName = ctx.getDeviceService().findDeviceById(edge.getTenantId(), new DeviceId(alarm.getOriginator().getId())).getName(); | ||
371 | + break; | ||
372 | + case ASSET: | ||
373 | + entityName = ctx.getAssetService().findAssetById(edge.getTenantId(), new AssetId(alarm.getOriginator().getId())).getName(); | ||
374 | + break; | ||
375 | + case ENTITY_VIEW: | ||
376 | + entityName = ctx.getEntityViewService().findEntityViewById(edge.getTenantId(), new EntityViewId(alarm.getOriginator().getId())).getName(); | ||
377 | + break; | ||
378 | + } | ||
379 | + AlarmUpdateMsg.Builder builder = AlarmUpdateMsg.newBuilder() | ||
380 | + .setMsgType(msgType) | ||
381 | + .setName(alarm.getName()) | ||
382 | + .setType(alarm.getName()) | ||
383 | + .setOriginatorName(entityName) | ||
384 | + .setOriginatorType(alarm.getOriginator().getEntityType().name()) | ||
385 | + .setSeverity(alarm.getSeverity().name()) | ||
386 | + .setStatus(alarm.getStatus().name()) | ||
387 | + .setStartTs(alarm.getStartTs()) | ||
388 | + .setEndTs(alarm.getEndTs()) | ||
389 | + .setAckTs(alarm.getAckTs()) | ||
390 | + .setClearTs(alarm.getClearTs()) | ||
391 | + .setDetails(JacksonUtil.toString(alarm.getDetails())) | ||
392 | + .setPropagate(alarm.isPropagate()); | ||
393 | + return builder.build(); | ||
394 | + } | ||
395 | + | ||
326 | private UpdateMsgType getResponseMsgType(String msgType) { | 396 | private UpdateMsgType getResponseMsgType(String msgType) { |
327 | if (msgType.equals(SessionMsgType.POST_TELEMETRY_REQUEST.name()) || | 397 | if (msgType.equals(SessionMsgType.POST_TELEMETRY_REQUEST.name()) || |
328 | msgType.equals(SessionMsgType.POST_ATTRIBUTES_REQUEST.name()) || | 398 | msgType.equals(SessionMsgType.POST_ATTRIBUTES_REQUEST.name()) || |
@@ -504,31 +574,31 @@ public final class EdgeGrpcSession implements Cloneable { | @@ -504,31 +574,31 @@ public final class EdgeGrpcSession implements Cloneable { | ||
504 | if (uplinkMsg.getEntityDataList() != null && !uplinkMsg.getEntityDataList().isEmpty()) { | 574 | if (uplinkMsg.getEntityDataList() != null && !uplinkMsg.getEntityDataList().isEmpty()) { |
505 | for (EntityDataProto entityData : uplinkMsg.getEntityDataList()) { | 575 | for (EntityDataProto entityData : uplinkMsg.getEntityDataList()) { |
506 | TbMsg tbMsg = null; | 576 | TbMsg tbMsg = null; |
507 | - TbMsg tmp = TbMsg.fromBytes(entityData.getTbMsg().toByteArray()); | ||
508 | - switch (tmp.getOriginator().getEntityType()) { | 577 | + TbMsg originalTbMsg = TbMsg.fromBytes(entityData.getTbMsg().toByteArray()); |
578 | + switch (originalTbMsg.getOriginator().getEntityType()) { | ||
509 | case DEVICE: | 579 | case DEVICE: |
510 | String deviceName = entityData.getEntityName(); | 580 | String deviceName = entityData.getEntityName(); |
511 | String deviceType = entityData.getEntityType(); | 581 | String deviceType = entityData.getEntityType(); |
512 | Device device = getOrCreateDevice(deviceName, deviceType); | 582 | Device device = getOrCreateDevice(deviceName, deviceType); |
513 | if (device != null) { | 583 | if (device != null) { |
514 | - tbMsg = new TbMsg(UUIDs.timeBased(), tmp.getType(), device.getId(), tmp.getMetaData().copy(), | ||
515 | - tmp.getDataType(), tmp.getData(), null, null, 0L); | 584 | + tbMsg = new TbMsg(UUIDs.timeBased(), originalTbMsg.getType(), device.getId(), originalTbMsg.getMetaData().copy(), |
585 | + originalTbMsg.getDataType(), originalTbMsg.getData(), null, null, 0L); | ||
516 | } | 586 | } |
517 | break; | 587 | break; |
518 | case ASSET: | 588 | case ASSET: |
519 | String assetName = entityData.getEntityName(); | 589 | String assetName = entityData.getEntityName(); |
520 | Asset asset = ctx.getAssetService().findAssetByTenantIdAndName(edge.getTenantId(), assetName); | 590 | Asset asset = ctx.getAssetService().findAssetByTenantIdAndName(edge.getTenantId(), assetName); |
521 | if (asset != null) { | 591 | if (asset != null) { |
522 | - tbMsg = new TbMsg(UUIDs.timeBased(), tmp.getType(), asset.getId(), tmp.getMetaData().copy(), | ||
523 | - tmp.getDataType(), tmp.getData(), null, null, 0L); | 592 | + tbMsg = new TbMsg(UUIDs.timeBased(), originalTbMsg.getType(), asset.getId(), originalTbMsg.getMetaData().copy(), |
593 | + originalTbMsg.getDataType(), originalTbMsg.getData(), null, null, 0L); | ||
524 | } | 594 | } |
525 | break; | 595 | break; |
526 | case ENTITY_VIEW: | 596 | case ENTITY_VIEW: |
527 | String entityViewName = entityData.getEntityName(); | 597 | String entityViewName = entityData.getEntityName(); |
528 | EntityView entityView = ctx.getEntityViewService().findEntityViewByTenantIdAndName(edge.getTenantId(), entityViewName); | 598 | EntityView entityView = ctx.getEntityViewService().findEntityViewByTenantIdAndName(edge.getTenantId(), entityViewName); |
529 | if (entityView != null) { | 599 | if (entityView != null) { |
530 | - tbMsg = new TbMsg(UUIDs.timeBased(), tmp.getType(), entityView.getId(), tmp.getMetaData().copy(), | ||
531 | - tmp.getDataType(), tmp.getData(), null, null, 0L); | 600 | + tbMsg = new TbMsg(UUIDs.timeBased(), originalTbMsg.getType(), entityView.getId(), originalTbMsg.getMetaData().copy(), |
601 | + originalTbMsg.getDataType(), originalTbMsg.getData(), null, null, 0L); | ||
532 | } | 602 | } |
533 | break; | 603 | break; |
534 | } | 604 | } |
@@ -537,6 +607,17 @@ public final class EdgeGrpcSession implements Cloneable { | @@ -537,6 +607,17 @@ public final class EdgeGrpcSession implements Cloneable { | ||
537 | } | 607 | } |
538 | } | 608 | } |
539 | } | 609 | } |
610 | + if (uplinkMsg.getDeviceUpdateMsgList() != null && !uplinkMsg.getDeviceUpdateMsgList().isEmpty()) { | ||
611 | + for (DeviceUpdateMsg deviceUpdateMsg : uplinkMsg.getDeviceUpdateMsgList()) { | ||
612 | + String deviceName = deviceUpdateMsg.getName(); | ||
613 | + String deviceType = deviceUpdateMsg.getType(); | ||
614 | + switch (deviceUpdateMsg.getMsgType()) { | ||
615 | + case ENTITY_CREATED_RPC_MESSAGE: | ||
616 | + getOrCreateDevice(deviceName, deviceType); | ||
617 | + break; | ||
618 | + } | ||
619 | + } | ||
620 | + } | ||
540 | } catch (Exception e) { | 621 | } catch (Exception e) { |
541 | return UplinkResponseMsg.newBuilder().setSuccess(false).setErrorMsg(e.getMessage()).build(); | 622 | return UplinkResponseMsg.newBuilder().setSuccess(false).setErrorMsg(e.getMessage()).build(); |
542 | } | 623 | } |
@@ -16,5 +16,5 @@ | @@ -16,5 +16,5 @@ | ||
16 | package org.thingsboard.server.common.data.edge; | 16 | package org.thingsboard.server.common.data.edge; |
17 | 17 | ||
18 | public enum EdgeQueueEntityType { | 18 | public enum EdgeQueueEntityType { |
19 | - DASHBOARD, ASSET, DEVICE, ENTITY_VIEW, ALARM, RULE_CHAIN, RULE_CHAIN_METADATA | 19 | + DASHBOARD, ASSET, DEVICE, ENTITY_VIEW, ALARM, RULE_CHAIN, RULE_CHAIN_METADATA, EDGE |
20 | } | 20 | } |
@@ -24,21 +24,16 @@ import lombok.extern.slf4j.Slf4j; | @@ -24,21 +24,16 @@ import lombok.extern.slf4j.Slf4j; | ||
24 | import org.springframework.beans.factory.annotation.Value; | 24 | import org.springframework.beans.factory.annotation.Value; |
25 | import org.springframework.stereotype.Service; | 25 | import org.springframework.stereotype.Service; |
26 | import org.thingsboard.edge.exception.EdgeConnectionException; | 26 | import org.thingsboard.edge.exception.EdgeConnectionException; |
27 | -import org.thingsboard.server.gen.edge.AssetUpdateMsg; | ||
28 | import org.thingsboard.server.gen.edge.ConnectRequestMsg; | 27 | import org.thingsboard.server.gen.edge.ConnectRequestMsg; |
29 | import org.thingsboard.server.gen.edge.ConnectResponseCode; | 28 | import org.thingsboard.server.gen.edge.ConnectResponseCode; |
30 | import org.thingsboard.server.gen.edge.ConnectResponseMsg; | 29 | import org.thingsboard.server.gen.edge.ConnectResponseMsg; |
31 | -import org.thingsboard.server.gen.edge.DashboardUpdateMsg; | ||
32 | -import org.thingsboard.server.gen.edge.DeviceUpdateMsg; | ||
33 | import org.thingsboard.server.gen.edge.DownlinkMsg; | 30 | import org.thingsboard.server.gen.edge.DownlinkMsg; |
34 | import org.thingsboard.server.gen.edge.EdgeConfiguration; | 31 | import org.thingsboard.server.gen.edge.EdgeConfiguration; |
35 | import org.thingsboard.server.gen.edge.EdgeRpcServiceGrpc; | 32 | import org.thingsboard.server.gen.edge.EdgeRpcServiceGrpc; |
36 | -import org.thingsboard.server.gen.edge.EntityViewUpdateMsg; | 33 | +import org.thingsboard.server.gen.edge.EntityUpdateMsg; |
37 | import org.thingsboard.server.gen.edge.RequestMsg; | 34 | import org.thingsboard.server.gen.edge.RequestMsg; |
38 | import org.thingsboard.server.gen.edge.RequestMsgType; | 35 | import org.thingsboard.server.gen.edge.RequestMsgType; |
39 | import org.thingsboard.server.gen.edge.ResponseMsg; | 36 | import org.thingsboard.server.gen.edge.ResponseMsg; |
40 | -import org.thingsboard.server.gen.edge.RuleChainMetadataUpdateMsg; | ||
41 | -import org.thingsboard.server.gen.edge.RuleChainUpdateMsg; | ||
42 | import org.thingsboard.server.gen.edge.UplinkMsg; | 37 | import org.thingsboard.server.gen.edge.UplinkMsg; |
43 | import org.thingsboard.server.gen.edge.UplinkResponseMsg; | 38 | import org.thingsboard.server.gen.edge.UplinkResponseMsg; |
44 | 39 | ||
@@ -72,12 +67,7 @@ public class EdgeGrpcClient implements EdgeRpcClient { | @@ -72,12 +67,7 @@ public class EdgeGrpcClient implements EdgeRpcClient { | ||
72 | String edgeSecret, | 67 | String edgeSecret, |
73 | Consumer<UplinkResponseMsg> onUplinkResponse, | 68 | Consumer<UplinkResponseMsg> onUplinkResponse, |
74 | Consumer<EdgeConfiguration> onEdgeUpdate, | 69 | Consumer<EdgeConfiguration> onEdgeUpdate, |
75 | - Consumer<DeviceUpdateMsg> onDeviceUpdate, | ||
76 | - Consumer<AssetUpdateMsg> onAssetUpdate, | ||
77 | - Consumer<EntityViewUpdateMsg> onEntityViewUpdate, | ||
78 | - Consumer<RuleChainUpdateMsg> onRuleChainUpdate, | ||
79 | - Consumer<RuleChainMetadataUpdateMsg> onRuleChainMetadataUpdate, | ||
80 | - Consumer<DashboardUpdateMsg> onDashboardUpdate, | 70 | + Consumer<EntityUpdateMsg> onEntityUpdate, |
81 | Consumer<DownlinkMsg> onDownlink, | 71 | Consumer<DownlinkMsg> onDownlink, |
82 | Consumer<Exception> onError) { | 72 | Consumer<Exception> onError) { |
83 | NettyChannelBuilder builder = NettyChannelBuilder.forAddress(rpcHost, rpcPort).usePlaintext(); | 73 | NettyChannelBuilder builder = NettyChannelBuilder.forAddress(rpcHost, rpcPort).usePlaintext(); |
@@ -92,7 +82,7 @@ public class EdgeGrpcClient implements EdgeRpcClient { | @@ -92,7 +82,7 @@ public class EdgeGrpcClient implements EdgeRpcClient { | ||
92 | channel = builder.build(); | 82 | channel = builder.build(); |
93 | EdgeRpcServiceGrpc.EdgeRpcServiceStub stub = EdgeRpcServiceGrpc.newStub(channel); | 83 | EdgeRpcServiceGrpc.EdgeRpcServiceStub stub = EdgeRpcServiceGrpc.newStub(channel); |
94 | log.info("[{}] Sending a connect request to the TB!", edgeKey); | 84 | log.info("[{}] Sending a connect request to the TB!", edgeKey); |
95 | - this.inputStream = stub.handleMsgs(initOutputStream(edgeKey, onUplinkResponse, onEdgeUpdate, onDeviceUpdate, onAssetUpdate, onEntityViewUpdate, onRuleChainUpdate, onRuleChainMetadataUpdate, onDashboardUpdate, onDownlink, onError)); | 85 | + this.inputStream = stub.handleMsgs(initOutputStream(edgeKey, onUplinkResponse, onEdgeUpdate, onEntityUpdate, onDownlink, onError)); |
96 | this.inputStream.onNext(RequestMsg.newBuilder() | 86 | this.inputStream.onNext(RequestMsg.newBuilder() |
97 | .setMsgType(RequestMsgType.CONNECT_RPC_MESSAGE) | 87 | .setMsgType(RequestMsgType.CONNECT_RPC_MESSAGE) |
98 | .setConnectRequestMsg(ConnectRequestMsg.newBuilder().setEdgeRoutingKey(edgeKey).setEdgeSecret(edgeSecret).build()) | 88 | .setConnectRequestMsg(ConnectRequestMsg.newBuilder().setEdgeRoutingKey(edgeKey).setEdgeSecret(edgeSecret).build()) |
@@ -118,12 +108,7 @@ public class EdgeGrpcClient implements EdgeRpcClient { | @@ -118,12 +108,7 @@ public class EdgeGrpcClient implements EdgeRpcClient { | ||
118 | private StreamObserver<ResponseMsg> initOutputStream(String edgeKey, | 108 | private StreamObserver<ResponseMsg> initOutputStream(String edgeKey, |
119 | Consumer<UplinkResponseMsg> onUplinkResponse, | 109 | Consumer<UplinkResponseMsg> onUplinkResponse, |
120 | Consumer<EdgeConfiguration> onEdgeUpdate, | 110 | Consumer<EdgeConfiguration> onEdgeUpdate, |
121 | - Consumer<DeviceUpdateMsg> onDeviceUpdate, | ||
122 | - Consumer<AssetUpdateMsg> onAssetUpdate, | ||
123 | - Consumer<EntityViewUpdateMsg> onEntityViewUpdate, | ||
124 | - Consumer<RuleChainUpdateMsg> onRuleChainUpdate, | ||
125 | - Consumer<RuleChainMetadataUpdateMsg> onRuleChainMetadataUpdate, | ||
126 | - Consumer<DashboardUpdateMsg> onDashboardUpdate, | 111 | + Consumer<EntityUpdateMsg> onEntityUpdate, |
127 | Consumer<DownlinkMsg> onDownlink, | 112 | Consumer<DownlinkMsg> onDownlink, |
128 | Consumer<Exception> onError) { | 113 | Consumer<Exception> onError) { |
129 | return new StreamObserver<ResponseMsg>() { | 114 | return new StreamObserver<ResponseMsg>() { |
@@ -141,24 +126,9 @@ public class EdgeGrpcClient implements EdgeRpcClient { | @@ -141,24 +126,9 @@ public class EdgeGrpcClient implements EdgeRpcClient { | ||
141 | } else if (responseMsg.hasUplinkResponseMsg()) { | 126 | } else if (responseMsg.hasUplinkResponseMsg()) { |
142 | log.debug("[{}] Uplink response message received {}", edgeKey, responseMsg.getUplinkResponseMsg()); | 127 | log.debug("[{}] Uplink response message received {}", edgeKey, responseMsg.getUplinkResponseMsg()); |
143 | onUplinkResponse.accept(responseMsg.getUplinkResponseMsg()); | 128 | onUplinkResponse.accept(responseMsg.getUplinkResponseMsg()); |
144 | - } else if (responseMsg.hasDeviceUpdateMsg()) { | ||
145 | - log.debug("[{}] Device update message received {}", edgeKey, responseMsg.getDeviceUpdateMsg()); | ||
146 | - onDeviceUpdate.accept(responseMsg.getDeviceUpdateMsg()); | ||
147 | - } else if (responseMsg.hasAssetUpdateMsg()) { | ||
148 | - log.debug("[{}] Asset update message received {}", edgeKey, responseMsg.getAssetUpdateMsg()); | ||
149 | - onAssetUpdate.accept(responseMsg.getAssetUpdateMsg()); | ||
150 | - } else if (responseMsg.hasEntityViewUpdateMsg()) { | ||
151 | - log.debug("[{}] EntityView update message received {}", edgeKey, responseMsg.getEntityViewUpdateMsg()); | ||
152 | - onEntityViewUpdate.accept(responseMsg.getEntityViewUpdateMsg()); | ||
153 | - } else if (responseMsg.hasRuleChainUpdateMsg()) { | ||
154 | - log.debug("[{}] Rule Chain udpate message received {}", edgeKey, responseMsg.getRuleChainUpdateMsg()); | ||
155 | - onRuleChainUpdate.accept(responseMsg.getRuleChainUpdateMsg()); | ||
156 | - } else if (responseMsg.hasRuleChainMetadataUpdateMsg()) { | ||
157 | - log.debug("[{}] Rule Chain Metadata udpate message received {}", edgeKey, responseMsg.getRuleChainMetadataUpdateMsg()); | ||
158 | - onRuleChainMetadataUpdate.accept(responseMsg.getRuleChainMetadataUpdateMsg()); | ||
159 | - } else if (responseMsg.hasDashboardUpdateMsg()) { | ||
160 | - log.debug("[{}] Dashboard message received {}", edgeKey, responseMsg.getDashboardUpdateMsg()); | ||
161 | - onDashboardUpdate.accept(responseMsg.getDashboardUpdateMsg()); | 129 | + } else if (responseMsg.hasEntityUpdateMsg()) { |
130 | + log.debug("[{}] Entity update message received {}", edgeKey, responseMsg.getEntityUpdateMsg()); | ||
131 | + onEntityUpdate.accept(responseMsg.getEntityUpdateMsg()); | ||
162 | } else if (responseMsg.hasDownlinkMsg()) { | 132 | } else if (responseMsg.hasDownlinkMsg()) { |
163 | log.debug("[{}] Downlink message received for rule chain {}", edgeKey, responseMsg.getDownlinkMsg()); | 133 | log.debug("[{}] Downlink message received for rule chain {}", edgeKey, responseMsg.getDownlinkMsg()); |
164 | onDownlink.accept(responseMsg.getDownlinkMsg()); | 134 | onDownlink.accept(responseMsg.getDownlinkMsg()); |
@@ -15,14 +15,9 @@ | @@ -15,14 +15,9 @@ | ||
15 | */ | 15 | */ |
16 | package org.thingsboard.edge.rpc; | 16 | package org.thingsboard.edge.rpc; |
17 | 17 | ||
18 | -import org.thingsboard.server.gen.edge.AssetUpdateMsg; | ||
19 | -import org.thingsboard.server.gen.edge.DashboardUpdateMsg; | ||
20 | -import org.thingsboard.server.gen.edge.DeviceUpdateMsg; | ||
21 | import org.thingsboard.server.gen.edge.DownlinkMsg; | 18 | import org.thingsboard.server.gen.edge.DownlinkMsg; |
22 | import org.thingsboard.server.gen.edge.EdgeConfiguration; | 19 | import org.thingsboard.server.gen.edge.EdgeConfiguration; |
23 | -import org.thingsboard.server.gen.edge.EntityViewUpdateMsg; | ||
24 | -import org.thingsboard.server.gen.edge.RuleChainMetadataUpdateMsg; | ||
25 | -import org.thingsboard.server.gen.edge.RuleChainUpdateMsg; | 20 | +import org.thingsboard.server.gen.edge.EntityUpdateMsg; |
26 | import org.thingsboard.server.gen.edge.UplinkMsg; | 21 | import org.thingsboard.server.gen.edge.UplinkMsg; |
27 | import org.thingsboard.server.gen.edge.UplinkResponseMsg; | 22 | import org.thingsboard.server.gen.edge.UplinkResponseMsg; |
28 | 23 | ||
@@ -34,12 +29,7 @@ public interface EdgeRpcClient { | @@ -34,12 +29,7 @@ public interface EdgeRpcClient { | ||
34 | String integrationSecret, | 29 | String integrationSecret, |
35 | Consumer<UplinkResponseMsg> onUplinkResponse, | 30 | Consumer<UplinkResponseMsg> onUplinkResponse, |
36 | Consumer<EdgeConfiguration> onEdgeUpdate, | 31 | Consumer<EdgeConfiguration> onEdgeUpdate, |
37 | - Consumer<DeviceUpdateMsg> onDeviceUpdate, | ||
38 | - Consumer<AssetUpdateMsg> onAssetUpdate, | ||
39 | - Consumer<EntityViewUpdateMsg> onEntityViewUpdate, | ||
40 | - Consumer<RuleChainUpdateMsg> onRuleChainUpdate, | ||
41 | - Consumer<RuleChainMetadataUpdateMsg> onRuleChainMetadataUpdate, | ||
42 | - Consumer<DashboardUpdateMsg> onDashboardUpdate, | 32 | + Consumer<EntityUpdateMsg> onEntityUpdate, |
43 | Consumer<DownlinkMsg> onDownlink, | 33 | Consumer<DownlinkMsg> onDownlink, |
44 | Consumer<Exception> onError); | 34 | Consumer<Exception> onError); |
45 | 35 |
@@ -34,26 +34,29 @@ service EdgeRpcService { | @@ -34,26 +34,29 @@ service EdgeRpcService { | ||
34 | message RequestMsg { | 34 | message RequestMsg { |
35 | RequestMsgType msgType = 1; | 35 | RequestMsgType msgType = 1; |
36 | ConnectRequestMsg connectRequestMsg = 2; | 36 | ConnectRequestMsg connectRequestMsg = 2; |
37 | - DeviceUpdateMsg deviceUpdateMsg = 3; | ||
38 | - UplinkMsg uplinkMsg = 4; | 37 | + UplinkMsg uplinkMsg = 3; |
39 | } | 38 | } |
40 | 39 | ||
41 | message ResponseMsg { | 40 | message ResponseMsg { |
42 | ConnectResponseMsg connectResponseMsg = 1; | 41 | ConnectResponseMsg connectResponseMsg = 1; |
43 | UplinkResponseMsg uplinkResponseMsg = 2; | 42 | UplinkResponseMsg uplinkResponseMsg = 2; |
44 | - DeviceUpdateMsg deviceUpdateMsg = 3; | ||
45 | - RuleChainUpdateMsg ruleChainUpdateMsg = 4; | ||
46 | - RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg = 5; | ||
47 | - DashboardUpdateMsg dashboardUpdateMsg = 6; | ||
48 | - AssetUpdateMsg assetUpdateMsg = 7; | ||
49 | - EntityViewUpdateMsg entityViewUpdateMsg = 8; | ||
50 | - DownlinkMsg downlinkMsg = 9; | 43 | + EntityUpdateMsg entityUpdateMsg = 3; |
44 | + DownlinkMsg downlinkMsg = 4; | ||
45 | +} | ||
46 | + | ||
47 | +message EntityUpdateMsg { | ||
48 | + DeviceUpdateMsg deviceUpdateMsg = 1; | ||
49 | + RuleChainUpdateMsg ruleChainUpdateMsg = 2; | ||
50 | + RuleChainMetadataUpdateMsg ruleChainMetadataUpdateMsg = 3; | ||
51 | + DashboardUpdateMsg dashboardUpdateMsg = 4; | ||
52 | + AssetUpdateMsg assetUpdateMsg = 5; | ||
53 | + EntityViewUpdateMsg entityViewUpdateMsg = 6; | ||
54 | + AlarmUpdateMsg alarmUpdateMsg = 7; | ||
51 | } | 55 | } |
52 | 56 | ||
53 | enum RequestMsgType { | 57 | enum RequestMsgType { |
54 | CONNECT_RPC_MESSAGE = 0; | 58 | CONNECT_RPC_MESSAGE = 0; |
55 | UPLINK_RPC_MESSAGE = 1; | 59 | UPLINK_RPC_MESSAGE = 1; |
56 | - DEVICE_UPDATE_RPC_MESSAGE = 2; | ||
57 | } | 60 | } |
58 | 61 | ||
59 | message ConnectRequestMsg { | 62 | message ConnectRequestMsg { |
@@ -85,7 +88,9 @@ enum UpdateMsgType { | @@ -85,7 +88,9 @@ enum UpdateMsgType { | ||
85 | ENTITY_CREATED_RPC_MESSAGE = 0; | 88 | ENTITY_CREATED_RPC_MESSAGE = 0; |
86 | ENTITY_UPDATED_RPC_MESSAGE = 1; | 89 | ENTITY_UPDATED_RPC_MESSAGE = 1; |
87 | ENTITY_DELETED_RPC_MESSAGE = 2; | 90 | ENTITY_DELETED_RPC_MESSAGE = 2; |
88 | - RULE_CHAIN_CUSTOM_MESSAGE = 3; | 91 | + ALARM_ACK_RPC_MESSAGE = 3; |
92 | + ALARM_CLEARK_RPC_MESSAGE = 4; | ||
93 | + RULE_CHAIN_CUSTOM_MESSAGE = 5; | ||
89 | } | 94 | } |
90 | 95 | ||
91 | message EntityDataProto { | 96 | message EntityDataProto { |
@@ -166,6 +171,22 @@ message EntityViewUpdateMsg { | @@ -166,6 +171,22 @@ message EntityViewUpdateMsg { | ||
166 | EntityType relatedEntityType = 6; | 171 | EntityType relatedEntityType = 6; |
167 | } | 172 | } |
168 | 173 | ||
174 | +message AlarmUpdateMsg { | ||
175 | + UpdateMsgType msgType = 1; | ||
176 | + string name = 2; | ||
177 | + string type = 3; | ||
178 | + string originatorType = 4; | ||
179 | + string originatorName = 5; | ||
180 | + string severity = 6; | ||
181 | + string status = 7; | ||
182 | + int64 startTs = 8; | ||
183 | + int64 endTs = 9; | ||
184 | + int64 ackTs = 10; | ||
185 | + int64 clearTs = 11; | ||
186 | + string details = 12; | ||
187 | + bool propagate = 13; | ||
188 | +} | ||
189 | + | ||
169 | enum EntityType { | 190 | enum EntityType { |
170 | DEVICE = 0; | 191 | DEVICE = 0; |
171 | ASSET = 1; | 192 | ASSET = 1; |
@@ -178,6 +199,8 @@ enum EntityType { | @@ -178,6 +199,8 @@ enum EntityType { | ||
178 | message UplinkMsg { | 199 | message UplinkMsg { |
179 | int32 uplinkMsgId = 1; | 200 | int32 uplinkMsgId = 1; |
180 | repeated EntityDataProto entityData = 2; | 201 | repeated EntityDataProto entityData = 2; |
202 | + repeated DeviceUpdateMsg deviceUpdateMsg = 3; | ||
203 | + repeated AlarmUpdateMsg alarmUpdatemsg = 4; | ||
181 | } | 204 | } |
182 | 205 | ||
183 | message UplinkResponseMsg { | 206 | message UplinkResponseMsg { |
@@ -37,6 +37,7 @@ import org.thingsboard.server.common.data.EntityView; | @@ -37,6 +37,7 @@ import org.thingsboard.server.common.data.EntityView; | ||
37 | import org.thingsboard.server.common.data.Event; | 37 | import org.thingsboard.server.common.data.Event; |
38 | import org.thingsboard.server.common.data.ShortEdgeInfo; | 38 | import org.thingsboard.server.common.data.ShortEdgeInfo; |
39 | import org.thingsboard.server.common.data.Tenant; | 39 | import org.thingsboard.server.common.data.Tenant; |
40 | +import org.thingsboard.server.common.data.alarm.Alarm; | ||
40 | import org.thingsboard.server.common.data.asset.Asset; | 41 | import org.thingsboard.server.common.data.asset.Asset; |
41 | import org.thingsboard.server.common.data.edge.Edge; | 42 | import org.thingsboard.server.common.data.edge.Edge; |
42 | import org.thingsboard.server.common.data.edge.EdgeQueueEntityType; | 43 | import org.thingsboard.server.common.data.edge.EdgeQueueEntityType; |
@@ -151,7 +152,6 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic | @@ -151,7 +152,6 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic | ||
151 | } | 152 | } |
152 | } | 153 | } |
153 | 154 | ||
154 | - | ||
155 | @Override | 155 | @Override |
156 | public Edge findEdgeById(TenantId tenantId, EdgeId edgeId) { | 156 | public Edge findEdgeById(TenantId tenantId, EdgeId edgeId) { |
157 | log.trace("Executing findEdgeById [{}]", edgeId); | 157 | log.trace("Executing findEdgeById [{}]", edgeId); |
@@ -349,6 +349,9 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic | @@ -349,6 +349,9 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic | ||
349 | } else { | 349 | } else { |
350 | try { | 350 | try { |
351 | switch (tbMsg.getOriginator().getEntityType()) { | 351 | switch (tbMsg.getOriginator().getEntityType()) { |
352 | + case EDGE: | ||
353 | + processEdge(tenantId, tbMsg, callback); | ||
354 | + break; | ||
352 | case ASSET: | 355 | case ASSET: |
353 | processAsset(tenantId, tbMsg, callback); | 356 | processAsset(tenantId, tbMsg, callback); |
354 | break; | 357 | break; |
@@ -364,6 +367,9 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic | @@ -364,6 +367,9 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic | ||
364 | case ENTITY_VIEW: | 367 | case ENTITY_VIEW: |
365 | processEntityView(tenantId, tbMsg, callback); | 368 | processEntityView(tenantId, tbMsg, callback); |
366 | break; | 369 | break; |
370 | + case ALARM: | ||
371 | + processAlarm(tenantId, tbMsg, callback); | ||
372 | + break; | ||
367 | default: | 373 | default: |
368 | log.debug("Entity type [{}] is not designed to be pushed to edge", tbMsg.getOriginator().getEntityType()); | 374 | log.debug("Entity type [{}] is not designed to be pushed to edge", tbMsg.getOriginator().getEntityType()); |
369 | } | 375 | } |
@@ -374,26 +380,9 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic | @@ -374,26 +380,9 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic | ||
374 | } | 380 | } |
375 | 381 | ||
376 | private void processCustomTbMsg(TenantId tenantId, TbMsg tbMsg, FutureCallback<Void> callback) { | 382 | private void processCustomTbMsg(TenantId tenantId, TbMsg tbMsg, FutureCallback<Void> callback) { |
377 | - EdgeId edgeId = null; | ||
378 | - EdgeQueueEntityType edgeQueueEntityType = null; | ||
379 | - switch (tbMsg.getOriginator().getEntityType()) { | ||
380 | - case DEVICE: | ||
381 | - edgeQueueEntityType = EdgeQueueEntityType.DEVICE; | ||
382 | - Device device = deviceService.findDeviceById(tenantId, new DeviceId(tbMsg.getOriginator().getId())); | ||
383 | - edgeId = device.getEdgeId(); | ||
384 | - break; | ||
385 | - case ASSET: | ||
386 | - edgeQueueEntityType = EdgeQueueEntityType.ASSET; | ||
387 | - Asset asset = assetService.findAssetById(tenantId, new AssetId(tbMsg.getOriginator().getId())); | ||
388 | - edgeId = asset.getEdgeId(); | ||
389 | - break; | ||
390 | - case ENTITY_VIEW: | ||
391 | - edgeQueueEntityType = EdgeQueueEntityType.ENTITY_VIEW; | ||
392 | - EntityView entityView = entityViewService.findEntityViewById(tenantId, new EntityViewId(tbMsg.getOriginator().getId())); | ||
393 | - edgeId = entityView.getEdgeId(); | ||
394 | - break; | ||
395 | - } | ||
396 | - if (edgeId != null) { | 383 | + EdgeId edgeId = getEdgeIdByOriginatorId(tenantId, tbMsg.getOriginator()); |
384 | + EdgeQueueEntityType edgeQueueEntityType = getEdgeQueueTypeByEntityType(tbMsg.getOriginator().getEntityType()); | ||
385 | + if (edgeId != null && edgeQueueEntityType != null) { | ||
397 | try { | 386 | try { |
398 | saveEventToEdgeQueue(tenantId, edgeId, edgeQueueEntityType, tbMsg.getType(), mapper.writeValueAsString(tbMsg), callback); | 387 | saveEventToEdgeQueue(tenantId, edgeId, edgeQueueEntityType, tbMsg.getType(), mapper.writeValueAsString(tbMsg), callback); |
399 | } catch (IOException e) { | 388 | } catch (IOException e) { |
@@ -402,6 +391,37 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic | @@ -402,6 +391,37 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic | ||
402 | } | 391 | } |
403 | } | 392 | } |
404 | 393 | ||
394 | + private EdgeQueueEntityType getEdgeQueueTypeByEntityType(EntityType entityType) { | ||
395 | + switch (entityType) { | ||
396 | + case DEVICE: | ||
397 | + return EdgeQueueEntityType.DEVICE; | ||
398 | + case ASSET: | ||
399 | + return EdgeQueueEntityType.ASSET; | ||
400 | + case ENTITY_VIEW: | ||
401 | + return EdgeQueueEntityType.ENTITY_VIEW; | ||
402 | + default: | ||
403 | + log.info("Unsupported entity type: [{}]", entityType); | ||
404 | + return null; | ||
405 | + } | ||
406 | + } | ||
407 | + | ||
408 | + private EdgeId getEdgeIdByOriginatorId(TenantId tenantId, EntityId originatorId) { | ||
409 | + switch (originatorId.getEntityType()) { | ||
410 | + case DEVICE: | ||
411 | + Device device = deviceService.findDeviceById(tenantId, new DeviceId(originatorId.getId())); | ||
412 | + return device.getEdgeId(); | ||
413 | + case ASSET: | ||
414 | + Asset asset = assetService.findAssetById(tenantId, new AssetId(originatorId.getId())); | ||
415 | + return asset.getEdgeId(); | ||
416 | + case ENTITY_VIEW: | ||
417 | + EntityView entityView = entityViewService.findEntityViewById(tenantId, new EntityViewId(originatorId.getId())); | ||
418 | + return entityView.getEdgeId(); | ||
419 | + default: | ||
420 | + log.info("Unsupported entity type: [{}]", originatorId.getEntityType()); | ||
421 | + return null; | ||
422 | + } | ||
423 | + } | ||
424 | + | ||
405 | private void processDevice(TenantId tenantId, TbMsg tbMsg, FutureCallback<Void> callback) throws IOException { | 425 | private void processDevice(TenantId tenantId, TbMsg tbMsg, FutureCallback<Void> callback) throws IOException { |
406 | switch (tbMsg.getType()) { | 426 | switch (tbMsg.getType()) { |
407 | case DataConstants.ENTITY_ASSIGNED_TO_EDGE: | 427 | case DataConstants.ENTITY_ASSIGNED_TO_EDGE: |
@@ -421,6 +441,21 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic | @@ -421,6 +441,21 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic | ||
421 | } | 441 | } |
422 | } | 442 | } |
423 | 443 | ||
444 | + private void processEdge(TenantId tenantId, TbMsg tbMsg, FutureCallback<Void> callback) throws IOException { | ||
445 | + switch (tbMsg.getType()) { | ||
446 | + case DataConstants.ENTITY_DELETED: | ||
447 | + case DataConstants.ENTITY_CREATED: | ||
448 | + case DataConstants.ENTITY_UPDATED: | ||
449 | + Edge edge = mapper.readValue(tbMsg.getData(), Edge.class); | ||
450 | + if (edge != null) { | ||
451 | + pushEventToEdge(tenantId, edge.getId(), EdgeQueueEntityType.EDGE, tbMsg, callback); | ||
452 | + } | ||
453 | + break; | ||
454 | + default: | ||
455 | + log.warn("Unsupported msgType [{}], tbMsg [{}]", tbMsg.getType(), tbMsg); | ||
456 | + } | ||
457 | + } | ||
458 | + | ||
424 | private void processAsset(TenantId tenantId, TbMsg tbMsg, FutureCallback<Void> callback) throws IOException { | 459 | private void processAsset(TenantId tenantId, TbMsg tbMsg, FutureCallback<Void> callback) throws IOException { |
425 | switch (tbMsg.getType()) { | 460 | switch (tbMsg.getType()) { |
426 | case DataConstants.ENTITY_ASSIGNED_TO_EDGE: | 461 | case DataConstants.ENTITY_ASSIGNED_TO_EDGE: |
@@ -459,6 +494,25 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic | @@ -459,6 +494,25 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic | ||
459 | } | 494 | } |
460 | } | 495 | } |
461 | 496 | ||
497 | + private void processAlarm(TenantId tenantId, TbMsg tbMsg, FutureCallback<Void> callback) throws IOException { | ||
498 | + switch (tbMsg.getType()) { | ||
499 | + case DataConstants.ENTITY_DELETED: | ||
500 | + case DataConstants.ENTITY_CREATED: | ||
501 | + case DataConstants.ENTITY_UPDATED: | ||
502 | + case DataConstants.ALARM_ACK: | ||
503 | + case DataConstants.ALARM_CLEAR: | ||
504 | + Alarm alarm = mapper.readValue(tbMsg.getData(), Alarm.class); | ||
505 | + EdgeId edgeId = getEdgeIdByOriginatorId(tenantId, alarm.getOriginator()); | ||
506 | + EdgeQueueEntityType edgeQueueEntityType = getEdgeQueueTypeByEntityType(alarm.getOriginator().getEntityType()); | ||
507 | + if (edgeId != null && edgeQueueEntityType != null) { | ||
508 | + pushEventToEdge(tenantId, edgeId, EdgeQueueEntityType.ALARM, tbMsg, callback); | ||
509 | + } | ||
510 | + break; | ||
511 | + default: | ||
512 | + log.warn("Unsupported msgType [{}], tbMsg [{}]", tbMsg.getType(), tbMsg); | ||
513 | + } | ||
514 | + } | ||
515 | + | ||
462 | private void processDashboard(TenantId tenantId, TbMsg tbMsg, FutureCallback<Void> callback) throws IOException { | 516 | private void processDashboard(TenantId tenantId, TbMsg tbMsg, FutureCallback<Void> callback) throws IOException { |
463 | processAssignedEntity(tenantId, tbMsg, EdgeQueueEntityType.DASHBOARD, callback); | 517 | processAssignedEntity(tenantId, tbMsg, EdgeQueueEntityType.DASHBOARD, callback); |
464 | } | 518 | } |
@@ -562,8 +616,8 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic | @@ -562,8 +616,8 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic | ||
562 | @Override | 616 | @Override |
563 | public Edge setRootRuleChain(TenantId tenantId, Edge edge, RuleChainId ruleChainId) throws IOException { | 617 | public Edge setRootRuleChain(TenantId tenantId, Edge edge, RuleChainId ruleChainId) throws IOException { |
564 | edge.setRootRuleChainId(ruleChainId); | 618 | edge.setRootRuleChainId(ruleChainId); |
565 | - Edge saveEdge = saveEdge(edge); | ||
566 | - ruleChainService.updateEdgeRuleChains(tenantId, saveEdge.getId()); | 619 | + Edge savedEdge = saveEdge(edge); |
620 | + ruleChainService.updateEdgeRuleChains(tenantId, savedEdge.getId()); | ||
567 | RuleChain ruleChain = ruleChainService.findRuleChainById(tenantId, ruleChainId); | 621 | RuleChain ruleChain = ruleChainService.findRuleChainById(tenantId, ruleChainId); |
568 | saveEventToEdgeQueue(tenantId, edge.getId(), EdgeQueueEntityType.RULE_CHAIN, DataConstants.ENTITY_UPDATED, mapper.writeValueAsString(ruleChain), new FutureCallback<Void>() { | 622 | saveEventToEdgeQueue(tenantId, edge.getId(), EdgeQueueEntityType.RULE_CHAIN, DataConstants.ENTITY_UPDATED, mapper.writeValueAsString(ruleChain), new FutureCallback<Void>() { |
569 | @Override | 623 | @Override |
@@ -576,7 +630,7 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic | @@ -576,7 +630,7 @@ public class BaseEdgeService extends AbstractEntityService implements EdgeServic | ||
576 | log.debug("Failure during event save", t); | 630 | log.debug("Failure during event save", t); |
577 | } | 631 | } |
578 | }); | 632 | }); |
579 | - return saveEdge; | 633 | + return savedEdge; |
580 | } | 634 | } |
581 | 635 | ||
582 | private DataValidator<Edge> edgeValidator = | 636 | private DataValidator<Edge> edgeValidator = |