From 0850908d83e86da899c89bf4f3cb48a9fd4610d0 Mon Sep 17 00:00:00 2001
From: Vincent <fswit@163.com>
Date: Fri, 22 Sep 2023 16:53:30 +0800
Subject: [PATCH] =?UTF-8?q?fix:=20OsdRouter=E5=9C=A8=E8=AE=BE=E5=A4=87?=
 =?UTF-8?q?=E6=9C=AA=E6=B3=A8=E5=86=8C=E7=9A=84=E6=83=85=E5=86=B5=E4=B8=8B?=
 =?UTF-8?q?=E6=8A=A5osd=E6=97=B6=E4=BA=A7=E7=94=9F=E5=A4=A7=E9=87=8F?=
 =?UTF-8?q?=E6=97=A5=E5=BF=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/dji/sdk/common/SDKManager.java   |  9 +++++
 .../java/com/dji/sdk/mqtt/osd/OsdRouter.java  | 36 +++++++++++--------
 2 files changed, 30 insertions(+), 15 deletions(-)

diff --git a/src/main/java/com/dji/sdk/common/SDKManager.java b/src/main/java/com/dji/sdk/common/SDKManager.java
index ce07689..684f647 100644
--- a/src/main/java/com/dji/sdk/common/SDKManager.java
+++ b/src/main/java/com/dji/sdk/common/SDKManager.java
@@ -8,6 +8,7 @@ import com.dji.sdk.exception.CloudSDKErrorEnum;
 import com.dji.sdk.exception.CloudSDKException;
 
 import java.util.Objects;
+import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 
 /**
@@ -30,6 +31,14 @@ public class SDKManager {
                 "The device has not been registered, please call the 'SDKManager.registerDevice()' method to register the device first.");
     }
 
+    public static Optional<GatewayManager> findDeviceSDK(String gatewaySn) {
+        if(SDK_MAP.containsKey(gatewaySn)){
+            return Optional.of(SDK_MAP.get(gatewaySn));
+        }else {
+            return Optional.empty();
+        }
+    }
+
     public static GatewayManager registerDevice(String gatewaySn, String droneSn,
             DeviceDomainEnum domain, DeviceTypeEnum type, DeviceSubTypeEnum subType, String gatewayThingVersion, String droneThingVersion) {
         return registerDevice(gatewaySn, droneSn, GatewayTypeEnum.find(DeviceEnum.find(domain, type, subType)), gatewayThingVersion, droneThingVersion);
diff --git a/src/main/java/com/dji/sdk/mqtt/osd/OsdRouter.java b/src/main/java/com/dji/sdk/mqtt/osd/OsdRouter.java
index 87f5282..6fbdde0 100644
--- a/src/main/java/com/dji/sdk/mqtt/osd/OsdRouter.java
+++ b/src/main/java/com/dji/sdk/mqtt/osd/OsdRouter.java
@@ -15,10 +15,7 @@ import org.springframework.integration.mqtt.support.MqttHeaders;
 import org.springframework.messaging.Message;
 
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import static com.dji.sdk.mqtt.TopicConst.*;
 
@@ -45,19 +42,28 @@ public class OsdRouter {
                     }
                 }, null)
                 .<TopicOsdRequest>handle((response, headers) -> {
-                    GatewayManager gateway = SDKManager.getDeviceSDK(response.getGateway());
-                    OsdDeviceTypeEnum typeEnum = OsdDeviceTypeEnum.find(gateway.getType(), response.getFrom().equals(response.getGateway()));
-                    Map<String, Object> data = (Map<String, Object>) response.getData();
-                    if (!typeEnum.isGateway()) {
-                        List payloadData = (List) data.getOrDefault(PayloadModelEnum.PAYLOAD_KEY, new ArrayList<>());
-                        PayloadModelEnum.getAllIndexWithPosition().stream().filter(data::containsKey)
-                                .map(data::get).forEach(payloadData::add);
-                        data.put(PayloadModelEnum.PAYLOAD_KEY, payloadData);
-                    }
-                    return response.setData(Common.getObjectMapper().convertValue(data, typeEnum.getClassType()));
+
+                    // fix: getDeviceSDK抛出异常导致在设备未注册的情况下报osd时产生大量日志 witcom@2023.09.22
+                    //GatewayManager gateway = SDKManager.getDeviceSDK(response.getGateway());
+                    return SDKManager.findDeviceSDK(response.getGateway())
+                            .map(gateway-> {
+
+                                OsdDeviceTypeEnum typeEnum = OsdDeviceTypeEnum.find(gateway.getType(), response.getFrom().equals(response.getGateway()));
+                                Map<String, Object> data = (Map<String, Object>) response.getData();
+                                if (!typeEnum.isGateway()) {
+                                    List payloadData = (List) data.getOrDefault(PayloadModelEnum.PAYLOAD_KEY, new ArrayList<>());
+                                    PayloadModelEnum.getAllIndexWithPosition().stream().filter(data::containsKey)
+                                            .map(data::get).forEach(payloadData::add);
+                                    data.put(PayloadModelEnum.PAYLOAD_KEY, payloadData);
+                                }
+                                return response.setData(Common.getObjectMapper().convertValue(data, typeEnum.getClassType()));
+                            })
+                            .orElse(null);
                 })
+                .<TopicOsdRequest>filter(Objects::nonNull)
                 .<TopicOsdRequest, OsdDeviceTypeEnum>route(response -> OsdDeviceTypeEnum.find(response.getData().getClass()),
-                        mapping -> Arrays.stream(OsdDeviceTypeEnum.values()).forEach(key -> mapping.channelMapping(key, key.getChannelName())))
+                        mapping -> Arrays.stream(OsdDeviceTypeEnum.values())
+                                .forEach(key -> mapping.channelMapping(key, key.getChannelName())))
                 .get();
     }