From b8b5a3895e741d5348ecdd39ad2e5cbd443f8e89 Mon Sep 17 00:00:00 2001
From: zhaowenyu <35589726@qq.com>
Date: Wed, 01 Apr 2026 12:17:04 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev
---
ard-vtdu/src/main/java/com/ard/vtdu/config/MediamtxSixHeConfig.java | 23 +++++
ard-inspection/src/main/java/com/ard/inspection/service/impl/BigFileUploadServiceImpl.java | 10 +
ard-route/src/main/java/com/ard/route/util/InitializationUtils.java | 12 +-
ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdArdMediaServiceImpl.java | 20 ++--
ard-work/src/main/java/com/ard/work/component/websocket/handler/UavStreamManager.java | 21 +++++
ard-admin/src/main/resources/application-daqing.yml | 13 ++-
ard-admin/src/main/resources/application-dev.yml | 54 +++++++++----
ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java | 4
ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInfoServiceImpl.java | 12 +-
ard-admin/src/main/resources/application.yml | 4
ard-admin/src/main/resources/application-prod.yml | 13 +++
ard-inspection/src/main/java/com/ard/inspection/service/impl/ArdPointCloudServiceImpl.java | 7 +
12 files changed, 142 insertions(+), 51 deletions(-)
diff --git a/ard-admin/src/main/resources/application-daqing.yml b/ard-admin/src/main/resources/application-daqing.yml
index 1cb0056..503f160 100644
--- a/ard-admin/src/main/resources/application-daqing.yml
+++ b/ard-admin/src/main/resources/application-daqing.yml
@@ -55,12 +55,12 @@
#流媒体
mediamtx:
apiHost: 192.168.10.103
- playHost: 192.168.10.103
- pushHost: 192.168.10.103
+ playHost: 112.98.104.134
https: true
+ pushHost: 192.168.10.103
rtmpPort: 1935
rtspPort: 8554
- webrtcPort: 8889
+ webrtcPort: 28889
# mqtt配置
@@ -88,4 +88,9 @@
# 机场单独用的oss配置,要http地址
dock:
endpoint: http://192.168.10.103:9011
- bucket: dockfile
\ No newline at end of file
+ bucket: dockfile
+
+pointCloud:
+ url : https://192.168.10.103:3001/tileset/
+ type : /tileset.json
+ folder : /home/inspection/uploadPath/zip/
\ No newline at end of file
diff --git a/ard-admin/src/main/resources/application-dev.yml b/ard-admin/src/main/resources/application-dev.yml
index a70eda9..3548002 100644
--- a/ard-admin/src/main/resources/application-dev.yml
+++ b/ard-admin/src/main/resources/application-dev.yml
@@ -2,10 +2,12 @@
server:
# 服务器的HTTP端口,默认为8080
port: 8080
+
# token配置
token:
# 是否允许账户多终端同时登录(true允许 false不允许)
soloLogin: true
+
# 日志配置
logging:
level:
@@ -23,14 +25,6 @@
enable: false
username: admin
password: ardkj12345
-# MyBatis Plus配置
-mybatis-plus:
- # 搜索指定包别名
- typeAliasesPackage: com.ard.**.domain
- # 配置mapper的扫描,找到所有的mapper.xml映射文件
- mapperLocations: classpath*:mapper/**/*Mapper.xml
- # 加载全局的配置文件
- configLocation: classpath:mybatis/mybatis-config.xml
# 六合服务器配置
tianyu:
@@ -60,13 +54,6 @@
#航线KMZ临时存放路径
waylineSavePath: /home/ard/myworkspace/uav_server/mainserver/waylines
-# MinIO
-minio:
- url: http://192.168.1.15:9001
- accessKey: admin
- secretKey: xzx12345
- bucketName: kmz
-
#上云API
cloud-api:
app:
@@ -75,11 +62,16 @@
license: khjd7FzUTzJgaArNv97XdA2nKQtYfESOvBHLqjC6MpvPqxCfuQ82nOlTgzoiLp7UoZujARopN2A1ctPFaJ8oHiHQrn3IRV4wqN3hdSM40xXj02YVvTWQBT54WS8Ks+E8Zatp3gk2T0+7cM5a5a3mWzxLMv7CNqw2z9pFBoOBdpY=
host: 192.168.1.15
port: 123
+
#流媒体
mediamtx:
apiHost: 192.168.1.15
playHost: 192.168.1.15
- https: false
+ https: true
+ pushHost: 127.0.0.1
+ rtmpPort: 1935
+ rtspPort: 8554
+ webrtcPort: 8889
# mqtt配置
mqtt:
@@ -89,4 +81,32 @@
username: admin
password: public
client-id: liusuyi
- inbound-topic: sys/product/+/status,thing/product/+/requests
\ No newline at end of file
+ inbound-topic: sys/product/+/status,thing/product/+/requests
+
+# oss配置 https://192.168.1.3:9001
+oss:
+ enable: true
+ provider: minio
+ endpoint: https://127.0.0.1:9001
+ access-key: admin
+ secret-key: ard12345
+ bucket: cloud-bucket
+ expire: 3600
+ region: us-east-1
+ object-dir-prefix: wayline
+
+dock:
+ enable: true
+ provider: minio
+ endpoint: http://127.0.0.1:9011
+ access-key: admin
+ secret-key: ard12345
+ bucket: dockfile
+ expire: 3600
+ region: us-east-1
+ object-dir-prefix: wayline
+
+pointCloud:
+ url : https://127.0.10.1:3001/tileset/
+ type : /tileset.json
+ folder : /home/inspection/uploadPath/zip/
\ No newline at end of file
diff --git a/ard-admin/src/main/resources/application-prod.yml b/ard-admin/src/main/resources/application-prod.yml
index 6da2f62..ce8aa27 100644
--- a/ard-admin/src/main/resources/application-prod.yml
+++ b/ard-admin/src/main/resources/application-prod.yml
@@ -62,6 +62,12 @@
rtspPort: 8554
webrtcPort: 8889
+#六合流媒体映射
+mediamtx-sixhe:
+ enable: true
+ playHost: 112.98.104.134
+ webrtcPort: 38889
+
# mqtt配置
mqtt:
protocol: tcp
@@ -86,4 +92,9 @@
dock:
endpoint: http://111.40.46.199:9011
- bucket: dockfile
\ No newline at end of file
+ bucket: dockfile
+
+pointCloud:
+ url : https://192.168.1.3:3001/tileset/
+ type : /tileset.json
+ folder : /home/inspection/uploadPath/zip/
\ No newline at end of file
diff --git a/ard-admin/src/main/resources/application.yml b/ard-admin/src/main/resources/application.yml
index 3f98273..e7dcb72 100644
--- a/ard-admin/src/main/resources/application.yml
+++ b/ard-admin/src/main/resources/application.yml
@@ -118,9 +118,9 @@
servlet:
multipart:
# 单个文件大小
- max-file-size: 3GB
+ max-file-size: 6144MB
# 设置总上传的文件大小
- max-request-size: 3GB
+ max-request-size: 6144MB
# 服务模块
devtools:
restart:
diff --git a/ard-inspection/src/main/java/com/ard/inspection/service/impl/ArdPointCloudServiceImpl.java b/ard-inspection/src/main/java/com/ard/inspection/service/impl/ArdPointCloudServiceImpl.java
index 0520752..fb553be 100644
--- a/ard-inspection/src/main/java/com/ard/inspection/service/impl/ArdPointCloudServiceImpl.java
+++ b/ard-inspection/src/main/java/com/ard/inspection/service/impl/ArdPointCloudServiceImpl.java
@@ -8,6 +8,7 @@
import com.ard.inspection.domain.NotCould;
import com.ard.inspection.utils.ZipFileUtils;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.ard.inspection.mapper.ArdPointCloudMapper;
import com.ard.inspection.domain.ArdPointCloud;
@@ -23,6 +24,9 @@
*/
@Service
public class ArdPointCloudServiceImpl implements IArdPointCloudService {
+
+ @Value(value = "${pointCloud.folder}")
+ private String cloudFolder;
@Autowired
private ArdPointCloudMapper ardPointCloudMapper;
@@ -87,11 +91,10 @@
@Override
public int deleteArdPointCloudByIds(String[] ids) {
// 删除点云文件
- String folderPath = "/home/inspection/uploadPath/zip/";
int count = 0;
for (String id : ids) {
ArdPointCloud ardPointCloud = ardPointCloudMapper.selectArdPointCloudById(id);
- if (zipFileUtils.deleteZipFile(folderPath + ardPointCloud.getFolderName())){
+ if (zipFileUtils.deleteZipFile(cloudFolder + ardPointCloud.getFolderName())){
ardPointCloudMapper.deleteArdPointCloudById(id);
count++;
}
diff --git a/ard-inspection/src/main/java/com/ard/inspection/service/impl/BigFileUploadServiceImpl.java b/ard-inspection/src/main/java/com/ard/inspection/service/impl/BigFileUploadServiceImpl.java
index 225b013..17ebfc4 100644
--- a/ard-inspection/src/main/java/com/ard/inspection/service/impl/BigFileUploadServiceImpl.java
+++ b/ard-inspection/src/main/java/com/ard/inspection/service/impl/BigFileUploadServiceImpl.java
@@ -1,7 +1,6 @@
package com.ard.inspection.service.impl;
import com.ard.common.core.domain.AjaxResult;
-import com.ard.common.utils.uuid.IdUtils;
import com.ard.inspection.domain.ArdPointCloud;
import com.ard.inspection.domain.UploadFileEntity;
import com.ard.inspection.service.IArdPointCloudService;
@@ -9,6 +8,7 @@
import com.ard.inspection.utils.ZipFileUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@@ -28,7 +28,11 @@
@Slf4j
public class BigFileUploadServiceImpl implements IBigFileUploadService {
- public static final String CLOUD_FILE_PATH = "https://192.168.1.3:3001/tileset/";
+ @Value(value = "${pointCloud.url}")
+ private String cloudUrl;
+
+ @Value(value = "${pointCloud.type}")
+ private String cloudType;
@Autowired
private IArdPointCloudService ardPointCloudService;
@@ -256,7 +260,7 @@
ardPointCloud.setFileSize(formatFileSize(file.getSize()));
int dotIndex = originalFilename.lastIndexOf('.');
String folderName = (dotIndex > 0) ? originalFilename.substring(0, dotIndex) : originalFilename;
- String zipP = CLOUD_FILE_PATH + folderName + "/tileset.json";
+ String zipP = cloudUrl + folderName + cloudType;
ardPointCloud.setFilePath(zipP);
ardPointCloud.setFolderName(folderName);
return AjaxResult.success("文件上传并解压成功", ardPointCloud);
diff --git a/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInfoServiceImpl.java b/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInfoServiceImpl.java
index cf56316..0d79c69 100644
--- a/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInfoServiceImpl.java
+++ b/ard-route/src/main/java/com/ard/route/service/impl/ArdRouteInfoServiceImpl.java
@@ -169,6 +169,11 @@
if (ardRouteInfo.getGroupId() == null){
ardRouteInfo.setGroupId("0");
}
+ if ("3".equals(ardRouteInfo.getType())){
+ ardRouteInfo.getUavRouteReq().setHeightMode("EGM96");
+ }else {
+ ardRouteInfo.getUavRouteReq().setHeightMode("relativeToStartPoint");
+ }
ardRouteInfo.getUavRouteReq().setDroneType(subStringDroneType(ardRouteInfo.getAircraft()));
KmzResultVo kmzResult = routeService.buildKmz(ardRouteInfo.getUavRouteReq(),ardRouteInfo.getName());
zoomProcessing(ardRouteInfo);
@@ -465,13 +470,6 @@
// 1.1通过航线数据,转换。
ArdRouteInfo route = ardRouteInfoMapper.selectArdRouteInfoById(id);
try {
-// if ("3".equals(route.getType())) {
-// UavRouteReq uavRouteReq = new UavRouteReq();
-// BeanUtils.copyProperties(deserialize(route.getRouteData()), uavRouteReq);
-// route.setUavRouteReq((UavRouteReq) deserialize(route.getRouteData()));
-// }else {
-// route.setUavRouteReq((UavRouteReq) deserialize(route.getRouteData()));
-// }
route.setUavRouteReq((UavRouteReq) deserialize(route.getRouteData()));
if (route.getCloudData() != null){
route.setArdPointCloudList(deserializeLs(route.getCloudData()));
diff --git a/ard-route/src/main/java/com/ard/route/util/InitializationUtils.java b/ard-route/src/main/java/com/ard/route/util/InitializationUtils.java
index b5a1cd4..0742cc7 100644
--- a/ard-route/src/main/java/com/ard/route/util/InitializationUtils.java
+++ b/ard-route/src/main/java/com/ard/route/util/InitializationUtils.java
@@ -34,7 +34,8 @@
if (uavRouteReq.getTakeOffRefPoint() == null){
uavRouteReq.setTakeOffRefPoint(
uavRouteReq.getRoutePointList().get(0).getLatitude() + "," +
- uavRouteReq.getRoutePointList().get(0).getLongitude() + "," + "0");
+ uavRouteReq.getRoutePointList().get(0).getLongitude() + "," +
+ uavRouteReq.getRoutePointList().get(0).getHeight());
}
//uavRouteReq.setDroneType(89);
uavRouteReq.setSubDroneType(0);
@@ -56,7 +57,6 @@
}
uavRouteReq.setWaypointTurnReq(waypointTurnReq);
uavRouteReq.setGimbalPitchMode("usePointSetting");
- uavRouteReq.setHeightMode("EGM96");
if (M350_RTK.getValue().equals(uavRouteReq.getDroneType())) {
// 变焦数值加工
buildZoom(uavRouteReq);
@@ -91,9 +91,11 @@
* 根据起飞点高度减去当前航点高度
*/
public void buildHeight(UavRouteReq uavRouteReq){
- double takeOffHeight = getDoublePoint(uavRouteReq.getTakeOffRefPoint(),"alt");
- for (RoutePointReq routePointReq : uavRouteReq.getRoutePointList()) {
- routePointReq.setHeight(routePointReq.getHeight() - takeOffHeight);
+ if (!"EGM96".equals(uavRouteReq.getHeightMode())){
+ double takeOffHeight = getDoublePoint(uavRouteReq.getTakeOffRefPoint(),"alt");
+ for (RoutePointReq routePointReq : uavRouteReq.getRoutePointList()) {
+ routePointReq.setHeight(routePointReq.getHeight() - takeOffHeight);
+ }
}
}
diff --git a/ard-vtdu/src/main/java/com/ard/vtdu/config/MediamtxSixHeConfig.java b/ard-vtdu/src/main/java/com/ard/vtdu/config/MediamtxSixHeConfig.java
new file mode 100644
index 0000000..1303420
--- /dev/null
+++ b/ard-vtdu/src/main/java/com/ard/vtdu/config/MediamtxSixHeConfig.java
@@ -0,0 +1,23 @@
+package com.ard.vtdu.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * MediamtxConfig
+ *
+ * @author liusuyi
+ * @date 2024年11月09日16:18
+ **/
+@Configuration
+@Data
+@ConfigurationProperties(prefix = "mediamtx-sixhe")
+public class MediamtxSixHeConfig {
+ //是否启动映射转换
+ private Boolean enable;
+ //播放ip地址
+ private String playHost;
+ //webrtc端口
+ private Integer webrtcPort;
+}
diff --git a/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdArdMediaServiceImpl.java b/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdArdMediaServiceImpl.java
index 533f3bc..3aacf67 100644
--- a/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdArdMediaServiceImpl.java
+++ b/ard-vtdu/src/main/java/com/ard/vtdu/service/impl/ArdArdMediaServiceImpl.java
@@ -58,21 +58,23 @@
String protocol = mediamtxConfig.isHttps() ? "https://" : "http://";
String webrtcUrl =
protocol + mediamtxConfig.getPlayHost() + ":" + mediamtxConfig.getWebrtcPort() + "/" + ardVtdu.getName();
-
+ String source = ardVtdu.getRtspSource();
Conf conf = new Conf();
- conf.setSource(ardVtdu.getRtspSource());
- if(!"publisher".equalsIgnoreCase(conf.getSource())) {
- conf.setSourceOnDemand(true);
+ conf.setName(ardVtdu.getName());
+ conf.setSource(source);
+ // 如果是拉流则配置按需
+ if (!"publisher".equalsIgnoreCase(source)) {
+ conf.setSourceOnDemand(true); // 按需拉
+ conf.setRunOnDemandCloseAfter("5s"); // 无观众 5 秒断开
}
- conf.setRunOnDemandRestart(false);
- conf.setRunOnDemandCloseAfter("5s");
conf.setMaxReaders(100);
conf.setSourceProtocol("tcp");
- if (checkNameExist(ardVtdu.getName())) {
- mediaClient.removePath(ardVtdu.getName());
+ if (!checkNameExist(ardVtdu.getName())) {
+ mediaClient.addPath(ardVtdu.getName(), conf);
+ } else {
+ mediaClient.editPath(ardVtdu.getName(), conf);
}
- mediaClient.addPath(ardVtdu.getName(), conf);
ardVtdu.setCameraId(ardVtdu.getName().split("_")[0]);
ardVtdu.setRtspUrl(rtspUrl);
diff --git a/ard-work/src/main/java/com/ard/work/component/websocket/handler/UavStreamManager.java b/ard-work/src/main/java/com/ard/work/component/websocket/handler/UavStreamManager.java
index 40b795b..0cc0861 100644
--- a/ard-work/src/main/java/com/ard/work/component/websocket/handler/UavStreamManager.java
+++ b/ard-work/src/main/java/com/ard/work/component/websocket/handler/UavStreamManager.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson2.JSON;
+import com.ard.vtdu.config.MediamtxSixHeConfig;
import com.ard.vtdu.domain.ArdVtdu;
import com.ard.work.component.websocket.utils.WebSocketUtil;
import com.ard.work.domain.message.BaseMessage;
@@ -27,6 +28,8 @@
@Resource
private ITyService tyService;
+ @Resource
+ private MediamtxSixHeConfig mediamtxSixHeConfig;
// 盒子拉流地址缓存 key:boxSn value: webrtcUrl
public static final ConcurrentMap<String, String> BOX_STREAM_PULL_MAP = new ConcurrentHashMap<>();
@@ -123,6 +126,24 @@
if (boxLiveUrl == null) {
throw new RuntimeException("未获取到盒子直播地址:" + boxSn);
}
+ // 2. 获取原始 URL 字符串
+ String originalUrl = boxLiveUrl.getRtc();
+ if (mediamtxSixHeConfig.getEnable() && originalUrl != null && !originalUrl.isEmpty()) {
+ // --- 开始替换逻辑 ---
+ // 配置你的外网地址
+ String targetHost = mediamtxSixHeConfig.getPlayHost() + ":" + mediamtxSixHeConfig.getWebrtcPort();
+ // 正则解释:
+ // (^https?://) -> 捕获组1:匹配 http:// 或 https://
+ // ([^/:]+) -> 捕获组2:匹配 IP 地址或域名 (非 / 和 : 的字符)
+ // (:\d+)? -> 捕获组3:匹配 :端口号 (可选)
+ // (/.*) -> 捕获组4:匹配后面的路径参数
+ String regex = "(^https?://)([^/:]+)(:\\d+)?(/.*)";
+ // 替换为:协议 + 外网IP:端口 + 路径
+ // $1 代表协议, $4 代表路径
+ String newUrl = originalUrl.replaceAll(regex, "$1" + targetHost + "$4");
+ // 将新 URL 设置回去
+ boxLiveUrl.setRtc(newUrl);
+ }
boxLiveUrl.setBoxSn(boxSn);
return boxLiveUrl;
}
diff --git a/ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java b/ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java
index 2206340..83e24dd 100644
--- a/ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java
+++ b/ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java
@@ -1,6 +1,7 @@
package com.ard.work.service.impl;
import com.ard.common.exception.ControlException;
+import com.ard.vtdu.config.MediamtxConfig;
import com.ard.work.aspect.annotation.CheckControlRight;
import com.ard.work.aspect.annotation.CheckDroneStatus;
import com.ard.work.aspect.annotation.CheckNoFlyZone;
@@ -87,7 +88,8 @@
private RouteStateMachineService stateMachineService;
@Autowired
private IArdFlightTaskPartService ardFlightTaskPartService;
-
+ @Resource
+ private MediamtxConfig mediamtxConfig;
/**
* 获取边缘服务器token信息
*
--
Gitblit v1.9.3