Compare commits

..

1 Commits
main ... test

Author SHA1 Message Date
孙小云 f08f3aca99 xx 2026-03-21 11:51:03 +08:00
12 changed files with 46 additions and 80 deletions

View File

@ -1 +1 @@
idddddddddddddddddddddddddddddddddddddddddddddddddddD堆堆ddddddddddddddddddddeeedddddddd dddddddddddddddddddddddddddddddddddddddddddddddddddD堆堆ddddddddddddddddddddeeedddddddd

View File

@ -12,7 +12,6 @@ import com.ruoyi.device.domain.impl.machine.command.CommandResult;
import com.ruoyi.device.domain.impl.machine.command.CommandType; import com.ruoyi.device.domain.impl.machine.command.CommandType;
import com.ruoyi.device.domain.impl.machine.state.MachineStates; import com.ruoyi.device.domain.impl.machine.state.MachineStates;
import com.ruoyi.device.service.FlightService; import com.ruoyi.device.service.FlightService;
import com.ruoyi.task.api.domain.TaskResultVO;
import com.ruoyi.task.api.enums.StatusEnum; import com.ruoyi.task.api.enums.StatusEnum;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
@ -67,16 +66,12 @@ public class AircraftFlyController extends BaseController
CommandType commandType; CommandType commandType;
java.util.Map<String, Object> params = new java.util.HashMap<>(); java.util.Map<String, Object> params = new java.util.HashMap<>();
Long currentTaskId = flightService.currentRunningTask(sn); // 处理消息ID
if (currentTaskId != null) {
params.put("messageID", currentTaskId);
} else {
if (request.getMessageID() != null) { if (request.getMessageID() != null) {
params.put("messageID", request.getMessageID()); params.put("messageID", request.getMessageID());
} else { } else {
params.put("messageID", System.currentTimeMillis()); params.put("messageID", System.currentTimeMillis());
} }
}
// 处理扩展参数 // 处理扩展参数
if (request.getEvalue() != null) { if (request.getEvalue() != null) {
@ -207,7 +202,6 @@ public class AircraftFlyController extends BaseController
@Parameter(description = "任务ID", required = true, example = "1") @Parameter(description = "任务ID", required = true, example = "1")
@PathVariable("taskId") Long taskId) @PathVariable("taskId") Long taskId)
{ {
// TODO: 实现获取实时信息逻辑 // TODO: 实现获取实时信息逻辑
DroneRealtimeInfoVO vo = new DroneRealtimeInfoVO(); DroneRealtimeInfoVO vo = new DroneRealtimeInfoVO();
vo.setClimbSpeed(0); vo.setClimbSpeed(0);
@ -279,19 +273,17 @@ public class AircraftFlyController extends BaseController
CommandResult result = future.get(); CommandResult result = future.get();
if (result.isSuccess()) { if (result.isSuccess()) {
log.info("无人机起飞命令发送成功 executeCommand: sn={}", request.getSn()); log.info("无人机起飞命令发送成功: sn={}", request.getSn());
flightService.updateFlightStatus(request.getTaskId(), TaskResultVO.Checking("无人机起飞命令发送成功")); flightService.updateFlightStatus(request.getTaskId(), StatusEnum.CHECKING);
return R.ok("无人机起飞命令发送成功"); return R.ok("无人机起飞命令发送成功");
} else { } else {
log.error("无人机起飞失败 无人机起飞命令发送失败: sn={}, reason={}", request.getSn(), result.getErrorMessage()); log.error("无人机起飞命令发送失败: sn={}, reason={}", request.getSn(), result.getErrorMessage());
flightService.updateFlightStatus(request.getTaskId(), flightService.updateFlightStatus(request.getTaskId(), StatusEnum.FAILED);
TaskResultVO.Error("人机起飞命令发送失败 executeCommand"+ result.getErrorMessage()));
return R.fail("无人机起飞命令发送失败: " + result.getErrorMessage()); return R.fail("无人机起飞命令发送失败: " + result.getErrorMessage());
} }
} catch (Exception e) { } catch (Exception e) {
log.error("无人机起飞失败 无人机起飞命令发送失败: sn={}", request.getSn(), e); log.error("无人机起飞命令发送失败: sn={}", request.getSn(), e);
flightService.updateFlightStatus(request.getTaskId(), flightService.updateFlightStatus(request.getTaskId(), StatusEnum.FAILED);
TaskResultVO.Error("人机起飞命令发送失败 executeCommand E" + e.getMessage()));
return R.fail("无人机起飞命令发送失败: " + e.getMessage()); return R.fail("无人机起飞命令发送失败: " + e.getMessage());
} }
} }
@ -483,10 +475,10 @@ public class AircraftFlyController extends BaseController
Long currentTaskId = flightService.currentRunningTask(request.getSn()); Long currentTaskId = flightService.currentRunningTask(request.getSn());
java.util.Map<String, Object> params = new java.util.HashMap<>(); java.util.Map<String, Object> params = new java.util.HashMap<>();
if (currentTaskId != null) { if(Objects.isNull(currentTaskId)){
params.put("messageID", currentTaskId); params.put("messageID", UUID.randomUUID().toString());
}else { }else {
params.put("messageID", System.currentTimeMillis()); params.put("messageID",currentTaskId);
} }
params.put("taskId", 9074); params.put("taskId", 9074);
params.put("zhilin", "03"); params.put("zhilin", "03");

View File

@ -139,9 +139,9 @@ public class GroupController extends BaseController
DockDetailDTO dockDetailDTO = bufferDeviceService.getDockDetailById(dock.getDockId()); DockDetailDTO dockDetailDTO = bufferDeviceService.getDockDetailById(dock.getDockId());
if (dockDetailDTO != null) { if (dockDetailDTO != null) {
dockDetailDTO.setLastActiveTime(dock.getLastActiveTime()); dockDetailDTO.setLastActiveTime(dock.getLastActiveTime());
// dockDetailDTO.setCabinVideoUrl(dock.getCabinVideoUrl()); dockDetailDTO.setCabinVideoUrl(dock.getCabinVideoUrl());
// dockDetailDTO.setOutsideVideoUrl(dock.getOutsideVideoUrl()); dockDetailDTO.setOutsideVideoUrl(dock.getOutsideVideoUrl());
// dockDetailDTO.setLiveVideoUrl(dock.getLiveVideoUrl()); dockDetailDTO.setLiveVideoUrl(dock.getLiveVideoUrl());
dtoList.add(dockDetailDTO); dtoList.add(dockDetailDTO);
} }
} }

View File

@ -1,7 +1,6 @@
package com.ruoyi.device.service; package com.ruoyi.device.service;
import com.ruoyi.device.mapper.entity.FlightEntity; import com.ruoyi.device.mapper.entity.FlightEntity;
import com.ruoyi.task.api.domain.TaskResultVO;
import com.ruoyi.task.api.enums.StatusEnum; import com.ruoyi.task.api.enums.StatusEnum;
import java.util.Map; import java.util.Map;
@ -54,7 +53,7 @@ public interface FlightService
* @param flightId 飞行ID * @param flightId 飞行ID
* @param status 状态自检中飞行中已返航 * @param status 状态自检中飞行中已返航
*/ */
void updateFlightStatus(Long flightId, TaskResultVO status); void updateFlightStatus(Long flightId, StatusEnum status);
// /** // /**
// * 更新返航时间 // * 更新返航时间

View File

@ -4,8 +4,6 @@ import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.UUID;
/** /**
* DJI MQTT配置属性 * DJI MQTT配置属性
* *
@ -34,7 +32,7 @@ public class TuohengMqttProperties {
/** /**
* 客户端ID * 客户端ID
*/ */
private String clientId = "ThingsBoard_gateway_" + UUID.randomUUID().toString().substring(0, 8); private String clientId = "ThingsBoard_gateway";
/** /**
* 用户名 * 用户名

View File

@ -65,7 +65,7 @@ public class DjiService {
DjiMqttClientConfig config = DjiMqttClientConfig.builder() DjiMqttClientConfig config = DjiMqttClientConfig.builder()
.host(mqttProperties.getHost()) .host(mqttProperties.getHost())
.port(mqttProperties.getPort()) .port(mqttProperties.getPort())
.clientId(mqttProperties.getClientId() + "_" + System.currentTimeMillis()) .clientId(mqttProperties.getClientId())
.username(mqttProperties.getUsername()) .username(mqttProperties.getUsername())
.password(mqttProperties.getPassword()) .password(mqttProperties.getPassword())
.connectionTimeout(mqttProperties.getConnectionTimeout()) .connectionTimeout(mqttProperties.getConnectionTimeout())
@ -73,7 +73,7 @@ public class DjiService {
.autoReconnect(mqttProperties.getAutoReconnect()) .autoReconnect(mqttProperties.getAutoReconnect())
.cleanSession(mqttProperties.getCleanSession()) .cleanSession(mqttProperties.getCleanSession())
.useSharedSubscription(true) .useSharedSubscription(true)
.sharedGroupName("dji-server-group") .sharedGroupName("dji-group")
.build(); .build();
// 创建客户端 // 创建客户端

View File

@ -1,6 +1,5 @@
package com.ruoyi.device.service.impl; package com.ruoyi.device.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.device.domain.impl.tuohengmqtt.callback.IAirportFlyControlCallback; import com.ruoyi.device.domain.impl.tuohengmqtt.callback.IAirportFlyControlCallback;
import com.ruoyi.device.domain.impl.tuohengmqtt.callback.IAirportFlyControlDataCallback; import com.ruoyi.device.domain.impl.tuohengmqtt.callback.IAirportFlyControlDataCallback;
@ -8,7 +7,6 @@ import com.ruoyi.device.mapper.entity.FlightEntity;
import com.ruoyi.device.mapper.entity.FlightLogEntity; import com.ruoyi.device.mapper.entity.FlightLogEntity;
import com.ruoyi.device.mapper.entity.PreCheckLogEntity; import com.ruoyi.device.mapper.entity.PreCheckLogEntity;
import com.ruoyi.device.service.FlightService; import com.ruoyi.device.service.FlightService;
import com.ruoyi.task.api.domain.TaskResultVO;
import com.ruoyi.task.api.enums.StatusEnum; import com.ruoyi.task.api.enums.StatusEnum;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -111,7 +109,7 @@ public class FlightEventCallback implements IAirportFlyControlCallback, IAirport
handleFlightLog(deviceSn, msg, taskId); handleFlightLog(deviceSn, msg, taskId);
// 更新状态为 FLYING // 更新状态为 FLYING
log.info("【FlightEventCallback】检测到起飞成功更新状态为FLYING: deviceSn={}, flightId={}", deviceSn, taskId); log.info("【FlightEventCallback】检测到起飞成功更新状态为FLYING: deviceSn={}, flightId={}", deviceSn, taskId);
flightService.updateFlightStatus(taskId, TaskResultVO.Running()); flightService.updateFlightStatus(taskId, StatusEnum.RUNNING);
return; return;
} }
@ -126,17 +124,9 @@ public class FlightEventCallback implements IAirportFlyControlCallback, IAirport
// 检查是否任务完成 // 检查是否任务完成
String dataContent = data.getString("data"); String dataContent = data.getString("data");
if ("操作成功".equals(msg) && "[地面站]任务飞行完成".equals(dataContent)) { if ("操作成功".equals(msg) && "[地面站]任务飞行完成".equals(dataContent)) {
log.info("【FlightEventCallback】检测到 [地面站]任务飞行完成 更新状态为HOME: deviceSn={}, flightId={}", deviceSn, taskId); log.info("【FlightEventCallback】检测到任务完成更新状态为HOME: deviceSn={}, flightId={}", deviceSn, taskId);
flightService.updateFlightStatus(taskId, TaskResultVO.Completed("检测到 [地面站]任务飞行完成 更新状态为HOME")); flightService.updateFlightStatus(taskId, StatusEnum.COMPLETED);
} }
if ("[机巢]无人机关机成功".equals(dataContent)) {
log.info("【FlightEventCallback】检测到 [机巢]无人机关机成功 更新状态为HOME: deviceSn={}, flightId={}", deviceSn, taskId);
flightService.updateFlightStatus(taskId, TaskResultVO.Completed("[机巢]无人机关机成功 更新状态为HOME"));
}
} else { } else {
// 未起飞所有消息存到 device_pre_check_log // 未起飞所有消息存到 device_pre_check_log
log.info("【FlightEventCallback】未起飞存入自检日志: deviceSn={}, flightId={}, msg={}, code={}", deviceSn, taskId, msg, code); log.info("【FlightEventCallback】未起飞存入自检日志: deviceSn={}, flightId={}, msg={}, code={}", deviceSn, taskId, msg, code);
@ -144,9 +134,8 @@ public class FlightEventCallback implements IAirportFlyControlCallback, IAirport
// 检查是否自检失败code=1 表示失败 // 检查是否自检失败code=1 表示失败
if (code != null && (code == 1 || code == -1)) { if (code != null && (code == 1 || code == -1)) {
log.info("无人机起飞失败【FlightEventCallback】检测到自检失败(code=1)更新状态为ERROR: deviceSn={}, flightId={} msg {}", log.info("【FlightEventCallback】检测到自检失败(code=1)更新状态为ERROR: deviceSn={}, flightId={}", deviceSn, taskId);
deviceSn, taskId, JSON.toJSONString(data)); flightService.updateFlightStatus(taskId, StatusEnum.FAILED);
flightService.updateFlightStatus(taskId, TaskResultVO.Error("handleControlDataMessage 检测到自检失败(code=1)"));
} }
} }
} }

View File

@ -9,7 +9,6 @@ import com.ruoyi.device.mapper.entity.FlightEntity;
import com.ruoyi.device.mapper.entity.FlightLogEntity; import com.ruoyi.device.mapper.entity.FlightLogEntity;
import com.ruoyi.device.mapper.entity.PreCheckLogEntity; import com.ruoyi.device.mapper.entity.PreCheckLogEntity;
import com.ruoyi.device.service.FlightService; import com.ruoyi.device.service.FlightService;
import com.ruoyi.task.api.domain.TaskResultVO;
import com.ruoyi.task.api.enums.StatusEnum; import com.ruoyi.task.api.enums.StatusEnum;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -105,9 +104,7 @@ public class FlightLogCallback implements IDroneRealTimeCallback {
String logContent = check + " " + value + " " + statusText; String logContent = check + " " + value + " " + statusText;
if(Boolean.FALSE.equals(result)){ if(Boolean.FALSE.equals(result)){
log.info("无人机起飞失败: sn={}", deviceSn); flightService.updateFlightStatus(taskId, StatusEnum.FAILED);
flightService.updateFlightStatus(taskId, TaskResultVO.Error("无人机起飞失败 " +
"handlePreCheckLog 自检失败" + deviceSn));
} }
logEntity.setLogContent(logContent); logEntity.setLogContent(logContent);

View File

@ -10,7 +10,6 @@ import com.ruoyi.device.mapper.entity.FlightLogEntity;
import com.ruoyi.device.mapper.entity.PreCheckLogEntity; import com.ruoyi.device.mapper.entity.PreCheckLogEntity;
import com.ruoyi.device.service.FlightService; import com.ruoyi.device.service.FlightService;
import com.ruoyi.task.api.RemoteTaskService; import com.ruoyi.task.api.RemoteTaskService;
import com.ruoyi.task.api.domain.TaskResultVO;
import com.ruoyi.task.api.domain.TaskVO; import com.ruoyi.task.api.domain.TaskVO;
import com.ruoyi.task.api.enums.ExecuteTypeEnum; import com.ruoyi.task.api.enums.ExecuteTypeEnum;
import com.ruoyi.task.api.enums.StatusEnum; import com.ruoyi.task.api.enums.StatusEnum;
@ -114,7 +113,7 @@ public class FlightServiceImpl implements FlightService
// } // }
@Override @Override
public void updateFlightStatus(Long flightId, TaskResultVO status) { public void updateFlightStatus(Long flightId,StatusEnum status) {
remoteTaskService.updateTaskStatus(flightId,status,SecurityConstants.INNER); remoteTaskService.updateTaskStatus(flightId,status,SecurityConstants.INNER);

View File

@ -69,9 +69,6 @@ public class TuohengBufferDeviceImpl implements IBufferDeviceService {
return null; return null;
} }
log.info("Dock对象详细信息: dockId={}, cabinVideoUrl={}, outsideVideoUrl={}, liveVideoUrl={}",
dock.getDockId(), dock.getCabinVideoUrl(), dock.getOutsideVideoUrl(), dock.getLiveVideoUrl());
// 查询设备信息 // 查询设备信息
Device device = deviceDomain.selectDeviceByDeviceId(dock.getDeviceId()); Device device = deviceDomain.selectDeviceByDeviceId(dock.getDeviceId());
if (device == null) { if (device == null) {
@ -94,9 +91,6 @@ public class TuohengBufferDeviceImpl implements IBufferDeviceService {
dto.setInternalCamera(dock.getCabinVideoUrl()); dto.setInternalCamera(dock.getCabinVideoUrl());
dto.setExternalCamera(dock.getOutsideVideoUrl()); dto.setExternalCamera(dock.getOutsideVideoUrl());
dto.setLiveCamera(dock.getLiveVideoUrl()); dto.setLiveCamera(dock.getLiveVideoUrl());
log.info("设置DTO视频地址: internalCamera={}, externalCamera={}, liveCamera={}",
dto.getInternalCamera(), dto.getExternalCamera(), dto.getLiveCamera());
dto.setDockIotId(device.getIotDeviceId()); dto.setDockIotId(device.getIotDeviceId());
dto.setSnNumber(device.getDeviceSn()); dto.setSnNumber(device.getDeviceSn());
dto.setBindTime(device.getCreateTime().getTime()); dto.setBindTime(device.getCreateTime().getTime());
@ -344,21 +338,20 @@ public class TuohengBufferDeviceImpl implements IBufferDeviceService {
machineStates.getCoverState(); machineStates.getCoverState();
log.info("机场舱门状态(从MachineStateManager): {}", coverState); log.info("机场舱门状态(从MachineStateManager): {}", coverState);
// 通过MODE判断飞行模式暂时注释掉数据不准确 // 先判断MODE是否为飞行模式
// boolean isFlyingMode = "auto".equalsIgnoreCase(mode) || boolean isFlyingMode = "auto".equalsIgnoreCase(mode) ||
// "guided".equalsIgnoreCase(mode) || "guided".equalsIgnoreCase(mode) ||
// "loiter".equalsIgnoreCase(mode) || "loiter".equalsIgnoreCase(mode) ||
// "rtl".equalsIgnoreCase(mode); "rtl".equalsIgnoreCase(mode);
// if (isFlyingMode) { if (isFlyingMode) {
// dockStatus = "WORKING"; dockStatus = "WORKING";
// log.info("无人机处于{}模式,设置机场状态为 WORKING", mode); log.info("无人机处于{}模式,设置机场状态为 WORKING", mode);
// } else if (coverState == CoverState.OPENED) { } else if (coverState == CoverState.OPENED) {
if (coverState == CoverState.OPENED) {
dockStatus = "WORKING"; dockStatus = "WORKING";
log.info("舱门打开,设置机场状态为 WORKING"); log.info("舱门打开,设置机场状态为 WORKING");
} else { } else {
log.info("舱门关闭,设置机场状态为 IDLE"); log.info("无人机处于{}模式且舱门关闭,设置机场状态为 IDLE", mode);
} }
} catch (Exception e) { } catch (Exception e) {
log.warn("获取无人机mode或舱门状态失败默认设置为IDLE: {}", e.getMessage()); log.warn("获取无人机mode或舱门状态失败默认设置为IDLE: {}", e.getMessage());

View File

@ -89,7 +89,7 @@ public class TuohengService {
TuohengMqttClientConfig config = TuohengMqttClientConfig.builder() TuohengMqttClientConfig config = TuohengMqttClientConfig.builder()
.host(mqttProperties.getHost()) .host(mqttProperties.getHost())
.port(mqttProperties.getPort()) .port(mqttProperties.getPort())
.clientId(mqttProperties.getClientId() + "_" + System.currentTimeMillis()) .clientId(mqttProperties.getClientId())
.username(mqttProperties.getUsername()) .username(mqttProperties.getUsername())
.password(mqttProperties.getPassword()) .password(mqttProperties.getPassword())
.connectionTimeout(mqttProperties.getConnectionTimeout()) .connectionTimeout(mqttProperties.getConnectionTimeout())
@ -97,7 +97,7 @@ public class TuohengService {
.autoReconnect(mqttProperties.getAutoReconnect()) .autoReconnect(mqttProperties.getAutoReconnect())
.cleanSession(mqttProperties.getCleanSession()) .cleanSession(mqttProperties.getCleanSession())
.useSharedSubscription(true) .useSharedSubscription(true)
.sharedGroupName("tuoheng-server-group") .sharedGroupName("tuoheng-group")
.build(); .build();
clientManager.initClient(config); clientManager.initClient(config);

View File

@ -101,9 +101,9 @@ public class PreCheckLogWebSocket {
if(Objects.nonNull(taskVOR) && Objects.nonNull(taskVOR.getData())){ if(Objects.nonNull(taskVOR) && Objects.nonNull(taskVOR.getData())){
TaskVO taskVO = taskVOR.getData(); TaskVO taskVO = taskVOR.getData();
// if(Objects.equals(true,taskVO.getRecovery())){ if(Objects.equals(true,taskVO.getRecovery())){
// continue; continue;
// } }
if(taskVO.getStatus() == StatusEnum.PENDING || taskVO.getStatus() == StatusEnum.CANCELED if(taskVO.getStatus() == StatusEnum.PENDING || taskVO.getStatus() == StatusEnum.CANCELED
|| taskVO.getStatus() == StatusEnum.COMPLETED){ || taskVO.getStatus() == StatusEnum.COMPLETED){
@ -116,7 +116,6 @@ public class PreCheckLogWebSocket {
if (flightData == null) { if (flightData == null) {
continue; continue;
} }
flightData.put("recovery", taskVOR.getData().getRecovery());
ws.sendMessage(JSON.toJSONString(flightData)); ws.sendMessage(JSON.toJSONString(flightData));
} }