Commit e04221b6e2f3adaceec15d5fbbb27f50e4563f79

Authored by 芯火源
1 parent 6688e6c4

fix(DEFECT-1234): 给网关子设备下发RPC指令

1、给子设备下发RPC指令时,自动转向网关
2、RPC记录挂载到网关子设备
@@ -58,6 +58,7 @@ import org.thingsboard.server.common.data.rpc.RpcStatus; @@ -58,6 +58,7 @@ import org.thingsboard.server.common.data.rpc.RpcStatus;
58 import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody; 58 import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody;
59 import org.thingsboard.server.common.data.security.DeviceCredentials; 59 import org.thingsboard.server.common.data.security.DeviceCredentials;
60 import org.thingsboard.server.common.data.security.DeviceCredentialsType; 60 import org.thingsboard.server.common.data.security.DeviceCredentialsType;
  61 +import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
61 import org.thingsboard.server.common.data.yunteng.constant.ModelConstants; 62 import org.thingsboard.server.common.data.yunteng.constant.ModelConstants;
62 import org.thingsboard.server.common.data.yunteng.enums.CmdTypeEnum; 63 import org.thingsboard.server.common.data.yunteng.enums.CmdTypeEnum;
63 import org.thingsboard.server.common.msg.TbActorMsg; 64 import org.thingsboard.server.common.msg.TbActorMsg;
@@ -242,20 +243,26 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor { @@ -242,20 +243,26 @@ class DeviceActorMessageProcessor extends AbstractContextAwareMsgProcessor {
242 } 243 }
243 244
244 private Rpc createRpc(ToDeviceRpcRequest request, RpcStatus status) { 245 private Rpc createRpc(ToDeviceRpcRequest request, RpcStatus status) {
  246 + //Thingskit function
  247 + JsonNode old = JacksonUtil.toJsonNode(request.getAdditionalInfo());
  248 + ObjectNode additional = (old == null || old.isEmpty()) ?mapper.createObjectNode():(ObjectNode)old;
  249 + if(!additional.has(ModelConstants.TablePropertyMapping.COMMAND_TYPE)){
  250 + additional.put(ModelConstants.TablePropertyMapping.COMMAND_TYPE, CmdTypeEnum.DIY.ordinal());
  251 + }
  252 + DeviceId saveDeviceId = deviceId;
  253 + if(additional.has(FastIotConstants.Rpc.TARGET_ID)){
  254 + saveDeviceId = new DeviceId(UUID.fromString(additional.get(FastIotConstants.Rpc.TARGET_ID).asText()));
  255 + }
  256 +
245 Rpc rpc = new Rpc(new RpcId(request.getId())); 257 Rpc rpc = new Rpc(new RpcId(request.getId()));
246 rpc.setCreatedTime(System.currentTimeMillis()); 258 rpc.setCreatedTime(System.currentTimeMillis());
247 rpc.setTenantId(tenantId); 259 rpc.setTenantId(tenantId);
248 - rpc.setDeviceId(deviceId); 260 + rpc.setDeviceId(saveDeviceId);
249 rpc.setExpirationTime(request.getExpirationTime()); 261 rpc.setExpirationTime(request.getExpirationTime());
250 rpc.setRequest(JacksonUtil.valueToTree(request)); 262 rpc.setRequest(JacksonUtil.valueToTree(request));
251 rpc.setStatus(status); 263 rpc.setStatus(status);
252 rpc.setAdditionalInfo(JacksonUtil.toJsonNode(request.getAdditionalInfo())); 264 rpc.setAdditionalInfo(JacksonUtil.toJsonNode(request.getAdditionalInfo()));
253 - //Thingskit function  
254 - JsonNode old = JacksonUtil.toJsonNode(request.getAdditionalInfo());  
255 - ObjectNode additional = (old == null || old.isEmpty()) ?mapper.createObjectNode():(ObjectNode)old;  
256 - if(!additional.has(ModelConstants.TablePropertyMapping.COMMAND_TYPE)){  
257 - additional.put(ModelConstants.TablePropertyMapping.COMMAND_TYPE, CmdTypeEnum.DIY.ordinal());  
258 - } 265 +
259 rpc.setAdditionalInfo(additional); 266 rpc.setAdditionalInfo(additional);
260 267
261 return systemContext.getTbRpcService().save(tenantId, rpc); 268 return systemContext.getTbRpcService().save(tenantId, rpc);
@@ -16,7 +16,9 @@ @@ -16,7 +16,9 @@
16 package org.thingsboard.server.controller; 16 package org.thingsboard.server.controller;
17 17
18 import com.fasterxml.jackson.databind.JsonNode; 18 import com.fasterxml.jackson.databind.JsonNode;
  19 +import com.fasterxml.jackson.databind.node.ObjectNode;
19 import com.google.common.util.concurrent.FutureCallback; 20 import com.google.common.util.concurrent.FutureCallback;
  21 +import com.google.gson.JsonObject;
20 import lombok.extern.slf4j.Slf4j; 22 import lombok.extern.slf4j.Slf4j;
21 import org.springframework.beans.factory.annotation.Autowired; 23 import org.springframework.beans.factory.annotation.Autowired;
22 import org.springframework.beans.factory.annotation.Value; 24 import org.springframework.beans.factory.annotation.Value;
@@ -35,8 +37,14 @@ import org.thingsboard.server.common.data.id.TenantId; @@ -35,8 +37,14 @@ import org.thingsboard.server.common.data.id.TenantId;
35 import org.thingsboard.server.common.data.id.UUIDBased; 37 import org.thingsboard.server.common.data.id.UUIDBased;
36 import org.thingsboard.server.common.data.rpc.RpcError; 38 import org.thingsboard.server.common.data.rpc.RpcError;
37 import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody; 39 import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody;
  40 +import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
  41 +import org.thingsboard.server.common.data.yunteng.constant.ModelConstants;
  42 +import org.thingsboard.server.common.data.yunteng.dto.DeviceDTO;
  43 +import org.thingsboard.server.common.data.yunteng.enums.CmdTypeEnum;
  44 +import org.thingsboard.server.common.data.yunteng.enums.DeviceTypeEnum;
38 import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse; 45 import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse;
39 import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest; 46 import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest;
  47 +import org.thingsboard.server.dao.yunteng.service.TkDeviceService;
40 import org.thingsboard.server.queue.util.TbCoreComponent; 48 import org.thingsboard.server.queue.util.TbCoreComponent;
41 import org.thingsboard.server.service.rpc.LocalRequestMetaData; 49 import org.thingsboard.server.service.rpc.LocalRequestMetaData;
42 import org.thingsboard.server.service.rpc.TbCoreDeviceRpcService; 50 import org.thingsboard.server.service.rpc.TbCoreDeviceRpcService;
@@ -62,6 +70,10 @@ public abstract class AbstractRpcController extends BaseController { @@ -62,6 +70,10 @@ public abstract class AbstractRpcController extends BaseController {
62 @Autowired 70 @Autowired
63 protected AccessValidator accessValidator; 71 protected AccessValidator accessValidator;
64 72
  73 +
  74 + @Autowired
  75 + protected TkDeviceService tkDeviceService;
  76 +
65 @Value("${server.rest.server_side_rpc.min_timeout:5000}") 77 @Value("${server.rest.server_side_rpc.min_timeout:5000}")
66 protected long minTimeout; 78 protected long minTimeout;
67 79
@@ -79,14 +91,28 @@ public abstract class AbstractRpcController extends BaseController { @@ -79,14 +91,28 @@ public abstract class AbstractRpcController extends BaseController {
79 long expTime = rpcRequestBody.has(DataConstants.EXPIRATION_TIME) ? rpcRequestBody.get(DataConstants.EXPIRATION_TIME).asLong() : System.currentTimeMillis() + Math.max(minTimeout, timeout); 91 long expTime = rpcRequestBody.has(DataConstants.EXPIRATION_TIME) ? rpcRequestBody.get(DataConstants.EXPIRATION_TIME).asLong() : System.currentTimeMillis() + Math.max(minTimeout, timeout);
80 UUID rpcRequestUUID = rpcRequestBody.has("requestUUID") ? UUID.fromString(rpcRequestBody.get("requestUUID").asText()) : UUID.randomUUID(); 92 UUID rpcRequestUUID = rpcRequestBody.has("requestUUID") ? UUID.fromString(rpcRequestBody.get("requestUUID").asText()) : UUID.randomUUID();
81 boolean persisted = rpcRequestBody.has(DataConstants.PERSISTENT) && rpcRequestBody.get(DataConstants.PERSISTENT).asBoolean(); 93 boolean persisted = rpcRequestBody.has(DataConstants.PERSISTENT) && rpcRequestBody.get(DataConstants.PERSISTENT).asBoolean();
82 - String additionalInfo = JacksonUtil.toString(rpcRequestBody.get(DataConstants.ADDITIONAL_INFO)); 94 +
  95 +
  96 + //Thingskit function
  97 + DeviceDTO tkDevice = tkDeviceService.findDeviceInfoByTbDeviceId(currentUser.getCurrentTenantId(), deviceId.getId().toString());
  98 + ObjectNode additional = (ObjectNode) rpcRequestBody.get(DataConstants.ADDITIONAL_INFO);
  99 + if(additional == null){
  100 + additional = JacksonUtil.newObjectNode();
  101 + }
  102 + if(!additional.has(FastIotConstants.Rpc.TARGET_ID)){
  103 + additional.put(FastIotConstants.Rpc.TARGET_ID, deviceId.getId().toString());
  104 + }
  105 + DeviceId realDevice = DeviceTypeEnum.SENSOR == tkDevice.getDeviceType()?new DeviceId(UUID.fromString(tkDevice.getGatewayId())):deviceId;
  106 + String additionalInfo = JacksonUtil.toString(additional);
  107 +
83 Integer retries = rpcRequestBody.has(DataConstants.RETRIES) ? rpcRequestBody.get(DataConstants.RETRIES).asInt() : null; 108 Integer retries = rpcRequestBody.has(DataConstants.RETRIES) ? rpcRequestBody.get(DataConstants.RETRIES).asInt() : null;
84 - accessValidator.validate(currentUser, Operation.RPC_CALL, deviceId, new HttpValidationCallback(response, new FutureCallback<>() { 109 + accessValidator.validate(currentUser, Operation.RPC_CALL, realDevice, new HttpValidationCallback(response, new FutureCallback<>() {
85 @Override 110 @Override
86 public void onSuccess(@Nullable DeferredResult<ResponseEntity> result) { 111 public void onSuccess(@Nullable DeferredResult<ResponseEntity> result) {
  112 +
87 ToDeviceRpcRequest rpcRequest = new ToDeviceRpcRequest(rpcRequestUUID, 113 ToDeviceRpcRequest rpcRequest = new ToDeviceRpcRequest(rpcRequestUUID,
88 tenantId, 114 tenantId,
89 - deviceId, 115 + realDevice,
90 oneWay, 116 oneWay,
91 expTime, 117 expTime,
92 body, 118 body,
@@ -167,5 +167,7 @@ public interface FastIotConstants { @@ -167,5 +167,7 @@ public interface FastIotConstants {
167 public static String METHOD_NAME = "method"; 167 public static String METHOD_NAME = "method";
168 /**RPC参数*/ 168 /**RPC参数*/
169 public static String PARAMS_NAME = "params"; 169 public static String PARAMS_NAME = "params";
  170 + /**实控设备*/
  171 + public static String TARGET_ID = "target";
170 } 172 }
171 } 173 }