Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

381 строка
22 KiB

  1. package com.hkversion.Acs;
  2. import com.alibaba.fastjson.JSONException;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.hkversion.HCNetSDK;
  5. import com.sun.jna.Pointer;
  6. import com.sun.jna.ptr.IntByReference;
  7. import java.io.*;
  8. import java.nio.ByteBuffer;
  9. import java.text.SimpleDateFormat;
  10. import java.util.Date;
  11. /**
  12. * 指纹管理:指纹采集,指纹下发,指纹信息查询,指纹删除
  13. */
  14. public final class FingerManage {
  15. /**
  16. * 采集指纹模块,采集指纹数据为二进制
  17. * @param userID
  18. */
  19. public static void fingerCapture(int userID)
  20. {
  21. HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_COND strFingerCond = new HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_COND();
  22. strFingerCond.read();
  23. strFingerCond.dwSize = strFingerCond.size();
  24. strFingerCond.byFingerPrintPicType = 1; //指纹读卡器
  25. strFingerCond.byFingerNo = 1; //指纹编号
  26. strFingerCond.write();
  27. int lGetFingerHandle = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_INFO, strFingerCond.getPointer(), strFingerCond.dwSize, null, null);
  28. if (lGetFingerHandle == -1) {
  29. System.out.println("建立采集指纹长连接失败,错误码为:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
  30. return;
  31. } else {
  32. System.out.println("建立采集指纹长连接成功!");
  33. }
  34. HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_CFG strFingerCfg = new HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_CFG();
  35. strFingerCfg.dwSize=strFingerCfg.size();
  36. strFingerCfg.write();
  37. while (true) {
  38. int dwFingerState = AcsMain.hCNetSDK.NET_DVR_GetNextRemoteConfig(lGetFingerHandle, strFingerCfg.getPointer(), strFingerCfg.size());
  39. if (dwFingerState == -1) {
  40. System.out.println("NET_DVR_GetNextRemoteConfig采集指纹失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
  41. break;
  42. } else if (dwFingerState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_FAILED) {
  43. System.out.println("采集指纹失败");
  44. break;
  45. } else if (dwFingerState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_NEED_WAIT) {
  46. System.out.println("正在采集指纹中,请等待...");
  47. try {
  48. Thread.sleep(10);
  49. } catch (InterruptedException e) {
  50. // TODO Auto-generated catch block
  51. e.printStackTrace();
  52. }
  53. continue;
  54. } else if (dwFingerState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
  55. //超时时间5秒内设备本地人脸采集失败就会返回失败,连接会断开
  56. System.out.println("采集指纹异常, 网络异常导致连接断开 ");
  57. break;
  58. } else if (dwFingerState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS) {
  59. strFingerCfg.read();
  60. SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
  61. String newName = sf.format(new Date());
  62. String fileName = newName + "_capFinger.data";
  63. String filePath = "..\\pic\\" + fileName;
  64. BufferedOutputStream bos = null;
  65. FileOutputStream fos = null;
  66. File file = null;
  67. try {
  68. File dir = new File(filePath);
  69. if (!dir.exists() && dir.isDirectory()) {//判断文件目录是否存在
  70. dir.mkdirs();
  71. }
  72. file = new File(filePath);
  73. fos = new FileOutputStream(file);
  74. bos = new BufferedOutputStream(fos);
  75. bos.write(strFingerCfg.byFingerData);
  76. System.out.println("采集指纹成功!");
  77. } catch (Exception e) {
  78. e.printStackTrace();
  79. } finally {
  80. if (bos != null) {
  81. try {
  82. bos.close();
  83. } catch (IOException e1) {
  84. e1.printStackTrace();
  85. }
  86. }
  87. if (fos != null) {
  88. try {
  89. fos.close();
  90. } catch (IOException e1) {
  91. e1.printStackTrace();
  92. }
  93. }
  94. }
  95. if ((strFingerCfg.dwFingerPrintPicSize > 0) && (strFingerCfg.pFingerPrintPicBuffer != null)) {
  96. FileOutputStream fout;
  97. try {
  98. String filename = "..\\pic\\" + newName + "_FingerPrintPic.jpg";
  99. fout = new FileOutputStream(filename);
  100. //将字节写入文件
  101. long offset = 0;
  102. ByteBuffer buffers = strFingerCfg.pFingerPrintPicBuffer.getByteBuffer(offset, strFingerCfg.dwFingerPrintPicSize);
  103. byte[] bytes = new byte[strFingerCfg.dwFingerPrintPicSize];
  104. buffers.rewind();
  105. buffers.get(bytes);
  106. fout.write(bytes);
  107. fout.close();
  108. System.out.println("采集指纹成功, 图片保存路径: " + filename);
  109. } catch (FileNotFoundException e) {
  110. // TODO Auto-generated catch block
  111. e.printStackTrace();
  112. } catch (IOException e) {
  113. // TODO Auto-generated catch block
  114. e.printStackTrace();
  115. }
  116. }
  117. break;
  118. } else {
  119. System.out.println("其他异常, dwState: " + dwFingerState);
  120. break;
  121. }
  122. }
  123. //采集成功之后断开连接、释放资源
  124. if (!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lGetFingerHandle)) {
  125. System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
  126. } else {
  127. System.out.println("NET_DVR_StopRemoteConfig接口成功");
  128. }
  129. }
  130. /**
  131. * 采用透传ISAPI协议方式采集指纹,获取的指纹信息为BASE64编码,
  132. */
  133. public static void fingerCpaureByisapi(int userID)
  134. {
  135. //采集指纹URL
  136. String fingerCapUrl="POST /ISAPI/AccessControl/CaptureFingerPrint";
  137. String XmlInput="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
  138. "<CaptureFingerPrintCond xmlns=\"http://www.isapi.org/ver20/XMLSchema\" version=\"2.0\">\n" +
  139. " <fingerNo>1</fingerNo>\n" +
  140. "</CaptureFingerPrintCond>";
  141. String result= TransIsapi.put_isapi(userID,fingerCapUrl,XmlInput);
  142. System.out.println("采集指纹结果:"+result);
  143. }
  144. public static void setOneFinger(int userID, String employeeNo,String figerdata) throws JSONException {
  145. HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组
  146. String strInBuffer = "POST /ISAPI/AccessControl/FingerPrint/SetUp?format=json";
  147. System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
  148. ptrByteArray.write();
  149. int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
  150. if (lHandler < 0)
  151. {
  152. System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig 失败,错误码为"+AcsMain.hCNetSDK.NET_DVR_GetLastError());
  153. return;
  154. }
  155. else{
  156. System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig成功!");
  157. JSONObject jsonObject = new JSONObject();
  158. JSONObject j_FingerPrintCond=new JSONObject();
  159. j_FingerPrintCond.put("employeeNo", employeeNo);
  160. int[] CardReader = {1};
  161. j_FingerPrintCond.put("enableCardReader",CardReader); //人员工号
  162. j_FingerPrintCond.put("fingerPrintID", 1);
  163. j_FingerPrintCond.put("fingerType", "normalFP");
  164. j_FingerPrintCond.put("fingerData",figerdata);
  165. jsonObject.put("FingerPrintCfg",j_FingerPrintCond);
  166. String strInbuff = jsonObject.toString();
  167. System.out.println("查询的json报文:" + strInbuff);
  168. //把string传递到Byte数组中,后续用.getPointer()方法传入指针地址中。
  169. HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(strInbuff.length());
  170. System.arraycopy(strInbuff.getBytes(), 0, ptrInbuff.byValue, 0, strInbuff.length());
  171. ptrInbuff.write();
  172. HCNetSDK.NET_DVR_STRING_POINTER ptrOutbuff = new HCNetSDK.NET_DVR_STRING_POINTER(3*1024);
  173. ptrOutbuff.write();
  174. IntByReference pInt = new IntByReference(0);
  175. while(true){
  176. int dwState =AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInbuff.getPointer(), strInbuff.length(), ptrOutbuff.getPointer(), ptrOutbuff.size(), pInt);
  177. ptrOutbuff.read();
  178. System.out.println(dwState);
  179. if(dwState == -1){
  180. System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
  181. break;
  182. }
  183. else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT)
  184. {
  185. System.out.println("配置等待");
  186. try {
  187. Thread.sleep(10);
  188. } catch (InterruptedException e) {
  189. // TODO Auto-generated catch block
  190. e.printStackTrace();
  191. }
  192. continue;
  193. }
  194. else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED)
  195. {
  196. System.out.println("下发指纹失败");
  197. break;
  198. }
  199. else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION)
  200. {
  201. System.out.println("下发指纹异常");
  202. break;
  203. }
  204. else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS)
  205. {
  206. System.out.println("下发指纹成功");
  207. //解析JSON字符串
  208. ptrOutbuff.read();
  209. System.out.println("返回的报文:"+new String(ptrOutbuff.byString));
  210. break;
  211. }
  212. else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
  213. System.out.println("下发指纹完成");
  214. break;
  215. }
  216. }
  217. if(!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)){
  218. System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
  219. }
  220. else{
  221. System.out.println("NET_DVR_StopRemoteConfig接口成功");
  222. lHandler = -1;
  223. }
  224. }
  225. }
  226. public static void SearchFingerInfo(int userID,String employeeNo) throws JSONException {
  227. HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组
  228. String strInBuffer = "POST /ISAPI/AccessControl/FingerPrintUpload?format=json";
  229. System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
  230. ptrByteArray.write();
  231. int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
  232. if (lHandler < 0)
  233. {
  234. System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig 失败,错误码为"+AcsMain.hCNetSDK.NET_DVR_GetLastError());
  235. return;
  236. }
  237. else{
  238. System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig成功!");
  239. JSONObject jsonObject = new JSONObject();
  240. JSONObject j_FingerPrintCond=new JSONObject();
  241. j_FingerPrintCond.put("searchID", "20211223");
  242. j_FingerPrintCond.put("employeeNo", employeeNo); //人员工号
  243. j_FingerPrintCond.put("cardReaderNo", 1);
  244. j_FingerPrintCond.put("fingerPrintID", 1);
  245. jsonObject.put("FingerPrintCond",j_FingerPrintCond);
  246. String strInbuff = jsonObject.toString();
  247. System.out.println("查询的json报文:" + strInbuff);
  248. //把string传递到Byte数组中,后续用.getPointer()方法传入指针地址中。
  249. HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(strInbuff.length());
  250. System.arraycopy(strInbuff.getBytes(), 0, ptrInbuff.byValue, 0, strInbuff.length());
  251. ptrInbuff.write();
  252. HCNetSDK.NET_DVR_STRING_POINTER ptrOutbuff = new HCNetSDK.NET_DVR_STRING_POINTER(3*1024);
  253. ptrOutbuff.write();
  254. IntByReference pInt = new IntByReference(0);
  255. while(true){
  256. int dwState =AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInbuff.getPointer(), strInbuff.length(), ptrOutbuff.getPointer(), ptrOutbuff.size(), pInt);
  257. ptrOutbuff.read();
  258. System.out.println(dwState);
  259. if(dwState == -1){
  260. System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
  261. break;
  262. }
  263. else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT)
  264. {
  265. System.out.println("配置等待");
  266. try {
  267. Thread.sleep(10);
  268. } catch (InterruptedException e) {
  269. // TODO Auto-generated catch block
  270. e.printStackTrace();
  271. }
  272. continue;
  273. }
  274. else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED)
  275. {
  276. System.out.println("查询指纹失败");
  277. break;
  278. }
  279. else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION)
  280. {
  281. System.out.println("查询指纹异常");
  282. break;
  283. }
  284. else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS)
  285. {
  286. System.out.println("查询指纹成功");
  287. //解析JSON字符串
  288. ptrOutbuff.read();
  289. System.out.println("查询的报文:"+new String(ptrOutbuff.byString));
  290. break;
  291. }
  292. else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
  293. System.out.println("获取指纹完成");
  294. break;
  295. }
  296. }
  297. if(!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)){
  298. System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
  299. }
  300. else{
  301. System.out.println("NET_DVR_StopRemoteConfig接口成功");
  302. lHandler = -1;
  303. }
  304. }
  305. }
  306. /**
  307. * 按工号和读卡器删除指纹,按工号是逐个删除,按读卡器是批量删除指定读卡器上所有的指纹数据
  308. * @param userID
  309. * @param employeeNo
  310. */
  311. public static void deleteFinger(int userID,String employeeNo )
  312. {
  313. int iErr = 0;
  314. HCNetSDK.NET_DVR_FINGER_PRINT_INFO_CTRL_V50 m_struFingerDelInfoParam = new HCNetSDK.NET_DVR_FINGER_PRINT_INFO_CTRL_V50();
  315. m_struFingerDelInfoParam.dwSize = m_struFingerDelInfoParam.size();
  316. m_struFingerDelInfoParam.byMode = 0;// 删除方式,0-按卡号(人员ID)方式删除,1-按读卡器删除
  317. m_struFingerDelInfoParam.struProcessMode.setType(HCNetSDK.NET_DVR_FINGER_PRINT_BYCARD_V50.class);
  318. for (int i = 0; i < employeeNo.length(); i++) {
  319. m_struFingerDelInfoParam.struProcessMode.struByCard.byEmployeeNo[i] = employeeNo.getBytes()[i];
  320. }
  321. m_struFingerDelInfoParam.struProcessMode.struByCard.byEnableCardReader[0] = 1;//指纹的读卡器信息,按位表示
  322. m_struFingerDelInfoParam.struProcessMode.struByCard.byFingerPrintID[0] = 1;//需要删除的指纹编号,按数组下标,值表示0-不删除,1-删除该指纹 ,指纹编号1删除
  323. Pointer lpInBuffer1 = m_struFingerDelInfoParam.getPointer();
  324. m_struFingerDelInfoParam.write();
  325. int lHandle = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_DEL_FINGERPRINT, lpInBuffer1, m_struFingerDelInfoParam.size(), null, null);
  326. if (lHandle < 0) {
  327. iErr = AcsMain.hCNetSDK.NET_DVR_GetLastError();
  328. System.out.println("NET_DVR_DEL_FINGERPRINT_CFG_V50 建立长连接失败,错误号:" + iErr);
  329. return;
  330. }
  331. while (true) {
  332. HCNetSDK.NET_DVR_FINGER_PRINT_INFO_CTRL_V50 v50 = new HCNetSDK.NET_DVR_FINGER_PRINT_INFO_CTRL_V50();
  333. v50.dwSize = v50.size();
  334. v50.write();
  335. int res = AcsMain.hCNetSDK.NET_DVR_GetNextRemoteConfig(lHandle, v50.getPointer(), v50.size());
  336. if (res == 1002) {
  337. AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandle);
  338. System.out.println("删除指纹成功!!!");
  339. break;
  340. } else if (res == 1003) {
  341. System.out.println("接口失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
  342. AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandle);
  343. break;
  344. }
  345. }
  346. }
  347. }