package com.ard.work.device.camera.service;
|
|
import com.ard.work.api.domian.ArdCamera;
|
import com.ard.work.api.domian.ArdChannel;
|
import com.ard.work.api.domian.CameraCmd;
|
import com.ard.work.api.domian.PtzDto;
|
import com.ard.work.device.camera.domain.PtzParamDTO;
|
import com.ard.work.sdk.service.CameraSDKService;
|
import jakarta.annotation.Resource;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.scheduling.annotation.Async;
|
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
import org.springframework.stereotype.Component;
|
import java.util.Arrays;
|
import java.util.HashSet;
|
import java.util.List;
|
import java.util.Set;
|
|
@Slf4j
|
@Component
|
@RequiredArgsConstructor
|
public class PtzDataCollector {
|
|
private final CameraSDKService cameraSDKService;
|
private final PtzCacheManager ptzCacheManager;
|
|
private static final Set<String> EXCLUDE_FACTORY = new HashSet<>(Arrays.asList("7"));
|
private static final String CAMERA_ENABLE = "1";
|
private static final Set<String> SUPPORT_TYPES = new HashSet<>(Arrays.asList("1", "4"));
|
|
@Async("cameraPTZExecutor")
|
public void collectCamera(ArdCamera camera, Set<String> runningCamera) {
|
|
String camId = camera.getId();
|
|
try {
|
if (!isValidCamera(camera)) return;
|
List<ArdChannel> channels = camera.getChannelList();
|
if (channels == null || channels.isEmpty()) return;
|
for (ArdChannel channel : channels) {
|
String key = camId + "_" + channel.getChanNo();
|
PtzParamDTO dto= fetchPtz(camera, channel);
|
if (dto != null) {
|
ptzCacheManager.updatePtzData(key, dto);
|
}
|
}
|
} finally {
|
// ✅ 必须释放(防死锁)
|
runningCamera.remove(camId);
|
}
|
}
|
|
/**
|
* 原始SDK调用(不改)
|
*/
|
private PtzParamDTO fetchPtz(ArdCamera camera, ArdChannel channel) {
|
|
CameraCmd cmd = new CameraCmd();
|
cmd.setCameraId(camera.getId());
|
cmd.setChanNo(channel.getChanNo());
|
|
PtzParamDTO dto = cameraSDKService.getGisInfo(cmd);
|
if (dto == null) return null;
|
|
dto.setCameraId(camera.getId());
|
dto.setChanNo(channel.getChanNo());
|
dto.setLongitude(camera.getLongitude());
|
dto.setLatitude(camera.getLatitude());
|
dto.setAltitude(camera.getAltitude());
|
|
PtzDto ptz = cameraSDKService.getPtz(cmd);
|
if (ptz != null) {
|
if ("4".equals(camera.getType())) {
|
ptz.setP((ptz.getP() + camera.getBaseYaw() + 360) % 360);
|
}
|
dto.setP(ptz.getP());
|
dto.setT(ptz.getT());
|
dto.setZ(ptz.getZ());
|
}
|
|
return dto;
|
}
|
|
private boolean isValidCamera(ArdCamera camera) {
|
return CAMERA_ENABLE.equals(camera.getState())
|
&& !EXCLUDE_FACTORY.contains(camera.getFactory())
|
&& SUPPORT_TYPES.contains(camera.getType());
|
}
|
}
|