Browse Source

设备状态获取优化

S0025136190 1 year ago
parent
commit
eb6a40ac27

+ 1 - 1
Backend/cloud-sdk/src/main/java/com/dji/sdk/cloudapi/device/api/AbstractDeviceService.java

@@ -148,7 +148,7 @@ public class AbstractDeviceService {
      */
     @ServiceActivator(inputChannel = ChannelName.INBOUND_STATE_RC_LIVE_STATUS)
     public void rcLiveStatusUpdate(TopicStateRequest<RcLiveStatus> request, MessageHeaders headers) {
-        //throw new UnsupportedOperationException("rcLiveStatusUpdate not implemented");
+        throw new UnsupportedOperationException("rcLiveStatusUpdate not implemented");
     }
 
     /**

+ 2 - 0
Backend/sample/src/main/java/com/dji/sample/component/redis/RedisConst.java

@@ -73,4 +73,6 @@ public final class RedisConst {
     public static final Integer DRONE_HOME_ALIVE_SECOND = 3600;
     //飞行航线
     public static final String DRONE_FLY_TRACK = "drone_fly_track" + DELIMITER;
+    //设备状态
+    public static final String DEVICE_STATUS = "device_status" + DELIMITER;
 }

+ 15 - 0
Backend/sample/src/main/java/com/dji/sample/manage/controller/DeviceController.java

@@ -15,6 +15,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
 import java.util.List;
 import java.util.Optional;
 
@@ -46,6 +48,19 @@ public class DeviceController {
         return HttpResultResponse.success(devicesList);
     }
 
+    /**
+     * 获取设备状态
+     * @param workspaceId
+     * @return
+     */
+    @GetMapping("/{workspace_id}/devices/status")
+    public HttpResultResponse<List<DeviceDTO>> getDevicesStatus(@PathVariable("workspace_id") String workspaceId,
+                                                          @NotNull @Size(min = 1) @RequestParam(name = "snList") List<String> snList) {
+        List<DeviceDTO> devicesList = deviceService.getDevicesStatus(snList);
+
+        return HttpResultResponse.success(devicesList);
+    }
+
     /**
      * After binding the device to the workspace, the device data can only be seen on the web.
      * @param device

+ 2 - 0
Backend/sample/src/main/java/com/dji/sample/manage/model/dto/DeviceDTO.java

@@ -50,6 +50,8 @@ public class DeviceDTO {
 
     private Boolean status;
 
+    private String statusText;
+
     private Boolean boundStatus;
 
     private LocalDateTime loginTime;

+ 7 - 0
Backend/sample/src/main/java/com/dji/sample/manage/service/IDeviceRedisService.java

@@ -1,6 +1,7 @@
 package com.dji.sample.manage.service;
 
 import com.dji.sample.component.mqtt.model.EventsReceiver;
+import com.dji.sample.manage.model.enums.DeviceStatusEnum;
 import com.dji.sdk.common.AMap;
 import com.dji.sample.manage.model.dto.DeviceDTO;
 import com.dji.sample.map.model.dto.FlightTaskDTO;
@@ -144,4 +145,10 @@ public interface IDeviceRedisService {
     Optional<List<FlightTrackDTO>> getDroneFlyTrack(String sn);
 
     Boolean delDroneFlyTrack(String sn);
+
+    void setDeviceStatus(String deviceSn, DeviceStatusEnum deviceStatus);
+
+    Optional<DeviceStatusEnum> getDeviceStatus(String sn);
+
+    Boolean delDeviceStatus(String sn);
 }

+ 2 - 0
Backend/sample/src/main/java/com/dji/sample/manage/service/IDeviceService.java

@@ -63,6 +63,8 @@ public interface IDeviceService {
      */
     List<DeviceDTO> getDevicesByParams(DeviceQueryParam param);
 
+    List<DeviceDTO> getDevicesStatus(List<String> snList);
+
     /**
      * The business interface on the web side. Get all information about all devices in this workspace.
      * @param workspaceId

+ 1 - 0
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DevicePayloadServiceImpl.java

@@ -95,6 +95,7 @@ public class DevicePayloadServiceImpl implements IDevicePayloadService {
         List<DevicePayloadDTO> payloads = this.getDevicePayloadEntitiesByDeviceSn(device.getDeviceSn());
         device.setPayloadsList(payloads);
         deviceRedisService.setDeviceOnline(device);
+
         return true;
     }
 

+ 18 - 0
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceRedisServiceImpl.java

@@ -3,6 +3,7 @@ package com.dji.sample.manage.service.impl;
 import com.dji.sample.component.mqtt.model.EventsReceiver;
 import com.dji.sample.component.redis.RedisConst;
 import com.dji.sample.component.redis.RedisOpsUtils;
+import com.dji.sample.manage.model.enums.DeviceStatusEnum;
 import com.dji.sdk.common.AMap;
 import com.dji.sample.manage.model.dto.DeviceDTO;
 import com.dji.sample.manage.service.ICapacityCameraService;
@@ -44,10 +45,12 @@ public class DeviceRedisServiceImpl implements IDeviceRedisService {
     @Override
     public void setDeviceOnline(DeviceDTO device) {
         RedisOpsUtils.setWithExpire(RedisConst.DEVICE_ONLINE_PREFIX + device.getDeviceSn(), device, RedisConst.DEVICE_ALIVE_SECOND);
+        setDeviceStatus(device.getDeviceSn(),device.getDeviceStatus());
     }
 
     @Override
     public Boolean delDeviceOnline(String sn) {
+        delDeviceStatus(sn);
         return RedisOpsUtils.del(RedisConst.DEVICE_ONLINE_PREFIX + sn);
     }
 
@@ -188,5 +191,20 @@ public class DeviceRedisServiceImpl implements IDeviceRedisService {
         return RedisOpsUtils.del(RedisConst.DRONE_FLY_TRACK + sn);
     }
 
+    @Override
+    public void setDeviceStatus(String deviceSn, DeviceStatusEnum deviceStatus) {
+        RedisOpsUtils.setWithExpire(RedisConst.DEVICE_STATUS + deviceSn, deviceStatus, RedisConst.DRONE_HOME_ALIVE_SECOND);
+    }
+
+    @Override
+    public Optional<DeviceStatusEnum> getDeviceStatus(String sn) {
+        return Optional.ofNullable((DeviceStatusEnum) RedisOpsUtils.get(RedisConst.DEVICE_STATUS + sn));
+    }
+
+    @Override
+    public Boolean delDeviceStatus(String sn) {
+        return RedisOpsUtils.del(RedisConst.DEVICE_STATUS + sn);
+    }
+
 
 }

+ 23 - 5
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java

@@ -10,13 +10,10 @@ import com.dji.sample.component.websocket.model.BizCodeEnum;
 import com.dji.sample.component.websocket.service.IWebSocketMessageService;
 import com.dji.sample.control.model.enums.DroneAuthorityEnum;
 import com.dji.sample.manage.dao.IDeviceMapper;
+import com.dji.sample.manage.model.enums.*;
 import com.dji.sdk.common.AMap;
 import com.dji.sample.manage.model.dto.*;
 import com.dji.sample.manage.model.entity.DeviceEntity;
-import com.dji.sample.manage.model.enums.DeviceFirmwareStatusEnum;
-import com.dji.sample.manage.model.enums.LogOprTypeEnum;
-import com.dji.sample.manage.model.enums.PropertySetFieldEnum;
-import com.dji.sample.manage.model.enums.UserTypeEnum;
 import com.dji.sample.manage.model.param.DeviceQueryParam;
 import com.dji.sample.manage.model.receiver.BasicDeviceProperty;
 import com.dji.sample.manage.service.*;
@@ -231,6 +228,17 @@ public class DeviceServiceImpl implements IDeviceService {
                 .collect(Collectors.toList());
     }
 
+    @Override
+    public List<DeviceDTO> getDevicesStatus(List<String> snList) {
+        List<DeviceDTO> deviceDTOList = new ArrayList<DeviceDTO>();
+        for (String sn : snList) {
+            DeviceDTO deviceDTO = DeviceDTO.builder().deviceSn(sn).build();
+            getDeviceStatus(deviceDTO);
+            deviceDTOList.add(deviceDTO);
+        }
+        return deviceDTOList;
+    }
+
     @Override
     public List<DeviceDTO> getDevicesTopoForWeb(String workspaceId) {
         List<DeviceDTO> devicesList = this.getDevicesByParams(
@@ -249,7 +257,7 @@ public class DeviceServiceImpl implements IDeviceService {
 
     @Override
     public void spliceDeviceTopo(DeviceDTO gateway) {
-
+        getDeviceStatus(gateway);
         gateway.setStatus(deviceRedisService.checkDeviceOnline(gateway.getDeviceSn()));
 
         // sub device
@@ -258,6 +266,7 @@ public class DeviceServiceImpl implements IDeviceService {
         }
 
         DeviceDTO subDevice = getDevicesByParams(DeviceQueryParam.builder().deviceSn(gateway.getChildDeviceSn()).build()).get(0);
+        getDeviceStatus(subDevice);
         subDevice.setStatus(deviceRedisService.checkDeviceOnline(subDevice.getDeviceSn()));
         gateway.setChildren(subDevice);
 
@@ -265,6 +274,15 @@ public class DeviceServiceImpl implements IDeviceService {
         subDevice.setPayloadsList(payloadService.getDevicePayloadEntitiesByDeviceSn(gateway.getChildDeviceSn()));
     }
 
+    private void getDeviceStatus(DeviceDTO deviceDTO) {
+        Optional<DeviceStatusEnum> deviceStatusOpt = deviceRedisService.getDeviceStatus(deviceDTO.getDeviceSn());
+        if(deviceStatusOpt.isPresent()) {
+            deviceDTO.setStatusText(deviceStatusOpt.get().getText());
+        } else {
+            deviceDTO.setStatusText("设备已离线");
+        }
+    }
+
     @Override
     public Optional<TopologyDeviceDTO> getDeviceTopoForPilot(String sn) {
         if (!StringUtils.hasText(sn)) {

+ 5 - 0
Backend/sample/src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java

@@ -578,6 +578,11 @@ public class SDKDeviceService extends AbstractDeviceService {
                                 .build()).collect(Collectors.toList()));
     }
 
+    @Override
+    public void rcLiveStatusUpdate(TopicStateRequest<RcLiveStatus> request, MessageHeaders headers) {
+        log.info("==========rcLiveStatusUpdate=========request:"+ request.toString() + ",headers:" + headers.toString());
+    }
+
     private void dockGoOnline(DeviceDTO gateway, DeviceDTO subDevice) {
         if (DeviceDomainEnum.DOCK != gateway.getDomain()) {
             return;

+ 1 - 1
Backend/sample/src/main/resources/application-test.yml

@@ -125,7 +125,7 @@ oss:
 
 logging:
   level:
-    com.dji: debug
+    com.dji: info
   file:
     name: logs/cloud-api-sample.log