前言

本来一个很简单的SDK接口对接,折腾了好久;总结下原因有:

海康的SDK底层使用C++写的,我不熟悉C++;
海康Java源码示例写的是一个Swing桌面应用,我需要的是嵌入到web项目;
海康《设备网络SDK使用手册》中的示例是用C++写的;并且会出现使用手册和Java源码示例版本不匹配的情况(用手册版本高于Java源码示例版)  
我的需求

使用海康认证对面设备在刷身份证和人脸识别通过后,取到身份证信息和人脸照片并且传到页面上。
代码处理
1.将SDK开发包【库文件】里的HCNetSDK.dll、HCCore.dll、PlayCtrl.dll、SuperRender.dll、AudioRender.dll、HCNetSDKCom文件夹、ssleay32.dll、libeay32.dll文件均要加载到程序里面,【HCNetSDKCom文件夹】(包含里面的功能组件dll库文件)需要和HCNetSDK.dll、HCCore.dll一起加载,放在同一个目录下(我的事springboot项目,放在resources目录下),且HCNetSDKCom文件夹名不能修改。
2.HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(“E:\project\renliantext\src\main\resources\lib\HCNetSDK”, HCNetSDK.class);修改HCnetSDK的引入路径。
3.将路径:将Demo示例\4- Java 开发示例\2-报警布防监听\AlarmJavaDemo\src\alarmjavademo的demo包移植过来并且解决报错信息,就是导入包的问题 手动引入jar包或者从MAVEN再导入就好
4,写Service类,调用接口进行注册,布防。布防成功后设置报警回调函数
5,写serviceimp类,就是报警回调函数的实现在里面取到想要的数据。
下面是代码
Service类源码 里面有main方法 可以先进行测试看时候可以注册成功已经设置回到函数成功

 package com.jeeplus.modules.xwhj.haikang.service;import com.jeeplus.modules.xwhj.haikang.HCNetSDK;
import com.jeeplus.modules.xwhj.haikang.Haikangimp;
import org.springframework.stereotype.Service;import javax.swing.*;
import java.util.Timer;
import java.util.TimerTask;@Service
public class Haikang {static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
static  HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();//设备登录信息
static HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();//设备信息
static String m_sDeviceIP="192.168.19.249";//已登录设备的IP地址
static String m_sUsername="admin";//设备用户名
static String m_sPassword="xwkj0713";//设备密码static int lUserID;//用户句柄
static int lAlarmHandle;//报警布防句柄
static int lListenHandle;//报警监听句柄/*  FMSGCallBack fMSFCallBack;//报警回调函数实现
AlarmJavaDemoView.FMSGCallBack_V31 fMSFCallBack_V31;*///报警回调函数实现public void logintext() {//GEN-FIRST:event_jButtonLoginActionPerformedhCNetSDK.NET_DVR_Init();//注册之前先注销已注册的用户,预览情况下不可注销if (lUserID > -1) {//先注销hCNetSDK.NET_DVR_Logout(lUserID);lUserID = -1;}//注册m_sDeviceIP = "192.168.19.249";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());m_sUsername = "admin";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());m_sPassword ="xwkj0713";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 =8000;lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);if (lUserID == -1) {JOptionPane.showMessageDialog(null, "false,错误号:" +  hCNetSDK.NET_DVR_GetLastError());} else {JOptionPane.showMessageDialog(null, "success");}}/*public static void main(String[] args){*//* while (1>0){System.out.println("~");}*//*
};*/public void initMemberFlowUpload(){// 初始化hCNetSDK.NET_DVR_Init();//设置连接时间与重连时间hCNetSDK.NET_DVR_SetConnectTime(2000, 1);hCNetSDK.NET_DVR_SetReconnect(10000, true);// 注册设备-登录参数,包括设备地址、登录用户、密码等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());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());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 = 8000;m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是//设备信息, 输出参数final int  lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo,m_strDeviceInfo);System.out.println("lUserID.size-->" + lUserID);if(lUserID< 0){System.out.println("hCNetSDK.NET_DVR_Login_V30()"+"\n" +hCNetSDK.NET_DVR_GetErrorMsg(null));hCNetSDK.NET_DVR_Cleanup();System.out.println("注册失败");return;}//设置报警回调函数boolean  callflag = hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(new Haikangimp(),null );if(callflag){System.out.println("callback----success+设置回调函数成功");}//启用布防-其他报警布防参数不需要设置,不支持HCNetSDK.NET_DVR_SETUPALARM_PARAM lpSetupParam = new HCNetSDK.NET_DVR_SETUPALARM_PARAM();lpSetupParam.byLevel=0;lpSetupParam.write();final   int lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID,lpSetupParam);if (lAlarmHandle< 0){System.out.println("NET_DVR_SetupAlarmChan_V41 error, %d\n"+hCNetSDK.NET_DVR_GetLastError());hCNetSDK.NET_DVR_Logout(lUserID);hCNetSDK.NET_DVR_Cleanup();System.out.println("布防失败");}else {System.out.println("bufangsuccess++布防成功");}//等待过程中,如果设备上传报警信息,在报警回调函数里面接收和处理报警信息Timer timer =new Timer();// 实例化Timer类timer.schedule(new TimerTask() {public void run() {//撤销布防上传通道if (! hCNetSDK.NET_DVR_CloseAlarmChan_V30(lAlarmHandle)){System.out.println("! hCNetSDK.NET_DVR_CloseAlarmChan_V31(lAlarmHandle)\n"+ hCNetSDK.NET_DVR_GetLastError() +"\n" +hCNetSDK.NET_DVR_GetErrorMsg(null) );hCNetSDK.NET_DVR_Logout(lUserID);hCNetSDK. NET_DVR_Cleanup();return;}//注销用户hCNetSDK.NET_DVR_Logout(lUserID);//释放SDK资源hCNetSDK.NET_DVR_Cleanup();this.cancel();System.gc();//主动回收垃圾}}, 100 * 60 * 1000 );// 这里毫秒}}

源码2报警回调函数实现

package com.jeeplus.modules.xwhj.haikang;
import com.jeeplus.common.utils.CacheUtils;
import com.jeeplus.modules.xwhj.familyinfo.entity.TFamilyinfo;
import com.sun.jna.Pointer;import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;public class Haikangimp implements HCNetSDK.FMSGCallBack_V31 {@Override
public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser ) {TFamilyinfo tFamilyinfo=new TFamilyinfo();String sAlarmType = new String();String[] newRow = new String[3];Date today = new Date();DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");String[] sIP = new String[2];switch (lCommand){case HCNetSDK.COMM_ID_INFO_ALARM: ///身份证信息*/HCNetSDK.NET_DVR_ID_CARD_INFO_ALARM strIDCardInfo = new HCNetSDK.NET_DVR_ID_CARD_INFO_ALARM();strIDCardInfo.write();Pointer pIDCardInfo = strIDCardInfo.getPointer();pIDCardInfo.write(0, pAlarmInfo.getByteArray(0, strIDCardInfo.size()), 0, strIDCardInfo.size());strIDCardInfo.read();sAlarmType = sAlarmType + ":门禁身份证刷卡信息,身份证号码:" + new String(strIDCardInfo.struIDCardCfg.byIDNum).trim() + ",姓名:" +new String(strIDCardInfo.struIDCardCfg.byName).trim() + ",报警主类型:" + strIDCardInfo.dwMajor + ",报警次类型:" + strIDCardInfo.dwMinor;String s =new String(strIDCardInfo.struIDCardCfg.byName).trim();/*System.out.println(sAlarmType);*/newRow[0] = dateFormat.format(today);String name=new String(strIDCardInfo.struIDCardCfg.byName).trim();String cardnum=new String(strIDCardInfo.struIDCardCfg.byIDNum).trim();String address=new String(strIDCardInfo.struIDCardCfg.byAddr).trim();tFamilyinfo.setHjyhm(name);tFamilyinfo.setZjhm(cardnum);tFamilyinfo.setJtmx(address);//报警类型newRow[1] = sAlarmType;//报警设备IP地址sIP = new String(pAlarmer.sDeviceIP).split("\0", 2);newRow[2] = sIP[0];//身份证图片if (strIDCardInfo.dwPicDataLen > 0) {SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");String newName = sf.format(new Date());FileOutputStream fout;try {String filename ="D:\\Program Files\\TortoiseSVN\\bin\\xbhj\\userfiles\\1\\xwhj\\" +newName + "_IDInfoPic.jpg";fout = new FileOutputStream(filename);//将字节写入文件long offset = 0;ByteBuffer buffers = strIDCardInfo.pPicData.getByteBuffer(offset, strIDCardInfo.dwPicDataLen);byte[] bytes = new byte[strIDCardInfo.dwPicDataLen];buffers.rewind();buffers.get(bytes);fout.write(bytes);fout.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (strIDCardInfo.dwCapturePicDataLen > 0) {SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");String newName = sf.format(new Date());FileOutputStream fout;try {String filename = "D:\\Program Files\\TortoiseSVN\\bin\\xbhj\\userfiles\\1\\xwhj\\"  +newName + "_IDInfoCapturePic.jpg";tFamilyinfo.setYhzp(filename);fout = new FileOutputStream(filename);//将字节写入文件long offset = 0;ByteBuffer buffers = strIDCardInfo.pCapturePicData.getByteBuffer(offset, strIDCardInfo.dwCapturePicDataLen);byte[] bytes = new byte[strIDCardInfo.dwCapturePicDataLen];buffers.rewind();buffers.get(bytes);fout.write(bytes);fout.close();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}CacheUtils.put("hkidcard",tFamilyinfo);}break;}return true;}}

以上就是全部的代码里 里面有我的项目里的一些实体类可以忽略不计。改成你自己的就好了 遇到问题的小伙伴可以看下 提供一个思路 ,毕竟对接的时候我也是一脸懵逼 研究了一段时间看到别人写的一些东西才调通设备,希望能给其他人一些帮助~~就这吧 加油了嘿嘿 = =

海康威视SDKjava二次开发身份证人脸识别相关推荐

  1. 项目总结25:海康威视SDK-Java二次开发-客流量分析

    项目总结25:海康威视SDK-Java二次开发-客流量分析 前言 本来一个很简单的SDK接口对接,折腾了好久:总结下原因有: 海康的SDK底层使用C++写的,我不熟悉C++: 海康Java源码示例写的 ...

  2. 1、华为hilens二次开发_人脸识别技能实现

    华为hilens二次开发_人脸识别 华为hilens二次开发_人脸识别 1.找到技能文件所在位置 2.hilens管理控制台创建技能 3.配置路径说明: 华为hilens二次开发_人脸识别 通过技能中 ...

  3. 微信小程序开发工具结合腾讯云开发AI人脸识别和身份证识别——基于腾讯云开发者实验项目

    微信小程序开发工具结合腾讯云开发AI人脸识别和身份证识别--基于腾讯云开发者实验项目 开通腾讯云相关权限(AI人脸识别,文字识别-身份证识别) 查看API密钥 部署微信小程序 成功演示 代码包 开通腾 ...

  4. 论文阅读笔记(二)——牛的人脸识别,能做到吗?

    论文阅读笔记(二)--牛的人脸识别,能做到吗? 论文简介 论文中文翻译:<牛的人脸识别,能做到吗?> 论文名称:<Face Recognition of Cattle: Can it ...

  5. 自动售卖系统开发系列——人脸识别自动售卖机三代BrotherSharp

    大纲: 售卖机三代BrotherSharp的简介 售卖机三代BrotherSharp的方案介绍    #系统整体组成    #软件平台    #硬件平台 售卖机三代BrotherSharp的实现过程 ...

  6. 程序员用「美貌」突破二维图像的人脸识别

    GitChat 作者:于航 原文: 如何利用"女装术"突破基于二维图像的人脸识别 关注微信公众号:「GitChat 技术杂谈」 一本正经的讲技术 [不要错过文末彩蛋] 首先声明,这 ...

  7. 海康威视SDK二次开发通过云台参数设置控制摄像机的位置

    海康威视SDK二次开发通过云台参数设置控制摄像机的位置 由于最近在开发海康威视摄像头,特此记录一下通过云台参数控制摄像机的位置,我这里是通过properties配置文件输入的参数,也可以不用配置文件, ...

  8. 强!一个Java开发的人脸识别系统,获取人脸68个关键点(附源码)

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 关注公众号后台回复pay或mall获取实战项目资料视频 点击此链接:多套SpringCloud/SpringBoot实 ...

  9. android 动态人脸识别码,Android开发中人脸识别(静态)

    知道没有妹纸,你们是不会看的.先放效果图 最近,项目中需要用到人脸识别,苦于无奈,各种百度,google有关Android开发中人脸识别的内容,最终发现Android官方自带的FaceDetector ...

  10. 自动售卖系统开发系列——人脸识别自动售卖机二代ChingTom

    大纲: 售卖机二代ChingTom的简介 售卖机二代ChingTom的方案介绍    #系统整体组成    #软件平台    #硬件平台 售卖机二代ChingTom的实现过程    #业务逻辑介绍   ...

最新文章

  1. 这可能是史上最全的Python算法集!
  2. 2013年阿里巴巴暑期实习招聘笔试题目(转)
  3. 热点推荐:秒杀系统架构分析与实战--转载
  4. 设计模式-创建型-抽象工厂
  5. 1026 Table Tennis (30 分) 未完成【难度: 难 / 知识点: 模拟】
  6. CTR深度学习模型之 DIEN(Deep Interest Evolution Network) 的理解与示例
  7. 微型计算机选用要点,微型计算机原理以及应用考试_new要点分析.doc
  8. 基于 java springboot+mybatis二手物品网站系统设计和实现
  9. JavaScript中对象的比较
  10. [转载]【深入Java虚拟机】之四:类加载机制
  11. 神经网络不胜语__M-P模型似可寻
  12. 我对秒杀在技术性上的一些看法
  13. PBOOT网站后太登录显示验证码错误的解决经验分享
  14. hfs explorer java_HFSExplorer0.23.1下载_HFS格式磁盘文件查看工具 含使用教程
  15. n阶方阵求逆c语言报告,n阶方阵求逆
  16. 移动 网络 连mysql_中国移动MySQL数据库优化最佳实践
  17. zcmu1064: 计算旅途时间
  18. word中套用表格样式在哪里_在Word2010中,关于“套用内置表格样式”的用法,下列说法正确的是_学小易找答案...
  19. Swift对象存储服务
  20. 如果一直都没钱,还要不要感谢贫穷?

热门文章

  1. chrome 插件开发指南
  2. 自己服务器搭建免费的进销存系统,云进销存服务器搭建
  3. MATLAB经纬度转化
  4. wsimport生成wsdl代码
  5. java自动填写网页表格,excel表格调用网页数据库-如何用Excel自动填写网页数据
  6. 如何制作一个优秀的PPT?
  7. 线性系统大作业——0.一阶和二阶倒立摆建模与控制系统设计
  8. 人工智能系列 之机器学习DBSCAN聚类算法
  9. JVM 垃圾回收机制和常见的垃圾回收器
  10. MyBatis缓存介绍