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; @@ -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 { @@ -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 { @@ -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))));

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

@ -68,6 +68,9 @@ public class ControlServiceImpl implements IControlService { @@ -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())

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

@ -84,6 +84,9 @@ public class DrcServiceImpl implements IDrcService { @@ -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);

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

@ -85,6 +85,9 @@ public class DeviceLogsServiceImpl extends AbstractLogService implements IDevice @@ -85,6 +85,9 @@ public class DeviceLogsServiceImpl extends AbstractLogService implements IDevice
@Autowired
private AbstractLogService abstractLogService;
@Autowired
SDKManager SDKManager;
@Override
public PaginationData<DeviceLogsDTO> getUploadedLogs(String deviceSn, DeviceLogsQueryParam param) {
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 { @@ -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.

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

@ -46,6 +46,9 @@ public class LiveStreamServiceImpl implements ILiveStreamService { @@ -46,6 +46,9 @@ public class LiveStreamServiceImpl implements ILiveStreamService {
@Autowired
private AbstractLivestreamService abstractLivestreamService;
@Autowired
SDKManager SDKManager;
@Override
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 { @@ -57,6 +57,9 @@ public class SDKDeviceService extends AbstractDeviceService {
@Autowired
private IDevicePayloadService devicePayloadService;
@Autowired
SDKManager SDKManager;
@Override
public TopicStatusResponse<MqttReply> updateTopoOnline(TopicStatusRequest<UpdateTopo> request, MessageHeaders headers) {
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 @@ -62,6 +62,9 @@ public class FlightTaskServiceImpl extends AbstractWaylineService implements IFl
@Autowired
private ObjectMapper mapper;
@Autowired
SDKManager SDKManager;
@Autowired
private IWebSocketMessageService websocketMessageService;

65
src/main/java/com/dji/sdk/common/LocalCacheSDKManager.java

@ -0,0 +1,65 @@ @@ -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; @@ -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<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() {
}
@ -56,4 +71,6 @@ public class SDKManager { @@ -56,4 +71,6 @@ public class SDKManager {
public static void logoutDevice(String gatewaySn) {
SDK_MAP.remove(gatewaySn);
}
*/
}

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

@ -8,7 +8,9 @@ @@ -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; @@ -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实现
*/

5
src/main/java/com/dji/sdk/mqtt/osd/OsdRouter.java

@ -14,6 +14,7 @@ import org.springframework.integration.dsl.IntegrationFlows; @@ -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.*; @@ -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 { @@ -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()));

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

@ -22,8 +22,11 @@ public class OsdSubscribe { @@ -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 { @@ -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()));

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

@ -1,6 +1,7 @@ @@ -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; @@ -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.*; @@ -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 { @@ -51,13 +56,14 @@ public class StateRouter {
private Class getTypeReference(String gatewaySn, Object data) {
Set<String> keys = ((Map<String, Object>) 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);
}
}
}

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

@ -20,10 +20,13 @@ public class StateSubscribe { @@ -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 { @@ -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()));

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

@ -22,8 +22,11 @@ public class StatusSubscribe { @@ -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 { @@ -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()));
}

Loading…
Cancel
Save