From 0b6724d31d175dce49208b160793c854f0670f15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B0=8F=E4=BA=91?= Date: Fri, 6 Feb 2026 11:02:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=97=A0=E4=BA=BA=E6=9C=BA?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/TuohengBufferDeviceImpl.java | 138 +++++++++++++++--- 1 file changed, 116 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/ruoyi/device/service/impl/TuohengBufferDeviceImpl.java b/src/main/java/com/ruoyi/device/service/impl/TuohengBufferDeviceImpl.java index 5f9cd36..8fbc8aa 100644 --- a/src/main/java/com/ruoyi/device/service/impl/TuohengBufferDeviceImpl.java +++ b/src/main/java/com/ruoyi/device/service/impl/TuohengBufferDeviceImpl.java @@ -307,6 +307,11 @@ public class TuohengBufferDeviceImpl implements IBufferDeviceService { log.info("设置充电状态: {}", chargingStatus); }); + // 填充无人机状态信息 + if (aircraftIotDeviceId != null) { + fillTuohengAircraftStatus(dto, aircraftIotDeviceId); + } + log.info("拓恒机场详情填充完成: iotDeviceId={}, dockStatus={}", iotDeviceId, dto.getDockStatus()); log.info("========== 拓恒机场详情填充结束 =========="); } catch (Exception e) { @@ -326,21 +331,84 @@ public class TuohengBufferDeviceImpl implements IBufferDeviceService { log.info("aircraftIotDeviceId: {}", aircraftIotDeviceId); // 获取拓恒无人机遥测数据 - TelemetryMap telemetry = thingsBoardDomain.getPredefinedTuohengDeviceTelemetry(aircraftIotDeviceId); - log.info("拓恒无人机遥测数据: {}", telemetry); + TelemetryMap aircraftTelemetry = thingsBoardDomain.getPredefinedTuohengDeviceTelemetry(aircraftIotDeviceId); + log.info("拓恒无人机遥测数据: {}", aircraftTelemetry); - // 设置无人机状态 - 根据 armed 状态判断 - telemetry.get(TuohengDeviceTelemetry.ARMED).ifPresent(armedValue -> { - String armed = armedValue.getValue(); - log.info("ARMED 解锁状态原始值: {}", armed); - if ("true".equals(armed) || "1".equals(armed)) { - dto.setAircraftStatus("IN_MISSION"); // 解锁状态表示在任务中 - log.info("设置无人机状态: IN_MISSION (任务中)"); - } else { - dto.setAircraftStatus("POWER_ON_IN_CABIN"); // 未解锁表示在舱内待机 - log.info("设置无人机状态: POWER_ON_IN_CABIN (舱内待机)"); + // 获取机场遥测数据(用于获取舱门状态) + // 注意:aircraftIotDeviceId 是无人机的ID,我们需要获取机场的舱门状态 + // 舱门状态在机场设备的遥测数据中,需要从 dto.getDockIotId() 获取 + String dockIotId = dto.getDockIotId(); + TelemetryMap dockTelemetry = null; + if (dockIotId != null) { + dockTelemetry = thingsBoardDomain.getPredefinedTuohengDeviceTelemetry(dockIotId); + log.info("拓恒机场遥测数据(用于获取舱门状态): {}", dockTelemetry); + } + + // 获取 mode 字段 + String mode = aircraftTelemetry.get(TuohengDeviceTelemetry.MODE) + .map(TelemetryValue::getValue) + .orElse(""); + log.info("无人机 MODE 值: {}", mode); + + // 判断逻辑 + if ("auto".equalsIgnoreCase(mode)) { + // mode == "auto" 表示正在执行任务 + dto.setAircraftStatus("IN_MISSION"); + log.info("无人机处于 auto 模式,设置状态: IN_MISSION"); + } else { + // mode != "auto",根据 tsingal 和 nest_door_status 判断 + + // 获取 tsingal(图传信号强度,用于判断开关机) + Integer tsingal = aircraftTelemetry.get(TuohengDeviceTelemetry.TSINGAL) + .map(TelemetryValue::getValue) + .orElse(0); + log.info("无人机 TSINGAL 值: {}", tsingal); + + boolean isPowerOn = tsingal > 60; // tsingal > 60 表示开机 + log.info("无人机开关机状态: {}", isPowerOn ? "开机" : "关机"); + + // 获取 nest_door_status(舱门状态) + Integer doorStatus = null; + if (dockTelemetry != null) { + doorStatus = dockTelemetry.get(TuohengDeviceTelemetry.NEST_DOOR_STATUS) + .map(TelemetryValue::getValue) + .orElse(null); + log.info("机场舱门状态: {}", doorStatus); } - }); + + // 根据舱门状态和开关机状态判断 + String aircraftStatus; + if (doorStatus != null && doorStatus == 1) { + // 舱门关闭(舱内) + if (isPowerOn) { + aircraftStatus = "POWER_ON_IN_CABIN"; + log.info("舱门关闭 + 开机 → POWER_ON_IN_CABIN"); + } else { + aircraftStatus = "POWER_OFF_IN_CABIN"; + log.info("舱门关闭 + 关机 → POWER_OFF_IN_CABIN"); + } + } else if (doorStatus != null && doorStatus == 0) { + // 舱门打开(舱外) + if (isPowerOn) { + aircraftStatus = "POWER_ON_OUT_CABIN"; + log.info("舱门打开 + 开机 → POWER_ON_OUT_CABIN"); + } else { + aircraftStatus = "POWER_OFF_OUT_CABIN"; + log.info("舱门打开 + 关机 → POWER_OFF_OUT_CABIN"); + } + } else { + // 无法获取舱门状态,默认根据开关机状态判断 + if (isPowerOn) { + aircraftStatus = "POWER_ON_IN_CABIN"; + log.warn("无法获取舱门状态,默认设置: POWER_ON_IN_CABIN"); + } else { + aircraftStatus = "POWER_OFF_IN_CABIN"; + log.warn("无法获取舱门状态,默认设置: POWER_OFF_IN_CABIN"); + } + } + + dto.setAircraftStatus(aircraftStatus); + } // 设置作业架次 - 暂时设置为0,拓恒设备可能没有这个数据 dto.setMissionCount(0); @@ -376,17 +444,43 @@ public class TuohengBufferDeviceImpl implements IBufferDeviceService { // 设置无人机状态 log.info("---------- 解析无人机状态 ----------"); - telemetry.get(TuohengDeviceTelemetry.ARMED).ifPresent(armedValue -> { - String armed = armedValue.getValue(); - log.info("ARMED 解锁状态: {}", armed); - if ("true".equals(armed) || "1".equals(armed)) { - dto.setAircraftStatus("IN_MISSION"); - log.info("设置无人机状态: IN_MISSION"); + + // 获取 mode 字段 + String mode = telemetry.get(TuohengDeviceTelemetry.MODE) + .map(TelemetryValue::getValue) + .orElse(""); + log.info("无人机 MODE 值: {}", mode); + + // 判断逻辑 + if ("auto".equalsIgnoreCase(mode)) { + // mode == "auto" 表示正在执行任务 + dto.setAircraftStatus("IN_MISSION"); + log.info("无人机处于 auto 模式,设置状态: IN_MISSION"); + } else { + // mode != "auto",根据 tsingal 判断开关机 + // 注意:无人机详情接口无法获取机场舱门状态,只能根据开关机判断 + + // 获取 tsingal(图传信号强度,用于判断开关机) + Integer tsingal = telemetry.get(TuohengDeviceTelemetry.TSINGAL) + .map(TelemetryValue::getValue) + .orElse(0); + log.info("无人机 TSINGAL 值: {}", tsingal); + + boolean isPowerOn = tsingal > 60; // tsingal > 60 表示开机 + log.info("无人机开关机状态: {}", isPowerOn ? "开机" : "关机"); + + // 无法获取舱门状态,默认根据开关机状态判断 + String aircraftStatus; + if (isPowerOn) { + aircraftStatus = "POWER_ON_IN_CABIN"; + log.info("开机状态,默认设置: POWER_ON_IN_CABIN"); } else { - dto.setAircraftStatus("POWER_ON_IN_CABIN"); - log.info("设置无人机状态: POWER_ON_IN_CABIN"); + aircraftStatus = "POWER_OFF_IN_CABIN"; + log.info("关机状态,默认设置: POWER_OFF_IN_CABIN"); } - }); + + dto.setAircraftStatus(aircraftStatus); + } // 设置作业架次 - 暂时设置为0 dto.setMissionCount(0);