修改无人机状态

This commit is contained in:
孙小云 2026-01-21 16:29:46 +08:00
parent 1fdf6dc22d
commit 7d51087047
1 changed files with 84 additions and 4 deletions

View File

@ -9,10 +9,12 @@ import com.ruoyi.device.domain.model.DockAircraft;
import com.ruoyi.device.domain.model.thingsboard.AttributeMap; import com.ruoyi.device.domain.model.thingsboard.AttributeMap;
import com.ruoyi.device.domain.model.thingsboard.TelemetryMap; import com.ruoyi.device.domain.model.thingsboard.TelemetryMap;
import com.ruoyi.device.domain.model.thingsboard.constants.DeviceAttributes; import com.ruoyi.device.domain.model.thingsboard.constants.DeviceAttributes;
import com.ruoyi.device.domain.model.thingsboard.constants.DeviceTelemetry;
import com.ruoyi.device.service.api.IBufferDeviceService; import com.ruoyi.device.service.api.IBufferDeviceService;
import com.ruoyi.device.service.dto.AircraftDTO; import com.ruoyi.device.service.dto.AircraftDTO;
import com.ruoyi.device.service.dto.AircraftDetailDTO; import com.ruoyi.device.service.dto.AircraftDetailDTO;
import com.ruoyi.device.service.dto.DockDetailDTO; import com.ruoyi.device.service.dto.DockDetailDTO;
import com.ruoyi.device.api.enums.AircraftStatusEnum;
import com.ruoyi.device.api.enums.DockStatusEnum; import com.ruoyi.device.api.enums.DockStatusEnum;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -69,6 +71,7 @@ public class BufferDeviceImpl implements IBufferDeviceService
dto.setDockLocation(dock.getDockLocation()); dto.setDockLocation(dock.getDockLocation());
dto.setDockIotId(device.getIotDeviceId()); dto.setDockIotId(device.getIotDeviceId());
List<DockAircraft> aircrafts = dockAircraftDomain.selectDockAircraftByDockId(dockId); List<DockAircraft> aircrafts = dockAircraftDomain.selectDockAircraftByDockId(dockId);
if(!CollectionUtils.isEmpty(aircrafts)){ if(!CollectionUtils.isEmpty(aircrafts)){
@ -80,6 +83,11 @@ public class BufferDeviceImpl implements IBufferDeviceService
Device airDevice = deviceDomain.selectDeviceByDeviceId(aircraft.getDeviceId()); Device airDevice = deviceDomain.selectDeviceByDeviceId(aircraft.getDeviceId());
dto.setAircraftIotId(airDevice.getIotDeviceId()); dto.setAircraftIotId(airDevice.getIotDeviceId());
AircraftDetailDTO aircraftDetailDTO = getChangeAbleAirDetailDTO(airDevice.getIotDeviceId());
/**
* 设置无人机状态
*/
} }
@ -91,14 +99,14 @@ public class BufferDeviceImpl implements IBufferDeviceService
} }
@Override @Override
public AircraftDetailDTO getAircraftDetailById(Long aircraftId) public AircraftDetailDTO getAircraftDetailById(Long aircraftId) {
{
return null; return null;
} }
private DockDetailDTO getChangeAbleDockDetailDTO(String deviceIotId) private DockDetailDTO getChangeAbleDockDetailDTO(String deviceIotId)
{ {
DockDetailDTO dto = new DockDetailDTO(); DockDetailDTO dto = new DockDetailDTO();
@ -140,8 +148,80 @@ public class BufferDeviceImpl implements IBufferDeviceService
private AircraftDetailDTO getChangeAbleAirDetailDTO(String deviceIotId) private AircraftDetailDTO getChangeAbleAirDetailDTO(String deviceIotId)
{ {
AircraftDetailDTO dto = new AircraftDetailDTO();
AttributeMap attributeMap = thingsBoardDomain.getPredefinedDeviceAttributes(deviceIotId);
TelemetryMap telemetryMap = thingsBoardDomain.getPredefinedDeviceTelemetry(deviceIotId);
return null; //设置aircraftStatus
// drone_in_dock 表示是否在舱外
// device_online_status 表示是否开机
// 先判断机场的状态是否是
// 任务中 调试, 这两个状态用机场的, 暂时不要用离线状态
//
String aircraftStatus = determineAircraftStatus(attributeMap, telemetryMap);
dto.setAircraftStatus(aircraftStatus);
return dto;
}
/**
* 根据设备属性和遥测数据确定无人机状态
*
* @param attributeMap 设备属性映射
* @param telemetryMap 设备遥测数据映射
* @return 无人机状态字符串
*/
private String determineAircraftStatus(AttributeMap attributeMap, TelemetryMap telemetryMap) {
// 先检查 MODE_CODE判断是否处于任务中或调试状态
// MODE_CODE 定义: {"0":"待机","1":"起飞准备","2":"起飞准备完毕","3":"手动飞行","4":"自动起飞",
// "5":"航线飞行","6":"全景拍照","7":"智能跟随","8":"ADS-B 躲避","9":"自动返航",
// "10":"自动降落","11":"强制降落","12":"三桨叶降落","13":"升级中","14":"未连接",
// "15":"APAS","16":"虚拟摇杆状态","17":"指令飞行","18":"空中 RTK 收敛模式",
// "19":"机场选址中","20":"POI环绕"}
Integer modeCode = attributeMap.get(DeviceAttributes.MODE_CODE).orElse(null);
if (modeCode != null) {
// 14 = 未连接直接返回离线状态
if (modeCode == 14) {
return AircraftStatusEnum.OFFLINE.getCode();
}
// 判断是否在任务中 (飞行相关状态: 1-12, 15-20)
if (modeCode >= 1 && modeCode <= 12 || modeCode >= 15 && modeCode <= 20) {
return AircraftStatusEnum.IN_MISSION.getCode();
}
}
// 获取无人机是否在舱内: {"0":"舱外","1":"舱内"}
Integer droneInDock = telemetryMap.get(DeviceTelemetry.Drone_In_Dock)
.map(telemetryValue -> telemetryValue.getValue())
.orElse(null);
// 获取无人机是否开机: {"0":"关机","1":"开机"}
Integer deviceOnlineStatus = telemetryMap.get(DeviceTelemetry.Sub_Device_Online_Status)
.map(telemetryValue -> telemetryValue.getValue())
.orElse(null);
// 根据舱内/舱外和开机/关机状态确定无人机状态
boolean isInCabin = droneInDock != null && droneInDock == 1;
boolean isPowerOn = deviceOnlineStatus != null && deviceOnlineStatus == 1;
if (isInCabin) {
// 舱内
if (isPowerOn) {
return AircraftStatusEnum.POWER_ON_IN_CABIN.getCode();
} else {
return AircraftStatusEnum.POWER_OFF_IN_CABIN.getCode();
}
} else {
// 舱外
if (isPowerOn) {
return AircraftStatusEnum.POWER_ON_OUT_CABIN.getCode();
} else {
return AircraftStatusEnum.POWER_OFF_OUT_CABIN.getCode();
}
}
} }
} }