| | |
| | | for (Object arg : args) { |
| | | String boxSn = getBoxSn(arg); // 调用之前实现的 getBoxSn 方法 |
| | | if (boxSn != null) { |
| | | TelemetryData uavTelemetryData = UavTelemetryDataCache.getUavTelemetryData(boxSn); |
| | | TelemetryData uavTelemetryData = UavTelemetryDataCache.get(boxSn); |
| | | if (uavTelemetryData == null) { |
| | | throw new ControlException("遥测数据异常,无法执行!"); |
| | | } |
| | |
| | | @Override |
| | | protected Map<String,Object> getData(String boxSn) { |
| | | Map<String,Object> map=new HashMap<>(); |
| | | UavState uavState = UavStateCache.getUavState(boxSn); |
| | | UavState uavState = UavStateCache.get(boxSn); |
| | | if (uavState != null) { |
| | | uavState.calculateFieldAngle();// 计算当前无人机的FieldAngle |
| | | } |
| | | map.put("boxSn", uavState.getBoxSn()); |
| | | map.put("state", uavState); |
| | | TelemetryData uavTelemetryData = UavTelemetryDataCache.getUavTelemetryData(boxSn); |
| | | TelemetryData uavTelemetryData = UavTelemetryDataCache.get(boxSn); |
| | | map.put("telemetry", uavTelemetryData); |
| | | SignalInfo uavSignalInfo = UavSignalInfoCache.getUavSignalInfo(boxSn); |
| | | SignalInfo uavSignalInfo = UavSignalInfoCache.get(boxSn); |
| | | map.put("signal", uavSignalInfo); |
| | | // 获取当前控制飞行的用户ID |
| | | Long flyUserId = uavControlService.getCurrentController(boxSn, "fly"); |
| | |
| | | |
| | | @Override |
| | | protected SignalInfo getData(String boxSn) { |
| | | return UavSignalInfoCache.getUavSignalInfo(boxSn); |
| | | return UavSignalInfoCache.get(boxSn); |
| | | } |
| | | |
| | | @Override |
| | |
| | | |
| | | @Override |
| | | protected UavState getData(String boxSn) { |
| | | UavState uavState = UavStateCache.getUavState(boxSn); |
| | | UavState uavState = UavStateCache.get(boxSn); |
| | | if (uavState != null) { |
| | | uavState.calculateFieldAngle();// 计算当前无人机的FieldAngle |
| | | } |
| | |
| | | |
| | | @Override |
| | | protected TelemetryData getData(String boxSn) { |
| | | return UavTelemetryDataCache.getUavTelemetryData(boxSn); |
| | | return UavTelemetryDataCache.get(boxSn); |
| | | } |
| | | |
| | | @Override |
| | |
| | | package com.ard.work.domain.cache; |
| | | |
| | | import com.ard.work.domain.dto.signal.SignalInfo; |
| | | import com.ard.work.domain.dto.telemetry.TelemetryData; |
| | | |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | |
| | |
| | | public class UavSignalInfoCache { |
| | | |
| | | // 使用 ConcurrentHashMap 来缓存无人机信道质量数据,key 是 boxSn(无人机序列号) |
| | | private static final ConcurrentHashMap<String, SignalInfo> uavSignalInfoCache = new ConcurrentHashMap<>(); |
| | | private static final ConcurrentHashMap<String, SignalInfo> cache = new ConcurrentHashMap<>(); |
| | | |
| | | // 存储无人机信道质量数据到缓存 |
| | | public static void putUavSignalInfoCache(SignalInfo signalInfo) { |
| | | uavSignalInfoCache.put(signalInfo.getBoxSn(), signalInfo); |
| | | public static void put(SignalInfo signalInfo) { |
| | | cache.put(signalInfo.getBoxSn(), signalInfo); |
| | | } |
| | | |
| | | // 从缓存中获取信道质量数据 |
| | | public static SignalInfo getUavSignalInfo(String boxSn) { |
| | | return uavSignalInfoCache.get(boxSn); |
| | | public static SignalInfo get(String boxSn) { |
| | | return cache.get(boxSn); |
| | | } |
| | | |
| | | // 删除缓存中的信道质量数据 |
| | | public static void removeUavSignalInfo(String boxSn) { |
| | | uavSignalInfoCache.remove(boxSn); |
| | | public static void remove(String boxSn) { |
| | | cache.remove(boxSn); |
| | | } |
| | | |
| | | // 定时任务使用:判断状遥测数据是否变化,但不更新缓存 |
| | | public static boolean hasChanged(String boxSn, SignalInfo signalInfo) { |
| | | SignalInfo oldSignalInfo= cache.get(boxSn); |
| | | if (oldSignalInfo == null) { |
| | | return true; // 没有缓存,算作变化 |
| | | } |
| | | return !oldSignalInfo.equals(signalInfo); // true = 有变化 |
| | | } |
| | | } |
| | |
| | | package com.ard.work.domain.cache; |
| | | |
| | | import com.ard.work.domain.dto.state.UavState; |
| | | |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | |
| | | /** |
| | |
| | | public class UavStateCache { |
| | | |
| | | // 使用 ConcurrentHashMap 来缓存无人机状态数据,key 是 boxSn(无人机序列号) |
| | | private static final ConcurrentHashMap<String, UavState> uavStateCache = new ConcurrentHashMap<>(); |
| | | private static final ConcurrentHashMap<String, UavState> cache = new ConcurrentHashMap<>(); |
| | | |
| | | // 存储无人机状态数据到缓存 |
| | | public static void putUavState(UavState uavState) { |
| | | uavStateCache.put(uavState.getBoxSn(), uavState); |
| | | } |
| | | public static void put(UavState uavState) {cache.put(uavState.getBoxSn(), uavState);} |
| | | |
| | | // 从缓存中获取无人机状态数据 |
| | | public static UavState getUavState(String boxSn) { |
| | | return uavStateCache.get(boxSn); |
| | | public static UavState get(String boxSn) { |
| | | return cache.get(boxSn); |
| | | } |
| | | |
| | | // 删除缓存中的无人机状态数据 |
| | | public static void removeUavState(String boxSn) { |
| | | uavStateCache.remove(boxSn); |
| | | public static void remove(String boxSn) { |
| | | cache.remove(boxSn); |
| | | } |
| | | |
| | | // 定时任务使用:判断状态是否变化,但不更新缓存 |
| | | public static boolean hasChanged(String boxSn, UavState newState) { |
| | | UavState oldState = cache.get(boxSn); |
| | | if (oldState == null) { |
| | | return true; // 没有缓存,算作变化 |
| | | } |
| | | return !oldState.equals(newState); // true = 有变化 |
| | | } |
| | | } |
| | |
| | | package com.ard.work.domain.cache; |
| | | |
| | | import com.ard.work.domain.dto.state.UavState; |
| | | import com.ard.work.domain.dto.telemetry.TelemetryData; |
| | | |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | |
| | | public class UavTelemetryDataCache { |
| | | |
| | | // 使用 ConcurrentHashMap 来缓存无人机遥测数据,key 是 boxSn(无人机序列号) |
| | | private static final ConcurrentHashMap<String, TelemetryData> uavTelemetryDataCache = new ConcurrentHashMap<>(); |
| | | private static final ConcurrentHashMap<String, TelemetryData> cache = new ConcurrentHashMap<>(); |
| | | |
| | | // 存储无人机遥测数据到缓存 |
| | | public static void putUavTelemetryData(TelemetryData telemetryData) { |
| | | uavTelemetryDataCache.put(telemetryData.getBoxSn(), telemetryData); |
| | | public static void put(TelemetryData telemetryData) { |
| | | cache.put(telemetryData.getBoxSn(), telemetryData); |
| | | } |
| | | |
| | | // 从缓存中获取无人机遥测数据 |
| | | public static TelemetryData getUavTelemetryData(String boxSn) { |
| | | return uavTelemetryDataCache.get(boxSn); |
| | | public static TelemetryData get(String boxSn) { |
| | | return cache.get(boxSn); |
| | | } |
| | | |
| | | // 删除缓存中的无人机遥测数据 |
| | | public static void removeUavTelemetryData(String boxSn) { |
| | | uavTelemetryDataCache.remove(boxSn); |
| | | public static void remove(String boxSn) { |
| | | cache.remove(boxSn); |
| | | } |
| | | |
| | | // 定时任务使用:判断状遥测数据是否变化,但不更新缓存 |
| | | public static boolean hasChanged(String boxSn, TelemetryData telemetryData) { |
| | | TelemetryData oldTelemetryData= cache.get(boxSn); |
| | | if (oldTelemetryData == null) { |
| | | return true; // 没有缓存,算作变化 |
| | | } |
| | | return !oldTelemetryData.equals(telemetryData); // true = 有变化 |
| | | } |
| | | } |
| | |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonProperty; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | @Data |
| | | @EqualsAndHashCode |
| | | public class SignalInfo { |
| | | private String mode; // 入网模式: NR5G-SA, NR5G-NSA,LTE |
| | | private String mcc; // NR5G-SA, NR5G-NSA, LTE |
| | |
| | | package com.ard.work.domain.dto.state; |
| | | |
| | | import com.ard.work.util.CameraUtil; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Builder; |
| | | import lombok.Data; |
| | | import lombok.NoArgsConstructor; |
| | | import lombok.*; |
| | | |
| | | import java.util.List; |
| | | |
| | |
| | | @Builder |
| | | @AllArgsConstructor |
| | | @NoArgsConstructor |
| | | @EqualsAndHashCode |
| | | public class UavState { |
| | | |
| | | private FlightControllerState flightControllerState; // 飞控状态 |
| | |
| | | package com.ard.work.domain.dto.telemetry; |
| | | |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.Builder; |
| | | import lombok.Data; |
| | | import lombok.NoArgsConstructor; |
| | | import lombok.*; |
| | | |
| | | @Data |
| | | @Builder |
| | | @AllArgsConstructor |
| | | @NoArgsConstructor |
| | | @EqualsAndHashCode |
| | | public class TelemetryData { |
| | | |
| | | private double lng; // 经度 |
| | |
| | | */ |
| | | @Override |
| | | public UavState getUavState(String boxSn) { |
| | | return UavStateCache.getUavState(boxSn); |
| | | return UavStateCache.get(boxSn); |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | @Override |
| | | public TelemetryData getUavTelemetryData(String boxSn) { |
| | | return UavTelemetryDataCache.getUavTelemetryData(boxSn); |
| | | return UavTelemetryDataCache.get(boxSn); |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | @Override |
| | | public SignalInfo getSignalInfo(String boxSn) { |
| | | return UavSignalInfoCache.getUavSignalInfo(boxSn); |
| | | return UavSignalInfoCache.get(boxSn); |
| | | } |
| | | |
| | | /** |
| | |
| | | case (byte) 0xA8: |
| | | // 处理无人机状态消息 |
| | | UavStateCmd uavStateCmd = (UavStateCmd) tyCommand; |
| | | UavStateCache.putUavState(uavStateCmd.getUavState()); |
| | | UavStateCache.put(uavStateCmd.getUavState()); |
| | | //logPrint("无人机状态", uavStateCmd.getUavState().getBoxSn()); |
| | | // WebSocketUtil.sendMessageAll(uavStateCmd.getUavState()); |
| | | break; |
| | | case (byte) 0xA9: |
| | | // 处理无人机遥测消息 |
| | | UavTelemetryDataCmd uavTelemetryDataCmd = (UavTelemetryDataCmd) tyCommand; |
| | | UavTelemetryDataCache.putUavTelemetryData(uavTelemetryDataCmd.getTelemetryData()); |
| | | UavTelemetryDataCache.put(uavTelemetryDataCmd.getTelemetryData()); |
| | | //logPrint("无人机遥测", uavTelemetryDataCmd.getTelemetryData().getBoxSn()); |
| | | //WebSocketUtil.sendMessageAll(uavTelemetryDataCmd.getTelemetryData()); |
| | | break; |
| | |
| | | case (byte) 0x0C: |
| | | // 处理无人机信道质量数据 |
| | | SignalInfoCmd signalInfoCmd = (SignalInfoCmd) tyCommand; |
| | | UavSignalInfoCache.putUavSignalInfoCache(signalInfoCmd.getSignalInfo()); |
| | | UavSignalInfoCache.put(signalInfoCmd.getSignalInfo()); |
| | | //logPrint("无人机信道质量", signalInfoCmd.getSignalInfo().getBoxSn()); |
| | | break; |
| | | case (byte) 0xD1: |