海康球机断线重连

merge-requests/5/merge
yiming 4 years ago
parent af823eea7c
commit a3cf728ba4

@ -16,8 +16,6 @@ public class TestController {
@Resource @Resource
private TestService testService; private TestService testService;
@ApiOperation("新增") @ApiOperation("新增")
@GetMapping("/check/{id}/{leftRight}") @GetMapping("/check/{id}/{leftRight}")
public Result test(@PathVariable Integer id,@PathVariable Integer leftRight){ public Result test(@PathVariable Integer id,@PathVariable Integer leftRight){

@ -4,6 +4,8 @@ import java.time.LocalDateTime;
public interface CameraControlModule { public interface CameraControlModule {
boolean connectStatus(Integer cameraId);
/** /**
* *
*/ */

@ -22,6 +22,13 @@ import java.util.Timer;
@Slf4j @Slf4j
public class HikCameraControlModuleImpl implements CameraControlModule { 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);
}
/** /**
* *
*/ */

@ -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)));
}
}
}

@ -1,14 +1,10 @@
package com.zhehekeji.web.lib.hik; package com.zhehekeji.web.lib.hik;
import com.sun.jna.Pointer;
import com.zhehekeji.web.lib.CameraControlLoginModule; import com.zhehekeji.web.lib.CameraControlLoginModule;
import com.zhehekeji.web.lib.OrderInfo;
import com.zhehekeji.web.lib.joyware.NetSDKLib; import com.zhehekeji.web.lib.joyware.NetSDKLib;
import lombok.Data;
import lombok.extern.slf4j.Slf4j; 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 HCNetSDK hcNetsdk = HCNetSDK.INSTANCE;
public static int m_lUserID = -1;//用户句柄 static HikExceptionCallBack hikExceptionCallBack = new HikExceptionCallBack();
private static boolean bInit = false;
private static boolean bLogopen = false;
/** /**
* \if ENGLISH_LANG * \if ENGLISH_LANG
@ -35,31 +27,29 @@ public class HikLoginModuleImpl implements CameraControlLoginModule {
*/ */
public boolean init() { public boolean init() {
//public static boolean init(NetSDKLib.fDisConnect disConnect, NetSDKLib.fHaveReConnect haveReConnect) { //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) { if(!bInit) {
System.out.println("Initialize SDK failed"); log.error("hik Initialize SDK failed");
return false; 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 waitTime = 5000; //登录请求响应超时时间设置为5S
int tryTimes = 3; //登录时尝试建立链接1次 int tryTimes = 1000; //登录时尝试建立链接1次
hcNetsdk.NET_DVR_SetConnectTime(waitTime, tryTimes); hcNetsdk.NET_DVR_SetConnectTime(waitTime, tryTimes);
hcNetsdk.NET_DVR_SetReconnect(500,Boolean.TRUE);
return true; return true;
} }
/** //检测球机连接状态
* \if ENGLISH_LANG public Boolean connectStatus(int userId){
* CleanUp return hcNetsdk.NET_DVR_RemoteControl(userId,20005,null,0);
* \else
*
* \endif
*/
public static void cleanup() {
if(bInit) {
hcNetsdk.NET_DVR_Cleanup();
}
} }
/** /**
@ -96,26 +86,7 @@ public class HikLoginModuleImpl implements CameraControlLoginModule {
}else { }else {
log.info("hik login success"); log.info("hik login success");
} }
return new NetSDKLib.LLong(m_lUserID);
}
/** 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;
} }
} }

@ -16,7 +16,7 @@ public class CallBack {
public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
Integer cameraId = CameraConnMap.getCameraIdByLoginId(lLoginID); Integer cameraId = CameraConnMap.getCameraIdByLoginId(lLoginID);
log.error("球机:{}掉线",cameraId); 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) { public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
log.info("球机:{}重连,loginId:{}",pchDVRIP,m_hLoginHandle.longValue()); log.info("球机:{}重连,loginId:{}",pchDVRIP,m_hLoginHandle.longValue());
System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort); System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);
} }
} }

@ -18,6 +18,12 @@ import static com.zhehekeji.web.lib.joyware.JoywareLoginModuleImpl.mp4ReceiveCB;
@Slf4j @Slf4j
public class JoywareCameraControlModuleImpl implements CameraControlModule { public class JoywareCameraControlModuleImpl implements CameraControlModule {
//中威球机断线会自动直接重连!!,没有等待的心跳时间所以这里直接返回true
@Override
public boolean connectStatus(Integer cameraId) {
return true;
}
/** /**
* *
*/ */

@ -8,7 +8,10 @@ import com.zhehekeji.web.config.ConfigProperties;
import com.zhehekeji.web.entity.Camera; import com.zhehekeji.web.entity.Camera;
import com.zhehekeji.web.entity.CameraIO; import com.zhehekeji.web.entity.CameraIO;
import com.zhehekeji.web.entity.CameraIOConfig; 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.CameraControlModule;
import com.zhehekeji.web.lib.joyware.NetSDKLib;
import com.zhehekeji.web.mapper.CameraIOConfigMapper; import com.zhehekeji.web.mapper.CameraIOConfigMapper;
import com.zhehekeji.web.mapper.CameraIOMapper; import com.zhehekeji.web.mapper.CameraIOMapper;
import com.zhehekeji.web.mapper.CameraMapper; import com.zhehekeji.web.mapper.CameraMapper;
@ -48,10 +51,16 @@ public class CameraService {
private CameraControlModule cameraControlModule; private CameraControlModule cameraControlModule;
private CameraControlLoginModule cameraControlLoginModule;
public void setCameraControlModule(CameraControlModule cameraControlModule){ public void setCameraControlModule(CameraControlModule cameraControlModule){
this.cameraControlModule = cameraControlModule; this.cameraControlModule = cameraControlModule;
} }
public void setCameraLoginModule(CameraControlLoginModule cameraControlLoginModule){
this.cameraControlLoginModule = cameraControlLoginModule;
}
public Integer add(Camera camera) { public Integer add(Camera camera) {
camera.setUser(configProperties.getCameraConfig().getCameraUser()); camera.setUser(configProperties.getCameraConfig().getCameraUser());
camera.setPassword(configProperties.getCameraConfig().getCameraPassword()); camera.setPassword(configProperties.getCameraConfig().getCameraPassword());
@ -205,6 +214,10 @@ public class CameraService {
cameraIO.setUpdateTime(LocalDateTime.now()); cameraIO.setUpdateTime(LocalDateTime.now());
conver(cameraIO,type); conver(cameraIO,type);
ioMapper.updateById(cameraIO); ioMapper.updateById(cameraIO);
}
boolean ok = cameraControlModule.connectStatus(cameraId);
if(!ok){
} }
cameraControlModule.ptz(ptzId,cameraIO.getName(),cameraId); cameraControlModule.ptz(ptzId,cameraIO.getName(),cameraId);
log.info("设置 预置点 球机ID:{},预置点ID:{}", cameraId, ptzId); 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);
}
}
} }

@ -53,11 +53,14 @@ public class InitService implements ApplicationRunner {
@Bean @Bean
public CameraControlLoginModule cameraControlLoginModule(){ public CameraControlLoginModule cameraControlLoginModule(){
CameraControlLoginModule cameraControlLoginModule = null;
if(configProperties.getCameraConfig().getCameraType() == ConfigProperties.JOYWARE_CAMERA){ if(configProperties.getCameraConfig().getCameraType() == ConfigProperties.JOYWARE_CAMERA){
return new JoywareLoginModuleImpl(); cameraControlLoginModule = new JoywareLoginModuleImpl();
}else { }else {
return new HikLoginModuleImpl(); cameraControlLoginModule = new HikLoginModuleImpl();
} }
cameraService.setCameraLoginModule(cameraControlLoginModule);
return cameraControlLoginModule;
} }
@Bean @Bean
@ -76,10 +79,11 @@ public class InitService implements ApplicationRunner {
@Override @Override
public void run(ApplicationArguments args) throws Exception { public void run(ApplicationArguments args) throws Exception {
//球机登录 //球机登录
List<Camera> cameras = cameraMapper.selectByMap(new HashMap<>(0)); List<Camera> cameras = cameraMapper.selectByMap(new HashMap<>(0));
loginThread loginThread = new loginThread(cameras, configProperties.getCameraConfig().getCameraType()); loginThread loginThread = new loginThread(cameras);
loginThread.start(); loginThread.start();
//plc连接
if(configProperties.getServerMode() == 0){ if(configProperties.getServerMode() == 0){
log.info("PLC TCP MODE"); log.info("PLC TCP MODE");
//plc 连接状态初始化 //plc 连接状态初始化
@ -115,20 +119,15 @@ public class InitService implements ApplicationRunner {
List<Camera> cameras; List<Camera> cameras;
Integer cameraType; public loginThread(List<Camera> cameras){
public loginThread(List<Camera> cameras,Integer cameraType){
this.cameras = cameras; this.cameras = cameras;
this.cameraType = cameraType;
} }
@Override @Override
public void run() { public void run() {
cameras.forEach(camera -> { cameras.forEach(camera -> {
NetSDKLib.LLong lLong = cameraControlLoginModule().login(camera.getIp(),camera.getPort(),camera.getUser(),camera.getPassword()); cameraService.cameraLogin(camera);
if(lLong != null){
CameraConnMap.conn(camera.getId(),lLong);
}
}); });
} }
} }

@ -7,6 +7,7 @@ import com.zhehekeji.web.entity.*;
import com.zhehekeji.web.lib.*; import com.zhehekeji.web.lib.*;
import com.zhehekeji.web.mapper.*; import com.zhehekeji.web.mapper.*;
import com.zhehekeji.web.pojo.OrderVO; import com.zhehekeji.web.pojo.OrderVO;
import com.zhehekeji.web.service.ksec.KsecNettyClient;
import com.zhehekeji.web.service.sick.SickSocket; import com.zhehekeji.web.service.sick.SickSocket;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
@ -458,7 +459,7 @@ public class PlcService {
log.info("test endTime:{},time:{}millisecond",endTime,(endTime - startTime)); 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(); long startTime = System.currentTimeMillis();
Street street = streetService.getStreetByPlcId(plcCmdInfo.getPlcId()); 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); StockCheckRunnable stockCheckRunnable = new StockCheckRunnable(street,plcCmdInfo,cmdCode,stockMapper,path,checkLogMapper,configProperties.getScanCodeMode().getGoods(),wmsCode,wmsTrayCode,trayCode,trayCheck,configProperties);
threadPoolExecutor.execute(stockCheckRunnable); threadPoolExecutor.execute(stockCheckRunnable);
long end = System.currentTimeMillis(); long end = System.currentTimeMillis();
long s = end - startTime; long s = end - startTime;
log.info("time:{}millisecond",s); log.info("time:{}millisecond",s);
return true;
} }
} }

@ -104,7 +104,8 @@ public class KsecDecoder extends DelimiterBasedFrameDecoder {
if(ksecInfo.getData().getCmdName().equals("test")){ if(ksecInfo.getData().getCmdName().equals("test")){
plcService.kescTest6(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode()); plcService.kescTest6(plcCmdInfo,ksecInfo.getData().getCmdName(), dataInfo.getCode());
}else { }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); //plcService.recordStock(plcCmdInfo, dataInfo.getCode(), 0, 0);

Loading…
Cancel
Save