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(); }