Compare commits

...

13 Commits
test ... main

Author SHA1 Message Date
孙小云 eb76ef35e0 添加taskId作为调用后台数据 2026-03-24 17:32:45 +08:00
孙小云 01e0504bba 修改无人机状态判断标准 2026-03-24 14:20:10 +08:00
孙小云 83b76fecdd 处理缓存实效问题 2026-03-24 14:08:53 +08:00
孙小云 22f18ebbe5 添加日志 2026-03-24 13:40:59 +08:00
孙小云 135402e725 修改日志 2026-03-24 13:27:00 +08:00
孙小云 b7825ab099 修改共享订阅组 2026-03-24 10:38:12 +08:00
孙小云 f4820b809f 修改配置 2026-03-24 10:18:05 +08:00
孙小云 1a241f809b 修改clientId动态生成 2026-03-24 09:55:23 +08:00
孙小云 3d4d995d05 添加日志 2026-03-24 08:32:44 +08:00
孙小云 3f1c4c21be recovery 2026-03-23 18:28:47 +08:00
孙小云 88cfd84fd8 添加错误原因 2026-03-23 18:20:31 +08:00
孙小云 e5cfb7068f 添加日志 2026-03-23 16:56:02 +08:00
孙小云 b5b3d3cc9d 添加日志 2026-03-23 15:53:51 +08:00
11 changed files with 79 additions and 45 deletions

View File

@ -12,6 +12,7 @@ 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;
@ -66,12 +67,16 @@ 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<>();
// 处理消息ID Long currentTaskId = flightService.currentRunningTask(sn);
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) {
@ -202,6 +207,7 @@ 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);
@ -273,17 +279,19 @@ public class AircraftFlyController extends BaseController
CommandResult result = future.get(); CommandResult result = future.get();
if (result.isSuccess()) { if (result.isSuccess()) {
log.info("无人机起飞命令发送成功: sn={}", request.getSn()); log.info("无人机起飞命令发送成功 executeCommand: sn={}", request.getSn());
flightService.updateFlightStatus(request.getTaskId(), StatusEnum.CHECKING); flightService.updateFlightStatus(request.getTaskId(), TaskResultVO.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(), StatusEnum.FAILED); flightService.updateFlightStatus(request.getTaskId(),
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(), StatusEnum.FAILED); flightService.updateFlightStatus(request.getTaskId(),
TaskResultVO.Error("人机起飞命令发送失败 executeCommand E" + e.getMessage()));
return R.fail("无人机起飞命令发送失败: " + e.getMessage()); return R.fail("无人机起飞命令发送失败: " + e.getMessage());
} }
} }
@ -475,10 +483,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(Objects.isNull(currentTaskId)){ if (currentTaskId != null) {
params.put("messageID", UUID.randomUUID().toString());
}else {
params.put("messageID", currentTaskId); params.put("messageID", currentTaskId);
} else {
params.put("messageID", System.currentTimeMillis());
} }
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,6 +1,7 @@
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;
@ -53,7 +54,7 @@ public interface FlightService
* @param flightId 飞行ID * @param flightId 飞行ID
* @param status 状态自检中飞行中已返航 * @param status 状态自检中飞行中已返航
*/ */
void updateFlightStatus(Long flightId, StatusEnum status); void updateFlightStatus(Long flightId, TaskResultVO status);
// /** // /**
// * 更新返航时间 // * 更新返航时间

View File

@ -4,6 +4,8 @@ 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配置属性
* *
@ -32,7 +34,7 @@ public class TuohengMqttProperties {
/** /**
* 客户端ID * 客户端ID
*/ */
private String clientId = "ThingsBoard_gateway"; private String clientId = "ThingsBoard_gateway_" + UUID.randomUUID().toString().substring(0, 8);
/** /**
* 用户名 * 用户名

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()) .clientId(mqttProperties.getClientId() + "_" + System.currentTimeMillis())
.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-group") .sharedGroupName("dji-server-group")
.build(); .build();
// 创建客户端 // 创建客户端

View File

@ -1,5 +1,6 @@
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;
@ -7,6 +8,7 @@ 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;
@ -109,7 +111,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, StatusEnum.RUNNING); flightService.updateFlightStatus(taskId, TaskResultVO.Running());
return; return;
} }
@ -124,9 +126,17 @@ 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, StatusEnum.COMPLETED); flightService.updateFlightStatus(taskId, TaskResultVO.Completed("检测到 [地面站]任务飞行完成 更新状态为HOME"));
} }
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);
@ -134,8 +144,9 @@ 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={}", deviceSn, taskId); log.info("无人机起飞失败【FlightEventCallback】检测到自检失败(code=1)更新状态为ERROR: deviceSn={}, flightId={} msg {}",
flightService.updateFlightStatus(taskId, StatusEnum.FAILED); deviceSn, taskId, JSON.toJSONString(data));
flightService.updateFlightStatus(taskId, TaskResultVO.Error("handleControlDataMessage 检测到自检失败(code=1)"));
} }
} }
} }

View File

@ -9,6 +9,7 @@ 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;
@ -104,7 +105,9 @@ 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)){
flightService.updateFlightStatus(taskId, StatusEnum.FAILED); log.info("无人机起飞失败: sn={}", deviceSn);
flightService.updateFlightStatus(taskId, TaskResultVO.Error("无人机起飞失败 " +
"handlePreCheckLog 自检失败" + deviceSn));
} }
logEntity.setLogContent(logContent); logEntity.setLogContent(logContent);

View File

@ -10,6 +10,7 @@ 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;
@ -113,7 +114,7 @@ public class FlightServiceImpl implements FlightService
// } // }
@Override @Override
public void updateFlightStatus(Long flightId,StatusEnum status) { public void updateFlightStatus(Long flightId, TaskResultVO status) {
remoteTaskService.updateTaskStatus(flightId,status,SecurityConstants.INNER); remoteTaskService.updateTaskStatus(flightId,status,SecurityConstants.INNER);

View File

@ -69,6 +69,9 @@ 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) {
@ -91,6 +94,9 @@ 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());
@ -338,20 +344,21 @@ 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", mode); log.info("舱门关闭,设置机场状态为 IDLE");
} }
} 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()) .clientId(mqttProperties.getClientId() + "_" + System.currentTimeMillis())
.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-group") .sharedGroupName("tuoheng-server-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,6 +116,7 @@ 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));
} }