diff --git a/web/src/main/java/com/zhehekeji/web/controller/CameraControlController.java b/web/src/main/java/com/zhehekeji/web/controller/CameraControlController.java index 56c7629..ea9b9be 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/CameraControlController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/CameraControlController.java @@ -9,6 +9,7 @@ import com.zhehekeji.web.entity.CameraDownload; import com.zhehekeji.web.entity.yolo.ImageTool; import com.zhehekeji.web.lib.*; import com.zhehekeji.web.lib.hik.HCNetSDK; +import com.zhehekeji.web.lib.joyware.JoywareCameraControlModuleImpl; import com.zhehekeji.web.lib.joyware.NetSDKLib; import com.zhehekeji.web.mapper.CameraMapper; import com.zhehekeji.web.service.CameraService; @@ -58,7 +59,13 @@ public class CameraControlController { public Result up(@PathVariable Integer id) { log.debug("球机控制向上"); checkLogin(id); - cameraControlModule.ptzControlUpStart(id,0,0,1); + + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlUpStart(id,camera.getChannel(),0,1); return Result.success(); } @@ -67,7 +74,12 @@ public class CameraControlController { public Result upStop(@PathVariable Integer id) { log.debug("球机控制向上 停止"); checkLogin(id); - cameraControlModule.ptzControlUpEnd(id,0); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlUpEnd(id,camera.getChannel()); return Result.success(); } @@ -75,7 +87,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制向下") public Result down(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlDownStart(id,0,0,1); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlDownStart(id,camera.getChannel(),0,1); log.debug("球机控制向下"); return Result.success(); } @@ -84,7 +101,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制向下-停止") public Result downStop(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlDownEnd(id,0); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlDownEnd(id,camera.getChannel()); log.debug("球机控制向下 停止"); return Result.success(); } @@ -93,7 +115,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制向左") public Result left(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlLeftStart(id,0,0,1); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlLeftStart(id,camera.getChannel(),0,1); log.debug("球机控制向左"); return Result.success(); } @@ -102,7 +129,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制左-停止") public Result leftStop(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlLeftEnd(id,0); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlLeftEnd(id,camera.getChannel()); log.debug("球机控制向左 -停止"); return Result.success(); } @@ -112,7 +144,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制向左上") public Result leftUp(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlLeftUpStart(id,0,1,1); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlLeftUpStart(id,camera.getChannel(),1,1); log.debug("球机控制向上"); return Result.success(); } @@ -121,7 +158,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制左上-停止") public Result leftUpStop(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlLeftUpEnd(id,0); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlLeftUpEnd(id,camera.getChannel()); log.debug("球机控制向上 停止"); return Result.success(); } @@ -130,7 +172,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制向左下") public Result leftDown(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlLeftDownStart(id,0,1,1); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlLeftDownStart(id,camera.getChannel(),1,1); log.debug("球机控制左下"); return Result.success(); } @@ -139,7 +186,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制左下-停止") public Result leftDownStop(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlLeftDownEnd(id,0); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlLeftDownEnd(id,camera.getChannel()); log.debug("球机控制左下 停止"); return Result.success(); @@ -149,7 +201,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制向右") public Result right(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlRightStart(id,0,0,1); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlRightStart(id,camera.getChannel(),0,1); log.debug("球机控制右"); return Result.success(); } @@ -158,7 +215,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制右-停止") public Result rightStop(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlRightEnd(id,0); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlRightEnd(id,camera.getChannel()); log.debug("球机控制右 停止"); return Result.success(); } @@ -168,7 +230,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制向右上") public Result rightUp(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlRightUpStart(id,0,1,1); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlRightUpStart(id,camera.getChannel(),1,1); log.debug("球机控制右上"); return Result.success(); } @@ -177,7 +244,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制右上-停止") public Result rightUpStop(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlRightUpEnd(id,0); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlRightUpEnd(id,camera.getChannel()); log.debug("球机控制右上 -停止"); return Result.success(); } @@ -186,7 +258,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制向右下") public Result rightDown(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlRightDownStart(id,0,1,1); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlRightDownStart(id,camera.getChannel(),1,1); log.debug("球机控制右下"); return Result.success(); } @@ -195,7 +272,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制右下-停止") public Result rightDownStop(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlRightDownEnd(id,0); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlRightDownEnd(id,camera.getChannel()); log.debug("球机控制右下 -停止"); return Result.success(); } @@ -204,7 +286,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制 变倍+") public Result ZoomAddStart(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlZoomAddStart(id,0,1); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlZoomAddStart(id,camera.getChannel(),1); return Result.success(); } @@ -212,7 +299,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制 变倍+ 停止") public Result ZoomAddEnd(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlZoomAddEnd(id,0); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlZoomAddEnd(id,camera.getChannel()); return Result.success(); } @@ -220,7 +312,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制 变倍-") public Result ZoomDecStart(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlZoomDecStart(id,0,1); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlZoomDecStart(id,camera.getChannel(),1); return Result.success(); } @@ -228,7 +325,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制 变倍- 停止") public Result ZoomDecEnd(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlZoomDecEnd(id,0); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlZoomDecEnd(id,camera.getChannel()); return Result.success(); } @@ -236,7 +338,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制 变焦 +") public Result FocusAddStart(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlFocusAddStart(id,0,1); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlFocusAddStart(id,camera.getChannel(),1); return Result.success(); } @@ -244,7 +351,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制 变焦+ 停止") public Result focusAddEnd(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlFocusAddEnd(id,0); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlFocusAddEnd(id,camera.getChannel()); return Result.success(); } @@ -252,7 +364,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制 变焦 -") public Result FocusDecStart(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlFocusDecStart(id,0,1); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlFocusDecStart(id,camera.getChannel(),1); return Result.success(); } @@ -260,7 +377,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制 变焦- 停止") public Result focusDecEnd(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlFocusDecEnd(id,0); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlFocusDecEnd(id,camera.getChannel()); return Result.success(); } @@ -268,7 +390,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制 光圈 +") public Result irisAddStart(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlIrisAddStart(id,0,1); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlIrisAddStart(id,camera.getChannel(),1); return Result.success(); } @@ -276,7 +403,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制 光圈+ 停止") public Result irisAddEnd(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlIrisAddEnd(id,0); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlIrisAddEnd(id,camera.getChannel()); return Result.success(); } @@ -284,7 +416,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制 光圈 -") public Result irisDecStart(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlIrisDecStart(id,0,1); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlIrisDecStart(id,camera.getChannel(),1); return Result.success(); } @@ -292,7 +429,12 @@ public class CameraControlController { @ApiOperation(value = "球机控制 光圈- 停止") public Result irisDecEnd(@PathVariable Integer id) { checkLogin(id); - cameraControlModule.ptzControlIrisDecEnd(id,0); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } + cameraControlModule.ptzControlIrisDecEnd(id,camera.getChannel()); return Result.success(); } @Resource @@ -302,6 +444,11 @@ public class CameraControlController { @ApiOperation(value = "立即拍照") public Result pic(@PathVariable Integer id) { checkLogin(id); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } String path = "D:\\work\\"+LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))+".jpeg"; cameraControlModule.pic(id,0,path); taskDelayExecutor.addPicDelayTask(id,path,0L); @@ -313,9 +460,14 @@ public class CameraControlController { public Result picCrop(@RequestParam ConfigProperties.InventoryImage image) { checkLogin(image.getCameraId()); + Camera camera = CameraConnMap.cameras.get(image.getCameraId()); + if(camera == null){ + log.error("camera is null,cameraId:{}",image.getCameraId()); + + } String path = "D:\\work\\"+LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))+".jpeg"; String pathCrop = "D:\\work\\crop\\"+LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))+".jpeg"; - cameraControlModule.pic(image.getCameraId(),0,path); + cameraControlModule.pic(image.getCameraId(),camera.getChannel(),path); try { ImageTool.cropImage(path,pathCrop,image.getImageSize(),image.getImageSpace()); } catch (IOException e) { @@ -333,6 +485,11 @@ public class CameraControlController { @ApiOperation(value = "录像") public Result MP4delay(@PathVariable Integer id) { //checkLogin(id); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } plcService.cameraVideo(1,LocalDateTime.now().minusSeconds(id),LocalDateTime.now().plusSeconds(3)); plcService.cameraVideo(2,LocalDateTime.now().minusSeconds(id),LocalDateTime.now().plusSeconds(3)); return Result.success(); @@ -343,6 +500,11 @@ public class CameraControlController { @ApiOperation(value = "录像") public Result MP4(@PathVariable Integer id) { checkLogin(id); + Camera camera = CameraConnMap.cameras.get(id); + if(camera == null){ + log.error("camera is null,cameraId:{}",id); + + } LocalDateTime localDateTime = LocalDateTime.of(2022,7,21,8,20); cameraControlModule.downloadMp4(id,"E:\\work\\"+localDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))+".mp4", localDateTime,localDateTime.plusMinutes(3)); return Result.success(); @@ -353,6 +515,7 @@ public class CameraControlController { public String MP4delay( HttpEntity httpEntity) { CameraDownload cameraDownload = httpEntity.getBody(); //checkLogin(id); + String path = plcService.cameraVideo(cameraDownload.getId(),cameraDownload.getStartTime(),cameraDownload.getEndTime()); return path; @@ -362,10 +525,41 @@ public class CameraControlController { @Resource private CameraService cameraService; + @PostMapping("/try/{id}/{channel}") + @ApiOperation(value = "诊断:指定通道试转一次,验证该通道能否控云台(结果看日志 ptzTry)") + public Result ptzTry(@PathVariable Integer id, @PathVariable Integer channel) { + checkLogin(id); + if(cameraControlModule instanceof JoywareCameraControlModuleImpl){ + ((JoywareCameraControlModuleImpl) cameraControlModule).ptzTry(id, channel); + }else{ + log.error("ptzTry only support joyware,cameraId:{}",id); + } + return Result.success(); + } + + @PostMapping("/scan/{id}") + @ApiOperation(value = "诊断:扫描设备通道,找出真正可控的通道(结果看日志 channelScan)") + public Result scan(@PathVariable Integer id) { + checkLogin(id); + if(cameraControlModule instanceof JoywareCameraControlModuleImpl){ + ((JoywareCameraControlModuleImpl) cameraControlModule).channelScan(id); + }else{ + log.error("scan only support joyware,cameraId:{}",id); + } + return Result.success(); + } + private void checkLogin(Integer cameraId){ if(CameraConnMap.getConnId(cameraId) == null){ Camera camera = cameraMapper.selectById(cameraId); cameraService.cameraLogin(camera); } + //CameraConnMap.cameras里没有时,下面camera.getChannel()会NPE,这里补进去 + if(CameraConnMap.cameras.get(cameraId) == null){ + Camera camera = cameraMapper.selectById(cameraId); + Assert.notNull(camera,"球机不存在"); + cameraService.checkChannel(camera); + CameraConnMap.cameras.put(cameraId,camera); + } } } diff --git a/web/src/main/java/com/zhehekeji/web/controller/StreetController.java b/web/src/main/java/com/zhehekeji/web/controller/StreetController.java index bc967db..d808542 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/StreetController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/StreetController.java @@ -100,6 +100,8 @@ public class StreetController { HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),1); }else if (configProperties.getLightSource().getType() == 3){ LightSourceService.lightController(lightSource.getIp(),lightSource.getPort(),1); + }else if (configProperties.getLightSource().getType() == 4){ + LightSourceService.lightRelayController(lightSource.getIp(),lightSource.getPort(),1); } }); @@ -125,6 +127,8 @@ public class StreetController { HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),0); }else if (configProperties.getLightSource().getType() == 3){ LightSourceService.lightController(lightSource.getIp(),lightSource.getPort(),0); + }else if (configProperties.getLightSource().getType() == 4){ + LightSourceService.lightRelayController(lightSource.getIp(),lightSource.getPort(),0); } }); @@ -175,6 +179,8 @@ public class StreetController { HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),1); }else if (configProperties.getLightSource().getType() == 3){ LightSourceService.lightController(lightSource.getIp(),lightSource.getPort(),1); + }else if (configProperties.getLightSource().getType() == 4){ + LightSourceService.lightRelayController(lightSource.getIp(),lightSource.getPort(),1); } }); @@ -199,6 +205,8 @@ public class StreetController { HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),1); }else if (configProperties.getLightSource().getType() == 3){ LightSourceService.lightController(lightSource.getIp(),lightSource.getPort(),1); + }else if (configProperties.getLightSource().getType() == 4){ + LightSourceService.lightRelayController(lightSource.getIp(),lightSource.getPort(),1); } }); @@ -221,6 +229,8 @@ public class StreetController { HikControlSocket.openLight(lightSource.getIp(),lightSource.getPort(),configProperties.getLightSource().getIndex(),0); }else if (configProperties.getLightSource().getType() == 3){ LightSourceService.lightController(lightSource.getIp(),lightSource.getPort(),0); + }else if (configProperties.getLightSource().getType() == 4){ + LightSourceService.lightRelayController(lightSource.getIp(),lightSource.getPort(),0); } }); diff --git a/web/src/main/java/com/zhehekeji/web/entity/Camera.java b/web/src/main/java/com/zhehekeji/web/entity/Camera.java index e599dfc..4c0bddf 100644 --- a/web/src/main/java/com/zhehekeji/web/entity/Camera.java +++ b/web/src/main/java/com/zhehekeji/web/entity/Camera.java @@ -31,6 +31,8 @@ public class Camera { private String rtcServer; + private Integer channel=0; + @TableField(exist = false) private String status; diff --git a/web/src/main/java/com/zhehekeji/web/lib/CameraConnMap.java b/web/src/main/java/com/zhehekeji/web/lib/CameraConnMap.java index 3210c4a..e5eb11d 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/CameraConnMap.java +++ b/web/src/main/java/com/zhehekeji/web/lib/CameraConnMap.java @@ -1,9 +1,12 @@ package com.zhehekeji.web.lib; +import com.zhehekeji.web.entity.Camera; import com.zhehekeji.web.lib.joyware.NetSDKLib; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; /** * camera login handler @@ -16,6 +19,14 @@ public class CameraConnMap { */ public static Map cameraMap = new HashMap<>(); + public static Map cameras = new HashMap<>(); + + /** + * key :cameraId + * value: 设备实际通道数(NET_DEVICEINFO_Ex.byChanNum),登录成功后写入 + */ + public static Map chanNumMap = new HashMap<>(); + /** * key:loginId * value: cameraId @@ -30,6 +41,7 @@ public class CameraConnMap { } + public static void disConn(Integer cameraId){ synchronized (cameraId.toString().intern()){ NetSDKLib.LLong lLong = cameraMap.get(cameraId); diff --git a/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareCameraControlModuleImpl.java b/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareCameraControlModuleImpl.java index 00d680e..6994c83 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareCameraControlModuleImpl.java +++ b/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareCameraControlModuleImpl.java @@ -3,6 +3,7 @@ package com.zhehekeji.web.lib.joyware; import com.sun.jna.ptr.IntByReference; import com.zhehekeji.common.util.PathUtil; import com.zhehekeji.core.util.Assert; +import com.zhehekeji.web.entity.Camera; import com.zhehekeji.web.lib.CameraConnMap; import com.zhehekeji.web.lib.CameraControlModule; import lombok.extern.slf4j.Slf4j; @@ -25,240 +26,338 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { return true; } + /** + * NVR界面上的通道号从1开始,SDK接口要的通道号从0开始,所以大于0时减一 + */ + private int channel(int nChannelID) { + return nChannelID > 0 ? nChannelID - 1 : 0; + } + /** * 向上 */ public boolean ptzControlUpStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) { - log.info("up start"); - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, - NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL, - lParam1, lParam2, 0, 0); - + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), + NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL, + lParam1, lParam2, 0, 0); + if(!ok){ + log.error("ptzControlUpStart error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } public boolean ptzControlUpEnd(Integer cameraId, int nChannelID) { - log.info("up end"); - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL, 0, 0, 0, 1); + if(!ok){ + log.error("ptzControlUpEnd error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } /** * 向下 */ public boolean ptzControlDownStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) { - log.info("down start"); - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_DOWN_CONTROL, lParam1, lParam2, 0, 0); + if(!ok){ + log.error("ptzControlDownStart error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } public boolean ptzControlDownEnd(Integer cameraId, int nChannelID) { - log.info("down end"); - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_DOWN_CONTROL, 0, 0, 0, 1); + if(!ok){ + log.error("ptzControlDownEnd error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } /** * 向左 */ public boolean ptzControlLeftStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) { - log.info("left start"); - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL, lParam1, lParam2, 0, 0); + if(!ok){ + log.error("ptzControlLeftStart error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } public boolean ptzControlLeftEnd(Integer cameraId, int nChannelID) { - log.info("left end"); - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_LEFT_CONTROL, 0, 0, 0, 1); + if(!ok){ + log.error("ptzControlLeftEnd error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } /** * 向右 */ public boolean ptzControlRightStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) { - log.info("right start"); - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL, lParam1, lParam2, 0, 0); + if(!ok){ + log.error("ptzControlRightStart error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } public boolean ptzControlRightEnd(Integer cameraId, int nChannelID) { - log.info("right end"); - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_RIGHT_CONTROL, 0, 0, 0, 1); + if(!ok){ + log.error("ptzControlRightEnd error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } /** * 向左上 */ public boolean ptzControlLeftUpStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) { - log.info("up left start"); - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTTOP, lParam1, lParam2, 0, 0); + if(!ok){ + log.error("ptzControlLeftUpStart error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } public boolean ptzControlLeftUpEnd(Integer cameraId, int nChannelID) { - log.info("up left end"); - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTTOP, 0, 0, 0, 1); + if(!ok){ + log.error("ptzControlLeftUpEnd error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } /** * 向右上 */ public boolean ptzControlRightUpStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) { - log.info("up right start"); - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTTOP, lParam1, lParam2, 0, 0); + if(!ok){ + log.error("ptzControlRightUpStart error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } public boolean ptzControlRightUpEnd(Integer cameraId, int nChannelID) { - log.info("up right end"); - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTTOP, 0, 0, 0, 1); + if(!ok){ + log.error("ptzControlRightUpEnd error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } /** * 向左下 */ public boolean ptzControlLeftDownStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) { - log.info(" left down start"); - Boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTDOWN, lParam1, lParam2, 0, 0); if(!ok){ - log.error("ptzControlLeftDownStart error :{},cameraId:{}", ToolKits.getErrorCodePrint(),cameraId); + log.error("ptzControlLeftDownStart error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); } return ok; } public boolean ptzControlLeftDownEnd(Integer cameraId, int nChannelID) { - log.info(" left down end"); - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_LEFTDOWN, 0, 0, 0, 1); + if(!ok){ + log.error("ptzControlLeftDownEnd error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } /** * 向右下 */ public boolean ptzControlRightDownStart(Integer cameraId, int nChannelID, int lParam1, int lParam2) { - log.info(" right down start"); - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTDOWN, lParam1, lParam2, 0, 0); + if(!ok){ + log.error("ptzControlRightDownStart error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } public boolean ptzControlRightDownEnd(Integer cameraId, int nChannelID) { - log.info(" right down end"); - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_RIGHTDOWN, 0, 0, 0, 1); + if(!ok){ + log.error("ptzControlRightDownEnd error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } /** * 变倍+ */ public boolean ptzControlZoomAddStart(Integer cameraId, int nChannelID, int lParam2) { - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_ADD_CONTROL, 0, lParam2, 0, 0); + if(!ok){ + log.error("ptzControlZoomAddStart error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } public boolean ptzControlZoomAddEnd(Integer cameraId, int nChannelID) { - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_ADD_CONTROL, 0, 0, 0, 1); + if(!ok){ + log.error("ptzControlZoomAddEnd error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } /** * 变倍- */ public boolean ptzControlZoomDecStart(Integer cameraId, int nChannelID, int lParam2) { - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_DEC_CONTROL, 0, lParam2, 0, 0); + if(!ok){ + log.error("ptzControlZoomDecStart error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } public boolean ptzControlZoomDecEnd(Integer cameraId, int nChannelID) { - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_ZOOM_DEC_CONTROL, 0, 0, 0, 1); + if(!ok){ + log.error("ptzControlZoomDecEnd error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } /** * 变焦+ */ public boolean ptzControlFocusAddStart(Integer cameraId, int nChannelID, int lParam2) { - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_ADD_CONTROL, 0, lParam2, 0, 0); + if(!ok){ + log.error("ptzControlFocusAddStart error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } public boolean ptzControlFocusAddEnd(Integer cameraId, int nChannelID) { - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_ADD_CONTROL, 0, 0, 0, 1); + if(!ok){ + log.error("ptzControlFocusAddEnd error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } /** * 变焦- */ public boolean ptzControlFocusDecStart(Integer cameraId, int nChannelID, int lParam2) { - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_DEC_CONTROL, 0, lParam2, 0, 0); + if(!ok){ + log.error("ptzControlFocusDecStart error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } public boolean ptzControlFocusDecEnd(Integer cameraId, int nChannelID) { - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_FOCUS_DEC_CONTROL, 0, 0, 0, 1); + if(!ok){ + log.error("ptzControlFocusDecEnd error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } /** * 光圈+ */ public boolean ptzControlIrisAddStart(Integer cameraId, int nChannelID, int lParam2) { - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_ADD_CONTROL, 0, lParam2, 0, 0); + if(!ok){ + log.error("ptzControlIrisAddStart error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } public boolean ptzControlIrisAddEnd(Integer cameraId, int nChannelID) { - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_ADD_CONTROL, 0, 0, 0, 1); + if(!ok){ + log.error("ptzControlIrisAddEnd error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } /** * 光圈- */ public boolean ptzControlIrisDecStart(Integer cameraId, int nChannelID, int lParam2) { - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_DEC_CONTROL, 0, lParam2, 0, 0); + if(!ok){ + log.error("ptzControlIrisDecStart error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } public boolean ptzControlIrisDecEnd(Integer cameraId, int nChannelID) { - return JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), nChannelID, + boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(CameraConnMap.getConnId(cameraId), channel(nChannelID), NetSDKLib.NET_PTZ_ControlType.NET_PTZ_APERTURE_DEC_CONTROL, 0, 0, 0, 1); + if(!ok){ + log.error("ptzControlIrisDecEnd error:{},cameraId:{},channel:{},loginId:{}", ToolKits.getErrorCodePrint(),cameraId,nChannelID,CameraConnMap.getConnId(cameraId)); + } + return ok; } public boolean pic(Integer cameraId,int channel, String realPath) { NetSDKLib.SNAP_PARAMS stuSnapParams = new NetSDKLib.SNAP_PARAMS(); - stuSnapParams.Channel = 0; // channel + stuSnapParams.Channel = channel(channel); // channel stuSnapParams.mode = 0; // capture picture mode stuSnapParams.Quality = 3; // picture quality stuSnapParams.InterSnap = 0; // timer capture picture time interval @@ -272,6 +371,11 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { } public void downloadMp4(Integer cameraId, String path, LocalDateTime start, LocalDateTime end) { + Camera camera = CameraConnMap.cameras.get(cameraId); + if(camera == null){ + log.error("camera is null,cameraId:{}",cameraId); + return; + } PathUtil.checkDirc(path); NetSDKLib.NET_TIME startTime = new NetSDKLib.NET_TIME(); @@ -280,7 +384,7 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { 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.nChannelID = camera.getChannel(); download_by_data_type.stStartTime = startTime; download_by_data_type.stStopTime = endTime; download_by_data_type.szSavedFileName = path; @@ -308,8 +412,13 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { * @param cameraId 球机ID,来获取登录句柄 */ public void ptz(Integer ptzId, String name, Integer cameraId) { + Camera camera = CameraConnMap.cameras.get(cameraId); + if(camera == null){ + log.error("camera is null,cameraId:{}",cameraId); + return; + } int dwzCommand = NetSDKLib.NET_PTZ_ControlType.NET_PTZ_POINT_SET_CONTROL; - Boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId), 0, dwzCommand, 0, ptzId, 0, 0, ToolKits.GetGBKStringToPointer(name)); + Boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId), channel(camera.getChannel()), dwzCommand, 0, ptzId, 0, 0, ToolKits.GetGBKStringToPointer(name)); if (!ok) { log.error("ptz error :{},cameraId:{}", ToolKits.getErrorCodePrint(),cameraId); } @@ -323,9 +432,14 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { * @param cameraId */ public void toPtz(Integer ptzId, Integer cameraId) { + Camera camera = CameraConnMap.cameras.get(cameraId); + if(camera == null){ + log.error("camera is null,cameraId:{}",cameraId); + return; + } 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); + Boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId), channel(camera.getChannel()), dwPTZCommand, 0, ptzId, 0, 0, null); if (!ok) { log.error("toPtz error, cameraId:{},ptzId:{},errorCode:{}", cameraId, ptzId,ToolKits.getErrorCodePrint()); } @@ -337,6 +451,11 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { * @param cameraId */ public void toPtzSlow(Integer cameraId,Integer x) { + Camera camera = CameraConnMap.cameras.get(cameraId); + if(camera == null){ + log.error("camera is null,cameraId:{}",cameraId); + return; + } int dwPTZCommand = NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_MOVE_ABSOLUTELY; NetSDKLib.PTZ_CONTROL_ABSOLUTELY absolutely = new NetSDKLib.PTZ_CONTROL_ABSOLUTELY(); @@ -346,7 +465,7 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { absolutely.stuSpeed.fPositionY = 0.2f; absolutely.write(); //absolutely.stuSpeed.fZoom = 0.5f; - Boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId), 0, dwPTZCommand, + Boolean ok = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx2(CameraConnMap.getConnId(cameraId), channel(camera.getChannel()), dwPTZCommand, 0, 0, 0, 0, absolutely.getPointer()); if (!ok) { @@ -367,6 +486,72 @@ public class JoywareCameraControlModuleImpl implements CameraControlModule { return JoywareLoginModuleImpl.netsdk.CLIENT_SetupDeviceTime(CameraConnMap.getConnId(cameraId), netTime); } + /** + * 诊断用:扫描设备所有通道,只发"停止"指令(无副作用)+查询云台位置,找出真正能控制的通道 + * 结果直接打日志:channelScan,cameraId:...,configuredChannel:...,ch=x,stop=...,location=... + * 注意:这里用的是原始通道号,不做减一 + */ + public void channelScan(Integer cameraId) { + NetSDKLib.LLong loginId = CameraConnMap.getConnId(cameraId); + if (loginId == null) { + log.error("channelScan,not login,cameraId:{}", cameraId); + return; + } + Camera camera = CameraConnMap.cameras.get(cameraId); + Integer chanNum = CameraConnMap.chanNumMap.get(cameraId); + int max = (chanNum == null || chanNum <= 0) ? 32 : chanNum; + StringBuilder sb = new StringBuilder("\n"); + for (int ch = 0; ch < max; ch++) { + boolean stopOk = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(loginId, ch, + NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL, 0, 0, 0, 1); + int stopErr = JoywareLoginModuleImpl.netsdk.CLIENT_GetLastError(); + + NetSDKLib.NET_PTZ_LOCATION_INFO location = new NetSDKLib.NET_PTZ_LOCATION_INFO(); + location.nChannelID = ch; + location.write(); + IntByReference retLen = new IntByReference(); + boolean locationOk = JoywareLoginModuleImpl.netsdk.CLIENT_QueryDevState(loginId, + NetSDKLib.NET_DEVSTATE_PTZ_LOCATION, location.getPointer(), location.size(), retLen, 1000); + int locationErr = JoywareLoginModuleImpl.netsdk.CLIENT_GetLastError(); + location.read(); + + sb.append("ch=").append(ch) + .append(",stop=").append(stopOk).append("(err:").append(stopErr).append(")") + .append(",location=").append(locationOk).append("(err:").append(locationErr).append(")") + .append(",pan=").append(location.nPTZPan) + .append(",tilt=").append(location.nPTZTilt) + .append("\n"); + } + log.warn("channelScan,cameraId:{},configuredChannel:{},ip:{},loginId:{},chanNum:{} {}", + cameraId, camera == null ? null : camera.getChannel(), + camera == null ? null : camera.getIp(), loginId, chanNum, sb); + } + + /** + * 诊断用:指定通道试转一次(向上一下再停止),验证该通道到底能不能控云台,结果看日志 ptzTry + * 注意:这里用的是原始通道号,不做减一,传几就是几 + */ + public void ptzTry(Integer cameraId, int channel) { + NetSDKLib.LLong loginId = CameraConnMap.getConnId(cameraId); + if (loginId == null) { + log.error("ptzTry,not login,cameraId:{}", cameraId); + return; + } + boolean start = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(loginId, channel, + NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL, 0, 1, 0, 0); + int startErr = JoywareLoginModuleImpl.netsdk.CLIENT_GetLastError(); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + boolean stop = JoywareLoginModuleImpl.netsdk.CLIENT_DHPTZControlEx(loginId, channel, + NetSDKLib.NET_PTZ_ControlType.NET_PTZ_UP_CONTROL, 0, 0, 0, 1); + int stopErr = JoywareLoginModuleImpl.netsdk.CLIENT_GetLastError(); + log.warn("ptzTry,cameraId:{},channel:{},loginId:{},start:{}(err:{}),stop:{}(err:{})", + cameraId, channel, loginId, start, startErr, stop, stopErr); + } + /** * 旋转360度 * @param cameraId diff --git a/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareLoginModuleImpl.java b/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareLoginModuleImpl.java index 612a36c..a2048cf 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareLoginModuleImpl.java +++ b/web/src/main/java/com/zhehekeji/web/lib/joyware/JoywareLoginModuleImpl.java @@ -69,6 +69,11 @@ public class JoywareLoginModuleImpl implements CameraControlLoginModule { System.out.println("Initialize SDK failed"); return false; } + if(!bLogopen) { + // 打开SDK日志,默认输出 ./sdk_log/sdk_log.log,排查完记得关 + bLogopen = netsdk.CLIENT_LogOpen(new NetSDKLib.LOG_SET_PRINT_INFO()); + log.info("sdk log open:{}", bLogopen); + } // 设置断线重连回调接口,设置过断线重连成功回调函数后,当设备出现断线情况,SDK内部会自动进行重连操作 // 此操作为可选操作,但建议用户进行设置 netsdk.CLIENT_SetAutoReconnect(haveReConnect, null); @@ -126,9 +131,9 @@ public class JoywareLoginModuleImpl implements CameraControlLoginModule { pstInParam.szIP=m_strIp.getBytes(); pstInParam.szPassword=m_strPassword.getBytes(); pstInParam.szUserName=m_strUser.getBytes(); - //出参 + //出参(每台设备单独一个,避免多线程登录互相覆盖) NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY pstOutParam=new NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY(); - pstOutParam.stuDeviceInfo=m_stDeviceInfo; + pstOutParam.stuDeviceInfo=new NetSDKLib.NET_DEVICEINFO_Ex(); //m_hLoginHandle = netsdk.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser, m_strPassword, 0, null, m_stDeviceInfo, nError); LLong m_hLoginHandle=netsdk.CLIENT_LoginWithHighLevelSecurity(pstInParam, pstOutParam); int tryTimes = 0; @@ -140,7 +145,13 @@ public class JoywareLoginModuleImpl implements CameraControlLoginModule { if(m_hLoginHandle.longValue()==0){ return null; } - log.info("joyware login success,loginId:{}",m_hLoginHandle.longValue()); + pstOutParam.read(); + NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = pstOutParam.stuDeviceInfo; + deviceInfo.read(); + int chanNum = deviceInfo.byChanNum; + CameraConnMap.chanNumMap.put(cameraId, chanNum); + log.info("joyware login success,loginId:{},cameraId:{},ip:{},chanNum:{},deviceType:{}", + m_hLoginHandle.longValue(), cameraId, m_strIp, chanNum, deviceInfo.byDVRType); return m_hLoginHandle; } diff --git a/web/src/main/java/com/zhehekeji/web/service/CameraService.java b/web/src/main/java/com/zhehekeji/web/service/CameraService.java index 86b8c31..1c9ab12 100644 --- a/web/src/main/java/com/zhehekeji/web/service/CameraService.java +++ b/web/src/main/java/com/zhehekeji/web/service/CameraService.java @@ -354,7 +354,26 @@ public class CameraService { 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()); + checkChannel(camera); CameraConnMap.conn(camera.getId(),lLong); + CameraConnMap.cameras.put(camera.getId(),camera); + } + } + + /** + * 校验通道号:配置的通道号 >= 设备实际通道数时,SDK会直接判为非法参数(错误码7),这里纠正为0 + * (每台设备都是用自己的IP单独登录,直连IPC只有1个通道,通道号只能传0) + */ + public void checkChannel(Camera camera){ + if(camera == null){ + return; + } + Integer chanNum = CameraConnMap.chanNumMap.get(camera.getId()); + Integer channel = camera.getChannel() == null ? 0 : camera.getChannel(); + if(chanNum != null && chanNum > 0 && channel >= chanNum){ + log.error("camera channel illegal,auto correct to 0,cameraId:{},ip:{},configuredChannel:{},deviceChanNum:{}", + camera.getId(),camera.getIp(),channel,chanNum); + camera.setChannel(0); } } diff --git a/web/src/main/java/com/zhehekeji/web/service/InitService.java b/web/src/main/java/com/zhehekeji/web/service/InitService.java index 98eb516..94670c9 100644 --- a/web/src/main/java/com/zhehekeji/web/service/InitService.java +++ b/web/src/main/java/com/zhehekeji/web/service/InitService.java @@ -119,7 +119,7 @@ public class InitService implements ApplicationRunner { } }else if(configProperties.getServerMode() == 3){} // TaskDelayExecutor.runMp4DownloadExecutor(); - streetController.closeLightSource(); +// streetController.closeLightSource(); cameras.forEach(camera -> { LoginThread loginThread = new LoginThread(camera); loginThread.start(); diff --git a/web/src/main/java/com/zhehekeji/web/service/LightSourceService.java b/web/src/main/java/com/zhehekeji/web/service/LightSourceService.java index a0e4c2f..f0622c9 100644 --- a/web/src/main/java/com/zhehekeji/web/service/LightSourceService.java +++ b/web/src/main/java/com/zhehekeji/web/service/LightSourceService.java @@ -3,6 +3,7 @@ package com.zhehekeji.web.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zhehekeji.web.entity.LightSource; import com.zhehekeji.web.mapper.LightSourceMapper; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -15,6 +16,7 @@ import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.List; +@Slf4j @Service public class LightSourceService { @@ -81,4 +83,64 @@ public class LightSourceService { } } + + + public static void lightRelayController(String ip, Integer port, Integer stat) { + Socket socket = new Socket(); + OutputStream os = null; + InputStream is = null; + try { + socket.connect(new InetSocketAddress(ip, port), 3000); + os = socket.getOutputStream(); + is = socket.getInputStream(); + socket.setSoTimeout(3000); + // 开灯: 01 05 00 00 FF 00 8C 3A,关灯: 01 05 00 00 FF 01 4D FA + byte[] cmd = stat != null && stat == 1 + ? new byte[]{0x01, 0x05, 0x00, 0x00, (byte) 0xFF, 0x00, (byte) 0x8C, 0x3A} + : new byte[]{0x01, 0x05, 0x00, 0x00, (byte) 0x00, 0x00, (byte)0xCD, (byte) 0xCA}; + os.write(cmd); + os.flush(); + // 读取返回,判断是否成功(返回帧通常与发送帧一致) + byte[] resp = new byte[8]; + int len = is.read(resp); + if (len > 0) { + log.info("[lightRelayController] ip={}, port={}, stat={}, 发送={}, 返回={}", + ip, port, stat, toHex(cmd), toHex(resp, len)); + } + } catch (IOException e) { + log.error("[lightRelayController] 控制失败, ip={}, port={}, stat={}", ip, port, stat, e); + } finally { + if (os != null) { + try { + os.close(); + } catch (IOException e) { + log.error("[lightRelayController] 关闭输出流失败", e); + } + } + if (is != null) { + try { + is.close(); + } catch (IOException e) { + log.error("[lightRelayController] 关闭输入流失败", e); + } + } + try { + socket.close(); + } catch (IOException e) { + log.error("[lightRelayController] 关闭socket失败", e); + } + } + } + + private static String toHex(byte[] data) { + return toHex(data, data.length); + } + + private static String toHex(byte[] data, int len) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < len; i++) { + sb.append(String.format("%02X ", data[i])); + } + return sb.toString().trim(); + } }