From a3cf728ba46ac5389dbfc1b1ecc977fdc70a6387 Mon Sep 17 00:00:00 2001 From: yiming Date: Mon, 11 Apr 2022 14:53:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=B7=E5=BA=B7=E7=90=83=E6=9C=BA=E6=96=AD?= =?UTF-8?q?=E7=BA=BF=E9=87=8D=E8=BF=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/TestController.java | 2 - .../web/lib/CameraControlModule.java | 2 + .../lib/hik/HikCameraControlModuleImpl.java | 7 +++ .../web/lib/hik/HikExceptionCallBack.java | 24 ++++++++ .../web/lib/hik/HikLoginModuleImpl.java | 59 +++++-------------- .../zhehekeji/web/lib/joyware/CallBack.java | 3 +- .../JoywareCameraControlModuleImpl.java | 6 ++ .../zhehekeji/web/service/CameraService.java | 30 ++++++++++ .../zhehekeji/web/service/InitService.java | 23 ++++---- .../com/zhehekeji/web/service/PlcService.java | 5 +- .../web/service/ksec/KsecDecoder.java | 3 +- 11 files changed, 103 insertions(+), 61 deletions(-) create mode 100644 web/src/main/java/com/zhehekeji/web/lib/hik/HikExceptionCallBack.java diff --git a/web/src/main/java/com/zhehekeji/web/controller/TestController.java b/web/src/main/java/com/zhehekeji/web/controller/TestController.java index d2e7469..506db15 100644 --- a/web/src/main/java/com/zhehekeji/web/controller/TestController.java +++ b/web/src/main/java/com/zhehekeji/web/controller/TestController.java @@ -16,8 +16,6 @@ public class TestController { @Resource private TestService testService; - - @ApiOperation("新增") @GetMapping("/check/{id}/{leftRight}") public Result test(@PathVariable Integer id,@PathVariable Integer leftRight){ diff --git a/web/src/main/java/com/zhehekeji/web/lib/CameraControlModule.java b/web/src/main/java/com/zhehekeji/web/lib/CameraControlModule.java index 70f8175..7c124a3 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/CameraControlModule.java +++ b/web/src/main/java/com/zhehekeji/web/lib/CameraControlModule.java @@ -4,6 +4,8 @@ import java.time.LocalDateTime; public interface CameraControlModule { + boolean connectStatus(Integer cameraId); + /** * 向上 */ diff --git a/web/src/main/java/com/zhehekeji/web/lib/hik/HikCameraControlModuleImpl.java b/web/src/main/java/com/zhehekeji/web/lib/hik/HikCameraControlModuleImpl.java index e505dd0..9447ac8 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/hik/HikCameraControlModuleImpl.java +++ b/web/src/main/java/com/zhehekeji/web/lib/hik/HikCameraControlModuleImpl.java @@ -22,6 +22,13 @@ import java.util.Timer; @Slf4j public class HikCameraControlModuleImpl implements CameraControlModule { + public boolean connectStatus(Integer cameraId){ + NetSDKLib.LLong userId = CameraConnMap.getConnId(cameraId); + + return HikLoginModuleImpl.hcNetsdk.NET_DVR_RemoteControl(userId.intValue(),20005,null,0); + + } + /** * 向上 */ diff --git a/web/src/main/java/com/zhehekeji/web/lib/hik/HikExceptionCallBack.java b/web/src/main/java/com/zhehekeji/web/lib/hik/HikExceptionCallBack.java new file mode 100644 index 0000000..aec408c --- /dev/null +++ b/web/src/main/java/com/zhehekeji/web/lib/hik/HikExceptionCallBack.java @@ -0,0 +1,24 @@ +package com.zhehekeji.web.lib.hik; + +import com.sun.jna.Pointer; +import com.zhehekeji.web.lib.CameraConnMap; +import com.zhehekeji.web.lib.joyware.NetSDKLib; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class HikExceptionCallBack implements HCNetSDK.FExceptionCallBack { + + @Override + public void invoke(int dwType, int lUserID, int lHandle, Pointer pUser) { + Integer cameraId =CameraConnMap.getCameraIdByLoginId(new NetSDKLib.LLong(lUserID)); + if(dwType == 32768){ + + log.error("hik disconnect,cameraId:{}", cameraId); + }else if(dwType == 32791){ + + log.info("hik reconnect,cameraId:{}", CameraConnMap.getCameraIdByLoginId(new NetSDKLib.LLong(lUserID))); + } + + } + +} diff --git a/web/src/main/java/com/zhehekeji/web/lib/hik/HikLoginModuleImpl.java b/web/src/main/java/com/zhehekeji/web/lib/hik/HikLoginModuleImpl.java index 9d6e6df..94dc28d 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/hik/HikLoginModuleImpl.java +++ b/web/src/main/java/com/zhehekeji/web/lib/hik/HikLoginModuleImpl.java @@ -1,14 +1,10 @@ package com.zhehekeji.web.lib.hik; +import com.sun.jna.Pointer; import com.zhehekeji.web.lib.CameraControlLoginModule; -import com.zhehekeji.web.lib.OrderInfo; import com.zhehekeji.web.lib.joyware.NetSDKLib; -import lombok.Data; import lombok.extern.slf4j.Slf4j; -import java.util.HashMap; -import java.util.Map; - /** * 海康 登陆接口实现 * 主要有 :初始化、登陆、登出功能 @@ -20,11 +16,7 @@ public class HikLoginModuleImpl implements CameraControlLoginModule { public static HCNetSDK hcNetsdk = HCNetSDK.INSTANCE; - public static int m_lUserID = -1;//用户句柄 - - private static boolean bInit = false; - private static boolean bLogopen = false; - + static HikExceptionCallBack hikExceptionCallBack = new HikExceptionCallBack(); /** * \if ENGLISH_LANG @@ -35,31 +27,29 @@ public class HikLoginModuleImpl implements CameraControlLoginModule { */ public boolean init() { //public static boolean init(NetSDKLib.fDisConnect disConnect, NetSDKLib.fHaveReConnect haveReConnect) { + Pointer pointer = null; - bInit = hcNetsdk.NET_DVR_Init(); + Boolean bInit = hcNetsdk.NET_DVR_Init(); if(!bInit) { - System.out.println("Initialize SDK failed"); + log.error("hik Initialize SDK failed"); return false; } + Boolean ok = hcNetsdk.NET_DVR_SetExceptionCallBack_V30(0,0,hikExceptionCallBack,pointer); + if(!ok){ + log.error("hik callback config error"); + } //设置登录超时时间和尝试次数,可选 int waitTime = 5000; //登录请求响应超时时间设置为5S - int tryTimes = 3; //登录时尝试建立链接1次 + int tryTimes = 1000; //登录时尝试建立链接1次 hcNetsdk.NET_DVR_SetConnectTime(waitTime, tryTimes); + hcNetsdk.NET_DVR_SetReconnect(500,Boolean.TRUE); return true; } - /** - * \if ENGLISH_LANG - * CleanUp - * \else - * 清除环境 - * \endif - */ - public static void cleanup() { - if(bInit) { - hcNetsdk.NET_DVR_Cleanup(); - } + //检测球机连接状态 + public Boolean connectStatus(int userId){ + return hcNetsdk.NET_DVR_RemoteControl(userId,20005,null,0); } /** @@ -96,26 +86,7 @@ public class HikLoginModuleImpl implements CameraControlLoginModule { }else { log.info("hik login success"); } - return new NetSDKLib.LLong(m_lUserID); - } - /** - * \if ENGLISH_LANG - * Logout Device - * \else - * 登出设备 - * \endif - */ - public static boolean logout() { - if(m_lUserID == -1) { - return false; - } - - boolean bRet = hcNetsdk.NET_DVR_Logout(m_lUserID); - if(bRet) { - m_lUserID = -1; - } - - return bRet; + return new NetSDKLib.LLong(m_lUserID); } } diff --git a/web/src/main/java/com/zhehekeji/web/lib/joyware/CallBack.java b/web/src/main/java/com/zhehekeji/web/lib/joyware/CallBack.java index 4904e2f..a37e232 100644 --- a/web/src/main/java/com/zhehekeji/web/lib/joyware/CallBack.java +++ b/web/src/main/java/com/zhehekeji/web/lib/joyware/CallBack.java @@ -16,7 +16,7 @@ public class CallBack { public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { Integer cameraId = CameraConnMap.getCameraIdByLoginId(lLoginID); log.error("球机:{}掉线",cameraId); - //CameraConnMap.disConn(cameraId); + CameraConnMap.disConn(cameraId); } } @@ -45,6 +45,7 @@ public class CallBack { public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) { log.info("球机:{}重连,loginId:{}",pchDVRIP,m_hLoginHandle.longValue()); System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort); + } } 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 8dffa15..fc2a64d 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 @@ -18,6 +18,12 @@ import static com.zhehekeji.web.lib.joyware.JoywareLoginModuleImpl.mp4ReceiveCB; @Slf4j public class JoywareCameraControlModuleImpl implements CameraControlModule { + //中威球机断线会自动直接重连!!,没有等待的心跳时间,所以这里直接返回true + @Override + public boolean connectStatus(Integer cameraId) { + return true; + } + /** * 向上 */ 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 4677895..5ca13ac 100644 --- a/web/src/main/java/com/zhehekeji/web/service/CameraService.java +++ b/web/src/main/java/com/zhehekeji/web/service/CameraService.java @@ -8,7 +8,10 @@ import com.zhehekeji.web.config.ConfigProperties; import com.zhehekeji.web.entity.Camera; import com.zhehekeji.web.entity.CameraIO; import com.zhehekeji.web.entity.CameraIOConfig; +import com.zhehekeji.web.lib.CameraConnMap; +import com.zhehekeji.web.lib.CameraControlLoginModule; import com.zhehekeji.web.lib.CameraControlModule; +import com.zhehekeji.web.lib.joyware.NetSDKLib; import com.zhehekeji.web.mapper.CameraIOConfigMapper; import com.zhehekeji.web.mapper.CameraIOMapper; import com.zhehekeji.web.mapper.CameraMapper; @@ -48,10 +51,16 @@ public class CameraService { private CameraControlModule cameraControlModule; + private CameraControlLoginModule cameraControlLoginModule; + public void setCameraControlModule(CameraControlModule cameraControlModule){ this.cameraControlModule = cameraControlModule; } + public void setCameraLoginModule(CameraControlLoginModule cameraControlLoginModule){ + this.cameraControlLoginModule = cameraControlLoginModule; + } + public Integer add(Camera camera) { camera.setUser(configProperties.getCameraConfig().getCameraUser()); camera.setPassword(configProperties.getCameraConfig().getCameraPassword()); @@ -205,6 +214,10 @@ public class CameraService { cameraIO.setUpdateTime(LocalDateTime.now()); conver(cameraIO,type); ioMapper.updateById(cameraIO); + } + boolean ok = cameraControlModule.connectStatus(cameraId); + if(!ok){ + } cameraControlModule.ptz(ptzId,cameraIO.getName(),cameraId); log.info("设置 预置点 球机ID:{},预置点ID:{}", cameraId, ptzId); @@ -244,5 +257,22 @@ 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 cameraLogin(Camera camera){ + + NetSDKLib.LLong lLong = cameraControlLoginModule.login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword()); + if(lLong != null){ + CameraConnMap.conn(camera.getId(),lLong); + } + } + } 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 84b9c9c..8e54a3e 100644 --- a/web/src/main/java/com/zhehekeji/web/service/InitService.java +++ b/web/src/main/java/com/zhehekeji/web/service/InitService.java @@ -53,11 +53,14 @@ public class InitService implements ApplicationRunner { @Bean public CameraControlLoginModule cameraControlLoginModule(){ + CameraControlLoginModule cameraControlLoginModule = null; if(configProperties.getCameraConfig().getCameraType() == ConfigProperties.JOYWARE_CAMERA){ - return new JoywareLoginModuleImpl(); + cameraControlLoginModule = new JoywareLoginModuleImpl(); }else { - return new HikLoginModuleImpl(); + cameraControlLoginModule = new HikLoginModuleImpl(); } + cameraService.setCameraLoginModule(cameraControlLoginModule); + return cameraControlLoginModule; } @Bean @@ -76,10 +79,11 @@ public class InitService implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { //球机登录 - List cameras = cameraMapper.selectByMap(new HashMap<>(0)); - loginThread loginThread = new loginThread(cameras, configProperties.getCameraConfig().getCameraType()); + loginThread loginThread = new loginThread(cameras); loginThread.start(); + + //plc连接 if(configProperties.getServerMode() == 0){ log.info("PLC TCP MODE"); //plc 连接状态初始化 @@ -115,20 +119,15 @@ public class InitService implements ApplicationRunner { List cameras; - Integer cameraType; - - public loginThread(List cameras,Integer cameraType){ + public loginThread(List cameras){ this.cameras = cameras; - this.cameraType = cameraType; + } @Override public void run() { cameras.forEach(camera -> { - NetSDKLib.LLong lLong = cameraControlLoginModule().login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword()); - if(lLong != null){ - CameraConnMap.conn(camera.getId(),lLong); - } + cameraService.cameraLogin(camera); }); } } diff --git a/web/src/main/java/com/zhehekeji/web/service/PlcService.java b/web/src/main/java/com/zhehekeji/web/service/PlcService.java index ffd66ea..6050f15 100644 --- a/web/src/main/java/com/zhehekeji/web/service/PlcService.java +++ b/web/src/main/java/com/zhehekeji/web/service/PlcService.java @@ -7,6 +7,7 @@ import com.zhehekeji.web.entity.*; import com.zhehekeji.web.lib.*; import com.zhehekeji.web.mapper.*; import com.zhehekeji.web.pojo.OrderVO; +import com.zhehekeji.web.service.ksec.KsecNettyClient; import com.zhehekeji.web.service.sick.SickSocket; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -458,7 +459,7 @@ public class PlcService { log.info("test endTime:{},time:{}millisecond",endTime,(endTime - startTime)); } - public void check(PlcCmdInfo plcCmdInfo,String cmdCode,String wmsCode,String wmsTrayCode){ + public Boolean check(PlcCmdInfo plcCmdInfo,String cmdCode,String wmsCode,String wmsTrayCode){ long startTime = System.currentTimeMillis(); Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId()); @@ -497,9 +498,11 @@ public class PlcService { } StockCheckRunnable stockCheckRunnable = new StockCheckRunnable(street,plcCmdInfo,cmdCode,stockMapper,path,checkLogMapper,configProperties.getScanCodeMode().getGoods(),wmsCode,wmsTrayCode,trayCode,trayCheck,configProperties); threadPoolExecutor.execute(stockCheckRunnable); + long end = System.currentTimeMillis(); long s = end - startTime; log.info("time:{}millisecond",s); + return true; } } diff --git a/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java b/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java index cfa3dce..719fe33 100644 --- a/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java +++ b/web/src/main/java/com/zhehekeji/web/service/ksec/KsecDecoder.java @@ -104,7 +104,8 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder { if(ksecInfo.getData().getCmdName().equals("test")){ plcService.kescTest6(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode()); }else { - plcService.check(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode(), dataInfo.getTrayCode()); + Boolean over = plcService.check(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode(), dataInfo.getTrayCode()); + ctx.writeAndFlush(ksecInfo); } //找到该货位的最后一张照片与现在的照片比照 //plcService.recordStock(plcCmdInfo, dataInfo.getCode(), 0, 0);