From dc4d96ff05b50617c685d90d625c6e2617c81dde Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Fri, 01 Nov 2024 14:53:54 +0800
Subject: [PATCH] 增加:航线 关闭:流媒体拉流

---
 ard-work/src/main/java/com/ard/tianyu/netty/handler/ClientHandler.java                        |    3 
 ard-work/src/main/java/com/ard/tianyu/controller/UavWayLineController.java                    |   39 +++
 ard-work/src/main/java/com/ard/tianyu/netty/TyNettyTcpClient.java                             |    3 
 ard-work/src/main/java/com/ard/tianyu/netty/handler/MessageProtocolDecoder.java               |    3 
 ard-work/src/main/java/com/ard/tianyu/service/impl/TyServiceImpl.java                         |   67 +++++
 ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/PlanLineDataConverter.java  |  128 +++++++++
 ard-work/src/main/java/com/ard/tianyu/model/cache/TyTcpServerCache.java                       |   31 ++
 ard-work/src/main/java/com/ard/tianyu/service/ITyService.java                                 |    6 
 ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/SurroundModelConverter.java |   47 +++
 ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/HangarPoint.java                      |   23 +
 ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/PointDataConverter.java     |   53 ++++
 ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/SurroundModel.java                    |   14 +
 ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/HangarPointConverter.java   |   29 ++
 ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/NormalModelConverter.java   |   48 +++
 ard-work/src/main/java/com/ard/tianyu/netty/command/wayline/WayLineUploadCmd.java             |   40 +++
 ard-work/src/main/java/com/ard/vtdu/service/impl/MediaServiceImpl.java                        |    9 
 ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/PlanLineData.java                     |   34 ++
 ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/WayLineUploadDTO.java                 |   22 +
 ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/NormalModel.java                      |   30 ++
 ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/PointAction.java                      |   22 +
 ard-work/src/main/java/com/ard/tianyu/netty/command/wayline/WayLineUploadReplyCmd.java        |   37 ++
 ard-work/src/main/java/com/ard/tianyu/model/dto/state/PointData.java                          |   14 +
 ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/PointActionConverter.java   |   27 ++
 23 files changed, 725 insertions(+), 4 deletions(-)

diff --git a/ard-work/src/main/java/com/ard/tianyu/controller/UavWayLineController.java b/ard-work/src/main/java/com/ard/tianyu/controller/UavWayLineController.java
new file mode 100644
index 0000000..6f4f203
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/controller/UavWayLineController.java
@@ -0,0 +1,39 @@
+package com.ard.tianyu.controller;
+
+import com.ard.common.core.domain.AjaxResult;
+import com.ard.tianyu.model.dto.speaker.SpeakModeSwitchDTO;
+import com.ard.tianyu.model.dto.speaker.StopSpeakDTO;
+import com.ard.tianyu.model.dto.speaker.TextSpeakDTO;
+import com.ard.tianyu.model.dto.wayline.WayLineUploadDTO;
+import com.ard.tianyu.service.ITyService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * UavSpeakerController
+ *
+ * @author liusuyi
+ * @date 2024年10月21日13:52
+ **/
+@Api(tags = "无人机航线飞行接口")
+@RequestMapping("/uav/wayline")
+@RestController
+public class UavWayLineController {
+
+    @Resource
+    private ITyService tyService;
+
+    @ApiOperation("上传航线")
+    @PostMapping("/wayLineUpload")
+    public AjaxResult wayLineUpload(@RequestBody WayLineUploadDTO wayLineUploadDTO) {
+        tyService.wayLineUpload(wayLineUploadDTO);
+        return AjaxResult.success();
+    }
+
+}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/cache/TyTcpServerCache.java b/ard-work/src/main/java/com/ard/tianyu/model/cache/TyTcpServerCache.java
new file mode 100644
index 0000000..26989c9
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/cache/TyTcpServerCache.java
@@ -0,0 +1,31 @@
+package com.ard.tianyu.model.cache;
+
+import com.ard.tianyu.model.dto.signal.SignalInfo;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 天宇tcp服务器缓存
+ *
+ * @author liusuyi
+ * @date 2024年11月01日13:53
+ **/
+public class TyTcpServerCache {
+    // 使用 ConcurrentHashMap 来缓存TCP服务连接状态,key 是 ip:port(服务器地址) value 是连接状态
+    private static final ConcurrentHashMap<String, Boolean> tcpServerCache = new ConcurrentHashMap<>();
+
+    // 存储TCP服务连接状态到缓存
+    public static void putTcpServerCache(String tcpServer,Boolean state) {
+        tcpServerCache.put(tcpServer, state);
+    }
+
+    // 从缓存中获取TCP服务连接状态
+    public static Boolean getTcpServerCache(String tcpServer) {
+        return tcpServerCache.getOrDefault(tcpServer,false);
+    }
+
+    // 删除缓存中的TCP服务连接状态
+    public static void removeTcpServerCache(String tcpServer) {
+        tcpServerCache.remove(tcpServer);
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/HangarPointConverter.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/HangarPointConverter.java
new file mode 100644
index 0000000..920bca8
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/HangarPointConverter.java
@@ -0,0 +1,29 @@
+package com.ard.tianyu.model.dto.converter.wayline;
+
+import com.ard.common.utils.bean.BeanUtils;
+import com.ard.tianyu.model.dto.wayline.HangarPoint;
+import com.ard.tianyu.netty.protobuf.TelemetryDataPB;
+
+public class HangarPointConverter {
+    public static TelemetryDataPB.HangarPoint convertEntityToProto(HangarPoint hangarPoint) {
+        // 使用 Protobuf 的构建器创建 HangarPoint 对象
+        TelemetryDataPB.HangarPoint.Builder builder = TelemetryDataPB.HangarPoint.newBuilder();
+        
+        // 从 HangarPoint 实体中获取值并设置到 Protobuf 对象
+        builder.setHangarId(hangarPoint.getHangarId());
+        builder.setHangarLng(hangarPoint.getHangarLng());
+        builder.setHangarLat(hangarPoint.getHangarLat());
+        builder.setAlternateLng(hangarPoint.getAlternateLng());
+        builder.setAlternateLat(hangarPoint.getAlternateLat());
+        
+        // 构建并返回 Protobuf 对象
+        return builder.build();
+    }
+    // 将 Protobuf 对象转换为实体对象
+    public static HangarPoint convertProtoToEntity(TelemetryDataPB.HangarPoint proto) {
+        HangarPoint hangarPoint = new HangarPoint();
+        // 从 Protobuf 对象中获取值并设置到实体对象
+        BeanUtils.copyProperties(proto, hangarPoint);
+        return hangarPoint;
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/NormalModelConverter.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/NormalModelConverter.java
new file mode 100644
index 0000000..7d66816
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/NormalModelConverter.java
@@ -0,0 +1,48 @@
+package com.ard.tianyu.model.dto.converter.wayline;
+
+import com.ard.common.utils.bean.BeanUtils;
+import com.ard.tianyu.model.dto.wayline.NormalModel;
+import com.ard.tianyu.netty.protobuf.TelemetryDataPB;
+
+public class NormalModelConverter {
+    public static TelemetryDataPB.NormalModel convertEntityToProto(NormalModel normalModel) {
+        // 使用构建器来创建 Protobuf 对象
+        TelemetryDataPB.NormalModel.Builder builder = TelemetryDataPB.NormalModel.newBuilder();
+
+        // 复制基本属性
+        builder.setServiceId(normalModel.getServiceId());
+        builder.setCameraId(normalModel.getCameraId());
+        builder.setIsModeling(normalModel.getIsModeling());
+        builder.setMode(normalModel.getMode());
+        builder.setHOverlap(normalModel.getHOverlap());
+        builder.setVOverlap(normalModel.getVOverlap());
+        builder.setMirror(normalModel.getMirror());
+
+        // 处理 repeated fields
+        if (normalModel.getArea() != null) {
+            normalModel.getArea().forEach(pointData -> {
+                builder.addArea(PointDataConverter.convertEntityToProto(pointData));
+            });
+        }
+
+        // 构建并返回 Protobuf 对象
+        return builder.build();
+    }
+
+    // 将 Protobuf 对象转换为实体对象
+    public static NormalModel convertProtoToEntity(TelemetryDataPB.NormalModel proto) {
+        NormalModel normalModel = new NormalModel();
+
+        // 复制基本属性
+        BeanUtils.copyProperties(proto, normalModel);
+
+        // 处理 repeated fields
+        if (proto.getAreaCount() > 0) {
+            proto.getAreaList().forEach(pointDataProto -> {
+                normalModel.getArea().add(PointDataConverter.convertProtoToEntity(pointDataProto));
+            });
+        }
+
+        return normalModel;
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/PlanLineDataConverter.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/PlanLineDataConverter.java
new file mode 100644
index 0000000..416494d
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/PlanLineDataConverter.java
@@ -0,0 +1,128 @@
+package com.ard.tianyu.model.dto.converter.wayline;
+
+import com.ard.common.utils.bean.BeanUtils;
+import com.ard.tianyu.model.dto.state.PointData;
+import com.ard.tianyu.model.dto.wayline.HangarPoint;
+import com.ard.tianyu.model.dto.wayline.NormalModel;
+import com.ard.tianyu.model.dto.wayline.PlanLineData;
+import com.ard.tianyu.model.dto.wayline.SurroundModel;
+import com.ard.tianyu.netty.protobuf.TelemetryDataPB;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class PlanLineDataConverter {
+
+    // 将 Protobuf 对象转换为实体对象
+    public static PlanLineData convertProtoToEntity(TelemetryDataPB.PlanLineData proto) {
+        PlanLineData planLineData = new PlanLineData();
+        
+        // 使用 BeanUtils 复制属性
+        BeanUtils.copyProperties(proto, planLineData);
+        
+        // 处理 repeated fields
+        if (proto.getPointsCount() > 0) {
+            List<PointData> points = proto.getPointsList().stream()
+                .map(PointDataConverter::convertProtoToEntity)
+                .collect(Collectors.toList());
+            planLineData.setPoints(points);
+        }
+        
+        if (proto.getInterestsCount() > 0) {
+            List<PointData> interests = proto.getInterestsList().stream()
+                .map(PointDataConverter::convertProtoToEntity)
+                .collect(Collectors.toList());
+            planLineData.setInterests(interests);
+        }
+        
+        // 处理 HangarPoint
+        if (proto.hasTakePoint()) {
+            HangarPoint takePoint = HangarPointConverter.convertProtoToEntity(proto.getTakePoint());
+            planLineData.setTakePoint(takePoint);
+        }
+        
+        if (proto.hasLandPoint()) {
+            HangarPoint landPoint = HangarPointConverter.convertProtoToEntity(proto.getLandPoint());
+            planLineData.setLandPoint(landPoint);
+        }
+        
+        // 处理 NormalModel 和 SurroundModel
+        if (proto.hasNormalModel()) {
+            NormalModel normalModel = NormalModelConverter.convertProtoToEntity(proto.getNormalModel());
+            planLineData.setNormalModel(normalModel);
+        }
+        
+        if (proto.hasSurroundModel()) {
+            SurroundModel surroundModel = SurroundModelConverter.convertProtoToEntity(proto.getSurroundModel());
+            planLineData.setSurroundModel(surroundModel);
+        }
+        
+        // 处理起飞点
+        if (proto.hasTakeOffPoint()) {
+            PointData takeOffPoint = PointDataConverter.convertProtoToEntity(proto.getTakeOffPoint());
+            planLineData.setTakeOffPoint(takeOffPoint);
+        }
+
+        return planLineData;
+    }
+
+    // 将实体对象转换为 Protobuf 对象
+    public static TelemetryDataPB.PlanLineData convertEntityToProto(PlanLineData planLineData) {
+        // 创建 Protobuf 的构建器
+        TelemetryDataPB.PlanLineData.Builder builder = TelemetryDataPB.PlanLineData.newBuilder();
+
+        // 复制基本属性
+        builder.setFinishedAction(planLineData.getFinishedAction());
+        builder.setMaxSpeed(planLineData.getMaxSpeed());
+        builder.setAutoSpeed(planLineData.getAutoSpeed());
+        builder.setLoseAction(planLineData.getLoseAction());
+        builder.setHomeHeight(planLineData.getHomeHeight());
+        builder.setIsSaveEnergyMode(planLineData.getIsSaveEnergyMode());
+
+        // 处理 repeated fields
+        if (planLineData.getPoints() != null) {
+            List<TelemetryDataPB.PointData> points = planLineData.getPoints().stream()
+                .map(PointDataConverter::convertEntityToProto)
+                .collect(Collectors.toList());
+            builder.addAllPoints(points);
+        }
+        
+        if (planLineData.getInterests() != null) {
+            List<TelemetryDataPB.PointData> interests = planLineData.getInterests().stream()
+                .map(PointDataConverter::convertEntityToProto)
+                .collect(Collectors.toList());
+            builder.addAllInterests(interests);
+        }
+        
+        // 处理 HangarPoint
+        if (planLineData.getTakePoint() != null) {
+            TelemetryDataPB.HangarPoint takePoint = HangarPointConverter.convertEntityToProto(planLineData.getTakePoint());
+            builder.setTakePoint(takePoint);
+        }
+        
+        if (planLineData.getLandPoint() != null) {
+            TelemetryDataPB.HangarPoint landPoint = HangarPointConverter.convertEntityToProto(planLineData.getLandPoint());
+            builder.setLandPoint(landPoint);
+        }
+        
+        // 处理 NormalModel 和 SurroundModel
+        if (planLineData.getNormalModel() != null) {
+            TelemetryDataPB.NormalModel normalModel = NormalModelConverter.convertEntityToProto(planLineData.getNormalModel());
+            builder.setNormalModel(normalModel);
+        }
+        
+        if (planLineData.getSurroundModel() != null) {
+            TelemetryDataPB.SurroundModel surroundModel = SurroundModelConverter.convertEntityToProto(planLineData.getSurroundModel());
+            builder.setSurroundModel(surroundModel);
+        }
+        
+        // 处理起飞点
+        if (planLineData.getTakeOffPoint() != null) {
+            TelemetryDataPB.PointData takeOffPoint = PointDataConverter.convertEntityToProto(planLineData.getTakeOffPoint());
+            builder.setTakeOffPoint(takeOffPoint);
+        }
+
+        // 构建并返回 Protobuf 对象
+        return builder.build();
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/PointActionConverter.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/PointActionConverter.java
new file mode 100644
index 0000000..8341ffb
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/PointActionConverter.java
@@ -0,0 +1,27 @@
+package com.ard.tianyu.model.dto.converter.wayline;
+
+import com.ard.common.utils.bean.BeanUtils;
+import com.ard.tianyu.model.dto.wayline.PointAction;
+import com.ard.tianyu.netty.protobuf.TelemetryDataPB;
+
+public class PointActionConverter {
+    public static TelemetryDataPB.PointAction convertEntityToProto(PointAction pointAction) {
+        // 使用构建器来创建 Protobuf 对象
+        TelemetryDataPB.PointAction.Builder builder = TelemetryDataPB.PointAction.newBuilder();
+
+        // 复制基本属性
+        builder.setType(pointAction.getType());
+        builder.setParam(pointAction.getParam());
+        builder.setWaitTime(pointAction.getWaitTime());
+        builder.setSpeakInfo(pointAction.getSpeakInfo());
+
+        // 构建并返回 Protobuf 对象
+        return builder.build();
+    }
+
+    public static PointAction convertProtoToEntity(TelemetryDataPB.PointAction proto) {
+        PointAction pointAction = new PointAction();
+        BeanUtils.copyProperties(proto, pointAction);
+        return pointAction;
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/PointDataConverter.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/PointDataConverter.java
new file mode 100644
index 0000000..8465898
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/PointDataConverter.java
@@ -0,0 +1,53 @@
+package com.ard.tianyu.model.dto.converter.wayline;
+
+import com.ard.common.utils.bean.BeanUtils;
+import com.ard.tianyu.model.dto.state.PointData;
+import com.ard.tianyu.model.dto.wayline.PointAction;
+import com.ard.tianyu.netty.protobuf.TelemetryDataPB;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class PointDataConverter {
+    public static TelemetryDataPB.PointData convertEntityToProto(PointData pointData) {
+        // 使用构建器来创建 Protobuf 对象
+        TelemetryDataPB.PointData.Builder builder = TelemetryDataPB.PointData.newBuilder();
+
+        // 复制基本属性
+        builder.setLng(pointData.getLng());
+        builder.setLat(pointData.getLat());
+        builder.setHeight(pointData.getHeight());
+        builder.setSpeed(pointData.getSpeed());
+        builder.setFlightPathMode(pointData.getFlightPathMode());
+        builder.setDampingDistance(pointData.getDampingDistance());
+        builder.setSafeGohomeFlag(pointData.getSafeGohomeFlag());
+        builder.setHeadingMode(pointData.getHeadingMode());
+        builder.setHeading(pointData.getHeading());
+        builder.setInterestIndex(pointData.getInterestIndex());
+        builder.setGroupIndex(pointData.getGroupIndex());
+
+        // 处理动作数组
+        if (pointData.getActions() != null && !pointData.getActions().isEmpty()) {
+            List<TelemetryDataPB.PointAction> actions = pointData.getActions().stream()
+                    .map(PointActionConverter::convertEntityToProto)
+                    .collect(Collectors.toList());
+            builder.addAllActions(actions);
+        }
+
+        // 构建并返回 Protobuf 对象
+        return builder.build();
+    }
+
+    public static PointData convertProtoToEntity(TelemetryDataPB.PointData proto) {
+        PointData pointData = new PointData();
+        BeanUtils.copyProperties(proto, pointData);
+        // 处理 repeated fields
+        if (proto.getActionsCount() > 0) {
+            List<PointAction> actions = proto.getActionsList().stream()
+                    .map(PointActionConverter::convertProtoToEntity)
+                    .collect(Collectors.toList());
+            pointData.setActions(actions);
+        }
+        return pointData;
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/SurroundModelConverter.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/SurroundModelConverter.java
new file mode 100644
index 0000000..3ce0b0d
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/converter/wayline/SurroundModelConverter.java
@@ -0,0 +1,47 @@
+package com.ard.tianyu.model.dto.converter.wayline;
+
+import com.ard.common.utils.bean.BeanUtils;
+import com.ard.tianyu.model.dto.state.PointData;
+import com.ard.tianyu.model.dto.wayline.SurroundModel;
+import com.ard.tianyu.netty.protobuf.TelemetryDataPB;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class SurroundModelConverter {
+    public static TelemetryDataPB.SurroundModel convertEntityToProto(SurroundModel surroundModel) {
+        // 使用构建器来创建 Protobuf 对象
+        TelemetryDataPB.SurroundModel.Builder builder = TelemetryDataPB.SurroundModel.newBuilder();
+
+        // 复制基本属性
+        builder.setServiceId(surroundModel.getServiceId());
+        builder.setCameraId(surroundModel.getCameraId());
+        builder.setIsModeling(surroundModel.getIsModeling());
+
+        // 处理 repeated fields
+        if (surroundModel.getArea() != null && !surroundModel.getArea().isEmpty()) {
+            List<TelemetryDataPB.PointData> area = surroundModel.getArea().stream()
+                    .map(PointDataConverter::convertEntityToProto)
+                    .collect(Collectors.toList());
+            builder.addAllArea(area);
+        }
+
+        // 构建并返回 Protobuf 对象
+        return builder.build();
+    }
+
+    public static SurroundModel convertProtoToEntity(TelemetryDataPB.SurroundModel proto) {
+        SurroundModel surroundModel = new SurroundModel();
+        BeanUtils.copyProperties(proto, surroundModel);
+
+        // 处理 repeated fields
+        if (proto.getAreaCount() > 0) {
+            List<PointData> area = proto.getAreaList().stream()
+                    .map(PointDataConverter::convertProtoToEntity)
+                    .collect(Collectors.toList());
+            surroundModel.setArea(area);
+        }
+        
+        return surroundModel;
+    }
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/state/PointData.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/state/PointData.java
index 4ed630b..8ab5ecf 100644
--- a/ard-work/src/main/java/com/ard/tianyu/model/dto/state/PointData.java
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/state/PointData.java
@@ -1,10 +1,24 @@
 package com.ard.tianyu.model.dto.state;
 
+import com.ard.tianyu.model.dto.wayline.PointAction;
 import lombok.Data;
+
+import java.util.List;
 
 // 假设 PointData 类定义如下
 @Data
 public class PointData {
     private double lat; // 纬度
     private double lng; // 经度
+    private float height; // 高度(单位:米,范围0~遥控器限高)
+    private float speed; // 速度(单位:米/秒,范围0~15),默认8
+    private List<PointAction> actions; // 动作数组
+    private int flightPathMode; // 航线飞行模式:1=直线飞行,2=协调转弯,3=曲线飞行(停),4=曲线飞行(不停)
+    private float dampingDistance; // 转弯半径(仅协调转弯模式下有效),取值范围1~655.35单位:米
+    private int safeGohomeFlag; // 是否为安全返航点 0=不是,1=是
+    private int headingMode; // 偏航模式 0=自动,1=锁定,2=遥控器控制,3=云台依照航点方向旋转,4=朝向兴趣点,5=飞机和云台的偏航同时旋转
+    private float heading; // 航点偏航 -180~180
+    private int interestIndex; // 兴趣点下标,默认-1
+    private int groupIndex; // 组下标
+
 }
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/HangarPoint.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/HangarPoint.java
new file mode 100644
index 0000000..525e493
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/HangarPoint.java
@@ -0,0 +1,23 @@
+package com.ard.tianyu.model.dto.wayline;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+/**
+ * 机库信息实体对象
+ *
+ * @author liusuyi
+ * @date 2024年11月01日10:55
+ **/
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class HangarPoint {
+    private String hangarId; // 机库ID
+    private double hangarLng; // 机库经度
+    private double hangarLat; // 机库纬度
+    private double alternateLng; // 备降点经度
+    private double alternateLat; // 备降点纬度
+}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/NormalModel.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/NormalModel.java
new file mode 100644
index 0000000..805651c
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/NormalModel.java
@@ -0,0 +1,30 @@
+package com.ard.tianyu.model.dto.wayline;
+
+import com.ard.tianyu.model.dto.state.PointData;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * 普通建模实体对象
+ *
+ * @author liusuyi
+ * @date 2024年11月01日10:55
+ **/
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class NormalModel {
+    private List<PointData> area; // 作业区域
+    private int serviceId; // 建模平台编号:1=瞰景,2=大势,默认1
+    private int cameraId; // 相机编号
+    private int isModeling; // 是否实时建模:0=不,1=是
+    private int mode; // 作业模式:1=倾斜,2=正摄
+    private int hOverlap; // 横向重叠率
+    private int vOverlap; // 纵向重叠率
+    private int mirror; // 方向正反
+}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/PlanLineData.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/PlanLineData.java
new file mode 100644
index 0000000..46494fb
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/PlanLineData.java
@@ -0,0 +1,34 @@
+package com.ard.tianyu.model.dto.wayline;
+
+import com.ard.tianyu.model.dto.state.PointData;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+/**
+ * 航线实体对象
+ *
+ * @author liusuyi
+ * @date 2024年11月01日10:55
+ **/
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class PlanLineData {
+    private int finishedAction; // 结束航线后动作
+    private float maxSpeed; // 最大飞行速度(单位:米/秒)
+    private float autoSpeed; // 自动飞行速度(单位:米/秒)
+    private List<PointData> points; // 坐标点数组
+    private int loseAction; // 网络失联后动作
+    private int homeHeight; // 返航高度
+    private int isSaveEnergyMode; // 是否开启节能模式
+    private HangarPoint takePoint; // 起飞点机库信息
+    private HangarPoint landPoint; // 降落点机库信息
+    private List<PointData> interests; // 兴趣点数组
+    private NormalModel normalModel; // 普通建模
+    private SurroundModel surroundModel; // 环绕建模
+    private PointData takeOffPoint; // 起飞点
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/PointAction.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/PointAction.java
new file mode 100644
index 0000000..2372dc4
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/PointAction.java
@@ -0,0 +1,22 @@
+package com.ard.tianyu.model.dto.wayline;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+/**
+ * 航点动作实体对象
+ *
+ * @author liusuyi
+ * @date 2024年11月01日10:55
+ **/
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class PointAction {
+    private int type; // 类型:1-变焦 2-拍照 3-录像 4-停录 5-控制飞机机头偏航 6-控制云台俯仰 7-控制云台偏航 8-控制云台横滚 9-悬停 10-等距间隔拍照 11-等时间隔拍照 12-结束间隔拍照 13-单条喊话 14-开始循环喊话 15-结束循环喊话 16-对焦
+    private float param; // 参数,根据类型不同含义不同
+    private int waitTime; // 动作触发后等待时长(单位:秒)
+    private String speakInfo; // 喊话内容[type=13和type=14时生效]
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/SurroundModel.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/SurroundModel.java
new file mode 100644
index 0000000..9986902
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/SurroundModel.java
@@ -0,0 +1,14 @@
+package com.ard.tianyu.model.dto.wayline;
+
+import com.ard.tianyu.model.dto.state.PointData;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SurroundModel {
+    private List<PointData> area; // 作业区域
+    private int serviceId; // 建模平台编号:1=瞰景
+    private int cameraId; // 相机编号
+    private int isModeling; // 是否实时建模:0=不,1=是
+}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/WayLineUploadDTO.java b/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/WayLineUploadDTO.java
new file mode 100644
index 0000000..7ed3fdf
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/model/dto/wayline/WayLineUploadDTO.java
@@ -0,0 +1,22 @@
+package com.ard.tianyu.model.dto.wayline;
+
+import com.ard.tianyu.netty.protobuf.TelemetryDataPB;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 上传航线实体对象
+ *
+ * @author liusuyi
+ * @date 2024年11月01日10:55
+ **/
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class WayLineUploadDTO {
+    private String boxSn;
+    private PlanLineData wayLineData;
+}
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/TyNettyTcpClient.java b/ard-work/src/main/java/com/ard/tianyu/netty/TyNettyTcpClient.java
index 08065a6..e226263 100644
--- a/ard-work/src/main/java/com/ard/tianyu/netty/TyNettyTcpClient.java
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/TyNettyTcpClient.java
@@ -1,6 +1,7 @@
 package com.ard.tianyu.netty;
 
 import com.ard.tianyu.config.TyConfiguration;
+import com.ard.tianyu.model.cache.TyTcpServerCache;
 import com.ard.tianyu.netty.handler.ClientHandler;
 import com.ard.tianyu.netty.handler.MessageProtocolDecoder;
 import com.ard.tianyu.netty.handler.MessageProtocolEncoder;
@@ -72,10 +73,12 @@
         ChannelFuture future = bootstrap.connect(host, port).addListener((ChannelFuture futureListener) -> {
             if (futureListener.isSuccess()) {
                 log.info("连接天宇TCP服务器成功【{}:{}】", host, port);
+                TyTcpServerCache.putTcpServerCache(host + ":" + port, true);
             } else {
                 final EventLoop eventLoop = futureListener.channel().eventLoop();
                 eventLoop.schedule(() -> {
                     log.info("连接天宇TCP服务器失败【{}:{}】,正尝试重连...", host, port);
+                    TyTcpServerCache.putTcpServerCache(host + ":" + port, false);
                     try {
                         initConnection(host, port);
                     } catch (Exception e) {
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/wayline/WayLineUploadCmd.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/wayline/WayLineUploadCmd.java
new file mode 100644
index 0000000..d19b017
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/wayline/WayLineUploadCmd.java
@@ -0,0 +1,40 @@
+package com.ard.tianyu.netty.command.wayline;
+
+import com.ard.tianyu.model.dto.converter.wayline.PlanLineDataConverter;
+import com.ard.tianyu.model.dto.wayline.PlanLineData;
+import com.ard.tianyu.model.dto.wayline.WayLineUploadDTO;
+import com.ard.tianyu.netty.command.BaseCmd;
+import com.ard.tianyu.netty.protobuf.TelemetryDataPB;
+import io.netty.buffer.ByteBuf;
+
+/**
+ * 上传航线指令
+ *
+ * @author liusuyi
+ * @date 2024年10月30日16:20
+ **/
+public class WayLineUploadCmd extends BaseCmd {
+
+    private final byte[] wayLineData;         //动作参数
+
+    public WayLineUploadCmd(WayLineUploadDTO wayLineUploadDTO) {
+        PlanLineData planLineData = wayLineUploadDTO.getWayLineData();
+        TelemetryDataPB.PlanLineData planLineDataPB = PlanLineDataConverter.convertEntityToProto(planLineData);
+        this.wayLineData = planLineDataPB.toByteArray();
+        setDataHeader((short) 0x7479);
+        setDataLength((short) (18 + wayLineData.length));
+        setBoxSn(wayLineUploadDTO.getBoxSn().getBytes());
+        setCmdCode((byte) 0xD1);
+
+    }
+
+    public void encode(ByteBuf out) {
+        out.writeShort(getDataHeader());    // 写入数据头
+        out.writeShort(getDataLength());    // 写入数据长度
+        out.writeBytes(getBoxSn());         // 写入盒子SN
+        out.writeByte(getCmdCode());        // 写入命令码
+        out.writeByte(0x00);          // 写入加密标志
+        out.writeByte(0x10);          // 写入动作编号
+        out.writeBytes(this.wayLineData);   // 写入航线数据
+    }
+}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/command/wayline/WayLineUploadReplyCmd.java b/ard-work/src/main/java/com/ard/tianyu/netty/command/wayline/WayLineUploadReplyCmd.java
new file mode 100644
index 0000000..fc470b5
--- /dev/null
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/command/wayline/WayLineUploadReplyCmd.java
@@ -0,0 +1,37 @@
+package com.ard.tianyu.netty.command.wayline;
+
+import com.ard.tianyu.model.dto.converter.wayline.PlanLineDataConverter;
+import com.ard.tianyu.model.dto.wayline.PlanLineData;
+import com.ard.tianyu.model.dto.wayline.WayLineUploadDTO;
+import com.ard.tianyu.netty.command.BaseCmd;
+import com.ard.tianyu.netty.protobuf.TelemetryDataPB;
+import io.netty.buffer.ByteBuf;
+import lombok.Data;
+
+/**
+ * 上传航线回复指令
+ *
+ * @author liusuyi
+ * @date 2024年10月30日16:20
+ **/
+@Data
+public class WayLineUploadReplyCmd extends BaseCmd {
+
+    private final byte encryptFlag = 0x00; // 加密标志
+    private final byte actionCode = 0x10;  // 动作编号
+    private final byte result;             // 执行结果
+    private final Integer errorCode;       // 错误码
+
+    public WayLineUploadReplyCmd(String boxSn, Byte result, Integer errorCode) {
+        setDataHeader((short) 0x6A77);
+        //setDataLength((short) 18);
+        setCmdCode((byte) 0xD1);
+        setBoxSn(boxSn.getBytes());
+        this.result = result;
+        this.errorCode = errorCode;
+    }
+
+    public void encode(ByteBuf out) {
+
+    }
+}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/handler/ClientHandler.java b/ard-work/src/main/java/com/ard/tianyu/netty/handler/ClientHandler.java
index 35e8ad7..8f64473 100644
--- a/ard-work/src/main/java/com/ard/tianyu/netty/handler/ClientHandler.java
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/handler/ClientHandler.java
@@ -1,5 +1,6 @@
 package com.ard.tianyu.netty.handler;
 
+import com.ard.tianyu.model.cache.TyTcpServerCache;
 import com.ard.tianyu.netty.TyNettyTcpClient;
 import com.ard.tianyu.netty.command.BaseCmd;
 import com.ard.tianyu.service.ITyService;
@@ -70,7 +71,7 @@
         int port = ipSocket.getPort();
         String host = ipSocket.getHostString();
         log.error("与天宇服务{}:{}连接断开!", host, port);
-
+        TyTcpServerCache.putTcpServerCache(host + ":" + port, false);
         ctx.channel().eventLoop().schedule(() -> {
             log.error("天宇服务端链接不上,开始重连操作...");
             try {
diff --git a/ard-work/src/main/java/com/ard/tianyu/netty/handler/MessageProtocolDecoder.java b/ard-work/src/main/java/com/ard/tianyu/netty/handler/MessageProtocolDecoder.java
index 2b811f9..c761e56 100644
--- a/ard-work/src/main/java/com/ard/tianyu/netty/handler/MessageProtocolDecoder.java
+++ b/ard-work/src/main/java/com/ard/tianyu/netty/handler/MessageProtocolDecoder.java
@@ -16,6 +16,7 @@
 import com.ard.tianyu.netty.command.register.HeartbeatReplyCmd;
 import com.ard.tianyu.netty.command.register.RegisterReplyCmd;
 import com.ard.tianyu.netty.command.register.UavInitReplyCmd;
+import com.ard.tianyu.netty.command.wayline.WayLineUploadReplyCmd;
 import com.ard.tianyu.netty.protobuf.TelemetryDataPB;
 import com.google.protobuf.InvalidProtocolBufferException;
 import io.netty.buffer.ByteBuf;
@@ -113,6 +114,8 @@
         in.readBytes(uavData);
         String boxSn = new String(uavData);
         switch (actionCode) {
+            case 0x10:
+                return new WayLineUploadReplyCmd(boxSn, result, errorCode);
             case 0x11:
                 return new TakeOffReplyCmd(boxSn, result, errorCode);
             case 0x12:
diff --git a/ard-work/src/main/java/com/ard/tianyu/service/ITyService.java b/ard-work/src/main/java/com/ard/tianyu/service/ITyService.java
index acac701..edde53f 100644
--- a/ard-work/src/main/java/com/ard/tianyu/service/ITyService.java
+++ b/ard-work/src/main/java/com/ard/tianyu/service/ITyService.java
@@ -12,6 +12,7 @@
 import com.ard.tianyu.model.dto.speaker.*;
 import com.ard.tianyu.model.dto.state.UavState;
 import com.ard.tianyu.model.dto.telemetry.TelemetryData;
+import com.ard.tianyu.model.dto.wayline.WayLineUploadDTO;
 import com.ard.tianyu.model.receiver.*;
 import com.ard.tianyu.netty.command.BaseCmd;
 import com.dtflys.forest.annotation.Var;
@@ -229,6 +230,11 @@
     void stopSpeak(StopSpeakDTO stopSpeakDTO);
 
     /**
+     * 上传航线
+     */
+    void wayLineUpload(WayLineUploadDTO wayLineUploadDTO);
+
+    /**
      * 处理回复消息
      */
     void processReplyMessage(String key, BaseCmd tyMessage);
diff --git a/ard-work/src/main/java/com/ard/tianyu/service/impl/TyServiceImpl.java b/ard-work/src/main/java/com/ard/tianyu/service/impl/TyServiceImpl.java
index 6d2a6f6..8132128 100644
--- a/ard-work/src/main/java/com/ard/tianyu/service/impl/TyServiceImpl.java
+++ b/ard-work/src/main/java/com/ard/tianyu/service/impl/TyServiceImpl.java
@@ -3,6 +3,7 @@
 import com.ard.common.utils.ByteUtils;
 import com.ard.tianyu.config.TyConfiguration;
 import com.ard.tianyu.http.TyClient;
+import com.ard.tianyu.model.cache.TyTcpServerCache;
 import com.ard.tianyu.model.cache.UavSignalInfoCache;
 import com.ard.tianyu.model.cache.UavStateCache;
 import com.ard.tianyu.model.cache.UavTelemetryDataCache;
@@ -16,11 +17,14 @@
 import com.ard.tianyu.model.dto.converter.UavSignalInfoConverter;
 import com.ard.tianyu.model.dto.converter.UavStateConverter;
 import com.ard.tianyu.model.dto.converter.UavTelemetryDataConverter;
+import com.ard.tianyu.model.dto.converter.wayline.PlanLineDataConverter;
 import com.ard.tianyu.model.dto.manual.*;
 import com.ard.tianyu.model.dto.signal.SignalInfo;
 import com.ard.tianyu.model.dto.speaker.*;
 import com.ard.tianyu.model.dto.state.UavState;
 import com.ard.tianyu.model.dto.telemetry.TelemetryData;
+import com.ard.tianyu.model.dto.wayline.PlanLineData;
+import com.ard.tianyu.model.dto.wayline.WayLineUploadDTO;
 import com.ard.tianyu.model.receiver.*;
 import com.ard.tianyu.netty.command.*;
 import com.ard.tianyu.netty.TyNettyTcpClient;
@@ -37,7 +41,10 @@
 import com.ard.tianyu.netty.command.real.UavTelemetryDataCmd;
 import com.ard.tianyu.netty.command.register.*;
 import com.ard.tianyu.netty.command.speaker.*;
+import com.ard.tianyu.netty.command.wayline.WayLineUploadCmd;
+import com.ard.tianyu.netty.command.wayline.WayLineUploadReplyCmd;
 import com.ard.tianyu.netty.handler.ErrorCodeEnum;
+import com.ard.tianyu.netty.protobuf.TelemetryDataPB;
 import com.ard.tianyu.service.ITyService;
 import com.ard.tianyu.websocket.utils.WebSocketUtil;
 import io.netty.channel.Channel;
@@ -49,6 +56,7 @@
 import javax.annotation.Resource;
 import java.net.InetSocketAddress;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -420,6 +428,7 @@
         RecordSpeakCmd recordSpeakCmd = new RecordSpeakCmd(recordSpeakDTO);
         this.sendMessage(tyConfiguration.getIpPort(), recordSpeakCmd);
     }
+
     /**
      * 设置音量
      */
@@ -437,13 +446,58 @@
         LoopSettingCmd loopSettingCmd = new LoopSettingCmd(loopSettingDTO);
         this.sendMessage(tyConfiguration.getIpPort(), loopSettingCmd);
     }
+
     /**
      * 停止喊话
      */
     @Override
     public void stopSpeak(StopSpeakDTO stopSpeakDTO) {
-        StopSpeakCmd stopSpeakCmd=new StopSpeakCmd(stopSpeakDTO);
+        StopSpeakCmd stopSpeakCmd = new StopSpeakCmd(stopSpeakDTO);
         this.sendMessage(tyConfiguration.getIpPort(), stopSpeakCmd);
+    }
+
+    /**
+     * 航线上传
+     */
+    @Override
+    public void wayLineUpload(WayLineUploadDTO wayLineUploadDTO) {
+        wayLineUploadDTO.setWayLineData(this.CreatePlanLineData());//设置航线数据
+        WayLineUploadCmd wayLineUploadCmd = new WayLineUploadCmd(wayLineUploadDTO);
+        this.sendMessage(tyConfiguration.getIpPort(), wayLineUploadCmd);
+    }
+
+    //创建航线
+    private PlanLineData CreatePlanLineData() {
+        TelemetryDataPB.PointData pointData1 = TelemetryDataPB.PointData.newBuilder()
+                .setLng(124.12345).setLat(45.12345).setHeight(80).setSpeed(10)
+                .setFlightPathMode(1)//航线飞行模式:1=直线飞行,2=协调转弯,3=曲线飞行(停),4=曲线飞行(不停)
+                .setSafeGohomeFlag(0)//是否为安全返航点 0=不是,1=是
+                .build();
+        TelemetryDataPB.PointData pointData2 = TelemetryDataPB.PointData.newBuilder()
+                .setLng(124.22222).setLat(45.22222).setHeight(80).setSpeed(10)
+                .setFlightPathMode(1)//航线飞行模式:1=直线飞行,2=协调转弯,3=曲线飞行(停),4=曲线飞行(不停)
+                .setSafeGohomeFlag(0)//是否为安全返航点 0=不是,1=是
+                .build();
+        TelemetryDataPB.PointData pointData3 = TelemetryDataPB.PointData.newBuilder()
+                .setLng(124.33333).setLat(45.33333).setHeight(80).setSpeed(10)
+                .setFlightPathMode(1)//航线飞行模式:1=直线飞行,2=协调转弯,3=曲线飞行(停),4=曲线飞行(不停)
+                .setSafeGohomeFlag(0)//是否为安全返航点 0=不是,1=是
+                .build();
+
+        //创建航线
+        TelemetryDataPB.PlanLineData PlanLineDataPB = TelemetryDataPB.PlanLineData.newBuilder()
+                .setFinishedAction(2)//结束航线后动作:1=返航,2=原地悬停,3=原地降落,4=原地绕飞
+                .setMaxSpeed(10)//最大飞行速度
+                .setAutoSpeed(10)//自动飞行速度
+                .addPoints(pointData1)//航线点1
+                .addPoints(pointData2)//航线点2
+                .addPoints(pointData3)//航线点3
+                .setLoseAction(1)//网络失联后动作:0=返回HOME点,1=继续航线,默认0
+                .setHomeHeight(6)//返航高度:(单位:米,范围20~1500)
+                .setIsSaveEnergyMode(0)////是否开启节能模式:0=不是,1=是(说明:节能模式下,飞机沿最短直线距离由起飞点到航线第一个航点,非升高到第一个航点高度再飞往第一个航点)
+                .build();
+
+        return PlanLineDataConverter.convertProtoToEntity(PlanLineDataPB);
     }
 
     /**
@@ -589,7 +643,12 @@
                 //紧急制动回复
                 if (tyCommand instanceof EmergencyBrakeReplyCmd) {
                     EmergencyBrakeReplyCmd emergencyBrakeReplyCmd = (EmergencyBrakeReplyCmd) tyCommand;
-                    logPrint("紧急制动回复", emergencyBrakeReplyCmd.getResult(), emergencyBrakeReplyCmd.getErrorCode());
+                    logPrint("紧急制动", emergencyBrakeReplyCmd.getResult(), emergencyBrakeReplyCmd.getErrorCode());
+                }
+                //上传航线回复
+                if (tyCommand instanceof WayLineUploadReplyCmd) {
+                    WayLineUploadReplyCmd wayLineUploadReplyCmd = (WayLineUploadReplyCmd) tyCommand;
+                    logPrint("上传航线", wayLineUploadReplyCmd.getResult(), wayLineUploadReplyCmd.getErrorCode());
                 }
                 break;
             default:
@@ -617,6 +676,10 @@
      */
     @Scheduled(fixedRate = 3000)
     public void sendHeartBeat() {
+        if(!TyTcpServerCache.getTcpServerCache(tyConfiguration.getTcpserver() + ":" + tyConfiguration.getTcpport()))
+        {
+            return;
+        }
         long timestamp = System.currentTimeMillis();
         log.debug("定时向天宇发送⼼跳,时间戳{}", timestamp);
         HeartbeatCmd heartbeatMessage = new HeartbeatCmd(timestamp);
diff --git a/ard-work/src/main/java/com/ard/vtdu/service/impl/MediaServiceImpl.java b/ard-work/src/main/java/com/ard/vtdu/service/impl/MediaServiceImpl.java
index 439a371..c3088df 100644
--- a/ard-work/src/main/java/com/ard/vtdu/service/impl/MediaServiceImpl.java
+++ b/ard-work/src/main/java/com/ard/vtdu/service/impl/MediaServiceImpl.java
@@ -2,6 +2,8 @@
 
 import com.ard.common.constant.HttpStatus;
 import com.ard.common.core.page.TableDataInfo;
+import com.ard.tianyu.config.TyConfiguration;
+import com.ard.tianyu.model.cache.TyTcpServerCache;
 import com.ard.tianyu.model.receiver.BoxInfoReceiver;
 import com.ard.tianyu.model.receiver.BoxStreamUrlReceiver;
 import com.ard.tianyu.service.ITyService;
@@ -42,6 +44,8 @@
     private MediaClient mediaClient;
     @Resource
     private ITyService tyService;
+    @Resource
+    private TyConfiguration tyConfiguration;
     @Value("${mediamtx.host}")
     private String mediamtxHost;
 
@@ -566,8 +570,11 @@
     }
 
     //同步无人机推流到流媒体
-    @Scheduled(cron = "0/20 * * * * ?")
+   // @Scheduled(cron = "0/20 * * * * ?")
     public void syncVtdu() {
+        if (!TyTcpServerCache.getTcpServerCache(tyConfiguration.getTcpserver() + ":" + tyConfiguration.getTcpport())) {
+            return;
+        }
         log.info("定时同步MediaMTX任务开始");
         List<String> nameList = getNameList();
         List<BoxInfoReceiver> boxList = tyService.getBoxList();

--
Gitblit v1.9.3