From 05f799b8a5ce57b1f98dc5f8ab08308c32a6ec63 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Fri, 16 Jan 2026 09:35:22 +0800
Subject: [PATCH] 优化
---
ard-device/src/main/java/com/ard/device/channel/service/impl/ArdChannelServiceImpl.java | 113 +++++++++
/dev/null | 258 ---------------------
ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceImpl.java | 16
ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdVtduServiceImpl.java | 36 ++
ard-work/src/main/java/com/ard/work/service/impl/ArdDroneInfoServiceImpl.java | 93 ++++---
ard-device/src/main/java/com/ard/device/camera/service/impl/ArdCameraServiceImpl.java | 83 ++++++
ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskPartServiceImpl.java | 64 ++--
ard-work/src/main/java/com/ard/work/service/task/MediaTask.java | 8
8 files changed, 319 insertions(+), 352 deletions(-)
diff --git a/ard-device/src/main/java/com/ard/device/camera/service/impl/ArdCameraServiceImpl.java b/ard-device/src/main/java/com/ard/device/camera/service/impl/ArdCameraServiceImpl.java
index e55b8cc..a7f7f73 100644
--- a/ard-device/src/main/java/com/ard/device/camera/service/impl/ArdCameraServiceImpl.java
+++ b/ard-device/src/main/java/com/ard/device/camera/service/impl/ArdCameraServiceImpl.java
@@ -373,4 +373,87 @@
redisService.setCacheObject(getCacheKey(camera.getId()), camera);
}
+ /**
+ * 定时执行登录失败相机重新登录
+ */
+ @Scheduled(cron = "0/10 * * * * ?")
+ public void failedReconnect() {
+ try {
+ log.debug("定时执行失败相机重连任务");
+ // 从数据库取全部设备
+ ArdCamera ardCamera = new ArdCamera();
+ ardCamera.setUseDataScope(false);
+ List<ArdCamera> cameraList = this.selectArdCameraList(ardCamera);
+ cameraList.stream()
+ // 只处理登录失败或离线的设备
+ .filter(camera -> camera.getLoginId() == null || camera.getLoginId() < 0 || "0".equals(camera.getState()))
+ .forEach(camera -> {
+ log.info("尝试重新登录设备 {}:{}", camera.getIp(), camera.getPort());
+ cameraSDKService.login(camera);
+ });
+
+ } catch (Exception ex) {
+ log.error("定时执行失败相机重连任务异常:{}", ex.getMessage());
+ }
+ }
+
+ /**
+ * 同步相机在线状态
+ */
+ @Scheduled(cron = "0/10 * * * * ?")
+ public void syncCameraState() {
+ try {
+ log.debug("定时执行同步相机在线状态任务");
+ //调用查询方法
+ ArdCamera ardCamera = new ArdCamera();
+ ardCamera.setUseDataScope(false);
+ List<ArdCamera> ardCameraList = this.selectArdCameraList(ardCamera);
+ ardCameraList
+ .forEach(camera -> {
+ boolean onLineNew = cameraSDKService.isOnLine(camera);
+ boolean onLineOld = "1".equals(camera.getState());
+ if (onLineNew != onLineOld) {
+ if (onLineNew) {
+ camera.setState("1");
+ } else {
+ camera.setState("0");
+ }
+ camera.setUpdateTime(DateUtils.getNowDate());
+ ardCameraMapper.updateArdCamera(camera);
+ }
+ });
+ } catch (Exception ex) {
+ log.error("同步相机在线状态异常:{}", ex.getMessage());
+ }
+ }
+ /**
+ * 同步相机通道
+ */
+ @Scheduled(cron = "0/10 * * * * ?")
+ public void syncChannel() {
+ try {
+ log.debug("定时执行同步通道任务");
+ ArdCamera camera = new ArdCamera();
+ camera.setUseDataScope(false);
+ List<ArdCamera> ardCameraList = this.selectArdCameraList(camera);
+ if (!ardCameraList.isEmpty()) {
+ ardCameraList
+ .forEach(ardCamera -> {
+ //SDK获取实际通道
+ List<ArdChannel> ardChannelListSDK = cameraSDKService.getChannels(ardCamera);
+ //数据库获取通道
+ ArdChannel ardChannel = new ArdChannel();
+ ardChannel.setUseDataScope(false);
+ ardChannel.setDeviceId(ardCamera.getId());
+ List<ArdChannel> ardChannelListDb = ardChannelService.selectArdChannelList(ardChannel);
+ //同步通道
+ asyncChannel(ardChannelListDb, ardChannelListSDK);
+ });
+ }
+ } catch (Exception ex) {
+ log.error("定时执行同步通道任务异常:{}", ex.getMessage());
+ }
+ }
+
+
}
\ No newline at end of file
diff --git a/ard-device/src/main/java/com/ard/device/channel/service/impl/ArdChannelServiceImpl.java b/ard-device/src/main/java/com/ard/device/channel/service/impl/ArdChannelServiceImpl.java
index 6c00d76..bfae263 100644
--- a/ard-device/src/main/java/com/ard/device/channel/service/impl/ArdChannelServiceImpl.java
+++ b/ard-device/src/main/java/com/ard/device/channel/service/impl/ArdChannelServiceImpl.java
@@ -33,7 +33,12 @@
@Resource
private ArdChannelMapper ardChannelMapper;
-
+ @Resource
+ private RedisCache redisCache;
+ @Resource
+ private IArdVtduService ardVtduService;
+ @Resource
+ private MediamtxConfig mediamtxConfig;
/**
* 查询通道管理
*
@@ -137,4 +142,110 @@
}
return UserConstants.UNIQUE;
}
+
+
+ /**
+ * 同步通道流媒体
+ */
+ @Scheduled(cron = "0/10 * * * * ?")
+ public void syncVtdu() {
+ log.debug("定时同步Vtdu任务");
+ try {
+ ArdChannel ardChannel = new ArdChannel();
+ ardChannel.setUseDataScope(false);
+ List<ArdChannel> channels = this.selectArdChannelList(ardChannel);
+ if (channels == null || channels.isEmpty()) {
+ // log.warn("没有获取到通道数据,退出同步");
+ return;
+ }
+ List<ArdVtdu> ardVtduList = ardVtduService.selectArdVtduList(new ArdVtdu());
+
+ Set<String> validNames = channels.stream()
+ .map(channel -> channel.getDeviceId() + "_" + channel.getChanNo())
+ .collect(Collectors.toSet());
+ // 2. 合并操作:增、删、改
+ channels.forEach(channel -> {
+ String name = channel.getDeviceId() + "_" + channel.getChanNo(); // 生成媒体表的 name
+ String cameraId = channel.getDeviceId(); // cameraId 就是通道的 deviceId
+ String rtspSourceUrl = getRtspSource(channel);
+ String rtspUrl =
+ "rtsp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtspPort() + "/" + name; //
+ // 拼接 webrtcUrl
+ String rtmpUrl =
+ "rtmp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtmpPort() + "/" + name; // 拼接
+ // webrtcUrl
+ String protocol = mediamtxConfig.isHttps() ? "https://" : "http://";
+ String webrtcUrl =
+ protocol + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getWebrtcPort() + "/" + name;
+ // 拼接 webrtcUrl
+
+ // 先检查媒体表是否已有此记录
+ Optional<ArdVtdu> existingMedia = ardVtduList.stream()
+ .filter(media -> media.getName().equals(name)) // 查找是否已有对应的媒体记录
+ .findFirst();
+
+ if (existingMedia.isPresent()) {
+ // 如果已有,更新现有记录
+ ArdVtdu vtdu = existingMedia.get();
+ // 更新前后内容相同则不进行更新
+ if (!vtdu.getRtspSource().equals(rtspSourceUrl) ||
+ !vtdu.getWebrtcUrl().equals(webrtcUrl) ||
+ !vtdu.getRtspUrl().equals(rtspUrl) ||
+ !vtdu.getRtmpUrl().equals(rtmpUrl)) {
+ vtdu.setRtspUrl(rtspUrl);
+ vtdu.setRtmpUrl(rtmpUrl);
+ vtdu.setWebrtcUrl(webrtcUrl);
+ ardVtduService.updateArdVtdu(vtdu);
+ log.info("更新媒体记录:{}", vtdu.getName());
+ }
+ } else {
+ // 如果没有,插入新的记录
+ ArdVtdu vtdu = new ArdVtdu();
+ vtdu.setName(name);
+ vtdu.setRtspSource(rtspSourceUrl);
+ vtdu.setCameraId(cameraId);
+ vtdu.setRtspUrl(rtspUrl);
+ vtdu.setRtmpUrl(rtmpUrl);
+ vtdu.setWebrtcUrl(webrtcUrl);
+ ardVtduService.insertArdVtdu(vtdu); // 保存到媒体表
+ log.info("插入新媒体记录:{}", vtdu.getName());
+ }
+ });
+ // 3. 删除操作:删除媒体表中多余的记录
+ List<String> invalidNames = ardVtduList.stream()
+ .filter(vtdu -> !validNames.contains(vtdu.getName()))
+ .filter(vtdu -> !"publisher".equalsIgnoreCase(vtdu.getRtspSource())) // 不是机场流
+ .map(ArdVtdu::getName)
+ .collect(Collectors.toList());
+
+ if (!invalidNames.isEmpty()) {
+ // 将 List<String> 转换为 String[]
+ String[] namesArray = invalidNames.toArray(new String[0]);
+ ardVtduService.deleteArdVtduByNames(namesArray); // 传递数组
+ log.info("删除不再存在的媒体记录:{}", Arrays.toString(namesArray));
+ }
+ } catch (Exception e) {
+ log.error("定时同步Vtdu任务异常:{}", e.getMessage());
+ }
+
+ }
+
+ // 根据通道信息获取rtsp源地址
+ private String getRtspSource(ArdChannel channel) {
+ String rtspSource = "";
+ ArdCamera ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + channel.getDeviceId());
+ if (ardCamera != null) {
+ switch (ardCamera.getFactory()) {
+ case "1":
+ rtspSource =
+ "rtsp://" + ardCamera.getUsername() + ":" + ardCamera.getPassword() + "@" + ardCamera.getIp() + ":" + ardCamera.getRtspPort() + "/h264/ch" + channel.getChanNo() + "/main/av_stream";
+ break;
+ case "2":
+ rtspSource =
+ "rtsp://" + ardCamera.getUsername() + ":" + ardCamera.getPassword() + "@" + ardCamera.getIp() + ":" + ardCamera.getRtspPort() + "/cam/realmonitor?channel=" + channel.getChanNo() + "&subtype=0";
+ break;
+ }
+ }
+ return rtspSource;
+ }
}
\ No newline at end of file
diff --git a/ard-quartz/src/main/java/com/ard/quartz/task/DeviceTask.java b/ard-quartz/src/main/java/com/ard/quartz/task/DeviceTask.java
deleted file mode 100644
index b51d24a..0000000
--- a/ard-quartz/src/main/java/com/ard/quartz/task/DeviceTask.java
+++ /dev/null
@@ -1,258 +0,0 @@
-package com.ard.quartz.task;
-
-import com.ard.common.constant.CacheConstants;
-import com.ard.common.core.redis.RedisCache;
-import com.ard.common.utils.DateUtils;
-import com.ard.common.utils.file.MimeTypeUtils;
-import com.ard.device.camera.domain.ArdCamera;
-import com.ard.device.camera.service.IArdCameraService;
-import com.ard.device.channel.domain.ArdChannel;
-import com.ard.device.channel.service.IArdChannelService;
-import com.ard.device.component.sdk.service.CameraSDKService;
-import com.ard.oss.service.impl.OssServiceContext;
-import com.ard.vtdu.config.MediamtxConfig;
-import com.ard.vtdu.domain.ArdVtdu;
-import com.ard.vtdu.service.IArdMediaService;
-import com.ard.vtdu.service.IArdVtduService;
-import com.ard.work.domain.entity.ArdMediaPic;
-import com.ard.work.domain.entity.ArdMediaVideo;
-import com.ard.work.mapper.ArdMediaPicMapper;
-import com.ard.work.mapper.ArdMediaVideoMapper;
-import com.ard.work.util.osSelect;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Resource;
-import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
-import java.io.*;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.net.URLConnection;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.security.cert.X509Certificate;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.stream.Collectors;
-
-/**
- * 定时同步设备任务
- *
- * @author ard
- */
-@Component("DeviceTask")
-@Slf4j
-public class DeviceTask {
- @Resource
- private RedisCache redisCache;
- @Resource
- private IArdChannelService ardChannelService;
- @Resource
- private IArdVtduService ardVtduService;
- @Resource
- private MediamtxConfig mediamtxConfig;
- @Resource
- private CameraSDKService cameraSDKService;
- @Resource
- private IArdCameraService ardCameraService;
- @Resource
- private IArdMediaService ardMediaService;
-
-
-
- /**
- * 定时执行登录失败相机重新登录
- */
- public void failedReconnect() {
- try {
- log.debug("定时执行失败相机重连任务");
- // 从数据库取全部设备
- ArdCamera ardCamera = new ArdCamera();
- ardCamera.setUseDataScope(false);
- List<ArdCamera> cameraList = ardCameraService.selectArdCameraList(ardCamera);
- cameraList.stream()
- // 只处理登录失败或离线的设备
- .filter(camera -> camera.getLoginId() == null || camera.getLoginId() < 0 || "0".equals(camera.getState()))
- .forEach(camera -> {
- log.info("尝试重新登录设备 {}:{}", camera.getIp(), camera.getPort());
- cameraSDKService.login(camera);
- });
-
- } catch (Exception ex) {
- log.error("定时执行失败相机重连任务异常:{}", ex.getMessage());
- }
- }
-
- /**
- * 同步相机在线状态
- */
- public void syncCameraState() {
- try {
- log.debug("定时执行同步相机在线状态任务");
- //调用查询方法
- ArdCamera ardCamera = new ArdCamera();
- ardCamera.setUseDataScope(false);
- List<ArdCamera> ardCameraList = ardCameraService.selectArdCameraList(ardCamera);
- ardCameraList
- .forEach(camera -> {
- boolean onLineNew = cameraSDKService.isOnLine(camera);
- boolean onLineOld = "1".equals(camera.getState());
- if (onLineNew != onLineOld) {
- if (onLineNew) {
- camera.setState("1");
- } else {
- camera.setState("0");
- }
- camera.setUpdateTime(DateUtils.getNowDate());
- ardCameraService.updateArdCamera(camera);
- }
- });
- } catch (Exception ex) {
- log.error("同步相机在线状态异常:{}", ex.getMessage());
- }
- }
-
- /**
- * 同步相机通道
- */
- public void syncChannel() {
- try {
- log.debug("定时执行同步通道任务");
- ArdCamera camera = new ArdCamera();
- camera.setUseDataScope(false);
- List<ArdCamera> ardCameraList = ardCameraService.selectArdCameraList(camera);
- if (!ardCameraList.isEmpty()) {
- ardCameraList
- .forEach(ardCamera -> {
- //SDK获取实际通道
- List<ArdChannel> ardChannelListSDK = cameraSDKService.getChannels(ardCamera);
- //数据库获取通道
- ArdChannel ardChannel = new ArdChannel();
- ardChannel.setUseDataScope(false);
- ardChannel.setDeviceId(ardCamera.getId());
- List<ArdChannel> ardChannelListDb = ardChannelService.selectArdChannelList(ardChannel);
- //同步通道
- ardCameraService.asyncChannel(ardChannelListDb, ardChannelListSDK);
- });
- }
- } catch (Exception ex) {
- log.error("定时执行同步通道任务异常:{}", ex.getMessage());
- }
- }
-
- /**
- * 同步通道流媒体
- */
- public void syncVtdu() {
- log.debug("定时同步Vtdu任务");
- ArdChannel ardChannel = new ArdChannel();
- ardChannel.setUseDataScope(false);
- List<ArdChannel> channels = ardChannelService.selectArdChannelList(ardChannel);
- if (channels == null || channels.isEmpty()) {
- // log.warn("没有获取到通道数据,退出同步");
- return;
- }
- List<ArdVtdu> ardVtduList = ardVtduService.selectArdVtduList(new ArdVtdu());
-
- Set<String> validNames = channels.stream()
- .map(channel -> channel.getDeviceId() + "_" + channel.getChanNo())
- .collect(Collectors.toSet());
- // 2. 合并操作:增、删、改
- channels.forEach(channel -> {
- String name = channel.getDeviceId() + "_" + channel.getChanNo(); // 生成媒体表的 name
- String cameraId = channel.getDeviceId(); // cameraId 就是通道的 deviceId
- String rtspSourceUrl = getRtspSource(channel);
- String rtspUrl =
- "rtsp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtspPort() + "/" + name; //
- // 拼接 webrtcUrl
- String rtmpUrl =
- "rtmp://" + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getRtmpPort() + "/" + name; // 拼接
- // webrtcUrl
- String protocol = mediamtxConfig.isHttps() ? "https://" : "http://";
- String webrtcUrl =
- protocol + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getWebrtcPort() + "/" + name;
- // 拼接 webrtcUrl
-
- // 先检查媒体表是否已有此记录
- Optional<ArdVtdu> existingMedia = ardVtduList.stream()
- .filter(media -> media.getName().equals(name)) // 查找是否已有对应的媒体记录
- .findFirst();
-
- if (existingMedia.isPresent()) {
- // 如果已有,更新现有记录
- ArdVtdu vtdu = existingMedia.get();
- // 更新前后内容相同则不进行更新
- if (!vtdu.getRtspSource().equals(rtspSourceUrl) ||
- !vtdu.getWebrtcUrl().equals(webrtcUrl) ||
- !vtdu.getRtspUrl().equals(rtspUrl) ||
- !vtdu.getRtmpUrl().equals(rtmpUrl)) {
- vtdu.setRtspUrl(rtspUrl);
- vtdu.setRtmpUrl(rtmpUrl);
- vtdu.setWebrtcUrl(webrtcUrl);
- ardVtduService.updateArdVtdu(vtdu);
- log.info("更新媒体记录:{}", vtdu.getName());
- }
- } else {
- // 如果没有,插入新的记录
- ArdVtdu vtdu = new ArdVtdu();
- vtdu.setName(name);
- vtdu.setRtspSource(rtspSourceUrl);
- vtdu.setCameraId(cameraId);
- vtdu.setRtspUrl(rtspUrl);
- vtdu.setRtmpUrl(rtmpUrl);
- vtdu.setWebrtcUrl(webrtcUrl);
- ardVtduService.insertArdVtdu(vtdu); // 保存到媒体表
- log.info("插入新媒体记录:{}", vtdu.getName());
- }
- });
- // 3. 删除操作:删除媒体表中多余的记录
- List<String> invalidNames = ardVtduList.stream()
- .filter(vtdu -> !validNames.contains(vtdu.getName()))
- .filter(vtdu -> !"publisher".equalsIgnoreCase(vtdu.getRtspSource())) // 不是机场流
- .map(ArdVtdu::getName)
- .collect(Collectors.toList());
-
- if (!invalidNames.isEmpty()) {
- // 将 List<String> 转换为 String[]
- String[] namesArray = invalidNames.toArray(new String[0]);
- ardVtduService.deleteArdVtduByNames(namesArray); // 传递数组
- log.info("删除不再存在的媒体记录:{}", Arrays.toString(namesArray));
- }
-
- }
-
- // 根据通道信息获取rtsp源地址
- private String getRtspSource(ArdChannel channel) {
- String rtspSource = "";
- ArdCamera ardCamera = redisCache.getCacheObject(CacheConstants.CAMERA_LIST_KEY + channel.getDeviceId());
- if (ardCamera != null) {
- switch (ardCamera.getFactory()) {
- case "1":
- rtspSource =
- "rtsp://" + ardCamera.getUsername() + ":" + ardCamera.getPassword() + "@" + ardCamera.getIp() + ":" + ardCamera.getRtspPort() + "/h264/ch" + channel.getChanNo() + "/main/av_stream";
- break;
- case "2":
- rtspSource =
- "rtsp://" + ardCamera.getUsername() + ":" + ardCamera.getPassword() + "@" + ardCamera.getIp() + ":" + ardCamera.getRtspPort() + "/cam/realmonitor?channel=" + channel.getChanNo() + "&subtype=0";
- break;
- }
- }
- return rtspSource;
- }
-
- /**
- * 同步mediamtx
- */
- public void syncMediamtx() {
- log.debug("定时同步MediaMTX任务");
- List<String> nameList = ardMediaService.getNameList();
- List<ArdVtdu> ardVtduList = ardVtduService.selectArdVtduList(new ArdVtdu());
- ardVtduService.asyncMediaMTX(ardVtduList, nameList);
- }
-}
diff --git a/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdVtduServiceImpl.java b/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdVtduServiceImpl.java
index 806b065..139c5cc 100644
--- a/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdVtduServiceImpl.java
+++ b/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdVtduServiceImpl.java
@@ -28,14 +28,14 @@
@Resource
private ArdVtduMapper ardVtduMapper;
@Resource
- private IArdMediaService mediaService;
+ private IArdMediaService ardMediaService;
@PostConstruct
public void initMediaMTX() {
//清空mediamtx流媒体数据
- mediaService.clearAll();
+ ardMediaService.clearAll();
}
/**
@@ -69,7 +69,7 @@
@Override
public int insertArdVtdu(ArdVtdu ardVtdu) {
ardVtdu.setCreateTime(DateUtils.getNowDate());
- ardVtdu = mediaService.addPath(ardVtdu);
+ ardVtdu = ardMediaService.addPath(ardVtdu);
return ardVtduMapper.insertArdVtdu(ardVtdu);
}
@@ -82,7 +82,7 @@
@Override
public int updateArdVtdu(ArdVtdu ardVtdu) {
ardVtdu.setUpdateTime(DateUtils.getNowDate());
- ardVtdu = mediaService.editPath(ardVtdu);
+ ardVtdu = ardMediaService.editPath(ardVtdu);
ardVtdu.setUpdateTime(DateUtils.getNowDate());
return ardVtduMapper.updateArdVtdu(ardVtdu);
}
@@ -98,7 +98,7 @@
for (String name : names) {
log.debug("流媒体【" + name + "】通道删除");
}
- mediaService.removePath(names);
+ ardMediaService.removePath(names);
return ardVtduMapper.deleteArdVtduByNames(names);
}
@@ -110,7 +110,7 @@
*/
@Override
public int deleteArdVtduByName(String name) {
- mediaService.removePath(name);
+ ardMediaService.removePath(name);
log.debug("流媒体【" + name + "】通道删除");
return ardVtduMapper.deleteArdVtduByName(name);
}
@@ -177,7 +177,7 @@
public void asyncMediaMTX(List<ArdVtdu> vtdus, List<String> names) {
//需要更新的数据,参数顺序注意
sameList(vtdus, names).forEach(vtdu -> {
- Conf conf = mediaService.getPathConfig(vtdu.getName());
+ Conf conf = ardMediaService.getPathConfig(vtdu.getName());
if (conf == null || conf.getSource() == null) {
return;
}
@@ -188,16 +188,32 @@
boolean isRtspSourceChanged = !Objects.equals(confRtspSource, currentRtspSource);
// 如果 RTSP 源发生变化,则更新路径
if (isRtspSourceChanged) {
- mediaService.editPath(vtdu);
+ ardMediaService.editPath(vtdu);
}
});
//需要删除的数据
diffListToDel(vtdus, names).forEach(name -> {
- mediaService.removePath(name);
+ ardMediaService.removePath(name);
});
//需要新增的数据
diffListToAdd(vtdus, names).forEach(vtdu -> {
- mediaService.addPath(vtdu);
+ ardMediaService.addPath(vtdu);
});
}
+
+ /**
+ * 同步mediamtx
+ */
+ @Scheduled(cron = "0/10 * * * * ?")
+ public void syncMediamtx() {
+ log.debug("定时同步MediaMTX任务");
+ try {
+ List<String> nameList = ardMediaService.getNameList();
+ List<ArdVtdu> ardVtduList = this.selectArdVtduList(new ArdVtdu());
+ asyncMediaMTX(ardVtduList, nameList);
+ }
+ catch (Exception e) {
+ log.error("同步MediaMTX任务失败", e);
+ }
+ }
}
diff --git a/ard-work/src/main/java/com/ard/work/service/impl/ArdDroneInfoServiceImpl.java b/ard-work/src/main/java/com/ard/work/service/impl/ArdDroneInfoServiceImpl.java
index 2b85811..567281a 100644
--- a/ard-work/src/main/java/com/ard/work/service/impl/ArdDroneInfoServiceImpl.java
+++ b/ard-work/src/main/java/com/ard/work/service/impl/ArdDroneInfoServiceImpl.java
@@ -307,57 +307,62 @@
*/
@Scheduled(fixedRate = 5000)
public void syncBoxInfo() {
- ArdServerInfo ardServerInfo = new ArdServerInfo();
- ardServerInfo.setUseDataScope(false);
- List<ArdServerInfo> servers = ardServerInfoService.selectArdServerInfoList(ardServerInfo);
+ log.debug("定时执行同步盒子属性任务");
+ try {
+ ArdServerInfo ardServerInfo = new ArdServerInfo();
+ ardServerInfo.setUseDataScope(false);
+ List<ArdServerInfo> servers = ardServerInfoService.selectArdServerInfoList(ardServerInfo);
- for (ArdServerInfo server : servers) {
- ArdDroneInfo droneInfo = new ArdDroneInfo();
- droneInfo.setServerId(server.getId());
- droneInfo.setUseDataScope(false);
- List<ArdDroneInfo> localList = selectArdDroneList(droneInfo);
- Map<String, ArdDroneInfo> localMap = localList.stream().collect(Collectors.toMap(ArdDroneInfo::getBoxSn,
- d -> d));
- List<BoxInfoReceiver> boxList = tyService.getBoxList(server.getId());
- // server 没有返回设备列表 → 全部离线
- if (boxList == null || boxList.isEmpty()) {
- for (ArdDroneInfo local : localList) {
- if (local.getOnLine() != 0) { // 仅当状态变化才更新
- local.setOnLine(0);
- ArdDroneInfoMapper.updateArdDrone(local);
- eventPublisher.publishEvent(new DeviceStatusEvent(local.getBoxSn(), false));
- redisCache.deleteObject(CacheConstants.UAV_ONLINE_KEY + local.getBoxSn());
+ for (ArdServerInfo server : servers) {
+ ArdDroneInfo droneInfo = new ArdDroneInfo();
+ droneInfo.setServerId(server.getId());
+ droneInfo.setUseDataScope(false);
+ List<ArdDroneInfo> localList = selectArdDroneList(droneInfo);
+ Map<String, ArdDroneInfo> localMap = localList.stream().collect(Collectors.toMap(ArdDroneInfo::getBoxSn,
+ d -> d));
+ List<BoxInfoReceiver> boxList = tyService.getBoxList(server.getId());
+ // server 没有返回设备列表 → 全部离线
+ if (boxList == null || boxList.isEmpty()) {
+ for (ArdDroneInfo local : localList) {
+ if (local.getOnLine() != 0) { // 仅当状态变化才更新
+ local.setOnLine(0);
+ ArdDroneInfoMapper.updateArdDrone(local);
+ eventPublisher.publishEvent(new DeviceStatusEvent(local.getBoxSn(), false));
+ redisCache.deleteObject(CacheConstants.UAV_ONLINE_KEY + local.getBoxSn());
+ }
}
+ continue;
}
- continue;
- }
- // server 返回设备列表 → 通过缓存判断状态
- for (BoxInfoReceiver remote : boxList) {
- String boxSn = remote.getBoxSn();
- String redisKey = CacheConstants.UAV_ONLINE_KEY + boxSn;
- boolean currentOnline = remote.getOnLine() == 1;
+ // server 返回设备列表 → 通过缓存判断状态
+ for (BoxInfoReceiver remote : boxList) {
+ String boxSn = remote.getBoxSn();
+ String redisKey = CacheConstants.UAV_ONLINE_KEY + boxSn;
+ boolean currentOnline = remote.getOnLine() == 1;
- ArdDroneInfo local = localMap.get(boxSn);
- boolean dbOnline = local != null && local.getOnLine() == 1;
- boolean needUpdate = (dbOnline != currentOnline);
- // 只要远端设备在线,就刷新Redis缓存(无论状态是否变化),保证缓存一定存在
- if (currentOnline) {
- redisCache.setCacheObject(redisKey, remote);
- } else {
- // 远端离线,删除Redis缓存
- redisCache.deleteObject(redisKey);
- }
- // 如果状态变化才更新
- if (needUpdate){
- // 发布事件
- eventPublisher.publishEvent(new DeviceStatusEvent(boxSn, currentOnline));
- // 更新数据库
- if (local != null) {
- local.setOnLine(currentOnline ? 1 : 0);
- updateArdDrone(local);
+ ArdDroneInfo local = localMap.get(boxSn);
+ boolean dbOnline = local != null && local.getOnLine() == 1;
+ boolean needUpdate = (dbOnline != currentOnline);
+ // 只要远端设备在线,就刷新Redis缓存(无论状态是否变化),保证缓存一定存在
+ if (currentOnline) {
+ redisCache.setCacheObject(redisKey, remote);
+ } else {
+ // 远端离线,删除Redis缓存
+ redisCache.deleteObject(redisKey);
+ }
+ // 如果状态变化才更新
+ if (needUpdate) {
+ // 发布事件
+ eventPublisher.publishEvent(new DeviceStatusEvent(boxSn, currentOnline));
+ // 更新数据库
+ if (local != null) {
+ local.setOnLine(currentOnline ? 1 : 0);
+ updateArdDrone(local);
+ }
}
}
}
+ } catch (Exception e) {
+ log.error("同步盒子属性任务异常", e);
}
}
diff --git a/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskPartServiceImpl.java b/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskPartServiceImpl.java
index dd0d4b1..dc2658d 100644
--- a/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskPartServiceImpl.java
+++ b/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskPartServiceImpl.java
@@ -48,38 +48,44 @@
*/
@Scheduled(fixedRate = 1000)
public void readTelemetryTask() {
- long now = System.currentTimeMillis();
- UavTelemetryDataCache.forEach((boxSn, telemetryData) -> {
- // 1️⃣ 从状态缓存里取当前状态
- UavState uavState = UavStateCache.get(boxSn);
- if (uavState == null) {
- log.warn("状态不存在,不记录");
- return; // 状态不存在,不记录
- }
+ log.debug("定时任务:读取遥测数据");
+ try {
+ long now = System.currentTimeMillis();
+ UavTelemetryDataCache.forEach((boxSn, telemetryData) -> {
+ // 1️⃣ 从状态缓存里取当前状态
+ UavState uavState = UavStateCache.get(boxSn);
+ if (uavState == null) {
+ log.warn("状态不存在,不记录");
+ return; // 状态不存在,不记录
+ }
- // 2️⃣ 使用遥测自身时间戳判断是否还活着
- long dataTs = telemetryData.getTimestamp(); // 设备时间 / 服务器接收时间
- if (now - dataTs > 3000) {
- //log.warn("超过 3 秒没有新遥测 → 认为已离线或冻结,不记录:{}", new Date(dataTs));
- return; // 超过 3 秒没有新遥测 → 认为已离线或冻结,不记录
- }
+ // 2️⃣ 使用遥测自身时间戳判断是否还活着
+ long dataTs = telemetryData.getTimestamp(); // 设备时间 / 服务器接收时间
+ if (now - dataTs > 3000) {
+ //log.warn("超过 3 秒没有新遥测 → 认为已离线或冻结,不记录:{}", new Date(dataTs));
+ return; // 超过 3 秒没有新遥测 → 认为已离线或冻结,不记录
+ }
- int currentStatus = uavState.getFlightControllerState().getFlightStatus();
- Integer lastStatus = lastFlightStatusMap.get(boxSn);
+ int currentStatus = uavState.getFlightControllerState().getFlightStatus();
+ Integer lastStatus = lastFlightStatusMap.get(boxSn);
- // 仅在“飞行中 → 非飞行中”状态变化时 flush
- if (lastStatus != null && lastStatus == 2 && currentStatus != 2) {
- flushRemaining(boxSn);
- }
- lastFlightStatusMap.put(boxSn, currentStatus);
- log.debug("设备 {} 当前状态为:{}", boxSn, currentStatus);
- // 只有飞行中才添加缓存
- if (currentStatus == 2) {
- log.warn("设备 {} 当前状态为飞行中,添加遥测数据到缓存", boxSn);
- UavFlightStateDTO dto = new UavFlightStateDTO(uavState, telemetryData, dataTs);
- addTelemetryData(dto);
- }
- });
+ // 仅在“飞行中 → 非飞行中”状态变化时 flush
+ if (lastStatus != null && lastStatus == 2 && currentStatus != 2) {
+ flushRemaining(boxSn);
+ }
+ lastFlightStatusMap.put(boxSn, currentStatus);
+ log.debug("设备 {} 当前状态为:{}", boxSn, currentStatus);
+ // 只有飞行中才添加缓存
+ if (currentStatus == 2) {
+ log.warn("设备 {} 当前状态为飞行中,添加遥测数据到缓存", boxSn);
+ UavFlightStateDTO dto = new UavFlightStateDTO(uavState, telemetryData, dataTs);
+ addTelemetryData(dto);
+ }
+ });
+ }
+ catch (Exception e) {
+ log.error("定时任务:读取遥测数据异常", e);
+ }
}
/**
diff --git a/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceImpl.java b/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceImpl.java
index ff1016d..64afb12 100644
--- a/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceImpl.java
+++ b/ard-work/src/main/java/com/ard/work/service/impl/ArdFlightTaskServiceImpl.java
@@ -55,12 +55,16 @@
*/
@Scheduled(fixedDelay = 5000)
public void syncAllFlightHistory() {
- List<String> serverIds = ardServerInfoService.getServerIdsList();
- for (String serverId : serverIds) {
- // 获取上次同步的时间(即数据库中最大 startTime)
- Date lastSyncTime = getLastSyncTimeForServer(serverId);
- // 根据上次同步时间同步飞行历史
- syncFlightHistory(serverId, lastSyncTime);
+ try {
+ List<String> serverIds = ardServerInfoService.getServerIdsList();
+ for (String serverId : serverIds) {
+ // 获取上次同步的时间(即数据库中最大 startTime)
+ Date lastSyncTime = getLastSyncTimeForServer(serverId);
+ // 根据上次同步时间同步飞行历史
+ syncFlightHistory(serverId, lastSyncTime);
+ }
+ } catch (Exception e) {
+ log.error("同步飞行历史失败", e);
}
}
diff --git a/ard-quartz/src/main/java/com/ard/quartz/task/MediaTask.java b/ard-work/src/main/java/com/ard/work/service/task/MediaTask.java
similarity index 98%
rename from ard-quartz/src/main/java/com/ard/quartz/task/MediaTask.java
rename to ard-work/src/main/java/com/ard/work/service/task/MediaTask.java
index 1e5258a..264e117 100644
--- a/ard-quartz/src/main/java/com/ard/quartz/task/MediaTask.java
+++ b/ard-work/src/main/java/com/ard/work/service/task/MediaTask.java
@@ -1,4 +1,4 @@
-package com.ard.quartz.task;
+package com.ard.work.service.task;
import com.ard.common.utils.StringUtils;
import com.ard.common.utils.file.MimeTypeUtils;
@@ -39,7 +39,7 @@
*
* @author ard
*/
-@Component("MediaTask")
+@Component
@Slf4j
public class MediaTask {
@Resource
@@ -55,7 +55,7 @@
private final AtomicBoolean runningVideo = new AtomicBoolean(false);
private final AtomicBoolean runningPic = new AtomicBoolean(false);
-
+ @Scheduled(cron = "0/10 * * * * ?")
public void syncVideoMediaUrl() {
log.warn("开始同步视频媒体");
if (!runningVideo.compareAndSet(false, true)) {
@@ -81,7 +81,7 @@
runningVideo.set(false);
}
}
-
+ @Scheduled(cron = "0/10 * * * * ?")
public void syncPicMediaUrl() {
log.warn("开始同步图片媒体");
if (!runningPic.compareAndSet(false, true)) {
--
Gitblit v1.9.3