diff --git a/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceEnum.java b/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceEnum.java index d63bcc3..9c5f9b5 100644 --- a/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceEnum.java +++ b/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceEnum.java @@ -142,4 +142,17 @@ public enum DeviceEnum { return Arrays.stream(values()).filter(device -> device.getDevice().equals(finalKey)) .findAny().orElseThrow(() -> new CloudSDKException(DeviceEnum.class, finalKey1)); } + + @JsonCreator + public static DeviceEnum findKey(String key) { + if(StringUtils.isEmpty(key)){ + key = DeviceEnum.M3TD.getDevice(); + } + String finalKey = key; + String finalKey1 = key; + return Arrays.stream(values()).filter(device -> device.toString().equals(finalKey)) + .findAny().orElseThrow(() -> new CloudSDKException(DeviceEnum.class, finalKey1)); + } + + } diff --git a/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceTypeVideoEnum.java b/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceTypeVideoEnum.java new file mode 100644 index 0000000..f3ce4d4 --- /dev/null +++ b/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceTypeVideoEnum.java @@ -0,0 +1,39 @@ +package org.dromara.common.sdk.cloudapi.device; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.v3.oas.annotations.media.Schema; +import org.dromara.common.sdk.exception.CloudSDKException; + +import java.util.Arrays; + +/** + * @author sean + * @version 1.7 + * @date 2023/5/26 + */ +@Schema(description = "DeviceTypeVideoEnum", enumAsRef = true) +public enum DeviceTypeVideoEnum { + + ZERO(0), + SEVEN(7); + + ; + + private final int videoType; + + DeviceTypeVideoEnum(int videoType) { + this.videoType = videoType; + } + + @JsonValue + public int getVideoType() { + return videoType; + } + + @JsonCreator + public static DeviceTypeVideoEnum find(int videoType) { + return Arrays.stream(values()).filter(typeEnum -> typeEnum.videoType == videoType).findAny() + .orElseThrow(() -> new CloudSDKException(DeviceTypeVideoEnum.class, videoType)); + } +} diff --git a/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceVideoEnum.java b/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceVideoEnum.java new file mode 100644 index 0000000..c851c1c --- /dev/null +++ b/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/device/DeviceVideoEnum.java @@ -0,0 +1,80 @@ +package org.dromara.common.sdk.cloudapi.device; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import io.swagger.v3.oas.annotations.media.Schema; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.sdk.exception.CloudSDKException; + +import java.util.Arrays; + +/** + * @author sean + * @version 1.7 + * @date 2023/5/19 + */ +@Schema(description = "device model key.", format = "domain-type-subType", enumAsRef = true, example = "0-89-0") +public enum DeviceVideoEnum { + + + DOCK(DeviceTypeEnum.DOCK_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.SEVEN), + + DJIDock2(DeviceTypeEnum.DOCK_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.SEVEN), + + DOCK3(DeviceTypeEnum.DOCK_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.SEVEN), + Matrice30(DeviceTypeEnum.M30_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.ZERO), + + Matrice30T(DeviceTypeEnum.M30T_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.ZERO), + M3D(DeviceTypeEnum.M3D_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.ZERO), + + M3TD(DeviceTypeEnum.M3TD_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.ZERO), + + M4D(DeviceTypeEnum.M4D_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.ZERO), + + M4TD(DeviceTypeEnum.M4TD_CAMERA, DeviceSubTypeEnum.ZERO, DeviceTypeVideoEnum.ZERO), + + ; + + + @Schema(enumAsRef = true) + private final DeviceTypeEnum type; + + @Schema(enumAsRef = true) + private final DeviceSubTypeEnum subType; + + @Schema(enumAsRef = true) + private final DeviceTypeVideoEnum videoType; + + DeviceVideoEnum(DeviceTypeEnum type, DeviceSubTypeEnum subType, DeviceTypeVideoEnum videoType) { + this.type = type; + this.subType = subType; + this.videoType = videoType; + } + + public DeviceTypeEnum getType() { + return type; + } + + public DeviceSubTypeEnum getSubType() { + return subType; + } + + public DeviceTypeVideoEnum getVideoType() { + return videoType; + } + + @JsonValue + public String getDevice() { + return String.format("%s-%s-%s", type.getType(), subType.getSubType(),videoType.getVideoType()); + } + + + @JsonCreator + public static DeviceVideoEnum find(String key) { + String finalKey = key.replaceAll(" ",""); + return Arrays.stream(values()).filter(device -> device.toString().equals(finalKey)) + .findAny().orElseThrow(() -> new CloudSDKException(DeviceEnum.class, finalKey)); + } + + +} diff --git a/dk-common/common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java b/dk-common/common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java index dd6ebb1..46bccfd 100644 --- a/dk-common/common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java +++ b/dk-common/common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java @@ -24,6 +24,8 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils { public static final String SLASH = "/"; + public static final String DASH = "-"; + /** * 获取参数不为空值 * diff --git a/dk-common/common-redis/src/main/java/org/dromara/common/redis/config/RedisConst.java b/dk-common/common-redis/src/main/java/org/dromara/common/redis/config/RedisConst.java index 68548ed..7f2713f 100644 --- a/dk-common/common-redis/src/main/java/org/dromara/common/redis/config/RedisConst.java +++ b/dk-common/common-redis/src/main/java/org/dromara/common/redis/config/RedisConst.java @@ -19,6 +19,8 @@ public final class RedisConst { public static final Integer WEBSOCKET_ALIVE_SECOND = 60 * 60 * 24; + public static final Integer DEVICE_VIDEO_STATUE_SECOND = 60 * 50; + public static final String DEVICE_ONLINE_PREFIX = "online" + DELIMITER; public static final String WEBSOCKET_PREFIX = "webSocket" + DELIMITER; @@ -62,4 +64,7 @@ public final class RedisConst { public static final String FILE_UPLOADING_PREFIX = "file_uploading" + DELIMITER; public static final String DRONE_CONTROL_PREFiX = "control_source" + DELIMITER; + + + public static final String VIDEO_STATUS = "video_status" + DELIMITER; } diff --git a/dk-modules/sample/pom.xml b/dk-modules/sample/pom.xml index ac6066c..1a4c98a 100644 --- a/dk-modules/sample/pom.xml +++ b/dk-modules/sample/pom.xml @@ -140,6 +140,10 @@ org.dromara api-workflow + + org.dromara + common-rocketmq + org.springframework.boot spring-boot-starter diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceRedisService.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceRedisService.java index 601a862..3e78f12 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceRedisService.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/IDeviceRedisService.java @@ -1,6 +1,7 @@ package org.dromara.sample.manage.service; import org.dromara.common.sdk.cloudapi.device.OsdDockDrone; +import org.dromara.common.sdk.cloudapi.device.VideoId; import org.dromara.common.sdk.cloudapi.firmware.OtaProgress; import org.dromara.sample.component.mqtt.model.EventsReceiver; import org.dromara.sample.manage.model.dto.DeviceDTO; @@ -126,4 +127,12 @@ public interface IDeviceRedisService { */ List getDevicesOsdInfo(List snList); + + Boolean checkDeviceVideo(String sn); + + void setDeviceVideo(String sn, Object data); + + Optional getDeviceVideo(String sn, Object data); + + Boolean delDeviceVideo(String sn); } diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceRedisServiceImpl.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceRedisServiceImpl.java index 2892e1d..d3310d7 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceRedisServiceImpl.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/DeviceRedisServiceImpl.java @@ -2,7 +2,9 @@ package org.dromara.sample.manage.service.impl; import org.dromara.common.redis.config.RedisConst; import org.dromara.common.redis.utils.RedisOpsUtils; +import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.sdk.cloudapi.device.OsdDockDrone; +import org.dromara.common.sdk.cloudapi.device.VideoId; import org.dromara.common.sdk.cloudapi.firmware.OtaProgress; import org.dromara.sample.component.mqtt.model.EventsReceiver; import org.dromara.sample.manage.model.dto.DeviceDTO; @@ -133,4 +135,25 @@ public class DeviceRedisServiceImpl implements IDeviceRedisService { return resultList; } + + @Override + public Boolean checkDeviceVideo(String sn) { + + return RedisOpsUtils.checkExist(RedisConst.VIDEO_STATUS + sn) && RedisOpsUtils.getExpire(RedisConst.VIDEO_STATUS + sn) > 0; + } + + @Override + public void setDeviceVideo(String sn, Object data) { + RedisOpsUtils.setWithExpire(RedisConst.VIDEO_STATUS + sn, data, RedisConst.DEVICE_VIDEO_STATUE_SECOND); + } + + @Override + public Optional getDeviceVideo(String sn, Object data) { + return Optional.ofNullable((VideoId) RedisOpsUtils.get(RedisConst.VIDEO_STATUS + sn)); + } + + @Override + public Boolean delDeviceVideo(String sn) { + return RedisOpsUtils.del(sn); + } } diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SDKDeviceService.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SDKDeviceService.java index 87c84bb..359f8fd 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SDKDeviceService.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SDKDeviceService.java @@ -2,8 +2,10 @@ package org.dromara.sample.manage.service.impl; import cn.hutool.core.util.ObjectUtil; import org.dromara.common.redis.utils.RedisOpsUtils; +import org.dromara.common.rocketmq.producer.MessageProducerUtil; import org.dromara.common.sdk.cloudapi.device.*; import org.dromara.common.sdk.cloudapi.device.api.AbstractDeviceService; +import org.dromara.common.sdk.cloudapi.livestream.VideoTypeEnum; import org.dromara.common.sdk.cloudapi.psdk.PsdkUiResource; import org.dromara.common.sdk.cloudapi.psdk.PsdkWidgetValues; import org.dromara.common.sdk.cloudapi.tsa.DeviceIconUrl; @@ -36,6 +38,9 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.stream.Collectors; +import static org.dromara.common.core.utils.StringUtils.DASH; +import static org.dromara.common.core.utils.StringUtils.SLASH; + /** * @author sean * @version 1.7 @@ -172,6 +177,34 @@ public class SDKDeviceService extends AbstractDeviceService { deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.DOCK_OSD, from, request.getData()); } + @Override + public void dockLiveStatusUpdate(TopicStateRequest request, MessageHeaders headers){ + Optional dockOnline = deviceRedisService.getDeviceOnline(request.getGateway()); + Optional deviceOnline = deviceRedisService.getDeviceOnline(dockOnline.get().getChildDeviceSn()); + if(deviceOnline.isEmpty()){ + return; + } + if(request.getData().getLiveStatus().size() == 0 ){ + String deviceVideoEnum = DeviceVideoEnum.find(deviceOnline.get().getDeviceName()).getDevice(); + if(!deviceRedisService.checkDeviceVideo(deviceOnline.get().getDeviceSn())){ + VideoId videoId = new VideoId(deviceOnline.get().getDeviceSn()+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL + DASH+DeviceTypeVideoEnum.ZERO.getVideoType()); + deviceRedisService.setDeviceVideo(deviceOnline.get().getDeviceSn(),videoId); + MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStopStart",deviceOnline.get().getDeviceSn(),videoId.toString()); + } + + } + List dockLiveStatusDataList = request.getData().getLiveStatus().stream().filter(item -> + item.getVideoId().getDroneSn().equals(dockOnline.get().getChildDeviceSn()) && item.getStatus() == true).collect(Collectors.toList()); + if(dockLiveStatusDataList.size() == 0){ + String deviceVideoEnum = DeviceVideoEnum.find(deviceOnline.get().getDeviceName()).getDevice(); + if(!deviceRedisService.checkDeviceVideo(deviceOnline.get().getDeviceSn())){ + VideoId videoId = new VideoId(deviceOnline.get().getDeviceSn()+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL + DASH+DeviceTypeVideoEnum.ZERO.getVideoType()); + deviceRedisService.setDeviceVideo(deviceOnline.get().getDeviceSn(),videoId); + MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStopStart",deviceOnline.get().getDeviceSn(),videoId.toString()); + } + } + } + @Override public void osdDockDrone(TopicOsdRequest request, MessageHeaders headers) { String from = request.getFrom(); @@ -190,12 +223,18 @@ public class SDKDeviceService extends AbstractDeviceService { } DeviceDTO device = deviceOpt.get(); + String deviceVideoEnum = DeviceVideoEnum.find(device.getDeviceName()).getDevice(); + if(!deviceRedisService.checkDeviceVideo(device.getDeviceSn())){ + VideoId videoId = new VideoId(device.getDeviceSn()+deviceVideoEnum+SLASH + VideoTypeEnum.NORMAL + DASH+DeviceTypeVideoEnum.ZERO.getVideoType()); + deviceRedisService.setDeviceVideo(device.getDeviceSn(),videoId); + MessageProducerUtil.sendAsyncProducerMessage("videoStartConsum","videoStart",device.getDeviceSn(),videoId.toString()); + } deviceRedisService.setDeviceOnline(device); deviceRedisService.setDeviceOsd(from, request.getData()); - deviceService.pushOsdDataToWeb(device.getWorkspaceId(), BizCodeEnum.DEVICE_OSD, from, request.getData()); } + @Override public void osdRemoteControl(TopicOsdRequest request, MessageHeaders headers) { String from = request.getFrom(); diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/rocketmq/RocketMqConsum.java b/dk-modules/sample/src/main/java/org/dromara/sample/rocketmq/RocketMqConsum.java new file mode 100644 index 0000000..0341e00 --- /dev/null +++ b/dk-modules/sample/src/main/java/org/dromara/sample/rocketmq/RocketMqConsum.java @@ -0,0 +1,46 @@ +package org.dromara.sample.rocketmq; + +import org.apache.rocketmq.common.message.MessageExt; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.dromara.common.sdk.cloudapi.device.VideoId; +import org.dromara.common.sdk.cloudapi.livestream.LensChangeVideoTypeEnum; +import org.dromara.common.sdk.cloudapi.livestream.UrlTypeEnum; +import org.dromara.common.sdk.cloudapi.livestream.VideoQualityEnum; +import org.dromara.sample.manage.model.dto.LiveTypeDTO; +import org.dromara.sample.manage.service.ILiveStreamService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +/** + * @auther wuyuan + * @data 2025/5/12 + */ +@RocketMQMessageListener(consumerGroup = "videoStart",topic = "videoStartConsum") +@Component +public class RocketMqConsum implements RocketMQListener { + + @Autowired + private ILiveStreamService liveStreamService; + + @Override + public void onMessage(MessageExt message) { + String tags = message.getTags(); + String videoIds = new String(message.getBody()); + VideoId videoId = new VideoId(videoIds); + LiveTypeDTO liveTypeDTO = new LiveTypeDTO(); + liveTypeDTO.setUrlType(UrlTypeEnum.WHIP); + liveTypeDTO.setVideoType(LensChangeVideoTypeEnum.WIDE); + liveTypeDTO.setVideoQuality(VideoQualityEnum.ULTRA_HD); + liveTypeDTO.setVideoId(videoId); + if(tags.equals("videoStart")){ + liveStreamService.liveStart(liveTypeDTO); + }else if(tags.equals("videoStopStart")){ + liveStreamService.liveStop(videoId); + liveStreamService.liveStart(liveTypeDTO); + } + + + } +} diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobController.java b/dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobController.java index a28e0a5..0182596 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobController.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobController.java @@ -127,10 +127,14 @@ public class WaylineJobController { @RequestParam(name = "device_sn") String deviceSn, HttpServletRequest req, HttpServletResponse rsp) { try { Optional> runningWaylineJob = waylineRedisService.getRunningWaylineJob(deviceSn); - if(runningWaylineJob.isEmpty())return; + if(runningWaylineJob.isEmpty()) { + return; + } String jobId = runningWaylineJob.get().getOutput().getExt().getFlightId(); Optional waylineJobDTO = waylineJobService.getJobByJobId(workspaceId, jobId); - if(waylineJobDTO.isEmpty())return; + if(waylineJobDTO.isEmpty()) { + return; + } URL url = waylineFileService.getObjectUrl(workspaceId, waylineJobDTO.get().getFileId()); rsp.sendRedirect(url.toString()); } catch (IOException | SQLException e) { diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IFlightTaskService.java b/dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IFlightTaskService.java index 4b4bb20..c4a2bce 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IFlightTaskService.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IFlightTaskService.java @@ -74,5 +74,7 @@ public interface IFlightTaskService { */ void updateJobStatus(String workspaceId, String jobId, UpdateJobParam param); + void updateJobDeviceSnStatus(String workspaceId, String deviceSn, UpdateJobParam param); + void retryPrepareJob(ConditionalWaylineJobKey jobKey, WaylineJobDTO waylineJob); } diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/FlightTaskServiceImpl.java b/dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/FlightTaskServiceImpl.java index e3011e4..f87d1f6 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/FlightTaskServiceImpl.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/FlightTaskServiceImpl.java @@ -505,6 +505,34 @@ public class FlightTaskServiceImpl extends AbstractWaylineService implements IFl } + @Override + public void updateJobDeviceSnStatus(String workspaceId, String deviceSn, UpdateJobParam param) { + Optional> runningWaylineJob = waylineRedisService.getRunningWaylineJob(deviceSn); + if(runningWaylineJob.isEmpty()) { + return; + } + String jobId = runningWaylineJob.get().getOutput().getExt().getFlightId(); + Optional waylineJobOpt = waylineJobService.getJobByJobId(workspaceId, jobId); + if (waylineJobOpt.isEmpty()) { + throw new RuntimeException("作业不存在。"); + } + WaylineJobDTO waylineJob = waylineJobOpt.get(); + WaylineJobStatusEnum statusEnum = waylineJobService.getWaylineState(waylineJob.getDockSn()); + if (statusEnum.getEnd() || WaylineJobStatusEnum.PENDING == statusEnum) { + throw new RuntimeException("路线作业状态不匹配,因此无法执行该操作。"); + } + + switch (param.getStatus()) { + case PAUSE: + pauseJob(workspaceId, waylineJob.getDockSn(), jobId, statusEnum); + break; + case RESUME: + resumeJob(workspaceId, waylineJob.getDockSn(), jobId, statusEnum); + break; + } + + } + private void pauseJob(String workspaceId, String dockSn, String jobId, WaylineJobStatusEnum statusEnum) { if (WaylineJobStatusEnum.PAUSED == statusEnum && jobId.equals(waylineRedisService.getPausedWaylineJobId(dockSn))) { waylineRedisService.setPausedWaylineJob(dockSn, jobId); diff --git a/dk-visual/nacos/src/main/resources/application.properties b/dk-visual/nacos/src/main/resources/application.properties index 972740f..44fe8a3 100644 --- a/dk-visual/nacos/src/main/resources/application.properties +++ b/dk-visual/nacos/src/main/resources/application.properties @@ -40,9 +40,9 @@ spring.sql.init.platform=mysql db.num=1 ### Connect URL of DB: -db.url.0=jdbc:mysql://127.0.0.1:3306/dk_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true +db.url.0=jdbc:mysql://114.235.183.147:3306/dk_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true db.user.0=root -db.password.0=123456 +db.password.0=dkcy@yf ### the maximum retry times for push nacos.config.push.maxRetryTime=50