package com.ld.igds.protocol.hk.lpr; import com.ld.igds.protocol.hk.HKConstant; import com.ld.igds.protocol.hk.common.HCNetSDK; import com.ld.igds.protocol.hk.common.LPRCallBask_V31; import com.ld.igds.protocol.hk.common.OsSelect; import com.sun.jna.Native; import com.sun.jna.Pointer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 海康车牌识别监听控制,使用在宁夏石嘴山项目 */ public class AlarmLpr { Logger log = LoggerFactory.getLogger(AlarmLpr.class); static HCNetSDK hCNetSDK = null; static int[] lUserID = new int[]{0, 0, 0, 0, 0};//用户句柄 实现对设备登录 static int[] lAlarmHandle = new int[]{-1, -1, -1, -1, -1};//报警布防句柄 static int lListenHandle = -1;//报警监听句柄 static LPRCallBask_V31 fMSFCallBack_V31 = null; /** * SDK初始化 * * @return */ public String initSdk() { if (hCNetSDK == null) { synchronized (HCNetSDK.class) { String strDllPath = ""; try { if (OsSelect.isWindows()) strDllPath = HKConstant.SDK_DIR_WIN + "\\HCNetSDK.dll"; else if (OsSelect.isLinux()) strDllPath = HKConstant.SDK_DIR_LINUX + "/libhcnetsdk.so"; hCNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class); } catch (Exception ex) { // System.out.println("loadLibrary: " + strDllPath + " Error: " + ex.getMessage()); log.error("loadLibrary: " + strDllPath + " Error: " + ex.getMessage()); return "ERROR:loadLibrary: " + strDllPath + " Error: " + ex.getMessage(); } } } String logBasePath = HKConstant.getLogBasePath(OsSelect.isLinux()); //初始化 hCNetSDK.NET_DVR_Init(); //加载日志 hCNetSDK.NET_DVR_SetLogToFile(3, logBasePath, false); //设置报警回调函数 if (fMSFCallBack_V31 == null) { fMSFCallBack_V31 = new LPRCallBask_V31(); Pointer pUser = null; if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUser)) { log.error("设置回调函数失败!"); return "ERROR:设置回调函数失败!"; } else { log.debug("设置回调函数失败!"); } } //配置警告监听 HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG struNET_DVR_LOCAL_GENERAL_CFG = new HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG(); struNET_DVR_LOCAL_GENERAL_CFG.byAlarmJsonPictureSeparate = 1; //设置JSON透传报警数据和图片分离 struNET_DVR_LOCAL_GENERAL_CFG.write(); Pointer pStrNET_DVR_LOCAL_GENERAL_CFG = struNET_DVR_LOCAL_GENERAL_CFG.getPointer(); hCNetSDK.NET_DVR_SetSDKLocalCfg(17, pStrNET_DVR_LOCAL_GENERAL_CFG); return HKConstant.RESULT_SUCCESS; } /** * @param index 登陆顺序 默认0 -4 同时只能登陆5个设备,每个设备登陆的顺序,人为控制 * @param ip * @param port * @param userName * @param pwd * @return */ public String login(int index, String ip, int port, String userName, String pwd) { //登陆 String msg = Login_V(index, ip, (short) port, userName, pwd); if (!HKConstant.RESULT_SUCCESS.equals(msg)) { return msg; } //启动事件监听 msg = SetAlarm_V(index, ip, port); return msg; } /** * 退出 * * @param ip * @param port * @return */ public String logout(int index, String ip, int port) { int i = index; if (lAlarmHandle[i] > -1) { if (!hCNetSDK.NET_DVR_CloseAlarmChan(lAlarmHandle[i])) { log.debug(ip + ":" + port + "撤防成功"); } } if (lListenHandle > -1) { if (!hCNetSDK.NET_DVR_StopListen_V30(lListenHandle)) { log.debug(ip + ":" + port + "停止监听成功"); } } if (hCNetSDK.NET_DVR_Logout(lUserID[i])) { log.debug(ip + ":" + port + "注销成功"); } hCNetSDK.NET_DVR_Cleanup(); return HKConstant.RESULT_SUCCESS; } public String Login_V(int i, String ip, short port, String user, String psw) { //注册 HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();//设备登录信息 HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();//设备信息 String m_sDeviceIP = ip;//设备ip地址 m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN]; System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length()); String m_sUsername = user;//设备用户名 m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN]; System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length()); String m_sPassword = psw;//设备密码 m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN]; System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length()); m_strLoginInfo.wPort = port; m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是 // m_strLoginInfo.byLoginMode=1; //ISAPI登录 m_strLoginInfo.write(); lUserID[i] = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo); if (lUserID[i] == -1) { log.error("ERROR:登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError()); return "ERROR:登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError(); } log.info(ip + ":车牌识别设备登录成功!"); return HKConstant.RESULT_SUCCESS; } public String SetAlarm_V(int index, String ip, int port) { if (lAlarmHandle[index] < 0) { //尚未布防,需要布防 //报警布防参数设置 HCNetSDK.NET_DVR_SETUPALARM_PARAM m_strAlarmInfo = new HCNetSDK.NET_DVR_SETUPALARM_PARAM(); m_strAlarmInfo.dwSize = m_strAlarmInfo.size(); m_strAlarmInfo.byLevel = 1; //布防等级 0 一级,1二级 m_strAlarmInfo.byAlarmInfoType = 1; // 智能交通报警信息上传类型:0- 老报警信息(NET_DVR_PLATE_RESULT),1- 新报警信息(NET_ITS_PLATE_RESULT) m_strAlarmInfo.byDeployType = 0; //布防类型:0-客户端布防,1-实时布防 m_strAlarmInfo.write(); lAlarmHandle[index] = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID[index], m_strAlarmInfo); log.debug("lAlarmHandle: " + lAlarmHandle[index]); if (lAlarmHandle[index] == -1) { log.error("ERROR:布防失败,错误码为" + hCNetSDK.NET_DVR_GetLastError()); return "ERROR:布防失败,错误码为" + hCNetSDK.NET_DVR_GetLastError(); } else { log.debug(ip + ":" + port + " 布防成功"); } } else { log.warn(ip + ":" + port + " 设备已经布防,请先撤防!"); } return HKConstant.RESULT_SUCCESS; } }