项目需求:

需要获取刷脸的流水记录,参考是主动获取设备事件SDK

步骤流程

连接设备----建立获取设备事件长连接------成功后就可以获取到设备事件进行其余的逻辑处理

1、连接设备

注意:HCNetSDK.java 的第33行[大概在这个位置]

HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HCNetDevicePro.initHcnetsdkDllPath(),HCNetSDK.class);
/*** HCNetSDK.dll初始化* @return HCNETSDK_DLL_PATH*/
public static String initHcnetsdkDllPath(){String path = (HCNetDeviceUtil.class.getResource("/HCNetSDK/HCNetSDK.dll").getPath()).replaceAll("%20", " ").substring(1).replace("/","\\");try {HCNETSDK_DLL_PATH = java.net.URLDecoder.decode(path, "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}System.out.println(HCNETSDK_DLL_PATH);return HCNETSDK_DLL_PATH;
}

这个是加载HCNetSDK.dll文件使用,根据个人项目存放的实际路径进行配置

设备连接方法

其中我把设备连接需要的ip、port、username、password全部写死初始化[因为我是测试阶段]

/*** 初始化连接设备所需要的信息*/
HCNDeviceEntity hcnDeviceEntity = new HCNDeviceEntity();
 /*** 设备登陆方法* @return true代表连接设备成功 false代表连接设备失败*/public boolean loginDevice(){//初始化HCNetSDKboolean status = hcNetSDK.NET_DVR_Init();if (status){System.out.println("初始化成功!");}else{System.out.println("初始化失败:"+hcNetSDK.NET_DVR_GetCardLastError_Card());}// 设备信息的参数结构体HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();NativeLong lDeviceID = hcNetSDK.NET_DVR_Login_V30(hcnDeviceEntity.getIp(),hcnDeviceEntity.getPort(),hcnDeviceEntity.getUsername(),hcnDeviceEntity.getPassword(),m_strDeviceInfo);lUserID = lDeviceID.intValue();if (lUserID == -1){System.out.println("=============设备登陆失败========lUserID:"+lUserID);// 获取错误码 [具体查看HCNetSDK.java 全局错误码]int error = hcNetSDK.NET_DVR_GetLastError();if (error == 7){System.out.println("连接服务器失败");}return false;}
//        HCNetSDK.NET_DVR_WORKSTATE_V30 devwork=new HCNetSDK.NET_DVR_WORKSTATE_V30();
//        if(!hcNetSDK.NET_DVR_GetDVRWorkState_V30(lDeviceID, devwork)){
//            //返回Boolean值,判断是否获取设备能力
//            System.out.println("返回设备状态失败");
//            return false;
//        }
//        System.out.println("------------正确-----------------");return true;}

然后就是建立长连接

/*** 调用设备事件*/
public void getDeviceCase() {Map<String,String> eventMap;// 储存事件信息的map// 调用获取设备事件长连接HCNetSDK.NET_DVR_ACS_EVENT_COND_V50 struAcsEventCond = new HCNetSDK.NET_DVR_ACS_EVENT_COND_V50();struAcsEventCond.read();struAcsEventCond.dwSize = struAcsEventCond.size();struAcsEventCond.dwMajor = 5;// 5代表event事件struAcsEventCond.dwMinor = 0x4b;// 代表刷脸成功struAcsEventCond.struStartTime = getDvrStruTime(StruTimeEnum.STRAT.toString());// ****必须要struAcsEventCond.struEndTime = getDvrStruTime(StruTimeEnum.END.toString());// ***必须要struAcsEventCond.write();Pointer ptrStruEventCond = struAcsEventCond.getPointer();lHandle = hcNetSDK.NET_DVR_StartRemoteConfig(lUserID,HCNetSDK.NET_DVR_GET_ACS_EVENT,ptrStruEventCond,struAcsEventCond.size(),null,null);if (lHandle == -1){System.out.println("建立获取设备事件长连接失败,错误码为"+hcNetSDK.NET_DVR_GetLastError());return;}else{System.out.println("建立获取设备事件连接成功!"+lHandle);}// 获取设备详细事件开始HCNetSDK.NET_DVR_ACS_EVENT_CFG_V50 struEventCFG = new HCNetSDK.NET_DVR_ACS_EVENT_CFG_V50();struEventCFG.read();struEventCFG.dwSize = struEventCFG.size();struEventCFG.write();while(true){dwState = hcNetSDK. NET_DVR_GetNextRemoteConfig(lHandle, struEventCFG.getPointer(), struEventCFG.size());struEventCFG.read();if (dwState == -1){System.out.println("NET_DVR_GetNextRemoteConfig接口调用失败,错误码:" + hcNetSDK.NET_DVR_GetLastError());continue;}else if (dwState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_NEED_WAIT){// 配置等待System.out.println("==========配置等待==============");try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}continue;}else if (dwState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_FAILED){// 获取事件失败System.out.println("===============获取设备事件失败=======================");break;} else if(dwState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_EXCEPTION)  {// 获取事件异常System.out.println("===============获取设备事件异常=======================");break;}else if (dwState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS){// 获取设备事件成功eventMap = new HashMap<>(16);eventMap.put("employeeNo",byteArrayToStr(struEventCFG.struAcsEventInfo.byEmployeeNo));eventMap.put("cardNo",byteArrayToStr(struEventCFG.struAcsEventInfo.byCardNo));eventMap.put("struTime",changeTimeFormat(struEventCFG.struTime));eventList.add(eventMap);continue;}else if(dwState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_FINISH) {// 获取设备事件信息完成System.out.println("=============获取设备事件完成================");break;}}
}

获取设备事件完成后需要断开长连接,释放sdk资源

/*** 停止长连接*/
public void stopRemote(){if(!hcNetSDK.NET_DVR_StopRemoteConfig(lHandle)){System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + hcNetSDK.NET_DVR_GetLastError());}else{System.out.println("NET_DVR_StopRemoteConfig接口成功");}boolean cleanUp = hcNetSDK.NET_DVR_Cleanup();if (cleanUp){System.out.println("释放SDK成功");}else{System.out.println("释放SDK失败");}
}

其中的一些结构体放在HCNetSDK里面

//NET_DVR_Login_V30()参数结构
public static class NET_DVR_DEVICEINFO_V30 extends Structure
{public  byte[] sSerialNumber = new byte[SERIALNO_LEN];  //序列号public  byte byAlarmInPortNum;             //报警输入个数public  byte byAlarmOutPortNum;            //报警输出个数public  byte byDiskNum;              //硬盘个数public  byte byDVRType;              //设备类型, 1:DVR 2:ATM DVR 3:DVS ......public  byte byChanNum;              //模拟通道个数public  byte byStartChan;                 //起始通道号,例如DVS-1,DVR - 1public  byte byAudioChanNum;                //语音通道数public  byte byIPChanNum;               //最大数字通道个数public  byte[] byRes1 = new byte[24];               //保留
}
int  NET_DVR_GET_ACS_EVENT = 2514;// 设备事件获取[命令码]
public static final int NET_SDK_EMPLOYEE_NO_LEN = 32;  // 编号长度
//状态码
int NET_SDK_GET_NEXT_STATUS_SUCCESS = 1000;// 成功读取到数据,处理完本次数据后需要再次调用NET_DVR_GetNextRemoteConfig获取下一条数据
int NET_SDK_GET_NEXT_STATUS_NEED_WAIT = 1001;// 需等待设备发送数据,继续调用NET_DVR_GetNextRemoteConfig
int NET_SDK_GET_NEXT_STATUS_FINISH = 1002; // 数据全部读取完,可调用NET_DVR_StopRemoteConfig结束长连接
int NET_SDK_GET_NEXT_STATUS_FAILED = 1003; // 读取失败,可调用NET_DVR_StopRemoteConfig结束长连接
int NET_SDK_GET_NEXT_STATUS_EXCEPTION = 1004;// 读取异常,可调用NET_DVR_StopRemoteConfig结束长连接/* V50参数版本 [设备时间主结构体]*/
class NET_DVR_ACS_EVENT_COND_V50 extends Structure{public int dwSize;public int dwMajor; //报警主类型,参考事件上传宏定义,0-全部public int dwMinor; //报警次类型,参考事件上传宏定义,0-全部public NET_DVR_TIME struStartTime; //开始时间public NET_DVR_TIME struEndTime; //结束时间public byte[] byCardNo = new byte[ACS_CARD_NO_LEN]; //卡号public byte[] byName = new byte[NAME_LEN]; //持卡人姓名public byte byPicEnable; //是否带图片,0-不带图片,1-带图片public byte[] byRes2 = new byte[3]; //保留public int dwBeginSerialNo; //起始流水号(为0时默认全部)public int dwEndSerialNo; //结束流水号(为0时默认全部)public byte[] byRes = new byte[244]; //保留
}/*设备事件详细信息结构体*/
class NET_DVR_ACS_EVENT_DETAIL_V50 extends Structure{public int dwSize;public byte[] byCardNo = new byte[ACS_CARD_NO_LEN]; //卡号(mac地址),为0无效public byte byCardType; //卡类型,1-普通卡,2-残疾人卡,3-黑名单卡,4-巡更卡,5-胁迫卡,6-超级卡,7-来宾卡,8-解除卡,为0无效public byte byWhiteListNo; //白名单单号,1-8,为0无效public byte byReportChannel; //报告上传通道,1-布防上传,2-中心组1上传,3-中心组2上传,为0无效public byte byCardReaderKind; //读卡器属于哪一类,0-无效,1-IC读卡器,2-身份证读卡器,3-二维码读卡器,4-指纹头public int dwCardReaderNo; //读卡器编号,为0无效public int dwDoorNo; //门编号(楼层编号),为0无效public int dwVerifyNo; //多重卡认证序号,为0无效public int dwAlarmInNo;  //报警输入号,为0无效public int dwAlarmOutNo; //报警输出号,为0无效public int dwCaseSensorNo; //事件触发器编号public int dwRs485No;    //RS485通道号,为0无效public int dwMultiCardGroupNo; //群组编号public short wAccessChannel;    //人员通道号public byte byDeviceNo; //设备编号,为0无效(有效范围1-255)public byte byDistractControlNo;//分控器编号,为0无效public int dwEmployeeNo; //工号,为0无效public short wLocalControllerID; //就地控制器编号,0-门禁主机,1-64代表就地控制器public byte byInternetAccess; //网口ID:(1-上行网口1,2-上行网口2,3-下行网口1)public byte byType;     //防区类型,0:即时防区,1-24小时防区,2-延时防区 ,3-内部防区,4-钥匙防区 5-火警防区 6-周界防区 7-24小时无声防区  8-24小时辅助防区,9-24小时震动防区,10-门禁紧急开门防区,11-门禁紧急关门防区 0xff-无public byte[] byMACAddr = new byte[MACADDR_LEN]; //物理地址,为0无效public byte bySwipeCardType;//刷卡类型,0-无效,1-二维码public byte byRes2;public int dwSerialNo;public byte byChannelControllerID;public byte byChannelControllerLampID;public byte byChannelControllerIRAdaptorID;public byte byChannelControllerIREmitterID;public int dwRecordChannelNum;public Pointer pRecordChannelData;public byte byUserType;public byte byCurrentVerifyMode;public byte[] byRe2 = new byte[2];public byte[] byEmployeeNo = new byte[NET_SDK_EMPLOYEE_NO_LEN];public byte[] byRes = new byte[64];
}/*设备事件信息结构体*/
class NET_DVR_ACS_EVENT_CFG_V50 extends Structure{public int dwSize;public int dwMajor; //报警主类型,参考宏定义public int dwMinor; //报警次类型,参考宏定义public NET_DVR_TIME struTime; //时间public byte[] sNetUser = new byte[MAX_NAMELEN];//网络操作的用户名public NET_DVR_IPADDR_V50    struRemoteHostAddr;//远程主机地址public NET_DVR_ACS_EVENT_DETAIL_V50 struAcsEventInfo; //详细参数public int dwPicDataLen;   //图片数据大小,不为0是表示后面带数据public Pointer pPicData;public short wInductiveEventType;public byte byTimeType;public byte[] byRes = new byte[61];
}class NET_DVR_IPADDR_V50 extends Structure {public byte[] sIpV4 = new byte[16];public byte[] byIPv6 = new byte[128];public String toString() {return "NET_DVR_IPADDR.sIpV4: " + new String(sIpV4) + "\n" + "NET_DVR_IPADDR.byIPv6: " + new String(byIPv6) + "\n";}
}

海康威视人脸识别智能终端获取设备事件二次开发Java相关推荐

  1. 海康威视人脸识别设备对接(一)环境搭建

    需要对接海康威视人脸识别设备,这里选择明眸门禁,还有其他的没研究过 打开海康威视开放平台 https://open.hikvision.com/ 选择开放体系,一直选择到设备集成SDK 这里我选择设备 ...

  2. 实现暂停一秒输出的效果_HID控制器与海康威视人脸识别amp;测温门禁一体机实现联动的改造方法...

    本文介绍了传统门禁系统与海康威视人脸识别&测温门禁一体机通过修改线路实现人脸+测温+卡控制门禁系统的方法. v  实现功能: ü  可实现人脸认证+卡认证双重认证: ü  可实现体温控制,体温 ...

  3. 海康威视人脸识别门禁系统对接

    海康威视是一家专业的安防公司,提供各种安防产品和解决方案.人脸识别门禁系统是海康威视提供的一种用于对人脸进行识别的门禁系统.它可以用来确保门禁的安全性,并且可以通过摄像头捕捉到的人脸图像进行人脸识别. ...

  4. atitit.人脸识别的应用场景and使用最佳实践 java .net php

    atitit.人脸识别的应用场景and使用最佳实践 java .net php 1. 人脸识别的应用场景 1 2. 框架选型 JNI2OpenCV.dll and JavaCV 1 3. Url ap ...

  5. 实现图片中文的识别和获取图片上文字的坐标(java实现)

    实现图片中文的识别和获取图片上文字的坐标(java实现)            现在利用python来进行图片的文字识别较为普遍,但是如果我们利用常用的家庭电脑来识别,需要的时间比较长,达到20~30 ...

  6. Python 通过pytwain 2.0对含TWAIN 驱动的扫描仪设备进行二次开发,支持Python 3

    Python 通过pytwain 2.0对含TWAIN 驱动的扫描仪设备进行二次开发,支持Python 3 第一步,安装Pytwain2.0 通过 pip install pytwain 第二步,输入 ...

  7. SSM毕设项目基于人脸识别的景区人数统计系统zzr18(java+VUE+Mybatis+Maven+Mysql)

    SSM毕设项目基于人脸识别的景区人数统计系统zzr18(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HB ...

  8. 短信猫二次开发(java版)

    短信猫二次开发(java版) 短信猫 短信猫用于批量收/发短信或其它SIM卡服务. 短信猫与PC通过GSM无线网络交互. 交互过程可以分为三个层次: 1.物理层,即无线网络通信. 2.指令层,短信猫支 ...

  9. 吴恩达深度学习笔记(105)-人脸识别之面部验证与二分类

    https://www.toutiao.com/a6652895489354105351/ 面部验证与二分类(Face verification and binary classification) ...

最新文章

  1. CUDA Samples: approximate prior vbox layer
  2. 102页PPT,DeepMind强化学习最新进展,含图文、公式和代码
  3. JAVA多线程之中断机制(如何处理中断?)
  4. angular父组件通过@ViewChild 主动获取子组 件的数据和方法
  5. Cacti 插件中setup.php 文件的编写
  6. boost::mpi模块对 broadcast() 集合的测试
  7. hadoop读取mysql数据_Pyspark连接mysql、hive、hdfs 实例展示
  8. 程序人生:给所有程序员的27个建议,抽空看看吧!
  9. linux中nfs存储权限,NFS权限管理 - 麦苗的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. MFC的凸包实例【赶紧进来膜拜】
  11. python 简明教程
  12. DOS那一代的程序员现在都干嘛呢?
  13. Active Learning through label error statistical methods(ALSE)
  14. 增加网站的档次!网页设计师可在网站中加入暗色调
  15. 浏览器劫持解决:解决浏览器的捆绑问题
  16. sim的准确识别技术
  17. uniapp开发之自定义制作安卓app基座
  18. 如何打开EPUB文件
  19. linux 日志报警,linux日志报警怎么解决
  20. golang并发资源的竞争

热门文章

  1. 学生成绩等级用c语言,C语言实现学生成绩等级划分的方法实例
  2. Hive Table 操作命令汇总
  3. IOS 判断iPhone刘海屏
  4. 利用VSPD建立虚拟串口
  5. 输入身高体重测身材_Excel制作身高体重自测表
  6. 理解Pointers In C++:第一重
  7. abp更改为mysql_ABPZero系列教程之拼多多卖家工具 更改数据库为MySQL数据库
  8. [分享]深思--求索人的心智 就是求索长青基业[分享]深思--求索人的心智 就是求索长青基业...
  9. 常用格式校验正则表达式
  10. mybatis json转对象Object