From f131b3b98fe3e236eb4544871d16d89619dc04eb Mon Sep 17 00:00:00 2001
From: zhaowenyu <35589726@qq.com>
Date: Tue, 28 Oct 2025 15:07:03 +0800
Subject: [PATCH] 2025-10-28 zwy 更新,发送websocket消息机场状态信息、远程调试操控状态、远程调试操控进度信息给客户端

---
 ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOSDServiceImpl.java      |   39 +++++++++++++------
 ard-sample/src/main/java/com/ard/sample/component/mqtt/model/CommonTopicReceiver.java    |    2 +
 ard-sample/src/main/java/com/ard/sample/manage/service/impl/ControlServiceImpl.java      |   31 +++++++++++++++
 ard-sample/src/main/java/com/ard/sample/component/mqtt/model/OutputProgressReceiver.java |   10 +++++
 ard-sample/src/main/java/com/ard/sample/component/mqtt/handler/ServicesReplyHandler.java |   21 ++++++++++
 5 files changed, 90 insertions(+), 13 deletions(-)

diff --git a/ard-sample/src/main/java/com/ard/sample/component/mqtt/handler/ServicesReplyHandler.java b/ard-sample/src/main/java/com/ard/sample/component/mqtt/handler/ServicesReplyHandler.java
index c51ca26..c1909e5 100644
--- a/ard-sample/src/main/java/com/ard/sample/component/mqtt/handler/ServicesReplyHandler.java
+++ b/ard-sample/src/main/java/com/ard/sample/component/mqtt/handler/ServicesReplyHandler.java
@@ -4,12 +4,15 @@
 import com.ard.sample.component.mqtt.model.ChannelName;
 import com.ard.sample.component.mqtt.model.CommonTopicReceiver;
 import com.ard.sample.component.mqtt.model.ServiceReply;
+import com.ard.sample.component.websocket.enums.MessageType;
+import com.ard.sample.component.websocket.handler.DockWebSocketHandler;
 import com.ard.sample.manage.model.enums.LogsFileMethodEnum;
 import com.ard.sample.manage.model.receiver.LogsFileUploadList;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.integration.annotation.ServiceActivator;
+import org.springframework.integration.mqtt.support.MqttHeaders;
 import org.springframework.messaging.Message;
 import org.springframework.stereotype.Component;
 
@@ -26,6 +29,9 @@
     @Autowired
     private ObjectMapper mapper;
 
+    @Autowired
+    private DockWebSocketHandler _dockWebSocketHandler;
+
     /**
      * Handle the reply message from the pilot side to the on-demand video.
      * @param message   reply message
@@ -33,9 +39,17 @@
      */
     @ServiceActivator(inputChannel = ChannelName.INBOUND_SERVICE_REPLY)
     public void serviceReply(Message<?> message) throws IOException {
+        String topic = message.getHeaders().get(MqttHeaders.RECEIVED_TOPIC).toString();
+        // thing/product/7CTDLCE00A1UPE/services_reply
+        String[] parts = topic.split("/");
+        // 目标子串是分割后数组的第3个元素(索引2)
+        String deviceSn = parts.length > 2 ? parts[2] : ""; // 加判断避免数组越界
+
         byte[] payload = (byte[])message.getPayload();
 
         CommonTopicReceiver receiver = mapper.readValue(payload, new TypeReference<CommonTopicReceiver>() {});
+        receiver.setGateway(deviceSn);
+        receiver.setType(MessageType.CONTROL.getType());
         if (LogsFileMethodEnum.FILE_UPLOAD_LIST.getMethod().equals(receiver.getMethod())) {
             LogsFileUploadList list = mapper.convertValue(receiver.getData(), new TypeReference<LogsFileUploadList>() {});
             receiver.setData(list);
@@ -46,5 +60,12 @@
         Chan<CommonTopicReceiver<?>> chan = Chan.getInstance();
         // Put the message to the chan object.
         chan.put(receiver);
+        // WebSocket 接口,发给前端
+        String dockControl="";
+        dockControl=mapper.writeValueAsString(receiver);
+
+        _dockWebSocketHandler.sendMessageToSubscribers(deviceSn, MessageType.CONTROL.getType(),dockControl);
+
+//        DockControlProgressWebSockerHandler.
     }
 }
diff --git a/ard-sample/src/main/java/com/ard/sample/component/mqtt/model/CommonTopicReceiver.java b/ard-sample/src/main/java/com/ard/sample/component/mqtt/model/CommonTopicReceiver.java
index 41dd14b..3b5b366 100644
--- a/ard-sample/src/main/java/com/ard/sample/component/mqtt/model/CommonTopicReceiver.java
+++ b/ard-sample/src/main/java/com/ard/sample/component/mqtt/model/CommonTopicReceiver.java
@@ -31,4 +31,6 @@
 
     private Integer needReply;
 
+    private String type;
+
 }
\ No newline at end of file
diff --git a/ard-sample/src/main/java/com/ard/sample/component/mqtt/model/OutputProgressReceiver.java b/ard-sample/src/main/java/com/ard/sample/component/mqtt/model/OutputProgressReceiver.java
index a9d6ee4..5d4cc43 100644
--- a/ard-sample/src/main/java/com/ard/sample/component/mqtt/model/OutputProgressReceiver.java
+++ b/ard-sample/src/main/java/com/ard/sample/component/mqtt/model/OutputProgressReceiver.java
@@ -1,5 +1,6 @@
 package com.ard.sample.component.mqtt.model;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
 
 /**
@@ -10,9 +11,18 @@
 @Data
 public class OutputProgressReceiver {
 
+    @JsonProperty("percent")
     private Integer percent;
 
+    @JsonProperty("current_step")
+    private String currentStep;
+
+    @JsonProperty("step_key")
     private String stepKey;
 
+    @JsonProperty("step_result")
     private Integer stepResult;
+
+    @JsonProperty("total_steps")
+    private String totalSteps;
 }
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/ControlServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/ControlServiceImpl.java
index 8658cbc..40093b2 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/ControlServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/ControlServiceImpl.java
@@ -6,6 +6,8 @@
 import com.ard.sample.component.mqtt.service.IMessageSenderService;
 import com.ard.common.core.redis.RedisConst;
 import com.ard.common.core.redis.RedisOpsUtils;
+import com.ard.sample.component.websocket.enums.MessageType;
+import com.ard.sample.component.websocket.handler.DockWebSocketHandler;
 import com.ard.sample.component.websocket.service.ISendMessageService;
 import com.ard.sample.manage.model.dto.BasicDeviceProperty;
 import com.ard.sample.manage.model.dto.DeviceDTO;
@@ -37,7 +39,13 @@
     private IMessageSenderService messageSenderService;
 
     @Autowired
+    private DockWebSocketHandler _dockWebSocketHandler;
+
+    @Autowired
     private ISendMessageService webSocketMessageService;
+
+    @Autowired
+    private IDeviceService _deviceService;
 
 //    @Autowired
 //    private IWebSocketManageService webSocketManageService;
@@ -105,12 +113,19 @@
         if (RedisOpsUtils.getExpire(key) <= 0) {
             return;
         }
+        // 更新设备列表状态--关闭舱盖中...
+        String method = receiver.getMethod();
+        String deviceSn = receiver.getGateway();
+        if(method.equals("cover_close")){
+            _deviceService.updateWorkType(deviceSn, 2L);
+        }
         String sn = RedisOpsUtils.get(key).toString();
-
+        receiver.setType(MessageType.PROGRESS.getType());
         EventsReceiver<EventsOutputReceiver> eventsReceiver = mapper.convertValue(receiver.getData(),
                 new TypeReference<EventsReceiver<EventsOutputReceiver>>(){});
         eventsReceiver.setBid(receiver.getBid());
         eventsReceiver.setSn(sn);
+        eventsReceiver.setType(MessageType.PROGRESS.getType());
 
         log.info("SN: {}, {} ===> Control progress: {}",
                 sn, receiver.getMethod(), eventsReceiver.getOutput().getProgress().toString());
@@ -133,6 +148,20 @@
 //                        .timestamp(System.currentTimeMillis())
 //                        .bizCode(receiver.getMethod())
 //                        .build());
+        // 更新设备列表状态--飞行器开机中...
+        if(method.equals("drone_open")){
+            _deviceService.updateWorkType(device.getChildDeviceSn(), 7L);
+        }
+
+        String dockProgress ="";
+        try {
+            dockProgress = mapper.writeValueAsString(eventsReceiver);
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+        }
+        // 设备控制进度消息websocket发给前端
+        _dockWebSocketHandler.sendMessageToSubscribers(sn, MessageType.PROGRESS.getType(), dockProgress);
 
         if (receiver.getNeedReply() != null && receiver.getNeedReply() == 1) {
             String topic = headers.get(MqttHeaders.RECEIVED_TOPIC) + TopicConst._REPLY_SUF;
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOSDServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOSDServiceImpl.java
index ca7c946..5918651 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOSDServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DockOSDServiceImpl.java
@@ -2,15 +2,17 @@
 
 import com.ard.sample.component.mqtt.model.CommonTopicReceiver;
 import com.ard.sample.component.websocket.config.ConcurrentWebSocketSession;
+import com.ard.sample.component.websocket.enums.MessageType;
+import com.ard.sample.component.websocket.handler.DockWebSocketHandler;
 import com.ard.sample.component.websocket.model.BizCodeEnum;
 import com.ard.sample.component.websocket.model.CustomWebSocketMessage;
-import com.ard.sample.component.websocket.service.impl.WebSocketDockServer;
 import com.ard.sample.manage.model.dto.DeviceDTO;
 import com.ard.sample.manage.model.dto.TelemetryDTO;
 import com.ard.sample.manage.model.enums.DeviceDomainEnum;
 import com.ard.sample.manage.model.receiver.OsdDockReceiver;
 import com.ard.sample.manage.service.IDeviceService;
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -25,7 +27,7 @@
 public class DockOSDServiceImpl extends AbstractTSAService {
 
     @Autowired
-    WebSocketDockServer _websocketdockserver;// = new WebSocketDockServer();
+    private DockWebSocketHandler _dockWebSocketHandler;
 
     @Autowired
     private IDeviceService _deviceService;
@@ -50,32 +52,45 @@
         if (DeviceDomainEnum.DOCK.getVal() == device.getDomain()) {
             wsMessage.setBizCode(BizCodeEnum.DOCK_OSD.getCode());
             OsdDockReceiver data = mapper.convertValue(receiver.getData(), OsdDockReceiver.class);
+            receiver.setType(MessageType.STATUS.getType());
             String dockOsd="";
+            String dockOsdData="";
             try{
-                dockOsd=mapper.writeValueAsString(receiver.getData());
-                if (dockOsd.contains("flighttask_step_code")) {
-                    JsonNode jsonNode = mapper.readTree(dockOsd);
+                dockOsd=mapper.writeValueAsString(receiver);
+                dockOsdData=mapper.writeValueAsString(receiver.getData());
+                if (dockOsdData.contains("flighttask_step_code")) {
+                    JsonNode jsonNode = mapper.readTree(dockOsdData);
                     if (jsonNode.has("flighttask_step_code")) {
                         String deviceSn = device.getDeviceSn();
                         Long code = jsonNode.get("flighttask_step_code").asLong();
-                        _deviceService.updateWorkType(deviceSn,code);
+                        if(code != null) {
+                            //只要状态 "0":"作业准备中","1":"飞行作业中","5":"任务空闲"
+                            if(code == 0 || code == 1 || code == 5) {
+                                _deviceService.updateWorkType(deviceSn,code);
+                            }
+                        }
                     }
 
-                } else if (dockOsd.contains("network_state")) {
-                    JsonNode jsonNode = mapper.readTree(dockOsd);
-                    if (jsonNode.has("drone_in_dock")) {
+                } else if (dockOsdData.contains("network_state")) {
+                    JsonNode jsonNode = mapper.readTree(dockOsdData);
+                    if (jsonNode.has("drone_in_dock") && jsonNode.get("sub_device").has("device_online_status")) {
                         String childDeviceSn=jsonNode.get("sub_device").get("device_sn").asText();
                         Long inDock=jsonNode.get("drone_in_dock").asLong();
-                        _deviceService.updateWorkType(childDeviceSn,inDock);
+                        Long deviceOnlineStatus=jsonNode.get("sub_device").get("device_online_status").asLong();
+                        if(inDock.equals(1L) && deviceOnlineStatus.equals(0L))
+                        {// 飞行器在舱内且关机状态为6
+                            _deviceService.updateWorkType(childDeviceSn,6L);
+                        }
                     }
-                } else if (dockOsd.contains("job_number")) {
+                } else if (dockOsdData.contains("job_number")) {
                 }
             }catch (Exception e){
                 e.printStackTrace();
             }
             wsMessage.getData().setHost(data);
             sendMessageService.sendBatch(webSessions, wsMessage);
-            _websocketdockserver.sendToAll(dockOsd);
+            // 发送给websocket客户端
+            _dockWebSocketHandler.sendMessageToSubscribers(device.getDeviceSn(), MessageType.STATUS.getType(), dockOsd);
         }
     }
 }

--
Gitblit v1.9.3