diff --git a/web/src/main/java/com/leaper/web/controller/CameraControlController.java b/web/src/main/java/com/leaper/web/controller/CameraControlController.java index 4639b73..b810f9a 100644 --- a/web/src/main/java/com/leaper/web/controller/CameraControlController.java +++ b/web/src/main/java/com/leaper/web/controller/CameraControlController.java @@ -26,6 +26,7 @@ import javax.annotation.Resource; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; @Api(value = "CameraControl",tags = "球机控制管理") @@ -373,12 +374,30 @@ public class CameraControlController { @PostMapping("/mp4/record") @ApiOperation(value = "录像") public Result record(@RequestBody CameraRecord cameraRecord) { + Camera camera = cameraMapper.selectById(cameraRecord.getCameraId()); + checkLogin(cameraRecord.getCameraId()); + String url ="work/"+cameraRecord.getStartTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))+"-"+ UUID.randomUUID() +".mp4"; + cameraRecord.setPath(url); + cameraRecordMapper.insert(cameraRecord); + ConfigProperties.SavePath savePath = configProperties.getSavePath(); + if (camera.getChannel() ==1){ + cameraControlModule.downloadMp4(cameraRecord.getCameraId(),"D:\\"+url, cameraRecord.getStartTime(),cameraRecord.getEndTime(),savePath); + }else { + Camera cameraNvr = cameraMapper.selectOne(new QueryWrapper().eq("type", 2)); + cameraControlModule.downloadMp4(cameraNvr.getId(), "D:\\" + url, cameraRecord.getStartTime(), cameraRecord.getEndTime(), savePath, camera.getChannel()); + } + return Result.success(configProperties.getServerOpenInfo().getDomain()+url); + } + + @PostMapping("/mp4/record1") + @ApiOperation(value = "录像") + public Result record1(@RequestBody CameraRecord cameraRecord) { checkLogin(cameraRecord.getCameraId()); String url ="work/"+cameraRecord.getStartTime().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))+".mp4"; cameraRecord.setPath(url); cameraRecordMapper.insert(cameraRecord); ConfigProperties.SavePath savePath = configProperties.getSavePath(); - cameraControlModule.downloadMp4(cameraRecord.getCameraId(),"D:\\"+url, cameraRecord.getStartTime(),cameraRecord.getEndTime(),savePath); + cameraControlModule.downloadMp4(cameraRecord.getCameraId(),"D:\\"+url, cameraRecord.getStartTime(),cameraRecord.getEndTime(),savePath,33); return Result.success(configProperties.getServerOpenInfo().getDomain()+url); } diff --git a/web/src/main/java/com/leaper/web/entity/Camera.java b/web/src/main/java/com/leaper/web/entity/Camera.java index 153dc2d..0815a0e 100644 --- a/web/src/main/java/com/leaper/web/entity/Camera.java +++ b/web/src/main/java/com/leaper/web/entity/Camera.java @@ -43,5 +43,6 @@ public class Camera { private LocalDateTime updateTime; private Integer rtspPort; + private Integer channel =1; private Integer cameraType = 1; } diff --git a/web/src/main/java/com/leaper/web/lib/CameraControlModule.java b/web/src/main/java/com/leaper/web/lib/CameraControlModule.java index a81b2fd..15471b1 100644 --- a/web/src/main/java/com/leaper/web/lib/CameraControlModule.java +++ b/web/src/main/java/com/leaper/web/lib/CameraControlModule.java @@ -110,6 +110,7 @@ public interface CameraControlModule { void downloadMp4(Integer cameraId, String path, LocalDateTime start, LocalDateTime end, ConfigProperties.SavePath savePath); + void downloadMp4(Integer cameraId, String path, LocalDateTime start, LocalDateTime end, ConfigProperties.SavePath savePath,Integer channel); /** * 设置预置点 * diff --git a/web/src/main/java/com/leaper/web/lib/hik/HikCameraControlModuleImpl.java b/web/src/main/java/com/leaper/web/lib/hik/HikCameraControlModuleImpl.java index b4d365e..9006b7b 100644 --- a/web/src/main/java/com/leaper/web/lib/hik/HikCameraControlModuleImpl.java +++ b/web/src/main/java/com/leaper/web/lib/hik/HikCameraControlModuleImpl.java @@ -278,8 +278,28 @@ public class HikCameraControlModuleImpl implements CameraControlModule { Timer downloadtimer = new Timer(); downloadtimer.schedule(new DownloadTask(result,downloadtimer,path,cameraId,savePath), 0, 5000); } + } + + + public void downloadMp4(Integer cameraId, String path, LocalDateTime start, LocalDateTime end, ConfigProperties.SavePath savePath,Integer channel) { + + PathUtil.checkDirc(path); + HCNetSDK.NET_DVR_TIME startTime = new HCNetSDK.NET_DVR_TIME(); + startTime.setTime(start.getYear(), start.getMonthValue(), start.getDayOfMonth(), start.getHour(), start.getMinute(), start.getSecond()); + HCNetSDK.NET_DVR_TIME endTime = new HCNetSDK.NET_DVR_TIME(); + endTime.setTime(end.getYear(), end.getMonthValue(), end.getDayOfMonth(), end.getHour(), end.getMinute(), end.getSecond()); + log.info("start download mp4 path:{} ,cameraId:{},start_time:{},end_time:{}",path,cameraId,startTime.toStringTime(),endTime.toStringTime()); + int lUserID = CameraConnMap.getConnId(cameraId).intValue(); + int result = HikLoginModuleImpl.hcNetsdk.NET_DVR_GetFileByTime(lUserID, channel, startTime, endTime, path); + if (result == -1) { + log.error("downloadMp4 error code:{},cameraId:{},path:{}", HikLoginModuleImpl.hcNetsdk.NET_DVR_GetLastError(),cameraId,path); + } else { + HikLoginModuleImpl.hcNetsdk.NET_DVR_PlayBackControl(result, HikLoginModuleImpl.hcNetsdk.NET_DVR_PLAYSTART,0,null); + Timer downloadtimer = new Timer(); + downloadtimer.schedule(new DownloadTask(result,downloadtimer,path,cameraId,savePath), 0, 5000); + } } class DownloadTask extends java.util.TimerTask { diff --git a/web/src/main/java/com/leaper/web/lib/joyware/JoywareCameraControlModuleImpl.java b/web/src/main/java/com/leaper/web/lib/joyware/JoywareCameraControlModuleImpl.java index 7650626..3747ebf 100644 --- a/web/src/main/java/com/leaper/web/lib/joyware/JoywareCameraControlModuleImpl.java +++ b/web/src/main/java/com/leaper/web/lib/joyware/JoywareCameraControlModuleImpl.java @@ -306,6 +306,36 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { } } + + public void downloadMp4(Integer cameraId, String path, LocalDateTime start, LocalDateTime end, ConfigProperties.SavePath savePath,Integer channel) { + + PathUtil.checkDirc(path); + NetSDKLib.NET_TIME startTime = new NetSDKLib.NET_TIME(); + startTime.setTime(start.getYear(), start.getMonthValue(), start.getDayOfMonth(), start.getHour(), start.getMinute(), start.getSecond()); + NetSDKLib.NET_TIME endTime = new NetSDKLib.NET_TIME(); + endTime.setTime(end.getYear(), end.getMonthValue(), end.getDayOfMonth(), end.getHour(), end.getMinute(), end.getSecond()); + + NetSDKLib.NET_IN_DOWNLOAD_BY_DATA_TYPE download_by_data_type = new NetSDKLib.NET_IN_DOWNLOAD_BY_DATA_TYPE(); + download_by_data_type.nChannelID = 0; + download_by_data_type.stStartTime = startTime; + download_by_data_type.stStopTime = endTime; + download_by_data_type.szSavedFileName = path; + download_by_data_type.emDataType = 3; + download_by_data_type.emRecordType = 0; + download_by_data_type.cbDownLoadPos = mp4ReceiveCB; + download_by_data_type.write(); + NetSDKLib.NET_OUT_DOWNLOAD_BY_DATA_TYPE net_out_download_by_data_type = new NetSDKLib.NET_OUT_DOWNLOAD_BY_DATA_TYPE(); + net_out_download_by_data_type.write(); + + NetSDKLib.LLong l = JoywareLoginModuleImpl.netsdk.CLIENT_DownloadByDataType(CameraConnMap.getConnId(cameraId), download_by_data_type.getPointer(), net_out_download_by_data_type.getPointer(), 8000); + if(l.longValue() != 0){ + log.info("start download mp4 path:{},startTime:{} ,endTime:{},now:{},status:{},cameraId:{}", path, start, end, LocalDateTime.now(),l.longValue(),cameraId); + }else { + + log.error("download mp4 error:{},startTime:{} ,endTime:{},cameraId:{}",ToolKits.getErrorCodePrint(),start,end,cameraId); + } + } + /** * 设置预置点 * diff --git a/web/src/main/java/com/leaper/web/service/CameraService.java b/web/src/main/java/com/leaper/web/service/CameraService.java index 0163ef9..53ca857 100644 --- a/web/src/main/java/com/leaper/web/service/CameraService.java +++ b/web/src/main/java/com/leaper/web/service/CameraService.java @@ -111,16 +111,11 @@ public class CameraService { public PageInfo cameras(StreetSearch streetSearch) { PageHelper.startPage(streetSearch.getPageNum(), streetSearch.getPageSize()); List cameras = cameraMapper.selectByMap(new HashMap<>(0)); - if (cameras.size() > 0) { - CountDownLatch latch = new CountDownLatch(cameras.size()); - cameras.forEach(camera -> { - StatusThread statusThread = new StatusThread(camera, latch); - statusThread.start(); - }); - try { - latch.await(); - } catch (InterruptedException e) { - e.printStackTrace(); + for(Camera camera : cameras){ + if (CameraConnMap.cameraMap.containsKey(camera.getId())) { + camera.setStatus("连接成功"); + } else { + camera.setStatus("未连接"); } } @@ -141,7 +136,11 @@ public class CameraService { try { Boolean ok = false; if (configProperties.getCameraConfig().getCameraType() == ConfigProperties.HIK_CAMERA) { + if(CameraConnMap.getConnId(camera.getId()) ==null){ + cameraLogin(camera); + } ok = HikLoginModuleImpl.connectStatus(CameraConnMap.getConnId(camera.getId()).intValue()); + } else { ok = JoywareLoginModuleImpl.connectStatus(CameraConnMap.getConnId(camera.getId())); } diff --git a/web/src/main/java/com/leaper/web/service/CronTab.java b/web/src/main/java/com/leaper/web/service/CronTab.java index 11eba80..12d7aa0 100644 --- a/web/src/main/java/com/leaper/web/service/CronTab.java +++ b/web/src/main/java/com/leaper/web/service/CronTab.java @@ -4,9 +4,14 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.SftpATTRS; import com.leaper.web.config.ConfigProperties; +import com.leaper.web.entity.Camera; import com.leaper.web.entity.LightSource; import com.leaper.web.entity.OrderLive; import com.leaper.web.entity.PicData; +import com.leaper.web.lib.CameraConnMap; +import com.leaper.web.lib.hik.HikLoginModuleImpl; +import com.leaper.web.lib.joyware.JoywareLoginModuleImpl; +import com.leaper.web.mapper.CameraMapper; import com.leaper.web.mapper.LightSourceMapper; import com.leaper.web.mapper.OrderLiveMapper; import com.leaper.web.mapper.PicDataMapper; @@ -31,12 +36,16 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.concurrent.CountDownLatch; @Component @EnableScheduling @Slf4j public class CronTab { + + @Resource + private CameraMapper cameraMapper; @Resource private ConfigProperties configProperties; @Resource @@ -89,6 +98,61 @@ public class CronTab { } } + @Scheduled(cron = "0 * * * * ?") + //@Scheduled(cron = "0 0/1 * * * *") + public void cameraConn() { + log.info("球机连接判断"); + List cameras = cameraMapper.selectByMap(new HashMap<>(0)); + if (cameras.size() > 0) { + CountDownLatch latch = new CountDownLatch(cameras.size()); + cameras.forEach(camera -> { + StatusThread statusThread = new StatusThread(camera, latch); + statusThread.start(); + }); + try { + latch.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + + public class StatusThread extends Thread { + private Camera camera; + private 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) { + ok = HikLoginModuleImpl.connectStatus(CameraConnMap.getConnId(camera.getId()).intValue()); + } else { + ok = JoywareLoginModuleImpl.connectStatus(CameraConnMap.getConnId(camera.getId())); + } + + if (ok) { + camera.setStatus("连接正常"); + } else { + CameraConnMap.disConn(camera.getId()); + camera.setStatus("未连接"); + } + } catch (Exception e) { + CameraConnMap.disConn(camera.getId()); + camera.setStatus("未连接"); + } finally { + latch.countDown(); + } + } + } + + public static void putTime(Integer streetId){ lightTimeMap.put(streetId,System.currentTimeMillis()); }