修改无人机状态判断

This commit is contained in:
孙小云 2026-02-06 11:02:45 +08:00
parent 3caead4779
commit 0b6724d31d
1 changed files with 116 additions and 22 deletions

View File

@ -307,6 +307,11 @@ public class TuohengBufferDeviceImpl implements IBufferDeviceService {
log.info("设置充电状态: {}", chargingStatus); log.info("设置充电状态: {}", chargingStatus);
}); });
// 填充无人机状态信息
if (aircraftIotDeviceId != null) {
fillTuohengAircraftStatus(dto, aircraftIotDeviceId);
}
log.info("拓恒机场详情填充完成: iotDeviceId={}, dockStatus={}", iotDeviceId, dto.getDockStatus()); log.info("拓恒机场详情填充完成: iotDeviceId={}, dockStatus={}", iotDeviceId, dto.getDockStatus());
log.info("========== 拓恒机场详情填充结束 =========="); log.info("========== 拓恒机场详情填充结束 ==========");
} catch (Exception e) { } catch (Exception e) {
@ -326,21 +331,84 @@ public class TuohengBufferDeviceImpl implements IBufferDeviceService {
log.info("aircraftIotDeviceId: {}", aircraftIotDeviceId); log.info("aircraftIotDeviceId: {}", aircraftIotDeviceId);
// 获取拓恒无人机遥测数据 // 获取拓恒无人机遥测数据
TelemetryMap telemetry = thingsBoardDomain.getPredefinedTuohengDeviceTelemetry(aircraftIotDeviceId); TelemetryMap aircraftTelemetry = thingsBoardDomain.getPredefinedTuohengDeviceTelemetry(aircraftIotDeviceId);
log.info("拓恒无人机遥测数据: {}", telemetry); log.info("拓恒无人机遥测数据: {}", aircraftTelemetry);
// 设置无人机状态 - 根据 armed 状态判断 // 获取机场遥测数据用于获取舱门状态
telemetry.get(TuohengDeviceTelemetry.ARMED).ifPresent(armedValue -> { // 注意aircraftIotDeviceId 是无人机的ID我们需要获取机场的舱门状态
String armed = armedValue.getValue(); // 舱门状态在机场设备的遥测数据中需要从 dto.getDockIotId() 获取
log.info("ARMED 解锁状态原始值: {}", armed); String dockIotId = dto.getDockIotId();
if ("true".equals(armed) || "1".equals(armed)) { TelemetryMap dockTelemetry = null;
dto.setAircraftStatus("IN_MISSION"); // 解锁状态表示在任务中 if (dockIotId != null) {
log.info("设置无人机状态: IN_MISSION (任务中)"); dockTelemetry = thingsBoardDomain.getPredefinedTuohengDeviceTelemetry(dockIotId);
} else { log.info("拓恒机场遥测数据(用于获取舱门状态): {}", dockTelemetry);
dto.setAircraftStatus("POWER_ON_IN_CABIN"); // 未解锁表示在舱内待机 }
log.info("设置无人机状态: POWER_ON_IN_CABIN (舱内待机)");
// 获取 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拓恒设备可能没有这个数据 // 设置作业架次 - 暂时设置为0拓恒设备可能没有这个数据
dto.setMissionCount(0); dto.setMissionCount(0);
@ -376,17 +444,43 @@ public class TuohengBufferDeviceImpl implements IBufferDeviceService {
// 设置无人机状态 // 设置无人机状态
log.info("---------- 解析无人机状态 ----------"); log.info("---------- 解析无人机状态 ----------");
telemetry.get(TuohengDeviceTelemetry.ARMED).ifPresent(armedValue -> {
String armed = armedValue.getValue(); // 获取 mode 字段
log.info("ARMED 解锁状态: {}", armed); String mode = telemetry.get(TuohengDeviceTelemetry.MODE)
if ("true".equals(armed) || "1".equals(armed)) { .map(TelemetryValue::getValue)
dto.setAircraftStatus("IN_MISSION"); .orElse("");
log.info("设置无人机状态: IN_MISSION"); 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 { } else {
dto.setAircraftStatus("POWER_ON_IN_CABIN"); aircraftStatus = "POWER_OFF_IN_CABIN";
log.info("设置无人机状态: POWER_ON_IN_CABIN"); log.info("关机状态,默认设置: POWER_OFF_IN_CABIN");
} }
});
dto.setAircraftStatus(aircraftStatus);
}
// 设置作业架次 - 暂时设置为0 // 设置作业架次 - 暂时设置为0
dto.setMissionCount(0); dto.setMissionCount(0);