diff --git a/src/main/java/com/dji/sample/component/ApplicationBootInitial.java b/src/main/java/com/dji/sample/component/ApplicationBootInitial.java index 16a691c..5b1573a 100644 --- a/src/main/java/com/dji/sample/component/ApplicationBootInitial.java +++ b/src/main/java/com/dji/sample/component/ApplicationBootInitial.java @@ -11,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; +import javax.annotation.Resource; import java.util.Optional; /** @@ -27,6 +28,9 @@ public class ApplicationBootInitial implements CommandLineRunner { @Autowired private IDeviceRedisService deviceRedisService; + @Resource + SDKManager sdkManager; + /** * Subscribe to the devices that exist in the redis when the program starts, * to prevent the data from being different from the pilot side due to program interruptions. @@ -44,7 +48,7 @@ public class ApplicationBootInitial implements CommandLineRunner { .map(Optional::get) .filter(device -> DeviceDomainEnum.DRONE != device.getDomain()) .forEach(device -> deviceService.subDeviceOnlineSubscribeTopic( - SDKManager.registerDevice(device.getDeviceSn(), device.getChildDeviceSn(), device.getDomain(), + sdkManager.registerDevice(device.getDeviceSn(), device.getChildDeviceSn(), device.getDomain(), device.getType(), device.getSubType(), device.getThingVersion(), deviceRedisService.getDeviceOnline(device.getChildDeviceSn()).map(DeviceDTO::getThingVersion).orElse(null)))); diff --git a/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java b/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java index 530729e..4bd5b0f 100644 --- a/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java +++ b/src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java @@ -68,6 +68,9 @@ public class ControlServiceImpl implements IControlService { @Qualifier("SDKWaylineService") private AbstractWaylineService abstractWaylineService; + @Autowired + SDKManager SDKManager; + private RemoteDebugHandler checkDebugCondition(String sn, RemoteDebugParam param, RemoteDebugMethodEnum controlMethodEnum) { RemoteDebugHandler handler = Objects.nonNull(controlMethodEnum.getClazz()) ? mapper.convertValue(Objects.nonNull(param) ? param : new Object(), controlMethodEnum.getClazz()) diff --git a/src/main/java/com/dji/sample/control/service/impl/DrcServiceImpl.java b/src/main/java/com/dji/sample/control/service/impl/DrcServiceImpl.java index 7aa86f3..29a61ec 100644 --- a/src/main/java/com/dji/sample/control/service/impl/DrcServiceImpl.java +++ b/src/main/java/com/dji/sample/control/service/impl/DrcServiceImpl.java @@ -84,6 +84,9 @@ public class DrcServiceImpl implements IDrcService { @Autowired private AbstractControlService abstractControlService; + @Autowired + SDKManager SDKManager; + @Override public void setDrcModeInRedis(String dockSn, String clientId) { RedisOpsUtils.setWithExpire(RedisConst.DRC_PREFIX + dockSn, clientId, RedisConst.DRC_MODE_ALIVE_SECOND); diff --git a/src/main/java/com/dji/sample/manage/service/impl/DeviceLogsServiceImpl.java b/src/main/java/com/dji/sample/manage/service/impl/DeviceLogsServiceImpl.java index 799de27..8acb72e 100644 --- a/src/main/java/com/dji/sample/manage/service/impl/DeviceLogsServiceImpl.java +++ b/src/main/java/com/dji/sample/manage/service/impl/DeviceLogsServiceImpl.java @@ -85,6 +85,9 @@ public class DeviceLogsServiceImpl extends AbstractLogService implements IDevice @Autowired private AbstractLogService abstractLogService; + @Autowired + SDKManager SDKManager; + @Override public PaginationData getUploadedLogs(String deviceSn, DeviceLogsQueryParam param) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() diff --git a/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java b/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java index f5bbe95..018ab0b 100644 --- a/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java +++ b/src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java @@ -124,6 +124,9 @@ public class DeviceServiceImpl implements IDeviceService { @Autowired private AbstractFirmwareService abstractFirmwareService; + @Autowired + SDKManager SDKManager; + @Override public void subDeviceOffline(String deviceSn) { // If no information about this device exists in the cache, the drone is considered to be offline. diff --git a/src/main/java/com/dji/sample/manage/service/impl/LiveStreamServiceImpl.java b/src/main/java/com/dji/sample/manage/service/impl/LiveStreamServiceImpl.java index 2b1f590..13d14ff 100644 --- a/src/main/java/com/dji/sample/manage/service/impl/LiveStreamServiceImpl.java +++ b/src/main/java/com/dji/sample/manage/service/impl/LiveStreamServiceImpl.java @@ -46,6 +46,9 @@ public class LiveStreamServiceImpl implements ILiveStreamService { @Autowired private AbstractLivestreamService abstractLivestreamService; + @Autowired + SDKManager SDKManager; + @Override public List getLiveCapacity(String workspaceId) { diff --git a/src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java b/src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java index 81db422..541212d 100644 --- a/src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java +++ b/src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java @@ -57,6 +57,9 @@ public class SDKDeviceService extends AbstractDeviceService { @Autowired private IDevicePayloadService devicePayloadService; + @Autowired + SDKManager SDKManager; + @Override public TopicStatusResponse updateTopoOnline(TopicStatusRequest request, MessageHeaders headers) { UpdateTopoSubDevice updateTopoSubDevice = request.getData().getSubDevices().get(0); diff --git a/src/main/java/com/dji/sample/wayline/service/impl/FlightTaskServiceImpl.java b/src/main/java/com/dji/sample/wayline/service/impl/FlightTaskServiceImpl.java index 938cd80..a7589e6 100644 --- a/src/main/java/com/dji/sample/wayline/service/impl/FlightTaskServiceImpl.java +++ b/src/main/java/com/dji/sample/wayline/service/impl/FlightTaskServiceImpl.java @@ -62,6 +62,9 @@ public class FlightTaskServiceImpl extends AbstractWaylineService implements IFl @Autowired private ObjectMapper mapper; + @Autowired + SDKManager SDKManager; + @Autowired private IWebSocketMessageService websocketMessageService; diff --git a/src/main/java/com/dji/sdk/common/LocalCacheSDKManager.java b/src/main/java/com/dji/sdk/common/LocalCacheSDKManager.java new file mode 100644 index 0000000..5bf9ff5 --- /dev/null +++ b/src/main/java/com/dji/sdk/common/LocalCacheSDKManager.java @@ -0,0 +1,65 @@ +/************************************************* + * @copyright 2017 Flision Corporation Inc. + * @author: Vincent Chan @ Canton + * @date: 2023年09月25日 + * @version: 1.0.0 + * @description: + **************************************************/ +package com.dji.sdk.common; + +import com.dji.sdk.cloudapi.device.DeviceDomainEnum; +import com.dji.sdk.cloudapi.device.DeviceEnum; +import com.dji.sdk.cloudapi.device.DeviceSubTypeEnum; +import com.dji.sdk.cloudapi.device.DeviceTypeEnum; +import com.dji.sdk.exception.CloudSDKErrorEnum; +import com.dji.sdk.exception.CloudSDKException; +import org.springframework.stereotype.Component; + +import java.util.Objects; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; + +public class LocalCacheSDKManager implements SDKManager{ + + final ConcurrentHashMap SDK_MAP = new ConcurrentHashMap<>(16); + + + @Override + public GatewayManager getDeviceSDK(String gatewaySn) { + if (SDK_MAP.containsKey(gatewaySn)) { + return SDK_MAP.get(gatewaySn); + } + throw new CloudSDKException(CloudSDKErrorEnum.NOT_REGISTERED, + "The device has not been registered, please call the 'SDKManager.registerDevice()' method to register the device first."); + } + + @Override + public Optional findDeviceSDK(String gatewaySn) { + if(SDK_MAP.containsKey(gatewaySn)){ + return Optional.of(SDK_MAP.get(gatewaySn)); + }else { + return Optional.empty(); + } + } + + @Override + public 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); + } + + @Override + public GatewayManager registerDevice(String gatewaySn, String droneSn, GatewayTypeEnum type, String gatewayThingVersion, String droneThingVersion) { + return registerDevice(new GatewayManager(Objects.requireNonNull(gatewaySn), droneSn, type, gatewayThingVersion, droneThingVersion)); + } + + @Override + public GatewayManager registerDevice(GatewayManager gateway) { + SDK_MAP.put(gateway.getGatewaySn(), gateway); + return gateway; + } + + @Override + public void logoutDevice(String gatewaySn) { + SDK_MAP.remove(gatewaySn); + } +} diff --git a/src/main/java/com/dji/sdk/common/SDKManager.java b/src/main/java/com/dji/sdk/common/SDKManager.java index 684f647..61b4b3f 100644 --- a/src/main/java/com/dji/sdk/common/SDKManager.java +++ b/src/main/java/com/dji/sdk/common/SDKManager.java @@ -15,9 +15,24 @@ import java.util.concurrent.ConcurrentHashMap; * @author sean * @version 1.7 * @date 2023/5/19 + * + * fix: 改接口,由客户决定Gateway管理策略 witcom@2023.09.25 */ -public class SDKManager { +public interface SDKManager { + GatewayManager getDeviceSDK(String gatewaySn); + + Optional findDeviceSDK(String gatewaySn); + GatewayManager registerDevice(String gatewaySn, String droneSn, + DeviceDomainEnum domain, DeviceTypeEnum type, DeviceSubTypeEnum subType, String gatewayThingVersion, String droneThingVersion); + + GatewayManager registerDevice(String gatewaySn, String droneSn, GatewayTypeEnum type, String gatewayThingVersion, String droneThingVersion); + + GatewayManager registerDevice(GatewayManager gateway); + + void logoutDevice(String gatewaySn); + +/* private SDKManager() { } @@ -56,4 +71,6 @@ public class SDKManager { public static void logoutDevice(String gatewaySn) { SDK_MAP.remove(gatewaySn); } + + */ } diff --git a/src/main/java/com/dji/sdk/config/DefaultBeanConfiguration.java b/src/main/java/com/dji/sdk/config/DefaultBeanConfiguration.java index 853201d..3e03b0c 100644 --- a/src/main/java/com/dji/sdk/config/DefaultBeanConfiguration.java +++ b/src/main/java/com/dji/sdk/config/DefaultBeanConfiguration.java @@ -8,7 +8,9 @@ package com.dji.sdk.config; import com.dji.sdk.common.JDKLockBarrierImpl; +import com.dji.sdk.common.LocalCacheSDKManager; import com.dji.sdk.common.PublishBarrier; +import com.dji.sdk.common.SDKManager; import com.dji.sdk.mqtt.ChanBarrierAdapter; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; @@ -17,6 +19,12 @@ import org.springframework.context.annotation.Configuration; @Configuration public class DefaultBeanConfiguration { + @Bean + @ConditionalOnMissingBean(SDKManager.class) + public SDKManager localCacheSDKManager(){ + return new LocalCacheSDKManager(); + } + /** * 使用者可以自定义PublishBarrier的实现,默认采用Chan实现 */ 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 6fbdde0..814dfa2 100644 --- a/src/main/java/com/dji/sdk/mqtt/osd/OsdRouter.java +++ b/src/main/java/com/dji/sdk/mqtt/osd/OsdRouter.java @@ -14,6 +14,7 @@ import org.springframework.integration.dsl.IntegrationFlows; import org.springframework.integration.mqtt.support.MqttHeaders; import org.springframework.messaging.Message; +import javax.annotation.Resource; import java.io.IOException; import java.util.*; @@ -29,7 +30,7 @@ import static com.dji.sdk.mqtt.TopicConst.*; public class OsdRouter { @Bean - public IntegrationFlow osdRouterFlow() { + public IntegrationFlow osdRouterFlow(SDKManager sdkManager) { return IntegrationFlows .from(ChannelName.INBOUND_OSD) .transform(Message.class, source -> { @@ -45,7 +46,7 @@ public class OsdRouter { // fix: getDeviceSDK抛出异常导致在设备未注册的情况下报osd时产生大量日志 witcom@2023.09.22 //GatewayManager gateway = SDKManager.getDeviceSDK(response.getGateway()); - return SDKManager.findDeviceSDK(response.getGateway()) + return sdkManager.findDeviceSDK(response.getGateway()) .map(gateway-> { OsdDeviceTypeEnum typeEnum = OsdDeviceTypeEnum.find(gateway.getType(), response.getFrom().equals(response.getGateway())); diff --git a/src/main/java/com/dji/sdk/mqtt/osd/OsdSubscribe.java b/src/main/java/com/dji/sdk/mqtt/osd/OsdSubscribe.java index bc359b2..ca433c6 100644 --- a/src/main/java/com/dji/sdk/mqtt/osd/OsdSubscribe.java +++ b/src/main/java/com/dji/sdk/mqtt/osd/OsdSubscribe.java @@ -22,8 +22,11 @@ public class OsdSubscribe { @Resource private IMqttTopicService topicService; + @Resource + SDKManager sdkManager; + public void subscribe(GatewayManager gateway, boolean unsubscribeSubDevice) { - SDKManager.registerDevice(gateway); + sdkManager.registerDevice(gateway); topicService.subscribe(String.format(TOPIC, gateway.getGatewaySn())); if (unsubscribeSubDevice) { topicService.unsubscribe(String.format(TOPIC, gateway.getDroneSn())); @@ -35,7 +38,7 @@ public class OsdSubscribe { } public void unsubscribe(GatewayManager gateway) { - SDKManager.logoutDevice(gateway.getGatewaySn()); + sdkManager.logoutDevice(gateway.getGatewaySn()); topicService.unsubscribe(String.format(TOPIC, gateway.getGatewaySn())); if (null != gateway.getDroneSn()) { topicService.unsubscribe(String.format(TOPIC, gateway.getDroneSn())); diff --git a/src/main/java/com/dji/sdk/mqtt/state/StateRouter.java b/src/main/java/com/dji/sdk/mqtt/state/StateRouter.java index b26c00e..30ccfbb 100644 --- a/src/main/java/com/dji/sdk/mqtt/state/StateRouter.java +++ b/src/main/java/com/dji/sdk/mqtt/state/StateRouter.java @@ -1,6 +1,7 @@ package com.dji.sdk.mqtt.state; import com.dji.sdk.common.Common; +import com.dji.sdk.common.GatewayTypeEnum; import com.dji.sdk.common.SDKManager; import com.dji.sdk.exception.CloudSDKErrorEnum; import com.dji.sdk.exception.CloudSDKException; @@ -13,6 +14,7 @@ import org.springframework.integration.dsl.IntegrationFlows; import org.springframework.integration.mqtt.support.MqttHeaders; import org.springframework.messaging.Message; +import javax.annotation.Resource; import java.io.IOException; import java.util.Arrays; import java.util.Map; @@ -29,6 +31,9 @@ import static com.dji.sdk.mqtt.TopicConst.*; @Configuration public class StateRouter { + @Resource + SDKManager sdkManager; + @Bean public IntegrationFlow stateDataRouterFlow() { return IntegrationFlows @@ -51,13 +56,14 @@ public class StateRouter { private Class getTypeReference(String gatewaySn, Object data) { Set keys = ((Map) data).keySet(); - switch (SDKManager.getDeviceSDK(gatewaySn).getType()) { + GatewayTypeEnum type = sdkManager.getDeviceSDK(gatewaySn).getType(); + switch (type) { case RC: return RcStateDataKeyEnum.find(keys).getClassType(); case DOCK: return DockStateDataKeyEnum.find(keys).getClassType(); default: - throw new CloudSDKException(CloudSDKErrorEnum.WRONG_DATA, "Unexpected value: " + SDKManager.getDeviceSDK(gatewaySn).getType()); + throw new CloudSDKException(CloudSDKErrorEnum.WRONG_DATA, "Unexpected value: " + type); } } } \ No newline at end of file diff --git a/src/main/java/com/dji/sdk/mqtt/state/StateSubscribe.java b/src/main/java/com/dji/sdk/mqtt/state/StateSubscribe.java index 7a1a746..cf8ec17 100644 --- a/src/main/java/com/dji/sdk/mqtt/state/StateSubscribe.java +++ b/src/main/java/com/dji/sdk/mqtt/state/StateSubscribe.java @@ -20,10 +20,13 @@ public class StateSubscribe { @Resource private IMqttTopicService topicService; + @Resource + SDKManager sdkManager; + public static final String TOPIC = TopicConst.THING_MODEL_PRE + TopicConst.PRODUCT + "%s" + TopicConst.STATE_SUF; public void subscribe(GatewayManager gateway, boolean unsubscribeSubDevice) { - SDKManager.registerDevice(gateway); + sdkManager.registerDevice(gateway); topicService.subscribe(String.format(TOPIC, gateway.getGatewaySn())); if (unsubscribeSubDevice) { topicService.unsubscribe(String.format(TOPIC, gateway.getDroneSn())); @@ -35,7 +38,7 @@ public class StateSubscribe { } public void unsubscribe(GatewayManager gateway) { - SDKManager.logoutDevice(gateway.getGatewaySn()); + sdkManager.logoutDevice(gateway.getGatewaySn()); topicService.unsubscribe(String.format(TOPIC, gateway.getGatewaySn())); if (null != gateway.getDroneSn()) { topicService.unsubscribe(String.format(TOPIC, gateway.getDroneSn())); diff --git a/src/main/java/com/dji/sdk/mqtt/status/StatusSubscribe.java b/src/main/java/com/dji/sdk/mqtt/status/StatusSubscribe.java index 2412067..178e70d 100644 --- a/src/main/java/com/dji/sdk/mqtt/status/StatusSubscribe.java +++ b/src/main/java/com/dji/sdk/mqtt/status/StatusSubscribe.java @@ -22,8 +22,11 @@ public class StatusSubscribe { @Resource private IMqttTopicService topicService; + @Resource + SDKManager sdkManager; + public void subscribe(GatewayManager gateway) { - SDKManager.registerDevice(gateway); + sdkManager.registerDevice(gateway); topicService.subscribe(String.format(TOPIC, gateway.getGatewaySn())); } @@ -32,7 +35,7 @@ public class StatusSubscribe { } public void unsubscribe(GatewayManager gateway) { - SDKManager.logoutDevice(gateway.getGatewaySn()); + sdkManager.logoutDevice(gateway.getGatewaySn()); topicService.unsubscribe(String.format(TOPIC, gateway.getGatewaySn())); }