package com.dji.sample.component; import com.dji.sample.component.redis.RedisConst; import com.dji.sample.component.redis.RedisOpsUtils; import com.dji.sample.manage.model.dto.DeviceDTO; import com.dji.sample.manage.service.IDeviceRedisService; import com.dji.sample.manage.service.IDeviceService; import com.dji.sdk.cloudapi.device.DeviceDomainEnum; import com.dji.sdk.common.SDKManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; import jakarta.annotation.Resource; import java.util.Optional; /** * @author sean.zhou * @date 2021/11/24 * @version 0.1 */ @Component public class ApplicationBootInitial implements CommandLineRunner { @Autowired private IDeviceService deviceService; @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. * @param args * @throws Exception */ @Override public void run(String... args) throws Exception { int start = RedisConst.DEVICE_ONLINE_PREFIX.length(); RedisOpsUtils.getAllKeys(RedisConst.DEVICE_ONLINE_PREFIX + "*") .stream() .map(key -> key.substring(start)) .map(deviceRedisService::getDeviceOnline) .map(Optional::get) .filter(device -> DeviceDomainEnum.DRONE != device.getDomain()) .forEach(device -> deviceService.subDeviceOnlineSubscribeTopic( sdkManager.registerDevice(device.getDeviceSn(), device.getChildDeviceSn(), device.getDomain(), device.getType(), device.getSubType(), device.getThingVersion(), deviceRedisService.getDeviceOnline(device.getChildDeviceSn()).map(DeviceDTO::getThingVersion).orElse(null)))); } }