zhaowenyu
2025-11-26 f2c909e42b81bb7b589c956bfcf90dba3e16d0a8
Merge remote-tracking branch 'origin/dev' into dev
2 files added
4 files modified
88 ■■■■■ changed files
ard-work/src/main/java/com/ard/work/component/netty/command/manual/FlyRoundControlCmd.java 5 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/component/websocket/handler/UavAllManager.java 8 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/cache/UavWaylineCache.java 42 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/dto/manual/FlyRoundControlDTO.java 4 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/domain/dto/wayline/WaylineInfo.java 19 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java 10 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/component/netty/command/manual/FlyRoundControlCmd.java
@@ -15,18 +15,20 @@
    private final double longitude;                  // 兴趣点经度
    private final double latitude;                   // 兴趣点纬度
    private final float altitude;                    // 兴趣点高度
    private final float height;                      // 飞行高度
    private final float speed;                       // 环绕速度
    private final float radius;                      // 环绕半径
    private final byte flyMode;                      // 飞行模式
    public FlyRoundControlCmd(FlyRoundControlDTO flyRoundControlDTO) {
        setDataHeader((short) 0x7479);
        setDataLength((short) 47);
        setDataLength((short) 51);
        setBoxSn(flyRoundControlDTO.getBoxSn().getBytes());
        setCmdCode((byte) 0xD1);
        this.longitude = flyRoundControlDTO.getLongitude();
        this.latitude = flyRoundControlDTO.getLatitude();
        this.altitude = flyRoundControlDTO.getAltitude();
        this.height=flyRoundControlDTO.getHeight();
        this.speed = flyRoundControlDTO.getSpeed();
        this.radius= flyRoundControlDTO.getRadius();
        this.flyMode = flyRoundControlDTO.getFlyMode();
@@ -43,6 +45,7 @@
        out.writeDouble(longitude);         // 写入兴趣点经度
        out.writeDouble(latitude);          // 写入兴趣点纬度
        out.writeFloat(altitude);           // 写入兴趣点高度
        out.writeFloat(height);             // 写入飞行高度
        out.writeFloat(speed);              // 写入环绕速度
        out.writeFloat(radius);             // 写入环绕半径
        out.writeByte(flyMode);             // 写入飞行模式
ard-work/src/main/java/com/ard/work/component/websocket/handler/UavAllManager.java
@@ -6,9 +6,11 @@
import com.ard.work.domain.cache.UavSignalInfoCache;
import com.ard.work.domain.cache.UavStateCache;
import com.ard.work.domain.cache.UavTelemetryDataCache;
import com.ard.work.domain.cache.UavWaylineCache;
import com.ard.work.domain.dto.signal.SignalInfo;
import com.ard.work.domain.dto.state.UavState;
import com.ard.work.domain.dto.telemetry.TelemetryData;
import com.ard.work.domain.dto.wayline.WaylineInfo;
import com.ard.work.service.control.UavControlService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -33,10 +35,16 @@
        log.debug("获取无人机所有数据");
        Map<String, Object> map = new HashMap<>();
        map.put("boxSn", boxSn);
        WaylineInfo waylineInfo = UavWaylineCache.get(boxSn);
        map.put("wayline", waylineInfo);
        UavState uavState = UavStateCache.get(boxSn);
        map.put("state", uavState);
        TelemetryData uavTelemetryData = UavTelemetryDataCache.get(boxSn);
        map.put("telemetry", uavTelemetryData);
        SignalInfo uavSignalInfo = UavSignalInfoCache.get(boxSn);
        map.put("signal", uavSignalInfo);
        // 获取当前控制飞行的用户ID
ard-work/src/main/java/com/ard/work/domain/cache/UavWaylineCache.java
New file
@@ -0,0 +1,42 @@
package com.ard.work.domain.cache;
import com.ard.work.domain.dto.signal.SignalInfo;
import com.ard.work.domain.dto.wayline.WaylineInfo;
import java.util.concurrent.ConcurrentHashMap;
/**
 * 无人机当前航线缓存
 *
 * @author 刘苏义
 * @date 2024/10/24 8:55
 */
public class UavWaylineCache {
    // 使用 ConcurrentHashMap 来缓存无人机信道质量数据,key 是 boxSn(无人机序列号)
    private static final ConcurrentHashMap<String, WaylineInfo> cache = new ConcurrentHashMap<>();
    // 存储无人机信道质量数据到缓存
    public static void put(WaylineInfo waylineInfo) {
        cache.put(waylineInfo.getBoxSn(), waylineInfo);
    }
    // 从缓存中获取信道质量数据
    public static WaylineInfo get(String boxSn) {
        return cache.get(boxSn);
    }
    // 删除缓存中的信道质量数据
    public static void remove(String boxSn) {
        cache.remove(boxSn);
    }
    // 定时任务使用:判断状遥测数据是否变化,但不更新缓存
    public static boolean hasChanged(String boxSn, WaylineInfo waylineInfo) {
        WaylineInfo oldWaylineInfo= cache.get(boxSn);
        if (oldWaylineInfo == null) {
            return true; // 没有缓存,算作变化
        }
        return !oldWaylineInfo.equals(waylineInfo); // true = 有变化
    }
}
ard-work/src/main/java/com/ard/work/domain/dto/manual/FlyRoundControlDTO.java
@@ -33,6 +33,10 @@
    private Float altitude;
    /**
     * 飞行高度
     */
    private Float height;
    /**
     * 环绕速度
     */
    private Float speed;
ard-work/src/main/java/com/ard/work/domain/dto/wayline/WaylineInfo.java
New file
@@ -0,0 +1,19 @@
package com.ard.work.domain.dto.wayline;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * Description: 当前航线信息
 * Author: lsy
 * Date: 2025年11月25日16:29
 **/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class WaylineInfo {
    private String boxSn;
    private String waylineId;
}
ard-work/src/main/java/com/ard/work/service/impl/TyServiceImpl.java
@@ -29,6 +29,7 @@
import com.ard.work.domain.cache.UavSignalInfoCache;
import com.ard.work.domain.cache.UavStateCache;
import com.ard.work.domain.cache.UavTelemetryDataCache;
import com.ard.work.domain.cache.UavWaylineCache;
import com.ard.work.domain.dto.BoxHistoryDTO;
import com.ard.work.domain.dto.BoxPhotosDTO;
import com.ard.work.domain.dto.BoxSettingsDTO;
@@ -614,8 +615,8 @@
        if (ardDroneInfo == null) {
            throw new ControlException("未找到对应的飞行器信息,boxSn:{}" + boxSn);
        }
        FlyRoundControlCmd flyPointControlCmd = new FlyRoundControlCmd(flyRoundControlDTO);
        this.sendMessage(ardDroneInfo.getServerId(), flyPointControlCmd);
        FlyRoundControlCmd flyRoundControlCmd = new FlyRoundControlCmd(flyRoundControlDTO);
        this.sendMessage(ardDroneInfo.getServerId(), flyRoundControlCmd);
        return true;
    }
@@ -941,6 +942,11 @@
                // 处理无人机状态消息
                UavStateCmd uavStateCmd = (UavStateCmd) tyCommand;
                UavStateCache.put(uavStateCmd.getUavState());
                int flightMode = uavStateCmd.getUavState().getFlightControllerState().getFlightMode();
                if (flightMode != 14) {
                    //不在航线中 移除航线信息
                    UavWaylineCache.remove(uavStateCmd.getUavState().getBoxSn());
                }
                //logPrint("无人机状态", uavStateCmd.getUavState().getBoxSn());
                // WebSocketUtil.sendMessageAll(uavStateCmd.getUavState());
                break;