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 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) .handle((response, headers) -> { - GatewayManager gateway = SDKManager.getDeviceSDK(response.getGateway()); - OsdDeviceTypeEnum typeEnum = OsdDeviceTypeEnum.find(gateway.getType(), response.getFrom().equals(response.getGateway())); - Map data = (Map) 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 data = (Map) 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); }) + .filter(Objects::nonNull) .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(); }