版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
前一段时间在HR系统中做了一个人脸识别考勤的模块,主要功能:设备注册,下发卡号与人脸,获取卡号与人脸,删除卡号与人脸,对设备布防,报警回调函数。
首先在Window上开发,我们项目的JDK是1.6(64位),所以必须要用Win64的SDK开发包,这个很重要,版本对不上,在调用HCNetSDK.dll这个库文件时会报错,现在开始开发。
1.先去海康官网下载最新的SDK 官网地址:https://www.hikvision.com/cn/,下载你JDK版本对应的SDK(里面包含Java的demo),你如果不知道你的JDK对应什么SDK,可以去找海康销售跟他要海康技术支持的邮箱,你在开发过程中所有遇到的问题都可以用邮件询问。
2.在你的项目中新建一个文件夹用来放置库文件,可以直接将SDK中的库文件一股脑全放进来,我这里就是全放进来的,如图:
3.将java的demo中的examples.jar和jna.jar加载到自己的项目中,将java的demo中HCNetSDK.java直接复制到自己的项目中,我们就是通过实现这个接口的方法来对设备进行操作。
4.根据sdk手册的信息建立相应的类,接口,回调函数,新建立的这些最好也放到HCNetSDK.java中。
图中红圈表示HCNetSDK.java要去加载HCNetSDK.dll文件
所以需要写一个路径加载类:HCNetSDKPath.java
package com.ykl; import java.io.UnsupportedEncodingException; public class HCNetSDKPath {	public static String dllPath;//HCNetSDK.dll 文件路径	public static void main(String[] args) {	String path = (HCNetSDKPath.class.getResource("/HCNetSDK/HCNetSDK.dll").getPath())	.replaceAll("%20", " ").substring(1).replace("/","\\"); System.out.println(path);	try {	dllPath = java.net.URLDecoder.decode(path, "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } System.out.println(dllPath);	} }
在自己的类中需要实例化HCNetSDK,具体写法是:HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
5.接下来写一个工具类,里面有调用设备的基础方法:HCNetDeviceUtil.java
package com.utils; import java.io.ByteArrayInputStream; import java.io.UnsupportedEncodingException; import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import com.ykl.FMSGCallBack_V31; public class HCNetDeviceUtil {	HCNetSDK hcNetSDK=HCNetSDK.INSTANCE;	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();//设备信息 static FMSGCallBack_V31 fMSFCallBack_V31;//报警回调函数实现类 FRemoteCfgCallBackCardGet fRemoteCfgCallBackCardGet;//获取卡参数回调函数实现类 FRemoteCfgCallBackCardSet fRemoteCfgCallBackCardSet;//下发卡回调函数实现类 FRemoteCfgCallBackFaceGet fRemoteCfgCallBackFaceGet;//获取人脸回调函数实现类 FRemoteCfgCallBackFaceSet fRemoteCfgCallBackFaceSet;//下发人脸回调函数实现类 //登录设备,设备会返回,唯一用户ID:lUserID public String loginDevice(String ip,String port,String userName,String password) {	//初始化SDK	boolean status = hcNetSDK.NET_DVR_Init();	if(status!=true) {	System.out.println("初始化失败:"+hcNetSDK.NET_DVR_GetCardLastError_Card());	}else {	System.out.println("初始化成功!");	}	//设置报警回调函数,这个函数将会上次人脸识别比对结果	if (fMSFCallBack_V31 == null){ fMSFCallBack_V31 = new FMSGCallBack_V31(); Pointer pUser = null; if (!hcNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUser)){ System.out.println("设置回调函数失败!"); } }	//注册 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 = userName;//设备用户名 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 = password;//设备密码 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 = (short)Integer.parseInt(port); m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是m_strLoginInfo.write(); int lUserID = hcNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo); if (lUserID == -1) { System.out.println( "注册失败,错误号:" + hcNetSDK.NET_DVR_GetLastError()); //这里自己做错误处理 } return lUserID+""; } //获取卡参数 public void GetCardInfo(int lUserID){ int iErr = 0; HCNetSDK.NET_DVR_CARD_CFG_COND m_struCardInputParam = new HCNetSDK.NET_DVR_CARD_CFG_COND(); m_struCardInputParam.dwSize = m_struCardInputParam.size(); m_struCardInputParam.dwCardNum = 0xffffffff; //查找全部 m_struCardInputParam.byCheckCardNo = 1; Pointer lpInBuffer = m_struCardInputParam.getPointer(); fRemoteCfgCallBackCardGet = new FRemoteCfgCallBackCardGet(); m_struCardInputParam.write(); HCNetSDK.MY_USER_DATA userData = new HCNetSDK.MY_USER_DATA(); userData.dwSize = userData.size(); userData.byteData = "1234567".getBytes(); Pointer pUserData = userData.getPointer(); userData.write(); int lHandle = hcNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_GET_CARD_CFG_V50, lpInBuffer, m_struCardInputParam.size(),fRemoteCfgCallBackCardGet, pUserData); if (lHandle