package com.ruoyi.HIKVISION.function; import com.ruoyi.HIKVISION.NetSDK.HCNetSDK; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import org.json.JSONException; import org.json.JSONObject; import java.io.*; import java.nio.ByteBuffer; import java.text.SimpleDateFormat; import java.util.Date; /** * 指纹管理:指纹采集,指纹下发,指纹信息查询,指纹删除 */ public final class FingerManage { /** * 采集指纹模块,采集指纹数据为二进制 * @param userID */ public static void fingerCapture(int userID) { HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_COND strFingerCond = new HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_COND(); strFingerCond.read(); strFingerCond.dwSize = strFingerCond.size(); strFingerCond.byFingerPrintPicType = 1; //指纹读卡器 strFingerCond.byFingerNo = 1; //指纹编号 strFingerCond.write(); int lGetFingerHandle = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_INFO, strFingerCond.getPointer(), strFingerCond.dwSize, null, null); if (lGetFingerHandle == -1) { System.out.println("建立采集指纹长连接失败,错误码为:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); return; } else { System.out.println("建立采集指纹长连接成功!"); } HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_CFG strFingerCfg = new HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_CFG(); strFingerCfg.dwSize=strFingerCfg.size(); strFingerCfg.write(); while (true) { int dwFingerState = AcsMain.hCNetSDK.NET_DVR_GetNextRemoteConfig(lGetFingerHandle, strFingerCfg.getPointer(), strFingerCfg.size()); if (dwFingerState == -1) { System.out.println("NET_DVR_GetNextRemoteConfig采集指纹失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); break; } else if (dwFingerState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_FAILED) { System.out.println("采集指纹失败"); break; } else if (dwFingerState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_NEED_WAIT) { System.out.println("正在采集指纹中,请等待..."); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } continue; } else if (dwFingerState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) { //超时时间5秒内设备本地人脸采集失败就会返回失败,连接会断开 System.out.println("采集指纹异常, 网络异常导致连接断开 "); break; } else if (dwFingerState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS) { strFingerCfg.read(); SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss"); String newName = sf.format(new Date()); String fileName = newName + "_capFinger.data"; String filePath = "..\\FingerData\\" + fileName; BufferedOutputStream bos = null; FileOutputStream fos = null; File file = null; try { File dir = new File(filePath); if (!dir.exists() && dir.isDirectory()) {//判断文件目录是否存在 dir.mkdirs(); } file = new File(filePath); fos = new FileOutputStream(file); bos = new BufferedOutputStream(fos); bos.write(strFingerCfg.byFingerData); System.out.println("采集指纹成功!"); } catch (Exception e) { e.printStackTrace(); } finally { if (bos != null) { try { bos.close(); } catch (IOException e1) { e1.printStackTrace(); } } if (fos != null) { try { fos.close(); } catch (IOException e1) { e1.printStackTrace(); } } } if ((strFingerCfg.dwFingerPrintPicSize > 0) && (strFingerCfg.pFingerPrintPicBuffer != null)) { FileOutputStream fout; try { String filename = "..\\FingerData\\" + newName + "_FingerPrintPic.jpg"; fout = new FileOutputStream(filename); //将字节写入文件 long offset = 0; ByteBuffer buffers = strFingerCfg.pFingerPrintPicBuffer.getByteBuffer(offset, strFingerCfg.dwFingerPrintPicSize); byte[] bytes = new byte[strFingerCfg.dwFingerPrintPicSize]; buffers.rewind(); buffers.get(bytes); fout.write(bytes); fout.close(); System.out.println("采集指纹成功, 图片保存路径: " + filename); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } break; } else { System.out.println("其他异常, dwState: " + dwFingerState); break; } } //采集成功之后断开连接、释放资源 if (!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lGetFingerHandle)) { System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); } else { System.out.println("NET_DVR_StopRemoteConfig接口成功"); } } /** * 采用透传ISAPI协议方式采集指纹,获取的指纹信息为BASE64编码, */ public static void fingerCpaureByisapi(int userID) { //采集指纹URL String fingerCapUrl="POST /ISAPI/AccessControl/CaptureFingerPrint"; String XmlInput="\n" + "\n" + " 1\n" + ""; String result=transIsapi.put_isapi(userID,fingerCapUrl,XmlInput); System.out.println("采集指纹结果:"+result); } public static void setOneFinger(int userID, String employeeNo,String figerdata) throws JSONException { HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组 String strInBuffer = "POST /ISAPI/AccessControl/FingerPrint/SetUp?format=json"; System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中 ptrByteArray.write(); int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null); if (lHandler < 0) { System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig 失败,错误码为"+AcsMain.hCNetSDK.NET_DVR_GetLastError()); return; } else{ System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig成功!"); JSONObject jsonObject = new JSONObject(); JSONObject j_FingerPrintCond=new JSONObject(); j_FingerPrintCond.put("employeeNo", employeeNo); int[] CardReader = {1}; j_FingerPrintCond.put("enableCardReader",CardReader); //人员工号 j_FingerPrintCond.put("fingerPrintID", 1); j_FingerPrintCond.put("fingerType", "normalFP"); j_FingerPrintCond.put("fingerData",figerdata); jsonObject.put("FingerPrintCfg",j_FingerPrintCond); String strInbuff = jsonObject.toString(); System.out.println("查询的json报文:" + strInbuff); //把string传递到Byte数组中,后续用.getPointer()方法传入指针地址中。 HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(strInbuff.length()); System.arraycopy(strInbuff.getBytes(), 0, ptrInbuff.byValue, 0, strInbuff.length()); ptrInbuff.write(); HCNetSDK.NET_DVR_STRING_POINTER ptrOutbuff = new HCNetSDK.NET_DVR_STRING_POINTER(3*1024); ptrOutbuff.write(); IntByReference pInt = new IntByReference(0); while(true){ int dwState =AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInbuff.getPointer(), strInbuff.length(), ptrOutbuff.getPointer(), ptrOutbuff.size(), pInt); ptrOutbuff.read(); System.out.println(dwState); if(dwState == -1){ System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); break; } else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) { System.out.println("配置等待"); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } continue; } else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) { System.out.println("下发指纹失败"); break; } else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) { System.out.println("下发指纹异常"); break; } else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) { System.out.println("下发指纹成功"); //解析JSON字符串 ptrOutbuff.read(); System.out.println("返回的报文:"+new String(ptrOutbuff.byString)); break; } else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) { System.out.println("下发指纹完成"); break; } } if(!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)){ System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); } else{ System.out.println("NET_DVR_StopRemoteConfig接口成功"); lHandler = -1; } } } public static void SearchFingerInfo(int userID,String employeeNo) throws JSONException { HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组 String strInBuffer = "POST /ISAPI/AccessControl/FingerPrintUpload?format=json"; System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中 ptrByteArray.write(); int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null); if (lHandler < 0) { System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig 失败,错误码为"+AcsMain.hCNetSDK.NET_DVR_GetLastError()); return; } else{ System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig成功!"); JSONObject jsonObject = new JSONObject(); JSONObject j_FingerPrintCond=new JSONObject(); j_FingerPrintCond.put("searchID", "20211223"); j_FingerPrintCond.put("employeeNo", employeeNo); //人员工号 j_FingerPrintCond.put("cardReaderNo", 1); j_FingerPrintCond.put("fingerPrintID", 1); jsonObject.put("FingerPrintCond",j_FingerPrintCond); String strInbuff = jsonObject.toString(); System.out.println("查询的json报文:" + strInbuff); //把string传递到Byte数组中,后续用.getPointer()方法传入指针地址中。 HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(strInbuff.length()); System.arraycopy(strInbuff.getBytes(), 0, ptrInbuff.byValue, 0, strInbuff.length()); ptrInbuff.write(); HCNetSDK.NET_DVR_STRING_POINTER ptrOutbuff = new HCNetSDK.NET_DVR_STRING_POINTER(3*1024); ptrOutbuff.write(); IntByReference pInt = new IntByReference(0); while(true){ int dwState =AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInbuff.getPointer(), strInbuff.length(), ptrOutbuff.getPointer(), ptrOutbuff.size(), pInt); ptrOutbuff.read(); System.out.println(dwState); if(dwState == -1){ System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); break; } else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) { System.out.println("配置等待"); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } continue; } else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) { System.out.println("查询指纹失败"); break; } else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) { System.out.println("查询指纹异常"); break; } else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) { System.out.println("查询指纹成功"); //解析JSON字符串 ptrOutbuff.read(); System.out.println("查询的报文:"+new String(ptrOutbuff.byString)); break; } else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) { System.out.println("获取指纹完成"); break; } } if(!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)){ System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); } else{ System.out.println("NET_DVR_StopRemoteConfig接口成功"); lHandler = -1; } } } /** * 按工号和读卡器删除指纹,按工号是逐个删除,按读卡器是批量删除指定读卡器上所有的指纹数据 * @param userID * @param employeeNo */ public static void deleteFinger(int userID,String employeeNo ) { int iErr = 0; HCNetSDK.NET_DVR_FINGER_PRINT_INFO_CTRL_V50 m_struFingerDelInfoParam = new HCNetSDK.NET_DVR_FINGER_PRINT_INFO_CTRL_V50(); m_struFingerDelInfoParam.dwSize = m_struFingerDelInfoParam.size(); m_struFingerDelInfoParam.byMode = 0;// 删除方式,0-按卡号(人员ID)方式删除,1-按读卡器删除 m_struFingerDelInfoParam.struProcessMode.setType(HCNetSDK.NET_DVR_FINGER_PRINT_BYCARD_V50.class); for (int i = 0; i < employeeNo.length(); i++) { m_struFingerDelInfoParam.struProcessMode.struByCard.byEmployeeNo[i] = employeeNo.getBytes()[i]; } m_struFingerDelInfoParam.struProcessMode.struByCard.byEnableCardReader[0] = 1;//指纹的读卡器信息,按位表示 m_struFingerDelInfoParam.struProcessMode.struByCard.byFingerPrintID[0] = 1;//需要删除的指纹编号,按数组下标,值表示0-不删除,1-删除该指纹 ,指纹编号1删除 Pointer lpInBuffer1 = m_struFingerDelInfoParam.getPointer(); m_struFingerDelInfoParam.write(); int lHandle = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_DEL_FINGERPRINT, lpInBuffer1, m_struFingerDelInfoParam.size(), null, null); if (lHandle < 0) { iErr = AcsMain.hCNetSDK.NET_DVR_GetLastError(); System.out.println("NET_DVR_DEL_FINGERPRINT_CFG_V50 建立长连接失败,错误号:" + iErr); return; } while (true) { HCNetSDK.NET_DVR_FINGER_PRINT_INFO_CTRL_V50 v50 = new HCNetSDK.NET_DVR_FINGER_PRINT_INFO_CTRL_V50(); v50.dwSize = v50.size(); v50.write(); int res = AcsMain.hCNetSDK.NET_DVR_GetNextRemoteConfig(lHandle, v50.getPointer(), v50.size()); if (res == 1002) { AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandle); System.out.println("删除指纹成功!!!"); break; } else if (res == 1003) { System.out.println("接口失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandle); break; } } } }