From a7aaeabc7873a0eafb4a7ecad7f65b018b7a9bc9 Mon Sep 17 00:00:00 2001
From: sean.zhou <sean.zhou@dji.com>
Date: Fri, 24 Feb 2023 19:31:23 +0800
Subject: [PATCH] What's new? 1. Add license for dock. 2. Modify the logic corresponding to the firmware file and device type. 3. Add multiple mqtt clients options. 4. Modify the structure of the interface for obtaining the device list. 5. Fixed some issues.

---
 src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java |   65 +++++++++++++++++++++-----------
 1 files changed, 42 insertions(+), 23 deletions(-)

diff --git a/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java b/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
index 2b0bbf4..beb1e29 100644
--- a/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
+++ b/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
@@ -1,5 +1,6 @@
 package com.dji.sample.control.service.impl;
 
+import com.dji.sample.common.error.CommonErrorEnum;
 import com.dji.sample.common.model.ResponseResult;
 import com.dji.sample.component.mqtt.model.*;
 import com.dji.sample.component.mqtt.service.IMessageSenderService;
@@ -8,9 +9,13 @@
 import com.dji.sample.component.websocket.model.CustomWebSocketMessage;
 import com.dji.sample.component.websocket.service.ISendMessageService;
 import com.dji.sample.component.websocket.service.IWebSocketManageService;
+import com.dji.sample.control.model.enums.RemoteControlMethodEnum;
+import com.dji.sample.control.model.param.RemoteDebugParam;
 import com.dji.sample.control.service.IControlService;
 import com.dji.sample.manage.model.dto.DeviceDTO;
 import com.dji.sample.manage.model.enums.UserTypeEnum;
+import com.dji.sample.manage.model.receiver.BasicDeviceProperty;
+import com.dji.sample.manage.service.IDeviceService;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.extern.slf4j.Slf4j;
@@ -20,7 +25,7 @@
 import org.springframework.messaging.MessageHeaders;
 import org.springframework.stereotype.Service;
 
-import java.util.Optional;
+import java.util.Objects;
 import java.util.UUID;
 
 /**
@@ -33,9 +38,6 @@
 public class ControlServiceImpl implements IControlService {
 
     @Autowired
-    private RedisOpsUtils redisOps;
-
-    @Autowired
     private IMessageSenderService messageSenderService;
 
     @Autowired
@@ -45,38 +47,55 @@
     private IWebSocketManageService webSocketManageService;
 
     @Autowired
+    private IDeviceService deviceService;
+
+    @Autowired
     private ObjectMapper mapper;
 
     @Override
-    public ResponseResult controlDock(String sn, String serviceIdentifier) {
-        ServicesMethodEnum servicesMethodEnum = ServicesMethodEnum.find(serviceIdentifier);
-        if (servicesMethodEnum == ServicesMethodEnum.UNKNOWN) {
+    public ResponseResult controlDock(String sn, String serviceIdentifier, RemoteDebugParam param) {
+        RemoteControlMethodEnum controlMethodEnum = RemoteControlMethodEnum.find(serviceIdentifier);
+        if (RemoteControlMethodEnum.UNKNOWN == controlMethodEnum) {
             return ResponseResult.error("The " + serviceIdentifier + " method does not exist.");
         }
-        boolean isExist = redisOps.getExpire(RedisConst.DEVICE_ONLINE_PREFIX + sn) > 0;
+
+        Object data = "";
+        // Add parameter validation.
+        if (Objects.nonNull(controlMethodEnum.getClazz())) {
+            if (Objects.isNull(param)) {
+                return ResponseResult.error(CommonErrorEnum.ILLEGAL_ARGUMENT);
+            }
+            BasicDeviceProperty basicDeviceProperty = mapper.convertValue(param.getAction(), controlMethodEnum.getClazz());
+            if (!basicDeviceProperty.valid()) {
+                return ResponseResult.error(CommonErrorEnum.ILLEGAL_ARGUMENT);
+            }
+            data = basicDeviceProperty;
+        }
+
+        boolean isExist = deviceService.checkDeviceOnline(sn);
         if (!isExist) {
             return ResponseResult.error("The dock is offline.");
         }
         String topic = TopicConst.THING_MODEL_PRE + TopicConst.PRODUCT + sn + TopicConst.SERVICES_SUF;
         String bid = UUID.randomUUID().toString();
-        Optional<ServiceReply> serviceReplyOpt = messageSenderService.publishWithReply(
+        ServiceReply serviceReplyOpt = messageSenderService.publishWithReply(
                 topic, CommonTopicResponse.builder()
                         .tid(UUID.randomUUID().toString())
                         .bid(bid)
                         .method(serviceIdentifier)
                         .timestamp(System.currentTimeMillis())
-                        .data("")
+                        .data(data)
                         .build());
-        if (serviceReplyOpt.isEmpty()) {
-            return ResponseResult.error("No message reply received.");
-        }
+
         ServiceReply<EventsOutputReceiver> serviceReply = mapper.convertValue(
-                serviceReplyOpt.get(), new TypeReference<ServiceReply<EventsOutputReceiver>>() {});
-        if (serviceReply.getResult() != ResponseResult.CODE_SUCCESS) {
-            return ResponseResult.error(serviceReply.getResult(), serviceReply.getOutput().getStatus());
+                serviceReplyOpt, new TypeReference<ServiceReply<EventsOutputReceiver>>() {});
+        if (ResponseResult.CODE_SUCCESS != serviceReply.getResult()) {
+            return ResponseResult.error(serviceReply.getResult(),
+                    Objects.nonNull(serviceReply.getOutput()) ? serviceReply.getOutput().getStatus()
+                            : "error: " + serviceIdentifier + serviceReply.getResult());
         }
-        if (servicesMethodEnum.getProgress()) {
-            redisOps.setWithExpire(serviceIdentifier + RedisConst.DELIMITER +  bid, sn,
+        if (controlMethodEnum.getProgress()) {
+            RedisOpsUtils.setWithExpire(serviceIdentifier + RedisConst.DELIMITER +  bid, sn,
                     RedisConst.DEVICE_ALIVE_SECOND * RedisConst.DEVICE_ALIVE_SECOND);
         }
         return ResponseResult.success();
@@ -86,10 +105,10 @@
     @ServiceActivator(inputChannel = ChannelName.INBOUND_EVENTS_CONTROL_PROGRESS, outputChannel = ChannelName.OUTBOUND)
     public void handleControlProgress(CommonTopicReceiver receiver, MessageHeaders headers) {
         String key = receiver.getMethod() + RedisConst.DELIMITER + receiver.getBid();
-        if (redisOps.getExpire(key) <= 0) {
+        if (RedisOpsUtils.getExpire(key) <= 0) {
             return;
         }
-        String sn = redisOps.get(key).toString();
+        String sn = RedisOpsUtils.get(key).toString();
 
         EventsReceiver<EventsOutputReceiver> eventsReceiver = mapper.convertValue(receiver.getData(),
                 new TypeReference<EventsReceiver<EventsOutputReceiver>>(){});
@@ -105,10 +124,10 @@
 
         if (eventsReceiver.getOutput().getProgress().getPercent() == 100 ||
                 EventsResultStatusEnum.find(eventsReceiver.getOutput().getStatus()).getEnd()) {
-            redisOps.del(key);
+            RedisOpsUtils.del(key);
         }
 
-        DeviceDTO device = (DeviceDTO) redisOps.get(RedisConst.DEVICE_ONLINE_PREFIX + sn);
+        DeviceDTO device = (DeviceDTO) RedisOpsUtils.get(RedisConst.DEVICE_ONLINE_PREFIX + sn);
         webSocketMessageService.sendBatch(
                 webSocketManageService.getValueWithWorkspaceAndUserType(
                         device.getWorkspaceId(), UserTypeEnum.WEB.getVal()),
@@ -126,7 +145,7 @@
                             .bid(receiver.getBid())
                             .method(receiver.getMethod())
                             .timestamp(System.currentTimeMillis())
-                            .data(ResponseResult.success())
+                            .data(RequestsReply.success())
                             .build());
         }
     }

--
Gitblit v1.9.3