You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

502 line
15 KiB

  1. package com.netsdk.demo.module;
  2. import java.io.UnsupportedEncodingException;
  3. import com.sun.jna.Memory;
  4. import com.netsdk.lib.NetSDKLib;
  5. import com.netsdk.lib.ToolKits;
  6. import com.netsdk.lib.NetSDKLib.*;
  7. /**
  8. * \if ENGLISH_LANG
  9. * Attendance Interface
  10. * contains:smart subscribe、CRUD of user&&fingerprint and collection fingerprint
  11. * \else
  12. * 考勤机接口实现
  13. * 包含: 智能订阅、考勤用户及信息的增删改查、信息采集
  14. * \endif
  15. */
  16. public class AttendanceModule {
  17. public static final int TIME_OUT = 3000;
  18. public static final int nMaxFingerPrintSize = 2048;
  19. public static LLong m_hAttachHandle = new LLong(0);
  20. /**
  21. * 智能订阅
  22. * @param callback 智能订阅回调函数
  23. */
  24. public static boolean realLoadPicture(fAnalyzerDataCallBack callback) {
  25. int bNeedPicture = 0; // 不需要图片
  26. m_hAttachHandle = LoginModule.netsdk.CLIENT_RealLoadPictureEx(LoginModule.m_hLoginHandle, -1,
  27. NetSDKLib.EVENT_IVS_ALL, bNeedPicture, callback, null, null);
  28. if(m_hAttachHandle.longValue() == 0) {
  29. System.err.printf("CLIENT_RealLoadPictureEx Failed!" + ToolKits.getErrorCodePrint());
  30. }
  31. return m_hAttachHandle.longValue() != 0;
  32. }
  33. /**
  34. * 停止智能订阅
  35. */
  36. public static void stopRealLoadPicture(){
  37. if (m_hAttachHandle.longValue() == 0) {
  38. return;
  39. }
  40. LoginModule.netsdk.CLIENT_StopLoadPic(m_hAttachHandle);
  41. m_hAttachHandle.setValue(0);
  42. }
  43. /**
  44. * 考勤新增加用户
  45. * @param userId 用户ID
  46. * @param userName 用户名
  47. * @param cardNo 卡号
  48. */
  49. public static boolean addUser(String userId, String userName, String cardNo) {
  50. /*
  51. * 入参
  52. */
  53. NET_IN_ATTENDANCE_ADDUSER stuIn = new NET_IN_ATTENDANCE_ADDUSER();
  54. stringToByteArray(userId, stuIn.stuUserInfo.szUserID);
  55. stringToByteArray(userName, stuIn.stuUserInfo.szUserName);
  56. stringToByteArray(cardNo, stuIn.stuUserInfo.szCardNo);
  57. /*
  58. * 出参
  59. */
  60. NET_OUT_ATTENDANCE_ADDUSER stuOut = new NET_OUT_ATTENDANCE_ADDUSER();
  61. boolean bRet = LoginModule.netsdk.CLIENT_Attendance_AddUser(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
  62. if (!bRet) {
  63. System.err.printf("CLIENT_Attendance_AddUser Failed!" + ToolKits.getErrorCodePrint());
  64. }
  65. return bRet;
  66. }
  67. /**
  68. * 考勤删除用户
  69. * @param userId 用户ID
  70. */
  71. public static boolean deleteUser(String userId) {
  72. removeFingerByUserId(userId); // 先去删除信息
  73. /*
  74. * 入参
  75. */
  76. NET_IN_ATTENDANCE_DELUSER stuIn = new NET_IN_ATTENDANCE_DELUSER();
  77. stringToByteArray(userId, stuIn.szUserID);
  78. /*
  79. * 出参
  80. */
  81. NET_OUT_ATTENDANCE_DELUSER stuOut = new NET_OUT_ATTENDANCE_DELUSER();
  82. boolean bRet = LoginModule.netsdk.CLIENT_Attendance_DelUser(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
  83. if (!bRet) {
  84. System.err.printf("CLIENT_Attendance_DelUser Failed!" + ToolKits.getErrorCodePrint());
  85. }
  86. return bRet;
  87. }
  88. /**
  89. * 考勤修改用户
  90. * @param userId 用户ID
  91. * @param userName 用户名
  92. * @param cardNo 卡号
  93. */
  94. public static boolean modifyUser(String userId, String userName, String cardNo) {
  95. /*
  96. * 入参
  97. */
  98. NET_IN_ATTENDANCE_ModifyUSER stuIn = new NET_IN_ATTENDANCE_ModifyUSER();
  99. stringToByteArray(userId, stuIn.stuUserInfo.szUserID);
  100. stringToByteArray(userName, stuIn.stuUserInfo.szUserName);
  101. stringToByteArray(cardNo, stuIn.stuUserInfo.szCardNo);
  102. /*
  103. * 出参
  104. */
  105. NET_OUT_ATTENDANCE_ModifyUSER stuOut = new NET_OUT_ATTENDANCE_ModifyUSER();
  106. boolean bRet = LoginModule.netsdk.CLIENT_Attendance_ModifyUser(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
  107. if (!bRet) {
  108. System.err.printf("CLIENT_Attendance_ModifyUser Failed!" + ToolKits.getErrorCodePrint());
  109. }
  110. return bRet;
  111. }
  112. /**
  113. * 考勤机 查找用户
  114. * @param nOffset 查询偏移
  115. * @param nPagedQueryCount 查询个数
  116. * @return UserData[] 用户信息组
  117. */
  118. public static UserData[] findUser(int nOffset, int nPagedQueryCount) {
  119. /*
  120. * 入参
  121. */
  122. NET_IN_ATTENDANCE_FINDUSER stuIn = new NET_IN_ATTENDANCE_FINDUSER();
  123. stuIn.nOffset = nOffset;
  124. stuIn.nPagedQueryCount = nPagedQueryCount;
  125. /*
  126. * 出参
  127. */
  128. NET_OUT_ATTENDANCE_FINDUSER stuOut = new NET_OUT_ATTENDANCE_FINDUSER();
  129. NET_ATTENDANCE_USERINFO[] userInfo = new NET_ATTENDANCE_USERINFO[nPagedQueryCount];
  130. for(int i = 0; i < nPagedQueryCount; i++) {
  131. userInfo[i] = new NET_ATTENDANCE_USERINFO();
  132. }
  133. stuOut.nMaxUserCount = nPagedQueryCount;
  134. stuOut.stuUserInfo = new Memory(userInfo[0].size() * stuOut.nMaxUserCount);
  135. stuOut.stuUserInfo.clear(userInfo[0].size() * stuOut.nMaxUserCount);
  136. ToolKits.SetStructArrToPointerData(userInfo, stuOut.stuUserInfo); // 将数组内存拷贝到Pointer
  137. stuOut.nMaxPhotoDataLength = 128;
  138. stuOut.pbyPhotoData = new Memory(stuOut.nMaxPhotoDataLength); // 申请内存
  139. boolean bRet = LoginModule.netsdk.CLIENT_Attendance_FindUser(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
  140. if (!bRet) {
  141. System.err.printf("CLIENT_Attendance_FindUser Failed!" + ToolKits.getErrorCodePrint());
  142. return null;
  143. }
  144. ToolKits.GetPointerDataToStructArr(stuOut.stuUserInfo, userInfo); // 将 Pointer 的内容 输出到 数组
  145. UserData[] userData = new UserData[stuOut.nRetUserCount];
  146. for(int i = 0; i < stuOut.nRetUserCount; i++) {
  147. userData[i] = new UserData();
  148. try {
  149. userData[i].userId = new String(userInfo[i].szUserID, "GBK").trim();
  150. userData[i].userName = new String(userInfo[i].szUserName, "GBK").trim();
  151. userData[i].cardNo = new String(userInfo[i].szCardNo, "GBK").trim();
  152. }catch(Exception e) { // 如果转化失败就采用原始数据
  153. userData[i].userId = new String(userInfo[i].szUserID).trim();
  154. userData[i].userName = new String(userInfo[i].szUserName).trim();
  155. userData[i].cardNo = new String(userInfo[i].szCardNo).trim();
  156. }
  157. // getFingerByUserId(userData[i].userId, userData[i]); // 获取信息信息
  158. }
  159. UserData.nTotalUser = stuOut.nTotalUser;
  160. return userData;
  161. }
  162. /**
  163. * 考勤获取用户信息
  164. * @param userId 用户ID
  165. * @return UserData 用户信息
  166. */
  167. public static UserData getUser(String userId) {
  168. /*
  169. * 入参
  170. */
  171. NET_IN_ATTENDANCE_GetUSER stuIn = new NET_IN_ATTENDANCE_GetUSER();
  172. stringToByteArray(userId, stuIn.szUserID);
  173. /*
  174. * 出参
  175. */
  176. NET_OUT_ATTENDANCE_GetUSER stuOut = new NET_OUT_ATTENDANCE_GetUSER();
  177. stuOut.nMaxLength = 128;
  178. stuOut.pbyPhotoData = new Memory(stuOut.nMaxLength); // 申请内存
  179. stuOut.pbyPhotoData.clear(stuOut.nMaxLength);
  180. boolean bRet = LoginModule.netsdk.CLIENT_Attendance_GetUser(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
  181. if (!bRet) {
  182. System.err.printf("CLIENT_Attendance_GetUser Failed!" + ToolKits.getErrorCodePrint());
  183. return null;
  184. }
  185. UserData userData = new UserData();
  186. try {
  187. userData.userId = new String(stuOut.stuUserInfo.szUserID, "GBK").trim();
  188. userData.userName = new String(stuOut.stuUserInfo.szUserName, "GBK").trim();
  189. userData.cardNo = new String(stuOut.stuUserInfo.szCardNo, "GBK").trim();
  190. }catch(Exception e) { // 如果转化失败就采用原始数据
  191. userData.userId = new String(stuOut.stuUserInfo.szUserID).trim();
  192. userData.userName = new String(stuOut.stuUserInfo.szUserName).trim();
  193. userData.cardNo = new String(stuOut.stuUserInfo.szCardNo).trim();
  194. }
  195. // getFingerByUserId(userId, userData); // 获取信息信息
  196. return userData;
  197. }
  198. /**
  199. * 考勤机 通过用户ID插入信息数据
  200. * @param userId 用户ID
  201. * @param szFingerPrintInfo 信息信息
  202. */
  203. public static boolean insertFingerByUserId(String userId, byte[] szFingerPrintInfo) {
  204. /*
  205. * 入参
  206. */
  207. NET_IN_FINGERPRINT_INSERT_BY_USERID stuIn = new NET_IN_FINGERPRINT_INSERT_BY_USERID();
  208. stringToByteArray(userId, stuIn.szUserID);
  209. stuIn.nPacketCount = 1;
  210. stuIn.nSinglePacketLen = szFingerPrintInfo.length;
  211. stuIn.szFingerPrintInfo = new Memory(stuIn.nPacketCount * stuIn.nSinglePacketLen); // 申请内存
  212. stuIn.szFingerPrintInfo.clear(stuIn.nPacketCount * stuIn.nSinglePacketLen);
  213. stuIn.szFingerPrintInfo.write(0, szFingerPrintInfo, 0, szFingerPrintInfo.length);
  214. /*
  215. * 出参
  216. */
  217. NET_OUT_FINGERPRINT_INSERT_BY_USERID stuOut = new NET_OUT_FINGERPRINT_INSERT_BY_USERID();
  218. boolean bRet = LoginModule.netsdk.CLIENT_Attendance_InsertFingerByUserID(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
  219. if (!bRet) {
  220. System.err.printf("CLIENT_Attendance_InsertFingerByUserID Failed!" + ToolKits.getErrorCodePrint());
  221. }
  222. return bRet;
  223. }
  224. /**
  225. * 考勤机 删除单个用户下所有信息数据
  226. * @param userId 用户ID
  227. */
  228. public static boolean removeFingerByUserId(String userId) {
  229. /*
  230. * 入参
  231. */
  232. NET_CTRL_IN_FINGERPRINT_REMOVE_BY_USERID stuIn = new NET_CTRL_IN_FINGERPRINT_REMOVE_BY_USERID();
  233. stringToByteArray(userId, stuIn.szUserID);
  234. /*
  235. * 出参
  236. */
  237. NET_CTRL_OUT_FINGERPRINT_REMOVE_BY_USERID stuOut = new NET_CTRL_OUT_FINGERPRINT_REMOVE_BY_USERID();
  238. boolean bRet = LoginModule.netsdk.CLIENT_Attendance_RemoveFingerByUserID(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
  239. if (!bRet) {
  240. System.err.printf("CLIENT_Attendance_RemoveFingerByUserID Failed!" + ToolKits.getErrorCodePrint());
  241. }
  242. return bRet;
  243. }
  244. /**
  245. * 考勤机 通过信息ID删除信息数据
  246. * @param nFingerPrintID 信息ID
  247. */
  248. public static boolean removeFingerRecord(int nFingerPrintID) {
  249. /*
  250. * 入参
  251. */
  252. NET_CTRL_IN_FINGERPRINT_REMOVE stuIn = new NET_CTRL_IN_FINGERPRINT_REMOVE();
  253. stuIn.nFingerPrintID = nFingerPrintID;
  254. /*
  255. * 出参
  256. */
  257. NET_CTRL_OUT_FINGERPRINT_REMOVE stuOut = new NET_CTRL_OUT_FINGERPRINT_REMOVE();
  258. boolean bRet = LoginModule.netsdk.CLIENT_Attendance_RemoveFingerRecord(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
  259. if (!bRet) {
  260. System.err.printf("CLIENT_Attendance_RemoveFingerRecord Failed!" + ToolKits.getErrorCodePrint());
  261. }
  262. return bRet;
  263. }
  264. /**
  265. * 考勤机 通过信息ID获取信息数据
  266. * @param nFingerPrintID 信息ID
  267. * @return userData 用户数据
  268. */
  269. public static UserData getFingerRecord(int nFingerPrintID) {
  270. /*
  271. * 入参
  272. */
  273. NET_CTRL_IN_FINGERPRINT_GET stuIn = new NET_CTRL_IN_FINGERPRINT_GET();
  274. stuIn.nFingerPrintID = nFingerPrintID;
  275. /*
  276. * 出参
  277. */
  278. NET_CTRL_OUT_FINGERPRINT_GET stuOut = new NET_CTRL_OUT_FINGERPRINT_GET();
  279. stuOut.nMaxFingerDataLength = nMaxFingerPrintSize;
  280. stuOut.szFingerPrintInfo = new Memory(stuOut.nMaxFingerDataLength); // 申请内存
  281. stuOut.szFingerPrintInfo.clear(stuOut.nMaxFingerDataLength);
  282. boolean bRet = LoginModule.netsdk.CLIENT_Attendance_GetFingerRecord(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
  283. if (!bRet) {
  284. System.err.printf("CLIENT_Attendance_GetFingerRecord Failed!" + ToolKits.getErrorCodePrint());
  285. return null;
  286. }
  287. if (stuOut.nRetLength == 0) {
  288. System.err.println("GetFingerRecord Failed nRetLength == 0!");
  289. }
  290. UserData userData = new UserData();
  291. userData.userId = new String(stuOut.szUserID).trim();
  292. userData.nFingerPrintIDs = new int[1];
  293. userData.nFingerPrintIDs[0] = nFingerPrintID;
  294. userData.szFingerPrintInfo = new byte[1][stuOut.nRetLength];
  295. stuOut.szFingerPrintInfo.read(0, userData.szFingerPrintInfo[0], 0, stuOut.nRetLength);
  296. return userData;
  297. }
  298. /**
  299. * 考勤机 通过用户ID查找该用户下的所有信息数据
  300. * @param userId 用户ID
  301. * @param userData 用户数据
  302. */
  303. public static boolean getFingerByUserId(String userId, UserData userData) {
  304. /*
  305. * 入参
  306. */
  307. NET_IN_FINGERPRINT_GETBYUSER stuIn = new NET_IN_FINGERPRINT_GETBYUSER();
  308. stringToByteArray(userId, stuIn.szUserID);
  309. /*
  310. * 出参
  311. */
  312. NET_OUT_FINGERPRINT_GETBYUSER stuOut = new NET_OUT_FINGERPRINT_GETBYUSER();
  313. stuOut.nMaxFingerDataLength = NetSDKLib.NET_MAX_FINGER_PRINT * nMaxFingerPrintSize;
  314. stuOut.pbyFingerData = new Memory(stuOut.nMaxFingerDataLength); // 申请内存
  315. stuOut.pbyFingerData.clear(stuOut.nMaxFingerDataLength);
  316. boolean bRet = LoginModule.netsdk.CLIENT_Attendance_GetFingerByUserID(LoginModule.m_hLoginHandle, stuIn, stuOut, TIME_OUT);
  317. if (!bRet) {
  318. System.err.printf("CLIENT_Attendance_GetFingerByUserID Failed!" + ToolKits.getErrorCodePrint());
  319. }else {
  320. userData.nFingerPrintIDs = new int[stuOut.nRetFingerPrintCount];
  321. userData.szFingerPrintInfo = new byte[stuOut.nRetFingerPrintCount][stuOut.nSinglePacketLength];
  322. int offset = 0;
  323. for (int i = 0; i < stuOut.nRetFingerPrintCount; ++i) {
  324. userData.nFingerPrintIDs[i] = stuOut.nFingerPrintIDs[i];
  325. stuOut.pbyFingerData.read(offset, userData.szFingerPrintInfo[i], 0, stuOut.nSinglePacketLength);
  326. offset += stuOut.nSinglePacketLength;
  327. }
  328. }
  329. return bRet;
  330. }
  331. /**
  332. * 信息采集
  333. * @param nChannelID 门禁序号
  334. * @param szReaderID 读卡器ID
  335. */
  336. public static boolean collectionFinger(int nChannelID, String szReaderID) {
  337. /*
  338. * 入参
  339. */
  340. NET_CTRL_CAPTURE_FINGER_PRINT stuCollection = new NET_CTRL_CAPTURE_FINGER_PRINT();
  341. stuCollection.nChannelID = nChannelID;
  342. stringToByteArray(szReaderID, stuCollection.szReaderID);
  343. stuCollection.write();
  344. boolean bRet = LoginModule.netsdk.CLIENT_ControlDeviceEx(LoginModule.m_hLoginHandle, NetSDKLib.CtrlType.CTRLTYPE_CTRL_CAPTURE_FINGER_PRINT, stuCollection.getPointer(), null, 5000);
  345. if (!bRet) {
  346. System.err.printf("CLIENT_ControlDeviceEx CAPTURE_FINGER_PRINT Failed!" + ToolKits.getErrorCodePrint());
  347. }
  348. return bRet;
  349. }
  350. /**
  351. * 字符串转字符数组
  352. * @param src 源字符串
  353. * @param dst 目标字符数组
  354. */
  355. public static void stringToByteArray(String src, byte[] dst) {
  356. if (src == null || src.isEmpty()) {
  357. return;
  358. }
  359. for(int i = 0; i < dst.length; i++) {
  360. dst[i] = 0;
  361. }
  362. byte []szSrc;
  363. try {
  364. szSrc = src.getBytes("GBK");
  365. } catch (UnsupportedEncodingException e) {
  366. szSrc = src.getBytes();
  367. }
  368. if (szSrc != null) {
  369. int len = szSrc.length >= dst.length ? dst.length-1:szSrc.length;
  370. System.arraycopy(szSrc, 0, dst, 0, len);
  371. }
  372. }
  373. /**
  374. * 用户信息
  375. * */
  376. public static class UserData {
  377. public static int nTotalUser; // 用户总数
  378. public String userId; // 用户ID
  379. public String userName; // 用户名
  380. public String cardNo; // 卡号
  381. public int[] nFingerPrintIDs; // 信息ID数组
  382. public byte[][] szFingerPrintInfo; // 信息数据数组
  383. }
  384. /**
  385. * 门禁事件信息
  386. * */
  387. public static class AccessEventInfo {
  388. public String userId; // 用户ID
  389. public String cardNo; // 卡号
  390. public String eventTime; // 事件发生时间
  391. public int openDoorMethod; // 开门方式
  392. }
  393. /**
  394. * 操作类型
  395. * */
  396. public enum OPERATE_TYPE {
  397. UNKNOWN, // 未知
  398. SEARCH_USER, // 搜索用户(第一页)
  399. PRE_SEARCH_USER, // 搜索用户(上一页)
  400. NEXT_SEARCH_USER, // 搜索用户(下一页)
  401. SEARCH_USER_BY_USERID, // 通过用户ID搜索用户
  402. ADD_USER, // 添加用户
  403. DELETE_USER, // 删除用户
  404. MODIFIY_USER, // 修改用户
  405. FINGERPRINT_OPEARTE_BY_USERID, // 通过用户ID操作信息
  406. FINGERPRINT_OPEARTE_BY_ID, // 通过信息ID操作信息
  407. SEARCH_FINGERPRINT_BY_USERID, // 通过用户ID搜索信息
  408. SEARCH_FINGERPRINT_BY_ID, // 通过信息ID搜索信息
  409. ADD_FINGERPRINT, // 添加信息
  410. DELETE_FINGERPRINT_BY_USERID, // 通过用户ID删除信息
  411. DELETE_FINGERPRINT_BY_ID // 通过信息ID删除信息
  412. };
  413. }