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

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

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

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

@ -137,7 +137,7 @@ public interface CameraControlModule {
* @param ptzId * @param ptzId
* @param cameraId * @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.time.LocalDateTime;
import java.util.concurrent.*; 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; import static com.zhehekeji.web.lib.CameraConnMap.cameraMap;
@ -13,7 +16,6 @@ import static com.zhehekeji.web.lib.CameraConnMap.cameraMap;
public class TaskDelayExecutor { public class TaskDelayExecutor {
private static ExecutorService exec = Executors.newFixedThreadPool(20); private static ExecutorService exec = Executors.newFixedThreadPool(20);
private static DelayQueue<CameraDelayTask> queue = new DelayQueue<>(); private static DelayQueue<CameraDelayTask> queue = new DelayQueue<>();
@ -33,13 +35,15 @@ public class TaskDelayExecutor {
cameraDelayTask.setPtzId(ptzId); cameraDelayTask.setPtzId(ptzId);
queue.add(cameraDelayTask); queue.add(cameraDelayTask);
} }
private static CameraService cameraService = SpringContextUtil.getBean(CameraService.class); private static CameraService cameraService = SpringContextUtil.getBean(CameraService.class);
public static void runMp4DownloadExecutor() { public static void runMp4DownloadExecutor() {
exec.execute(new Consumer()); exec.execute(new ConsumerTask());
} }
private static class Consumer implements Runnable { private static class ConsumerTask implements Runnable {
@Override @Override
public void run() { public void run() {
@ -47,49 +51,33 @@ public class TaskDelayExecutor {
try { try {
CameraControlModule cameraControlModule = SpringContextUtil.getBean(CameraControlModule.class); CameraControlModule cameraControlModule = SpringContextUtil.getBean(CameraControlModule.class);
CameraDelayTask cameraDelayTask = queue.take(); CameraDelayTask cameraDelayTask = queue.take();
if (cameraDelayTask != null) { if (cameraDelayTask != null) {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<?> future ;
if (cameraDelayTask.getType() == 0) { if (cameraDelayTask.getType() == 0) {
future = executor.submit(() -> {
if(cameraControlModule.downloadMp4(cameraDelayTask.getCameraId(), cameraDelayTask.getPath(), cameraDelayTask.getStartTime(), cameraDelayTask.getEndTime())) { foreach(s->{
log.info("录像成功"); 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) { } else if (cameraDelayTask.getType() == 1) {
future = executor.submit(() -> { //
if(cameraControlModule.pic(cameraDelayTask.getCameraId(), 0, cameraDelayTask.getPath())){ // if (cameraControlModule.pic(cameraDelayTask.getCameraId(), 0, cameraDelayTask.getPath())) {
log.info("拍照成功"); // 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) { } else if (cameraDelayTask.getType() == 2) {
future = executor.submit(() -> {
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("云台线程超时");
}
} }
} }
@ -98,7 +86,25 @@ public class TaskDelayExecutor {
} catch (Exception e) { } catch (Exception e) {
log.error("队列失败", 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) {
throw new RuntimeException(e);
}
log.info("任务成功");
break;
} else {
System.out.printf("未成功");
} }
i++;
} }
} }

@ -462,7 +462,7 @@ public class HikCameraControlModuleImpl implements CameraControlModule {
* @param ptzId * @param ptzId
* @param cameraId * @param cameraId
*/ */
public void toPtz(Integer ptzId, Integer cameraId) public boolean toPtz(Integer ptzId, Integer cameraId)
{ {
int dwPTZCommand = HCNetSDK.GOTO_PRESET; int dwPTZCommand = HCNetSDK.GOTO_PRESET;
Boolean ok = false; Boolean ok = false;
@ -474,6 +474,9 @@ public class HikCameraControlModuleImpl implements CameraControlModule {
} }
if(!ok){ if(!ok){
log.error("toPtz error:{},cameraId:{}", HikLoginModuleImpl.hcNetsdk.NET_DVR_GetLastError(),cameraId); 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); m_lUserID = hcNetsdk.NET_DVR_Login_V40(m_strLoginInfo,m_strDeviceInfo);
tryTimes ++; tryTimes ++;
} }
if(m_lUserID >= 0){ if(m_lUserID >= 0){
log.info("hik login success"); log.info("hik login success");
//此id是用来保存视频的 且id不是固定的 //此id是用来保存视频的 且id不是固定的

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

@ -129,10 +129,12 @@ public class CameraService {
public class StatusThread extends Thread { public class StatusThread extends Thread {
private Camera camera; private Camera camera;
private CountDownLatch latch; private CountDownLatch latch;
public StatusThread(Camera camera, CountDownLatch latch) { public StatusThread(Camera camera, CountDownLatch latch) {
this.camera = camera; this.camera = camera;
this.latch = latch; this.latch = latch;
} }
@Override @Override
public void run() { public void run() {
try { try {
@ -146,7 +148,7 @@ public class CameraService {
if (ok) { if (ok) {
camera.setStatus("连接正常"); camera.setStatus("连接正常");
} else { } else {
CameraConnMap.disConn(camera.getId()); //CameraConnMap.disConn(camera.getId());
camera.setStatus("未连接"); camera.setStatus("未连接");
} }
} catch (Exception e) { } catch (Exception e) {
@ -169,6 +171,7 @@ public class CameraService {
/** /**
* HD01 - HD05 * HD01 - HD05
*
* @return * @return
*/ */
public List<Camera> allCameras1() { public List<Camera> allCameras1() {
@ -244,6 +247,7 @@ public class CameraService {
/** /**
* io * io
*
* @param cameraId * @param cameraId
* @return * @return
*/ */
@ -255,6 +259,7 @@ public class CameraService {
/** /**
* *
* synchronized ptzId * synchronized ptzId
*
* @param IOId * @param IOId
* @param cameraId * @param cameraId
*/ */
@ -304,6 +309,7 @@ public class CameraService {
/** /**
* codecaameraId使 * codecaameraId使
*
* @param code * @param code
* @param cameraId * @param cameraId
* @return * @return
@ -335,15 +341,6 @@ public class CameraService {
} }
} }
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); log.error("camera unconnected,cameraId:{}", cameraId);

Loading…
Cancel
Save