Browse Source

fix: SdkManager改接口,由客户实现gateway管理策略

feat: 提供LocalCacheSDKManager默认实现
pull/42/head
Vincent 1 year ago
parent
commit
a79449a8a4
  1. 6
      src/main/java/com/dji/sample/component/ApplicationBootInitial.java
  2. 3
      src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java
  3. 3
      src/main/java/com/dji/sample/control/service/impl/DrcServiceImpl.java
  4. 3
      src/main/java/com/dji/sample/manage/service/impl/DeviceLogsServiceImpl.java
  5. 3
      src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java
  6. 3
      src/main/java/com/dji/sample/manage/service/impl/LiveStreamServiceImpl.java
  7. 3
      src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java
  8. 3
      src/main/java/com/dji/sample/wayline/service/impl/FlightTaskServiceImpl.java
  9. 65
      src/main/java/com/dji/sdk/common/LocalCacheSDKManager.java
  10. 19
      src/main/java/com/dji/sdk/common/SDKManager.java
  11. 8
      src/main/java/com/dji/sdk/config/DefaultBeanConfiguration.java
  12. 5
      src/main/java/com/dji/sdk/mqtt/osd/OsdRouter.java
  13. 7
      src/main/java/com/dji/sdk/mqtt/osd/OsdSubscribe.java
  14. 10
      src/main/java/com/dji/sdk/mqtt/state/StateRouter.java
  15. 7
      src/main/java/com/dji/sdk/mqtt/state/StateSubscribe.java
  16. 7
      src/main/java/com/dji/sdk/mqtt/status/StatusSubscribe.java

6
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.boot.CommandLineRunner;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Optional; import java.util.Optional;
/** /**
@ -27,6 +28,9 @@ public class ApplicationBootInitial implements CommandLineRunner {
@Autowired @Autowired
private IDeviceRedisService deviceRedisService; private IDeviceRedisService deviceRedisService;
@Resource
SDKManager sdkManager;
/** /**
* Subscribe to the devices that exist in the redis when the program starts, * 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. * 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) .map(Optional::get)
.filter(device -> DeviceDomainEnum.DRONE != device.getDomain()) .filter(device -> DeviceDomainEnum.DRONE != device.getDomain())
.forEach(device -> deviceService.subDeviceOnlineSubscribeTopic( .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(), device.getType(), device.getSubType(), device.getThingVersion(),
deviceRedisService.getDeviceOnline(device.getChildDeviceSn()).map(DeviceDTO::getThingVersion).orElse(null)))); deviceRedisService.getDeviceOnline(device.getChildDeviceSn()).map(DeviceDTO::getThingVersion).orElse(null))));

3
src/main/java/com/dji/sample/control/service/impl/ControlServiceImpl.java

@ -68,6 +68,9 @@ public class ControlServiceImpl implements IControlService {
@Qualifier("SDKWaylineService") @Qualifier("SDKWaylineService")
private AbstractWaylineService abstractWaylineService; private AbstractWaylineService abstractWaylineService;
@Autowired
SDKManager SDKManager;
private RemoteDebugHandler checkDebugCondition(String sn, RemoteDebugParam param, RemoteDebugMethodEnum controlMethodEnum) { private RemoteDebugHandler checkDebugCondition(String sn, RemoteDebugParam param, RemoteDebugMethodEnum controlMethodEnum) {
RemoteDebugHandler handler = Objects.nonNull(controlMethodEnum.getClazz()) ? RemoteDebugHandler handler = Objects.nonNull(controlMethodEnum.getClazz()) ?
mapper.convertValue(Objects.nonNull(param) ? param : new Object(), controlMethodEnum.getClazz()) mapper.convertValue(Objects.nonNull(param) ? param : new Object(), controlMethodEnum.getClazz())

3
src/main/java/com/dji/sample/control/service/impl/DrcServiceImpl.java

@ -84,6 +84,9 @@ public class DrcServiceImpl implements IDrcService {
@Autowired @Autowired
private AbstractControlService abstractControlService; private AbstractControlService abstractControlService;
@Autowired
SDKManager SDKManager;
@Override @Override
public void setDrcModeInRedis(String dockSn, String clientId) { public void setDrcModeInRedis(String dockSn, String clientId) {
RedisOpsUtils.setWithExpire(RedisConst.DRC_PREFIX + dockSn, clientId, RedisConst.DRC_MODE_ALIVE_SECOND); RedisOpsUtils.setWithExpire(RedisConst.DRC_PREFIX + dockSn, clientId, RedisConst.DRC_MODE_ALIVE_SECOND);

3
src/main/java/com/dji/sample/manage/service/impl/DeviceLogsServiceImpl.java

@ -85,6 +85,9 @@ public class DeviceLogsServiceImpl extends AbstractLogService implements IDevice
@Autowired @Autowired
private AbstractLogService abstractLogService; private AbstractLogService abstractLogService;
@Autowired
SDKManager SDKManager;
@Override @Override
public PaginationData<DeviceLogsDTO> getUploadedLogs(String deviceSn, DeviceLogsQueryParam param) { public PaginationData<DeviceLogsDTO> getUploadedLogs(String deviceSn, DeviceLogsQueryParam param) {
LambdaQueryWrapper<DeviceLogsEntity> queryWrapper = new LambdaQueryWrapper<DeviceLogsEntity>() LambdaQueryWrapper<DeviceLogsEntity> queryWrapper = new LambdaQueryWrapper<DeviceLogsEntity>()

3
src/main/java/com/dji/sample/manage/service/impl/DeviceServiceImpl.java

@ -124,6 +124,9 @@ public class DeviceServiceImpl implements IDeviceService {
@Autowired @Autowired
private AbstractFirmwareService abstractFirmwareService; private AbstractFirmwareService abstractFirmwareService;
@Autowired
SDKManager SDKManager;
@Override @Override
public void subDeviceOffline(String deviceSn) { public void subDeviceOffline(String deviceSn) {
// If no information about this device exists in the cache, the drone is considered to be offline. // If no information about this device exists in the cache, the drone is considered to be offline.

3
src/main/java/com/dji/sample/manage/service/impl/LiveStreamServiceImpl.java

@ -46,6 +46,9 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
@Autowired @Autowired
private AbstractLivestreamService abstractLivestreamService; private AbstractLivestreamService abstractLivestreamService;
@Autowired
SDKManager SDKManager;
@Override @Override
public List<CapacityDeviceDTO> getLiveCapacity(String workspaceId) { public List<CapacityDeviceDTO> getLiveCapacity(String workspaceId) {

3
src/main/java/com/dji/sample/manage/service/impl/SDKDeviceService.java

@ -57,6 +57,9 @@ public class SDKDeviceService extends AbstractDeviceService {
@Autowired @Autowired
private IDevicePayloadService devicePayloadService; private IDevicePayloadService devicePayloadService;
@Autowired
SDKManager SDKManager;
@Override @Override
public TopicStatusResponse<MqttReply> updateTopoOnline(TopicStatusRequest<UpdateTopo> request, MessageHeaders headers) { public TopicStatusResponse<MqttReply> updateTopoOnline(TopicStatusRequest<UpdateTopo> request, MessageHeaders headers) {
UpdateTopoSubDevice updateTopoSubDevice = request.getData().getSubDevices().get(0); UpdateTopoSubDevice updateTopoSubDevice = request.getData().getSubDevices().get(0);

3
src/main/java/com/dji/sample/wayline/service/impl/FlightTaskServiceImpl.java

@ -62,6 +62,9 @@ public class FlightTaskServiceImpl extends AbstractWaylineService implements IFl
@Autowired @Autowired
private ObjectMapper mapper; private ObjectMapper mapper;
@Autowired
SDKManager SDKManager;
@Autowired @Autowired
private IWebSocketMessageService websocketMessageService; private IWebSocketMessageService websocketMessageService;

65
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<String, GatewayManager> 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<GatewayManager> 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);
}
}

19
src/main/java/com/dji/sdk/common/SDKManager.java

@ -15,9 +15,24 @@ import java.util.concurrent.ConcurrentHashMap;
* @author sean * @author sean
* @version 1.7 * @version 1.7
* @date 2023/5/19 * @date 2023/5/19
*
* fix: 改接口,由客户决定Gateway管理策略 witcom@2023.09.25
*/ */
public class SDKManager { public interface SDKManager {
GatewayManager getDeviceSDK(String gatewaySn);
Optional<GatewayManager> 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() { private SDKManager() {
} }
@ -56,4 +71,6 @@ public class SDKManager {
public static void logoutDevice(String gatewaySn) { public static void logoutDevice(String gatewaySn) {
SDK_MAP.remove(gatewaySn); SDK_MAP.remove(gatewaySn);
} }
*/
} }

8
src/main/java/com/dji/sdk/config/DefaultBeanConfiguration.java

@ -8,7 +8,9 @@
package com.dji.sdk.config; package com.dji.sdk.config;
import com.dji.sdk.common.JDKLockBarrierImpl; import com.dji.sdk.common.JDKLockBarrierImpl;
import com.dji.sdk.common.LocalCacheSDKManager;
import com.dji.sdk.common.PublishBarrier; import com.dji.sdk.common.PublishBarrier;
import com.dji.sdk.common.SDKManager;
import com.dji.sdk.mqtt.ChanBarrierAdapter; import com.dji.sdk.mqtt.ChanBarrierAdapter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
@ -17,6 +19,12 @@ import org.springframework.context.annotation.Configuration;
@Configuration @Configuration
public class DefaultBeanConfiguration { public class DefaultBeanConfiguration {
@Bean
@ConditionalOnMissingBean(SDKManager.class)
public SDKManager localCacheSDKManager(){
return new LocalCacheSDKManager();
}
/** /**
* 使用者可以自定义PublishBarrier的实现默认采用Chan实现 * 使用者可以自定义PublishBarrier的实现默认采用Chan实现
*/ */

5
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.integration.mqtt.support.MqttHeaders;
import org.springframework.messaging.Message; import org.springframework.messaging.Message;
import javax.annotation.Resource;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
@ -29,7 +30,7 @@ import static com.dji.sdk.mqtt.TopicConst.*;
public class OsdRouter { public class OsdRouter {
@Bean @Bean
public IntegrationFlow osdRouterFlow() { public IntegrationFlow osdRouterFlow(SDKManager sdkManager) {
return IntegrationFlows return IntegrationFlows
.from(ChannelName.INBOUND_OSD) .from(ChannelName.INBOUND_OSD)
.transform(Message.class, source -> { .transform(Message.class, source -> {
@ -45,7 +46,7 @@ public class OsdRouter {
// fix: getDeviceSDK抛出异常导致在设备未注册的情况下报osd时产生大量日志 witcom@2023.09.22 // fix: getDeviceSDK抛出异常导致在设备未注册的情况下报osd时产生大量日志 witcom@2023.09.22
//GatewayManager gateway = SDKManager.getDeviceSDK(response.getGateway()); //GatewayManager gateway = SDKManager.getDeviceSDK(response.getGateway());
return SDKManager.findDeviceSDK(response.getGateway()) return sdkManager.findDeviceSDK(response.getGateway())
.map(gateway-> { .map(gateway-> {
OsdDeviceTypeEnum typeEnum = OsdDeviceTypeEnum.find(gateway.getType(), response.getFrom().equals(response.getGateway())); OsdDeviceTypeEnum typeEnum = OsdDeviceTypeEnum.find(gateway.getType(), response.getFrom().equals(response.getGateway()));

7
src/main/java/com/dji/sdk/mqtt/osd/OsdSubscribe.java

@ -22,8 +22,11 @@ public class OsdSubscribe {
@Resource @Resource
private IMqttTopicService topicService; private IMqttTopicService topicService;
@Resource
SDKManager sdkManager;
public void subscribe(GatewayManager gateway, boolean unsubscribeSubDevice) { public void subscribe(GatewayManager gateway, boolean unsubscribeSubDevice) {
SDKManager.registerDevice(gateway); sdkManager.registerDevice(gateway);
topicService.subscribe(String.format(TOPIC, gateway.getGatewaySn())); topicService.subscribe(String.format(TOPIC, gateway.getGatewaySn()));
if (unsubscribeSubDevice) { if (unsubscribeSubDevice) {
topicService.unsubscribe(String.format(TOPIC, gateway.getDroneSn())); topicService.unsubscribe(String.format(TOPIC, gateway.getDroneSn()));
@ -35,7 +38,7 @@ public class OsdSubscribe {
} }
public void unsubscribe(GatewayManager gateway) { public void unsubscribe(GatewayManager gateway) {
SDKManager.logoutDevice(gateway.getGatewaySn()); sdkManager.logoutDevice(gateway.getGatewaySn());
topicService.unsubscribe(String.format(TOPIC, gateway.getGatewaySn())); topicService.unsubscribe(String.format(TOPIC, gateway.getGatewaySn()));
if (null != gateway.getDroneSn()) { if (null != gateway.getDroneSn()) {
topicService.unsubscribe(String.format(TOPIC, gateway.getDroneSn())); topicService.unsubscribe(String.format(TOPIC, gateway.getDroneSn()));

10
src/main/java/com/dji/sdk/mqtt/state/StateRouter.java

@ -1,6 +1,7 @@
package com.dji.sdk.mqtt.state; package com.dji.sdk.mqtt.state;
import com.dji.sdk.common.Common; import com.dji.sdk.common.Common;
import com.dji.sdk.common.GatewayTypeEnum;
import com.dji.sdk.common.SDKManager; import com.dji.sdk.common.SDKManager;
import com.dji.sdk.exception.CloudSDKErrorEnum; import com.dji.sdk.exception.CloudSDKErrorEnum;
import com.dji.sdk.exception.CloudSDKException; 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.integration.mqtt.support.MqttHeaders;
import org.springframework.messaging.Message; import org.springframework.messaging.Message;
import javax.annotation.Resource;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Map; import java.util.Map;
@ -29,6 +31,9 @@ import static com.dji.sdk.mqtt.TopicConst.*;
@Configuration @Configuration
public class StateRouter { public class StateRouter {
@Resource
SDKManager sdkManager;
@Bean @Bean
public IntegrationFlow stateDataRouterFlow() { public IntegrationFlow stateDataRouterFlow() {
return IntegrationFlows return IntegrationFlows
@ -51,13 +56,14 @@ public class StateRouter {
private Class getTypeReference(String gatewaySn, Object data) { private Class getTypeReference(String gatewaySn, Object data) {
Set<String> keys = ((Map<String, Object>) data).keySet(); Set<String> keys = ((Map<String, Object>) data).keySet();
switch (SDKManager.getDeviceSDK(gatewaySn).getType()) { GatewayTypeEnum type = sdkManager.getDeviceSDK(gatewaySn).getType();
switch (type) {
case RC: case RC:
return RcStateDataKeyEnum.find(keys).getClassType(); return RcStateDataKeyEnum.find(keys).getClassType();
case DOCK: case DOCK:
return DockStateDataKeyEnum.find(keys).getClassType(); return DockStateDataKeyEnum.find(keys).getClassType();
default: default:
throw new CloudSDKException(CloudSDKErrorEnum.WRONG_DATA, "Unexpected value: " + SDKManager.getDeviceSDK(gatewaySn).getType()); throw new CloudSDKException(CloudSDKErrorEnum.WRONG_DATA, "Unexpected value: " + type);
} }
} }
} }

7
src/main/java/com/dji/sdk/mqtt/state/StateSubscribe.java

@ -20,10 +20,13 @@ public class StateSubscribe {
@Resource @Resource
private IMqttTopicService topicService; private IMqttTopicService topicService;
@Resource
SDKManager sdkManager;
public static final String TOPIC = TopicConst.THING_MODEL_PRE + TopicConst.PRODUCT + "%s" + TopicConst.STATE_SUF; public static final String TOPIC = TopicConst.THING_MODEL_PRE + TopicConst.PRODUCT + "%s" + TopicConst.STATE_SUF;
public void subscribe(GatewayManager gateway, boolean unsubscribeSubDevice) { public void subscribe(GatewayManager gateway, boolean unsubscribeSubDevice) {
SDKManager.registerDevice(gateway); sdkManager.registerDevice(gateway);
topicService.subscribe(String.format(TOPIC, gateway.getGatewaySn())); topicService.subscribe(String.format(TOPIC, gateway.getGatewaySn()));
if (unsubscribeSubDevice) { if (unsubscribeSubDevice) {
topicService.unsubscribe(String.format(TOPIC, gateway.getDroneSn())); topicService.unsubscribe(String.format(TOPIC, gateway.getDroneSn()));
@ -35,7 +38,7 @@ public class StateSubscribe {
} }
public void unsubscribe(GatewayManager gateway) { public void unsubscribe(GatewayManager gateway) {
SDKManager.logoutDevice(gateway.getGatewaySn()); sdkManager.logoutDevice(gateway.getGatewaySn());
topicService.unsubscribe(String.format(TOPIC, gateway.getGatewaySn())); topicService.unsubscribe(String.format(TOPIC, gateway.getGatewaySn()));
if (null != gateway.getDroneSn()) { if (null != gateway.getDroneSn()) {
topicService.unsubscribe(String.format(TOPIC, gateway.getDroneSn())); topicService.unsubscribe(String.format(TOPIC, gateway.getDroneSn()));

7
src/main/java/com/dji/sdk/mqtt/status/StatusSubscribe.java

@ -22,8 +22,11 @@ public class StatusSubscribe {
@Resource @Resource
private IMqttTopicService topicService; private IMqttTopicService topicService;
@Resource
SDKManager sdkManager;
public void subscribe(GatewayManager gateway) { public void subscribe(GatewayManager gateway) {
SDKManager.registerDevice(gateway); sdkManager.registerDevice(gateway);
topicService.subscribe(String.format(TOPIC, gateway.getGatewaySn())); topicService.subscribe(String.format(TOPIC, gateway.getGatewaySn()));
} }
@ -32,7 +35,7 @@ public class StatusSubscribe {
} }
public void unsubscribe(GatewayManager gateway) { public void unsubscribe(GatewayManager gateway) {
SDKManager.logoutDevice(gateway.getGatewaySn()); sdkManager.logoutDevice(gateway.getGatewaySn());
topicService.unsubscribe(String.format(TOPIC, gateway.getGatewaySn())); topicService.unsubscribe(String.format(TOPIC, gateway.getGatewaySn()));
} }

Loading…
Cancel
Save