球机句柄线程不安全,采用线程安全map

焦作-mxbc-北起
LAPTOP-S9HJSOEB\昊天 2 years ago
parent b691cd8cf3
commit 287626e929

@ -43,13 +43,13 @@ public class CameraControlController {
return Result.success();
}
private NetSDKLib.LLong cameraLogin(Integer cameraId){
/*private NetSDKLib.LLong cameraLogin(Integer cameraId){
log.info("相机登录 cameraId:{}",cameraId);
Camera camera = cameraMapper.selectById(cameraId);
Assert.notNull(camera,"球机不存在");
NetSDKLib.LLong lLong = loginControlModule.login(cameraId,camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword());
return lLong;
}
}*/
@PostMapping("/up/{id}")
@ApiOperation(value = "球机控制向上")
@ -314,9 +314,11 @@ public class CameraControlController {
//checkLogin(id);
plcService.cameraVideo(1,LocalDateTime.now().minusSeconds(id),LocalDateTime.now().plusSeconds(3));
plcService.cameraVideo(2,LocalDateTime.now().minusSeconds(id),LocalDateTime.now().plusSeconds(3));
/*String path = PathUtil.createFileName("mp4",id);
String path = PathUtil.createFileName("mp4",id);
String realPath = configProperties.getSavePath().getMp4Path() + path;
TaskDelayExecutor.addMp4DelayTask(id,realPath,LocalDateTime.now().minusMinutes(2),LocalDateTime.now().minusSeconds(7),12000L);*/
TaskDelayExecutor.addMp4DelayTask(id,realPath,LocalDateTime.now().minusMinutes(3),LocalDateTime.now().minusMinutes(2),12000L);
/*
*/
//cameraControlModule.downloadMp4(id,"D:\\work\\"+LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))+".mp4", LocalDateTime.now().minusMinutes(10),LocalDateTime.now().minusMinutes(8));
return Result.success();
}
@ -344,12 +346,12 @@ public class CameraControlController {
} else {
ok = JoywareLoginModuleImpl.connectStatus(CameraConnMap.getConnId(cameraId));
}
if (!ok) {
/* if (!ok) {
{
CameraConnMap.disConn(cameraId);
//CameraConnMap.disConn(cameraId);
cameraService.cameraLogin(camera);
}
}
}*/
}else {
Camera camera = cameraMapper.selectById(cameraId);
cameraService.cameraLogin(camera);

@ -5,6 +5,7 @@ import com.zhehekeji.web.lib.joyware.NetSDKLib;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* camera login handler
@ -15,19 +16,18 @@ public class CameraConnMap {
* key :cameraId
* value: loginId
*/
public static Map<Integer, NetSDKLib.LLong> cameraMap = new HashMap<>();
public static Map.Entry<Integer, NetSDKLib.LLong> cameraMapEntry = new HashMap.SimpleEntry<>(0,null);
public static Map<Integer, NetSDKLib.LLong> cameraMap = new ConcurrentHashMap<>();
/**
* key :cameraId
* value: loginId
*/
public static Map<Integer, Camera> cameraByIdMap = new HashMap<>();
public static Map<Integer, Camera> cameraByIdMap = new ConcurrentHashMap<>();
/**
* key:loginId
* value: cameraId
*/
public static Map<NetSDKLib.LLong,Integer> loginMap = new HashMap<>();
public static Map<NetSDKLib.LLong,Integer> loginMap = new ConcurrentHashMap<>();
public static void conn(Integer cameraId,NetSDKLib.LLong handlerId){
@ -40,10 +40,16 @@ public class CameraConnMap {
synchronized (cameraId.toString().intern()){
NetSDKLib.LLong lLong = cameraMap.get(cameraId);
cameraMap.remove(cameraId);
loginMap.remove(lLong);
if(lLong!=null) {
loginMap.remove(lLong);
}
}
}
public static void main(String[] args) {
disConn(55);
}
public static NetSDKLib.LLong getConnId(Integer cameraId){
return cameraMap.get(cameraId);

@ -137,7 +137,7 @@ public interface CameraControlModule {
* @param ptzId
* @param cameraId
*/
void toPtz(Integer ptzId, Integer cameraId);
boolean toPtz(Integer ptzId, Integer cameraId);
/**
*

@ -6,6 +6,9 @@ import lombok.extern.slf4j.Slf4j;
import java.time.LocalDateTime;
import java.util.concurrent.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import static com.zhehekeji.web.lib.CameraConnMap.cameraMap;
@ -13,33 +16,34 @@ import static com.zhehekeji.web.lib.CameraConnMap.cameraMap;
public class TaskDelayExecutor {
private static ExecutorService exec = Executors.newFixedThreadPool(20);
private static DelayQueue<CameraDelayTask> queue = new DelayQueue<>();
public static void addMp4DelayTask(Integer cameraId, String path, LocalDateTime startTime, LocalDateTime endTime, Long delayTime) {
CameraDelayTask cameraDelayTask = new CameraDelayTask(cameraId, startTime, endTime,path, 0,delayTime);
CameraDelayTask cameraDelayTask = new CameraDelayTask(cameraId, startTime, endTime, path, 0, delayTime);
queue.add(cameraDelayTask);
}
public static void addPicDelayTask(Integer cameraId, String path, Long delayTime) {
CameraDelayTask cameraDelayTask = new CameraDelayTask(cameraId, null, null,path, 1,delayTime);
CameraDelayTask cameraDelayTask = new CameraDelayTask(cameraId, null, null, path, 1, delayTime);
queue.add(cameraDelayTask);
}
public static void addGyrateCameraTask(Integer cameraId, Long delayTime,Integer ptzId){
CameraDelayTask cameraDelayTask = new CameraDelayTask(cameraId, null, null,null, 2,delayTime);
public static void addGyrateCameraTask(Integer cameraId, Long delayTime, Integer ptzId) {
CameraDelayTask cameraDelayTask = new CameraDelayTask(cameraId, null, null, null, 2, delayTime);
cameraDelayTask.setPtzId(ptzId);
queue.add(cameraDelayTask);
}
private static CameraService cameraService = SpringContextUtil.getBean(CameraService.class);
public static void runMp4DownloadExecutor(){
exec.execute(new Consumer());
public static void runMp4DownloadExecutor() {
exec.execute(new ConsumerTask());
}
private static class Consumer implements Runnable {
private static class ConsumerTask implements Runnable {
@Override
public void run() {
@ -47,58 +51,60 @@ public class TaskDelayExecutor {
try {
CameraControlModule cameraControlModule = SpringContextUtil.getBean(CameraControlModule.class);
CameraDelayTask cameraDelayTask = queue.take();
if(cameraDelayTask != null){
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<?> future ;
if(cameraDelayTask.getType() == 0){
future = executor.submit(() -> {
if(cameraControlModule.downloadMp4(cameraDelayTask.getCameraId(), cameraDelayTask.getPath(), cameraDelayTask.getStartTime(), cameraDelayTask.getEndTime())) {
log.info("录像成功");
} // 录像线程任务
if (cameraDelayTask != null) {
if (cameraDelayTask.getType() == 0) {
foreach(s->{
return cameraControlModule.downloadMp4(cameraDelayTask.getCameraId(), cameraDelayTask.getPath(), cameraDelayTask.getStartTime(), cameraDelayTask.getEndTime());
});
try {
future.get(15, TimeUnit.SECONDS); // 设置5秒超时
} catch (TimeoutException e) {
future.cancel(true); // 超时时取消任务
System.out.println("视频线程超时");
}
}else if(cameraDelayTask.getType() == 1){
future = executor.submit(() -> {
if(cameraControlModule.pic(cameraDelayTask.getCameraId(), 0, cameraDelayTask.getPath())){
log.info("拍照成功");
}
} else if (cameraDelayTask.getType() == 1) {
//
// if (cameraControlModule.pic(cameraDelayTask.getCameraId(), 0, cameraDelayTask.getPath())) {
// log.info("拍照成功");
// }
foreach(s->{
return cameraControlModule.pic(cameraDelayTask.getCameraId(), 0, cameraDelayTask.getPath());
});
try {
future.get(15, TimeUnit.SECONDS); // 设置5秒超时
} catch (TimeoutException e) {
future.cancel(true); // 超时时取消任务
System.out.println("拍照线程超时");
}
}else if(cameraDelayTask.getType() == 2){
future = executor.submit(() -> {
} else if (cameraDelayTask.getType() == 2) {
cameraControlModule.toPtz(cameraDelayTask.getPtzId(),cameraDelayTask.getCameraId());
foreach(s->{
return cameraControlModule.toPtz(cameraDelayTask.getPtzId(), cameraDelayTask.getCameraId());
});
try {
future.get(15, TimeUnit.SECONDS); // 设置5秒超时
} catch (TimeoutException e) {
future.cancel(true); // 超时时取消任务
System.out.println("云台线程超时");
}
;
}
}
}
} catch (InterruptedException e) {
log.error("任务执行失败", e);
} catch (Exception e) {
log.error("队列失败", e);
}
}
}
}
public static void foreach(Predicate<String> predicate){
int i = 0;
while (i<5){
if(predicate.test("")){
try {
Thread.sleep(300);
} catch (InterruptedException e) {
log.error("任务执行失败",e);
}catch (Exception e){
log.error("队列失败",e);
throw new RuntimeException(e);
}
log.info("任务成功");
break;
} else {
System.out.printf("未成功");
}
i++;
}
}

@ -462,7 +462,7 @@ public class HikCameraControlModuleImpl implements CameraControlModule {
* @param ptzId
* @param cameraId
*/
public void toPtz(Integer ptzId, Integer cameraId)
public boolean toPtz(Integer ptzId, Integer cameraId)
{
int dwPTZCommand = HCNetSDK.GOTO_PRESET;
Boolean ok = false;
@ -474,6 +474,9 @@ public class HikCameraControlModuleImpl implements CameraControlModule {
}
if(!ok){
log.error("toPtz error:{},cameraId:{}", HikLoginModuleImpl.hcNetsdk.NET_DVR_GetLastError(),cameraId);
return false;
}else {
return true;
}
}

@ -123,6 +123,7 @@ public class HikLoginModuleImpl implements CameraControlLoginModule {
m_lUserID = hcNetsdk.NET_DVR_Login_V40(m_strLoginInfo,m_strDeviceInfo);
tryTimes ++;
}
if(m_lUserID >= 0){
log.info("hik login success");
//此id是用来保存视频的 且id不是固定的

@ -341,12 +341,16 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule {
* @param ptzId
* @param cameraId
*/
public void toPtz(Integer ptzId, Integer cameraId) {
public boolean toPtz(Integer ptzId, Integer cameraId) {
log.info("to ptz,ptzId:{},cameraId:{}",ptzId,cameraId);
int dwPTZCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_MOVE_CONTROL;
Boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId), 0, dwPTZCommand, 0, ptzId, 0, 0, null);
if (!ok) {
log.error("toPtz error, cameraId:{},ptzId:{},errorCode:{}", cameraId, ptzId,ToolKits.getErrorCodePrint());
log.error("toPtzSlow cameraId:{},error:{}", cameraId,ToolKits.getErrorCodePrint());
return false;
}else {
return true;
}
}
@ -370,6 +374,7 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule {
if (!ok) {
log.error("toPtzSlow cameraId:{},error:{}", cameraId,ToolKits.getErrorCodePrint());
}else {
}
}

@ -58,11 +58,11 @@ public class CameraService {
private CameraControlLoginModule cameraControlLoginModule;
public void setCameraControlModule(CameraControlModule cameraControlModule){
public void setCameraControlModule(CameraControlModule cameraControlModule) {
this.cameraControlModule = cameraControlModule;
}
public void setCameraLoginModule(CameraControlLoginModule cameraControlLoginModule){
public void setCameraLoginModule(CameraControlLoginModule cameraControlLoginModule) {
this.cameraControlLoginModule = cameraControlLoginModule;
}
@ -71,8 +71,8 @@ public class CameraService {
camera.setPassword(configProperties.getCameraConfig().getCameraPassword());
camera.setPort(configProperties.getCameraConfig().getCameraPort());
camera.setUpdateTime(LocalDateTime.now());
camera.setRtsp("rtsp://"+configProperties.getCameraConfig().getCameraUser()+":"+configProperties.getCameraConfig().getCameraPassword()+"@"+camera.getIp()+":554/h264/ch1/sub/av_stream");
if(StringUtils.isEmpty(camera.getRtcServer())){
camera.setRtsp("rtsp://" + configProperties.getCameraConfig().getCameraUser() + ":" + configProperties.getCameraConfig().getCameraPassword() + "@" + camera.getIp() + ":554/h264/ch1/sub/av_stream");
if (StringUtils.isEmpty(camera.getRtcServer())) {
camera.setRtcServer("127.0.0.1");
}
camera.setRtcServerPort(8083);
@ -88,12 +88,12 @@ public class CameraService {
public void edit(Camera camera) {
camera.setUpdateTime(LocalDateTime.now());
camera.setPtzId(null);
if(StringUtils.isEmpty(camera.getRtcServer())){
if (StringUtils.isEmpty(camera.getRtcServer())) {
camera.setRtcServer("127.0.0.1");
}
camera.setPort(configProperties.getCameraConfig().getCameraPort());
camera.setUser(configProperties.getCameraConfig().getCameraUser());
camera.setRtsp("rtsp://"+configProperties.getCameraConfig().getCameraUser()+":"+configProperties.getCameraConfig().getCameraPassword()+"@"+camera.getIp()+":554/h264/ch1/sub/av_stream");
camera.setRtsp("rtsp://" + configProperties.getCameraConfig().getCameraUser() + ":" + configProperties.getCameraConfig().getCameraPassword() + "@" + camera.getIp() + ":554/h264/ch1/sub/av_stream");
try {
cameraMapper.updateById(camera);
} catch (DuplicateKeyException e) {
@ -110,10 +110,10 @@ public class CameraService {
public PageInfo<Camera> cameras(StreetSearch streetSearch) {
PageHelper.startPage(streetSearch.getPageNum(), streetSearch.getPageSize());
List<Camera> cameras = cameraMapper.selectByMap(new HashMap<>(0));
if(cameras.size() > 0){
if (cameras.size() > 0) {
CountDownLatch latch = new CountDownLatch(cameras.size());
cameras.forEach(camera -> {
StatusThread statusThread = new StatusThread(camera,latch);
StatusThread statusThread = new StatusThread(camera, latch);
statusThread.start();
});
try {
@ -126,66 +126,69 @@ public class CameraService {
return new PageInfo<>(cameras);
}
public class StatusThread extends Thread{
public class StatusThread extends Thread {
private Camera camera;
private CountDownLatch latch;
public StatusThread(Camera camera,CountDownLatch latch){
public StatusThread(Camera camera, CountDownLatch latch) {
this.camera = camera;
this.latch = latch;
}
@Override
public void run() {
try {
Boolean ok = false;
if(configProperties.getCameraConfig().getCameraType() == ConfigProperties.HIK_CAMERA){
if (configProperties.getCameraConfig().getCameraType() == ConfigProperties.HIK_CAMERA) {
ok = HikLoginModuleImpl.connectStatus(CameraConnMap.getConnId(camera.getId()).intValue());
}else {
} else {
ok = JoywareLoginModuleImpl.connectStatus(CameraConnMap.getConnId(camera.getId()));
}
if(ok){
if (ok) {
camera.setStatus("连接正常");
}else {
CameraConnMap.disConn(camera.getId());
} else {
//CameraConnMap.disConn(camera.getId());
camera.setStatus("未连接");
}
}catch (Exception e){
} catch (Exception e) {
camera.setStatus("未连接");
}finally {
} finally {
latch.countDown();
}
}
}
public Camera detail(Integer id){
public Camera detail(Integer id) {
return cameraMapper.selectById(id);
}
public List<Camera> allCameras(){
public List<Camera> allCameras() {
return cameraMapper.selectByMap(new HashMap<>());
}
/**
* HD01 - HD05
*
* @return
*/
public List<Camera> allCameras1(){
public List<Camera> allCameras1() {
//Integer num = configProperties.getVideoStyleConfig().getVideoStyleRow() *configProperties.getVideoStyleConfig().getVideoStyleColumn();
Integer count = cameraMapper.selectCount(new QueryWrapper<Camera>());
List<Camera> cameras = cameraMapper.selectList(new QueryWrapper<Camera>().last("limit "+8));
List<Camera> cameras = cameraMapper.selectList(new QueryWrapper<Camera>().last("limit " + 8));
return cameras;
}
public List<Camera> allCameras2(){
Integer num = configProperties.getVideoStyleConfig().getVideoStyleRow() *configProperties.getVideoStyleConfig().getVideoStyleColumn();
public List<Camera> allCameras2() {
Integer num = configProperties.getVideoStyleConfig().getVideoStyleRow() * configProperties.getVideoStyleConfig().getVideoStyleColumn();
List<Camera> cameras = cameraMapper.selectList(new QueryWrapper<Camera>().last("limit 0,4"));
return cameras;
}
public List<Camera> allCameras3(){
Integer num = configProperties.getVideoStyleConfig().getVideoStyleRow() *configProperties.getVideoStyleConfig().getVideoStyleColumn();
public List<Camera> allCameras3() {
Integer num = configProperties.getVideoStyleConfig().getVideoStyleRow() * configProperties.getVideoStyleConfig().getVideoStyleColumn();
List<Camera> cameras = cameraMapper.selectList(new QueryWrapper<Camera>().last("limit 4,4"));
return cameras;
@ -244,6 +247,7 @@ public class CameraService {
/**
* io
*
* @param cameraId
* @return
*/
@ -255,11 +259,12 @@ public class CameraService {
/**
*
* synchronized ptzId
*
* @param IOId
* @param cameraId
*/
@CacheEvict(value = "ptz",key = "#cameraId+'-'+#code")
public synchronized Integer ptz(Integer IOId, Integer cameraId, String name,Integer type,String code) {
@CacheEvict(value = "ptz", key = "#cameraId+'-'+#code")
public synchronized Integer ptz(Integer IOId, Integer cameraId, String name, Integer type, String code) {
Camera camera = cameraMapper.selectById(cameraId);
Assert.notNull(camera, "球机不存在");
CameraIO cameraIO = null;
@ -275,11 +280,11 @@ public class CameraService {
cameraIO.setName(name);
cameraIO.setPtzId(ptzId);
cameraIO.setCode(code);
conver(cameraIO,0);
conver(cameraIO, 0);
try {
ioMapper.insert(cameraIO);
}catch (DuplicateKeyException e){
Assert.isTrue(false,"code已存在:"+code);
} catch (DuplicateKeyException e) {
Assert.isTrue(false, "code已存在:" + code);
}
camera.setPtzId(ptzId);
cameraMapper.updateById(camera);
@ -290,75 +295,67 @@ public class CameraService {
//将ptzId赋值为旧的不能用新的
ptzId = cameraIO.getPtzId();
cameraIO.setUpdateTime(LocalDateTime.now());
conver(cameraIO,type);
conver(cameraIO, type);
ioMapper.updateById(cameraIO);
}
boolean ok = cameraControlModule.connectStatus(cameraId);
if(!ok){
if (!ok) {
}
cameraControlModule.ptz(ptzId,cameraIO.getName(),cameraId);
cameraControlModule.ptz(ptzId, cameraIO.getName(), cameraId);
log.info("设置 预置点 球机ID:{},预置点ID:{}", cameraId, ptzId);
return cameraIO.getId();
}
/**
* codecaameraId使
*
* @param code
* @param cameraId
* @return
*/
@Cacheable(value = "ptz",key = "#cameraId+'-'+#code")
public Integer getPtzIdByCodeAndCameraId(String code,Integer cameraId){
CameraIO cameraIO = ioMapper.getByCodeAndCameraId(code,cameraId);
if(cameraIO != null){
@Cacheable(value = "ptz", key = "#cameraId+'-'+#code")
public Integer getPtzIdByCodeAndCameraId(String code, Integer cameraId) {
CameraIO cameraIO = ioMapper.getByCodeAndCameraId(code, cameraId);
if (cameraIO != null) {
return cameraIO.getPtzId();
}
return null;
}
public Integer getPtzId(Integer ioId){
public Integer getPtzId(Integer ioId) {
CameraIO cameraIO = ioMapper.selectById(ioId);
Assert.notNull(cameraIO,"IO配置不存在");
Assert.notNull(cameraIO, "IO配置不存在");
return cameraIO.getPtzId();
}
private void conver(CameraIO cameraIO,Integer type){
if(type == 0){
private void conver(CameraIO cameraIO, Integer type) {
if (type == 0) {
cameraIO.setPosition("OK");
}else if(type == 1){
} else if (type == 1) {
cameraIO.setFocusing("OK");
}else if(type == 2){
} else if (type == 2) {
cameraIO.setMultiple("OK");
}else if(type == 3){
} else if (type == 3) {
cameraIO.setAperture("OK");
}
}
public void cameraConnectStatus(Integer cameraId){
Boolean ok = cameraControlModule.connectStatus(cameraId);
if(!ok){
log.error("camera unconnected,cameraId:{}",cameraId);
Camera camera = cameraMapper.selectById(cameraId);
cameraLogin(camera);
}
}
public void cameraConnect(Integer cameraId){
public void cameraConnect(Integer cameraId) {
log.error("camera unconnected,cameraId:{}",cameraId);
Camera camera = cameraMapper.selectById(cameraId);
cameraLogin(camera);
log.error("camera unconnected,cameraId:{}", cameraId);
Camera camera = cameraMapper.selectById(cameraId);
cameraLogin(camera);
}
public void cameraLogin(Camera camera){
public void cameraLogin(Camera camera) {
synchronized (camera.getId().toString().intern()){
NetSDKLib.LLong lLong = cameraControlLoginModule.login(camera.getId(),camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword());
if(lLong != null){
log.info("camera login success,cameraId:{},ip:{}",camera.getId(),camera.getIp());
CameraConnMap.conn(camera.getId(),lLong);
}
synchronized (camera.getId().toString().intern()) {
NetSDKLib.LLong lLong = cameraControlLoginModule.login(camera.getId(), camera.getIp(), camera.getPort(), camera.getUser(), camera.getPassword());
if (lLong != null) {
log.info("camera login success,cameraId:{},ip:{}", camera.getId(), camera.getIp());
CameraConnMap.conn(camera.getId(), lLong);
}
}
}

Loading…
Cancel
Save