package com.netsdk.demo.accessControl; import java.io.File; import java.io.UnsupportedEncodingException; import com.netsdk.demo.util.Base64Util; import com.netsdk.demo.util.CaseMenu; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.NetSDKLib.*; import com.netsdk.lib.ToolKits; import com.sun.jna.Memory; import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; public class AccessControlNew { static NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE; static NetSDKLib configApi = NetSDKLib.CONFIG_INSTANCE; private NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); private static LLong loginHandle = new LLong(0); String address = "172.23.12.248"; // 172.26.6.104 int port = 37777; String username = "admin"; String password = "admin123"; private boolean bFaceOperate = true; // 控制是否带人脸操作 private AccessFaceOperate accessFaceOperate = null; private static class DisconnectCallback implements NetSDKLib.fDisConnect { private static DisconnectCallback instance = new DisconnectCallback(); private DisconnectCallback() {} public static DisconnectCallback getInstance() { return instance; } public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser){ System.out.printf("Device[%s:%d] Disconnect!\n" , pchDVRIP , nDVRPort); } } private static class HaveReconnectCallback implements NetSDKLib.fHaveReConnect { private static HaveReconnectCallback instance = new HaveReconnectCallback(); private HaveReconnectCallback() {} public static HaveReconnectCallback getInstance() { return instance; } public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser){ System.out.printf("Device[%s:%d] HaveReconnected!\n" , pchDVRIP , nDVRPort); } } public void EndTest() { System.out.println("End Test"); if( loginHandle.longValue() != 0) { stopListen(); netsdkApi.CLIENT_Logout(loginHandle); } System.out.println("See You..."); netsdkApi.CLIENT_Cleanup(); System.exit(0); } public void InitTest() { //初始化SDK库 netsdkApi.CLIENT_Init(DisconnectCallback.getInstance(), null); //设置断线自动重练功能 netsdkApi.CLIENT_SetAutoReconnect(HaveReconnectCallback.getInstance(), null); // 打开日志,可选 NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO(); File path = new File("."); String logPath = path.getAbsoluteFile().getParent() + "\\sdk_log\\" + System.currentTimeMillis() + ".log"; setLog.bSetFilePath = 1; System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length); setLog.bSetPrintStrategy = 1; setLog.nPrintStrategy = 0; boolean bLogopen = netsdkApi.CLIENT_LogOpen(setLog); if (!bLogopen) { System.err.println("Failed to open NetSDK log !!!"); } // 向设备登入 int nSpecCap = 0; IntByReference nError = new IntByReference(0); loginHandle = netsdkApi.CLIENT_LoginEx2(address, port, username, password, nSpecCap, null, deviceInfo, nError); if(loginHandle.longValue() == 0) { System.err.printf("Login Device [%s:%d] Failed ! Last Error[%x]\n", address, port, netsdkApi.CLIENT_GetLastError()); EndTest(); return; } System.out.printf("Login Device [%s:%d] Success. \n", address, port); accessFaceOperate = new AccessFaceOperate(loginHandle); } /** * 获取接口错误码 * @return */ public static String getErrorCode() { return " { error code: ( 0x80000000|" + (netsdkApi.CLIENT_GetLastError() & 0x7fffffff) +" ). 参考 NetSDKLib.java }"; } /** * 订阅报警信息 * @return */ public void startListen() { // 设置报警回调函数 netsdkApi.CLIENT_SetDVRMessCallBack(fAlarmDataCB.getCallBack(), null); // 订阅报警 boolean bRet = netsdkApi.CLIENT_StartListenEx(loginHandle); if (!bRet) { System.err.println("订阅报警失败! LastError = 0x%x\n" + netsdkApi.CLIENT_GetLastError()); } else { System.out.println("订阅报警成功."); } } /** * 取消订阅报警信息 * @return */ public void stopListen() { // 停止订阅报警 boolean bRet = netsdkApi.CLIENT_StopListen(loginHandle); if (bRet) { System.out.println("取消订阅报警信息."); } } /** * 报警信息回调函数原形,建议写成单例模式 */ private static class fAlarmDataCB implements NetSDKLib.fMessCallBack{ private fAlarmDataCB(){} private static class fAlarmDataCBHolder { private static fAlarmDataCB callback = new fAlarmDataCB(); } public static fAlarmDataCB getCallBack() { return fAlarmDataCBHolder.callback; } public boolean invoke(int lCommand, LLong lLoginID, Pointer pStuEvent, int dwBufLen, String strDeviceIP, NativeLong nDevicePort, Pointer dwUser){ // System.out.printf("command = %x\n", lCommand); switch (lCommand) { case NetSDKLib.NET_ALARM_FINGER_PRINT: { // 获取信息事件 final ALARM_CAPTURE_FINGER_PRINT_INFO msg = new ALARM_CAPTURE_FINGER_PRINT_INFO(); ToolKits.GetPointerData(pStuEvent, msg); System.out.println("门通道号(从0开始):" + msg.nChannelID); System.out.println("事件时间:" + msg.stuTime.toStringTime()); System.out.println("门读卡器ID:" + new String(msg.szReaderID).trim()); int length = msg.nPacketNum * msg.nPacketLen; byte[] buffer = new byte[length]; msg.szFingerPrintInfo.read(0, buffer, 0, length); String figerStr = Base64Util.getEncoder().encodeToString(buffer); // 将获取到的信息转成没有乱码的字符串 System.out.println("信息数据:" + figerStr); break; } case NetSDKLib.NET_ALARM_ACCESS_CTL_EVENT: { // 门禁事件 ALARM_ACCESS_CTL_EVENT_INFO msg = new ALARM_ACCESS_CTL_EVENT_INFO(); ToolKits.GetPointerData(pStuEvent, msg); System.out.println(msg.toString()); if (msg.nErrorCode == 0x10) { // 密码开门 if (msg.emOpenMethod == NetSDKLib.NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_PWD_ONLY) { System.out.println("密码开门失败"); } else if (msg.emOpenMethod == NetSDKLib.NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_CARD) { // 刷卡开门 - (1202B-D 的 二维码方式) System.out.println("刷卡方式失败"); } } /// 触发开门 // new Thread(new Runnable() { // @Override // public void run() { // openDoor(); // } // }).start(); break; } case NetSDKLib.NET_ALARM_ACCESS_CTL_STATUS: { // 门禁状态事件 ALARM_ACCESS_CTL_STATUS_INFO msg = new ALARM_ACCESS_CTL_STATUS_INFO(); ToolKits.GetPointerData(pStuEvent, msg); System.out.println("门通道号:" + msg.nDoor); System.out.println("事件发生的时间:" + msg.stuTime.toStringTime()); if(msg.emStatus == 1) { System.out.println("门禁状态 : 开门."); } else if(msg.emStatus == 2) { System.out.println("门禁状态 : 关门."); } break; } default: break; } return true; } } /** * 智能订阅 */ public void realLoadPicture() { accessFaceOperate.realLoadPicture(); } /** * 取消智能订阅 */ public void stopRealLoadPicture() { accessFaceOperate.Detach(); } ////////////////////////////////////开关门 /////////////////////////////////////// /** * 开门 */ public static void openDoor() { NetSDKLib.NET_CTRL_ACCESS_OPEN open = new NetSDKLib.NET_CTRL_ACCESS_OPEN(); open.nChannelID = 0; open.write(); boolean openSuccess = netsdkApi.CLIENT_ControlDeviceEx(loginHandle, NetSDKLib.CtrlType.CTRLTYPE_CTRL_ACCESS_OPEN, open.getPointer(), null, 5000); open.read(); if (!openSuccess) { System.err.println("open error: 0x" + Long.toHexString(netsdkApi.CLIENT_GetLastError())); } } /** * 关门 */ public void closeDoor() { final NetSDKLib.NET_CTRL_ACCESS_CLOSE close = new NetSDKLib.NET_CTRL_ACCESS_CLOSE(); close.nChannelID = 0; // 对应的门编号 - 如何开全部的门 close.write(); boolean result = netsdkApi.CLIENT_ControlDeviceEx(loginHandle, NetSDKLib.CtrlType.CTRLTYPE_CTRL_ACCESS_CLOSE, close.getPointer(), null, 5000); close.read(); if (!result) { System.err.println("close error: 0x" + Long.toHexString(netsdkApi.CLIENT_GetLastError())); } } /** * 查询门(开、关)状态 */ public void queryDoorStatus() { int cmd = NetSDKLib.NET_DEVSTATE_DOOR_STATE; NetSDKLib.NET_DOOR_STATUS_INFO doorStatus = new NetSDKLib.NET_DOOR_STATUS_INFO(); IntByReference retLenByReference = new IntByReference(0); doorStatus.write(); boolean bRet = netsdkApi.CLIENT_QueryDevState(loginHandle, cmd, doorStatus.getPointer(), doorStatus.size(), retLenByReference, 3000); doorStatus.read(); if (!bRet) { System.err.println("Failed to queryDoorStatus. Error Code 0x" + Integer.toHexString(netsdkApi.CLIENT_GetLastError())); return; } String stateType[] = {"未知", "门打开", "门关闭", "门异常打开"}; System.out.println("doorStatus -> Channel: " + doorStatus.nChannel + " type: " + stateType[doorStatus.emStateType]); } //////////////////////////////////// 下发信息 ////////////////////////////////////// /** * 信息采集 * @param nChannelID 门禁序号(从开始) * @param szReaderID 读卡器ID, 值为2 */ public void captureFingerprint() { int nChannelID = 0; String szReaderID = "2"; NET_CTRL_CAPTURE_FINGER_PRINT captureFingerprint = new NET_CTRL_CAPTURE_FINGER_PRINT(); captureFingerprint.nChannelID = nChannelID; // 门禁序号(从开始) System.arraycopy(szReaderID.getBytes(), 0, captureFingerprint.szReaderID, 0, szReaderID.getBytes().length); // 读卡器ID captureFingerprint.write(); boolean openSuccess = netsdkApi.CLIENT_ControlDeviceEx(loginHandle, NetSDKLib.CtrlType.CTRLTYPE_CTRL_CAPTURE_FINGER_PRINT, captureFingerprint.getPointer(), null, 5000); captureFingerprint.read(); if (!openSuccess) { System.err.println("CaptureFingerprint Failed." + getErrorCode()); } } /** * 插入信息 */ public void insertFingerprint() { String finggerStr = "xR5jAAOIEiX/NCfFhIliVhAHpkYeiirZ+HP4g4WIyu43S4ZJVoZ7UshNtwgxibuh+C4mxkqGU67RD8YFM4pryfhyFoY/h7Pt4JYoijKGpIIZS6nGtYbkfQiyOUe5iLSB30WZBEKJtIr4MheEVogkwdYvygi3ibTdJ8XIg7eHZPbgvg8bSoi89eZ0KQSuh2ytCM5LUaeHFQ0hvk+Wh4oiFRf/t4RrhuIhB8n2wyOH+5XZ4Gh2NIfLyeEcSJZLhUwd18f2BEWFXIHXxfaEx4ddGs9/v5hHiaVe+Ln7Ak+IZar/9/rDwoklthf/y0IIiGH6/zIlQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGEYMyNXZEMndoR2EWUzZiaEM+qTSHYksRJ2QyUyMxAyM0TxJFdPFGMiVVEz5Slkl4wyFkMRMfJzGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaY+xaNHQFhcwqM2BVghxXQISYjTsaA2O6YagjEqOekUxGA2IWkYAKcBSYcukRANDstPJOMhHlkUUbEJCsolMRRcHtYZVgM7TJYr0VEDQB9u8sIDRTcRZcEMGJkbsZIXUT9XwuFHVGYVwFMRPg9oENMRS9YS9kIDGrgF1sNWNHgG12ElNnYW9xQ0IxcY0CIVIlsGVdNMGeoE11UlQRUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYIFQYLCgQRCQ0FAw8MEBIHGRcOAgEAGhsdAAAAAP/K"; byte[] szFingerPrintInfo = Base64Util.getDecoder().decode(finggerStr); // 将字符串转为信息数据 // 门禁卡记录集信息 NET_RECORDSET_ACCESS_CTL_CARD accessInsert = new NET_RECORDSET_ACCESS_CTL_CARD(); final String cardNo = "1011"; /// 卡号, 16进制, 最大支持8位, 不要为负数的值 final String useId = "1123"; /// 用户ID final String role = "责任人"; // 角色 setPublicInfo(cardNo, useId, role, accessInsert); // 启用成员 stuFingerPrintInfoEx accessInsert.bEnableExtended = 1; // 1-true, 0-false // 信息数据信息, 先申请内存 accessInsert.stuFingerPrintInfoEx.nLength = szFingerPrintInfo.length; // 单个数据包长度,单位字节 accessInsert.stuFingerPrintInfoEx.nCount = 1; // 包个数 accessInsert.stuFingerPrintInfoEx.nPacketLen = szFingerPrintInfo.length; // pPacketData 指向内存区的大小,用户填写 accessInsert.stuFingerPrintInfoEx.pPacketData = new Memory(szFingerPrintInfo.length); // 所有信息数据包, 用户申请内存,大小至少为nLength * nCount accessInsert.stuFingerPrintInfoEx.pPacketData.clear(szFingerPrintInfo.length); // 信息数据包 accessInsert.stuFingerPrintInfoEx.pPacketData.write(0, szFingerPrintInfo, 0, szFingerPrintInfo.length); accessInsert.nDoorNum = 1; // 门个数 表示双门控制器 accessInsert.sznDoors[0] = 0; // 表示第一个门有权限 accessInsert.nTimeSectionNum = 1; // 与门数对应 accessInsert.sznTimeSectionNo[0] = 255; // 表示第一个门全天有效 // 创建时间 accessInsert.stuCreateTime.setTime(2019, 4, 26, 9, 9, 9); // 使用次数 accessInsert.nUserTime = 200; // 有效开始/结束时间 accessInsert.bIsValid = 1; accessInsert.stuValidStartTime.setTime(2019, 4, 26, 0, 0, 0); accessInsert.stuValidEndTime.setTime(2019, 5, 26, 0, 0, 0); if(!AccessCtlOperate.insert(accessInsert)) { System.err.println("insert password failed." + getErrorCode()); return; } } /** * 更新信息 */ public void updateFingerprint() { String finggerStr = "xTxpAASFsk3+8hoDh4ky0ghH2oR7hjp658Wp" + "Q4eJQyEQBdoFgIerDuhFuAQGhsr6BvQpguuF804HMjpFaIUjOQ" + "AJyUSGiAwlCEupSGSFnA3gS7nF2IUUVe62SYVXhcSBoJG5iGSGvJqI" + "lZsRkYhksjBNnUmjh4VOEFEpizyGVUnol4oQQohVft6sOQdWh93lzarniBeJK" + "4EANhtCKoqEmuA0C4M+im2+/zPJAzCKrcX5OipCtIpF9g6DqQOth32CAA8bUiiGdbog0wqKWofGYtxwecgQhsZi" + "ONMO3VqH5p7b8kmGiooaSQfF/MEWilKZ+Dgeg4iJuwYQBgyDJ4uEMfg3/kOsi53VB/++RTaLbf74N/uFY4NzPegFyQNfg3Ot6EXawda" + "CO63/fhpAWIS0YehJyoRSg9SR+IfYRFCCbQXnxcrBR4RtTeCJykPKgrU5/rYagr6EvbIOeDhCOoWt5dB/yI" + "dDgd3FB8f4BEGDpf3oR/oDQYImAQfJ+kM+iy5x+HXMRUaJznnQtCrGNoteifk4CkUohZaWyIepBTGEdsLX/9qBHoZO0pD" + "JGog6iybq+Tn3x1yH7vrbco2HN4R+8s//+EIhhbcW18f3RZqGnx4LfhvXO4qvOvlB+0qQhpc9/L5MVlJH878zUyMvjxF2YSIlVRJUamE" + "lNH8nRUGD8niPUp/xI6f28/czRPMPMfH2QvIvQSNEcyNB/zIyRSM/8zXzUvMzYfNFQ/IzUh9CNSf1X//xL0U6MohGebIWlDNWhRZi/xIVgkVP+Hhn" + "9f9RAUWhRi8eafk+QXSytDwtFjGCklxSMTK8pNZYFILYkrkkYmS30qhUEcKqtNswRwKFkq8QQSHHkRBtESNRkfhdEbK9ovslIVKMoYYdMtGdgSM0" + "ERE1cnIOQQTYoLJkIQJ0gJsNFFTugetWEhME5zESEnLokpsbFFS+kYVfVLGbs" + "E4qQTaYgcEOIRPEkfQRJGDhkWsOEmXWoLdpRKKNoA5tRENBoM" + "5GEFEkosISZBLUkKlXIHbdkGRRAQHRoAwLDw4NFwgJChglKxEoKiYaGQcSBDIbIy0pNBQWFVVs"; byte[] szFingerPrintInfo = Base64Util.getDecoder().decode(finggerStr); // 将字符串转为信息数据 // 门禁卡记录集信息 NET_RECORDSET_ACCESS_CTL_CARD accessUpdate = new NET_RECORDSET_ACCESS_CTL_CARD(); accessUpdate.nRecNo = AccessCtlOperate.getRecordNo(); // 需要修改的记录集编号,由插入获得 final String cardNo = "1011"; /// 卡号, 16进制, 最大支持8位, 不要为负数的值 final String useId = "1123"; /// 用户ID final String role = "负责人"; // 角色 setPublicInfo(cardNo, useId, role, accessUpdate); // 启用成员 stuFingerPrintInfoEx accessUpdate.bEnableExtended = 1; // 1-true, 0-false // 信息数据信息, 先申请内存 accessUpdate.stuFingerPrintInfoEx.nLength = szFingerPrintInfo.length; // 单个数据包长度,单位字节 accessUpdate.stuFingerPrintInfoEx.nCount = 1; // 包个数 accessUpdate.stuFingerPrintInfoEx.nPacketLen = szFingerPrintInfo.length; // pPacketData 指向内存区的大小,用户填写 accessUpdate.stuFingerPrintInfoEx.pPacketData = new Memory(szFingerPrintInfo.length); // 所有信息数据包, 用户申请内存,大小至少为nLength * nCount accessUpdate.stuFingerPrintInfoEx.pPacketData.clear(szFingerPrintInfo.length); // 信息数据包 accessUpdate.stuFingerPrintInfoEx.pPacketData.write(0, szFingerPrintInfo, 0, szFingerPrintInfo.length); accessUpdate.bIsValid = 1; accessUpdate.stuValidStartTime.setTime(2019, 4, 26, 0, 0, 0); accessUpdate.stuValidEndTime.setTime(2019, 5, 26, 10, 10, 10); if (!AccessCtlOperate.update(accessUpdate)) { System.err.println("update password failed." + getErrorCode()); } System.out.println("update fingerprint success."); } /** * 删除信息 */ public void deleteFingerprint() { if(!AccessCtlOperate.delete(EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD, AccessCtlOperate.getRecordNo())){ System.err.println("delete fingerprint failed." + getErrorCode()); } System.out.println("delete fingerprint success."); } /** * 清除记录 */ public void clearFingerprint() { if(!AccessCtlOperate.clear(EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD)){ System.err.println("clear fingerprint failed." + getErrorCode()); } System.out.println("clear fingerprint success."); } ////////////////////////////////////// 发卡操作 ////////////////////////////////////////// /** * 插入卡信息 */ public void insertCard() { NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARD cardInsert = new NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARD(); final String cardNo = "8190D743"; /// 卡号, 16进制, 最大支持8位, 不要为负数的值 final String useId = "123456"; /// 用户ID final String role = "经理"; // 角色 setPublicInfo(cardNo, useId, role, cardInsert); /// 设置有效时间 cardInsert.stuValidStartTime.dwYear = 2019; cardInsert.stuValidStartTime.dwMonth = 4; cardInsert.stuValidEndTime.dwYear = cardInsert.stuValidStartTime.dwYear + 10; // 10 年有效 cardInsert.stuValidEndTime.dwMonth = 4; ///-- 设置开门权限 cardInsert.nDoorNum = 2; // 门个数 表示双门控制器 cardInsert.sznDoors[0] = 0; // 表示第一个门有权限 cardInsert.sznDoors[1] = 1; // 表示第二个门有权限 cardInsert.nTimeSectionNum = 2; // 与门数对应 cardInsert.sznTimeSectionNo[0] = 255; // 表示第一个门全天有效 cardInsert.sznTimeSectionNo[1] = 255; // 表示第二个门全天有效 /// 卡类型使用: 设置成来宾卡可以使能刷卡有效次数 // cardInsert.emType = NET_ACCESSCTLCARD_TYPE.NET_ACCESSCTLCARD_TYPE_GUEST; // cardInsert.nUserTime = 10; // 表示刷卡成功10次后将失效 if(!AccessCtlOperate.insert(cardInsert)) { // 返回的为CardNo 的10进制:即插入卡号3344 成功, 返回13124 System.err.println("Insert Card Failed." + getErrorCode()); return; } // 下发人脸 faceOperate(EM_FACEINFO_OPREATE_TYPE.EM_FACEINFO_OPREATE_ADD, useId); } /** * 更新卡信息: * 主要:不能更新卡号,原来插入的信息也要保留,仅修改对应的字段 * */ public void updateCard() { NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARD cardUpdate = new NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARD(); /// 注意:原来插入卡的字段要保留 cardUpdate.nRecNo = AccessCtlOperate.getRecordNo(); final String cardNo = "8190D743"; /// 卡号, 16进制, 最大支持8位, 不要为负数的值 final String useId = "123456"; /// 用户ID final String role = "领导"; // 角色 setPublicInfo(cardNo, useId, role, cardUpdate); /// 设置有效时间 cardUpdate.stuValidStartTime.dwYear = 2017; cardUpdate.stuValidStartTime.dwMonth = 11; cardUpdate.stuValidEndTime.dwYear = cardUpdate.stuValidStartTime.dwYear + 10; // 10 年有效 cardUpdate.stuValidEndTime.dwMonth = 11; ///-- 修改: 门的权限及时间段, 仅第一个门有效 cardUpdate.nDoorNum = 1; // 门个数 表示双门控制器 cardUpdate.sznDoors[0] = 0; // 表示第一个门有权限 cardUpdate.nTimeSectionNum = 1; // 与门数对应 cardUpdate.sznTimeSectionNo[0] = 255; // 表示第一个门全天有效 if (!AccessCtlOperate.update(cardUpdate)) { System.err.println("Update Card Failed." + getErrorCode()); return; } System.out.println("Update Card Success."); faceOperate(EM_FACEINFO_OPREATE_TYPE.EM_FACEINFO_OPREATE_UPDATE, useId); } /** * 删除卡信息 */ public void deleteCard() { if(!AccessCtlOperate.delete(EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD, AccessCtlOperate.getRecordNo())){ System.err.println("delete Card/Fingerprint Failed." + getErrorCode()); return; } System.out.println("delete Card/Fingerprint RecordNo " + AccessCtlOperate.getRecordNo() + " Success!"); final String useId = "123456"; /// 用户ID faceOperate(EM_FACEINFO_OPREATE_TYPE.EM_FACEINFO_OPREATE_REMOVE, useId); } /** * 清除卡 */ public void clearCard() { if(!AccessCtlOperate.clear(EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD)) { System.err.println("Clear Card/Fingerprint Failed." + getErrorCode()); return; } System.out.println("Clear Card/Fingerprint Success."); faceOperate(EM_FACEINFO_OPREATE_TYPE.EM_FACEINFO_OPREATE_CLEAR, null); } public void setPublicInfo(String cardNo, String useId, String role, NET_RECORDSET_ACCESS_CTL_CARD accessCard) { System.arraycopy(cardNo.getBytes(), 0, accessCard.szCardNo, 0, cardNo.getBytes().length); System.arraycopy(useId.getBytes(), 0, accessCard.szUserID, 0, useId.getBytes().length); try { accessCard.emSex = NET_ACCESSCTLCARD_SEX.NET_ACCESSCTLCARD_SEX_MALE; System.arraycopy(role.getBytes("GBK"), 0, accessCard.szRole, 0, role.getBytes("GBK").length); String temp = "H/010-1800"; // 项目编号 System.arraycopy(temp.getBytes(), 0, accessCard.szProjectNo, 0, temp.getBytes().length); temp = "hhhh"; // 项目名称 System.arraycopy(temp.getBytes("GBK"), 0, accessCard.szProjectName, 0, temp.getBytes("GBK").length); temp = "hhhh"; // 施工单位全称 System.arraycopy(temp.getBytes("GBK"), 0, accessCard.szBuilderName, 0, temp.getBytes("GBK").length); temp = "001"; System.arraycopy(temp.getBytes(), 0, accessCard.szBuilderID, 0, temp.getBytes().length); temp = "002"; System.arraycopy(temp.getBytes(), 0, accessCard.szBuilderType, 0, temp.getBytes().length); temp = "003"; System.arraycopy(temp.getBytes(), 0, accessCard.szBuilderTypeID, 0, temp.getBytes().length); temp = "004"; System.arraycopy(temp.getBytes(), 0, accessCard.szPictureID, 0, temp.getBytes().length); temp = "005"; System.arraycopy(temp.getBytes(), 0, accessCard.szContractID, 0, temp.getBytes().length); temp = "007"; // 工种ID System.arraycopy(temp.getBytes(), 0, accessCard.szWorkerTypeID, 0, temp.getBytes().length); temp = "ttttt"; // 工种名称 System.arraycopy(temp.getBytes("GBK"), 0, accessCard.szWorkerTypeName, 0, temp.getBytes("GBK").length); temp = "yyyyy"; // 卡命名 System.arraycopy(temp.getBytes("GBK"), 0, accessCard.szCardName, 0, temp.getBytes("GBK").length); accessCard.bPersonStatus = 0; }catch (UnsupportedEncodingException e) { System.err.println("...UnsupportedEncodingException..."); } } private void faceOperate(int emType, String userId) { if (!bFaceOperate) { return; } // 图片路径 String imagePath = "d:/31289.jpg"; switch (emType) { case EM_FACEINFO_OPREATE_TYPE.EM_FACEINFO_OPREATE_ADD: accessFaceOperate.addFaceInfo(userId, imagePath); break; case EM_FACEINFO_OPREATE_TYPE.EM_FACEINFO_OPREATE_UPDATE: accessFaceOperate.updateFaceInfo(userId, imagePath); break; case EM_FACEINFO_OPREATE_TYPE.EM_FACEINFO_OPREATE_REMOVE: accessFaceOperate.removeFaceInfo(userId); break; case EM_FACEINFO_OPREATE_TYPE.EM_FACEINFO_OPREATE_CLEAR: accessFaceOperate.clearFaceInfo(); break; } } ////////////////////////////////////// 查询卡记录集 /////////////////////////////////////// /** * 按记录集编号查询卡 */ public void queryCardByRecNo() { NET_RECORDSET_ACCESS_CTL_CARD accessCard = new NET_RECORDSET_ACCESS_CTL_CARD(); // 记录集编号 accessCard.nRecNo = AccessCtlOperate.getRecordNo(); if (!AccessCtlOperate.queryRecordState(accessCard)) { System.err.println("Query Card By RecNo Failed." + getErrorCode()); return; } } /** * 按卡号查询卡信息 * 由于1202B-D性能问题, 不能按卡号或者时间条件过滤查询数据 */ public void queryCardByCardNo() { final NetSDKLib.FIND_RECORD_ACCESSCTLCARD_CONDITION queryCondition = new NetSDKLib.FIND_RECORD_ACCESSCTLCARD_CONDITION(); queryCondition.abCardNo = 1; final String cardNo = "1011"; System.arraycopy(cardNo.getBytes(), 0, queryCondition.szCardNo, 0, cardNo.length()); queryAccessCard(queryCondition); } /** * 查询所有卡 */ public void queryAllCard() { final NetSDKLib.FIND_RECORD_ACCESSCTLCARD_CONDITION queryCondition = new NetSDKLib.FIND_RECORD_ACCESSCTLCARD_CONDITION(); queryAccessCard(queryCondition); } /** * 查询门禁刷卡记录 */ public void queryAccessCard(NetSDKLib.FIND_RECORD_ACCESSCTLCARD_CONDITION queryCondition) { /// 1202B-D 不支持该功能 // System.out.println("Total Record Count: " + getTotalRecordCount(findRecordOut.lFindeHandle)); final int nRecordCount = 10; // 每次查询的最大个数, 1202B-D 最多支持10条 ///门禁刷卡记录记录集信息 NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARD[] records = new NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARD[nRecordCount]; for(int i = 0; i < nRecordCount; i++) { records[i] = new NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARD(); } AccessCtlOperate.queryRecord(queryCondition, records); } private static void printRecord(NET_RECORDSET_ACCESS_CTL_CARD record) { System.out.println("记录集编号:" + record.nRecNo); System.out.println("卡号:" + new String(record.szCardNo).trim()); System.out.println("用户ID:" + new String(record.szUserID).trim()); System.out.println("开始时间:" + record.stuValidStartTime.toStringTime()); System.out.println("结束时间:" + record.stuValidEndTime.toStringTime()); try { System.out.println("卡命名:" + new String(record.szCardName, "GBK").trim()); System.out.println("角色:" + new String(record.szRole, "GBK").trim()); System.out.println("项目编号:" + new String(record.szProjectNo).trim()); System.out.println("项目名称:" + new String(record.szProjectName, "GBK").trim()); System.out.println("施工单位全称:" + new String(record.szBuilderName, "GBK").trim()); System.out.println("工种名称:" + new String(record.szWorkerTypeName, "GBK").trim()); }catch(UnsupportedEncodingException e) { System.err.println("...UnsupportedEncodingException..."); } } ////////////////////////////////////// 门禁出入记录操作 ////////////////////////////////////////// /** * 插入门禁出入记录 */ public void insertRecord() { NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARDREC recordInsert = new NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARDREC(); final String cardNo = "7FFFFFFF"; /// 卡号, 16进制, 最大支持8位, 不要为负数的值 final String useId = "1122"; /// 用户ID final String role = "民工"; // 角色 setPublicInfo(cardNo, useId, role, recordInsert); // 记录集编号 recordInsert.nRecNo = AccessCtlOperate.getRecordNo(); /// 刷卡时间 recordInsert.stuTime.setTime(2019, 4, 25, 17, 17, 17); recordInsert.emMethod = NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_CARD; // 卡 if(!AccessCtlOperate.insert(recordInsert)) { // 返回的为CardNo 的10进制:即插入卡号3344 成功, 返回13124 System.err.println("Insert Record Failed." + getErrorCode()); return; } } /** * 更新门禁出入记录: */ public void updateRecord() { NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARDREC recordUpdate = new NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARDREC(); /// 注意:原来插入的字段要保留 recordUpdate.nRecNo = AccessCtlOperate.getRecordNo(); final String cardNo = "7FFFFFFF"; /// 卡号, 16进制, 最大支持8位, 不要为负数的值 final String useId = "1122"; /// 用户ID final String role = "干事"; // 角色 setPublicInfo(cardNo, useId, role, recordUpdate); /// 设置刷卡时间 recordUpdate.stuTime.setTime(2019, 4, 25, 18, 18, 18); recordUpdate.emMethod = NET_ACCESS_DOOROPEN_METHOD.NET_ACCESS_DOOROPEN_METHOD_FACE_RECOGNITION; // 目标识别 if (!AccessCtlOperate.update(recordUpdate)) { System.err.println("Update Record Failed." + getErrorCode()); return; } System.out.println("Update Record Success."); } /** * 删除门禁出入记录 */ public void deleteRecord() { if(!AccessCtlOperate.delete(EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARDREC_EX, AccessCtlOperate.getRecordNo())){ System.err.println("delete Record Failed." + getErrorCode()); return; } System.out.println("delete Record RecordNo " + AccessCtlOperate.getRecordNo() + " Success!"); } /** * 清除门禁出入记录 */ public void clearRecord() { if(!AccessCtlOperate.clear(EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARDREC_EX)) { System.err.println("Clear Record Failed." + getErrorCode()); return; } System.out.println("Clear Record Success."); } public void setPublicInfo(String cardNo, String useId, String role, NET_RECORDSET_ACCESS_CTL_CARDREC cardRecord) { if (cardNo != null) { System.arraycopy(cardNo.getBytes(), 0, cardRecord.szCardNo, 0, cardNo.getBytes().length); } if (useId != null) { System.arraycopy(useId.getBytes(), 0, cardRecord.szUserID, 0, useId.getBytes().length); } try { if (role != null) { System.arraycopy(role.getBytes("GBK"), 0, cardRecord.szRole, 0, role.getBytes("GBK").length); } String temp = "H/010-1800"; // 项目编号 System.arraycopy(temp.getBytes(), 0, cardRecord.szProjectNo, 0, temp.getBytes().length); temp = "河源恒府"; // 项目名称 System.arraycopy(temp.getBytes("GBK"), 0, cardRecord.szProjectName, 0, temp.getBytes("GBK").length); temp = "五局"; // 施工单位全称 System.arraycopy(temp.getBytes("GBK"), 0, cardRecord.szBuilderName, 0, temp.getBytes("GBK").length); }catch (UnsupportedEncodingException e) { System.err.println("...UnsupportedEncodingException..."); } } ////////////////////////////////////// 查询刷卡记录 /////////////////////////////////////// /** * 按记录集编号查询卡 */ public void queryRecordByRecNo() { NET_RECORDSET_ACCESS_CTL_CARDREC cardRecord = new NET_RECORDSET_ACCESS_CTL_CARDREC(); // 记录集编号 cardRecord.nRecNo = AccessCtlOperate.getRecordNo(); if (!AccessCtlOperate.queryRecordState(cardRecord)) { System.err.println("Query Record By RecNo Failed." + getErrorCode()); return; } } /** * 按卡号查询 刷卡记录 * 由于1202B-D性能问题, 不能按卡号或者时间条件过滤查询数据 */ public void queryRecordByCardNo() { final NetSDKLib.FIND_RECORD_ACCESSCTLCARDREC_CONDITION_EX queryCondition = new NetSDKLib.FIND_RECORD_ACCESSCTLCARDREC_CONDITION_EX(); queryCondition.bCardNoEnable = 1; final String cardNo = "7FFFFFFF"; System.arraycopy(cardNo.getBytes(), 0, queryCondition.szCardNo, 0, cardNo.length()); queryAccessRecord(queryCondition); } /** * 按时间查询刷卡记录 * 由于1202B-D性能问题, 不能按卡号或者时间条件过滤查询数据 */ public void queryRecordByTime() { final NetSDKLib.FIND_RECORD_ACCESSCTLCARDREC_CONDITION_EX queryCondition = new NetSDKLib.FIND_RECORD_ACCESSCTLCARDREC_CONDITION_EX(); queryCondition.bTimeEnable = 1; queryCondition.stStartTime.setTime(2019, 4, 25, 15, 20, 0); queryCondition.stEndTime.setTime(2019, 4, 25, 15, 39, 0); queryAccessRecord(queryCondition); } /** * 不按时间或卡号查询刷卡记录 * 由于1202B-D性能问题, 不能按卡号或者时间条件过滤查询数据 */ public void queryAllRecord() { final NetSDKLib.FIND_RECORD_ACCESSCTLCARDREC_CONDITION_EX queryCondition = new NetSDKLib.FIND_RECORD_ACCESSCTLCARDREC_CONDITION_EX(); queryAccessRecord(queryCondition); } /** * 查询门禁刷卡记录 */ public void queryAccessRecord(NetSDKLib.FIND_RECORD_ACCESSCTLCARDREC_CONDITION_EX queryCondition) { /// 1202B-D 不支持该功能 // System.out.println("Total Record Count: " + getTotalRecordCount(findRecordOut.lFindeHandle)); final int nRecordCount = 10; // 每次查询的最大个数, 1202B-D 最多支持10条 ///门禁刷卡记录记录集信息 NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARDREC[] records = new NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARDREC[nRecordCount]; for(int i = 0; i < nRecordCount; i++) { records[i] = new NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARDREC(); } AccessCtlOperate.queryRecord(queryCondition, records); } private static void printRecord(NET_RECORDSET_ACCESS_CTL_CARDREC record) { try { System.out.println("刷卡时间:" + record.stuTime.toStringTime() + "\n" + "卡号:" + new String(record.szCardNo).trim() + "\n" + "卡类型:" + record.emCardType + "\n" + "门号:" + record.nDoor + "\n" + "密码:" + new String(record.szPwd).trim() + "\n" + "开门方式:" + record.emMethod + "\n" + "开门结果:" + (record.bStatus == 1 ? "成功" : "失败") + "\n" + "角色:" + new String(record.szRole, "GBK").trim() + "\n" + "项目编号:" + new String(record.szProjectNo).trim() + "\n" + "项目名称:" + new String(record.szProjectName, "GBK").trim() + "\n" + "施工单位全称:" + new String(record.szBuilderName, "GBK").trim() + "\n" + "工种名称:" + new String(record.szWorkerTypeName, "GBK").trim() ); }catch(UnsupportedEncodingException e) { System.err.println("...UnsupportedEncodingException..."); } } ////////////////////////////////////下发密码 /////////////////////////////////////// /** * 插入密码 */ public void insertPassword() { // 密码的编号, 支持500个, 不重复 final String userId = "1011"; // 开门密码 final String openDoorPassword = "888887"; NetSDKLib.NET_RECORDSET_ACCESS_CTL_PWD accessInsert = new NetSDKLib.NET_RECORDSET_ACCESS_CTL_PWD(); System.arraycopy(userId.getBytes(), 0, accessInsert.szUserID, 0, userId.getBytes().length); System.arraycopy(openDoorPassword.getBytes(), 0, accessInsert.szDoorOpenPwd, 0, openDoorPassword.getBytes().length); /// 以下字段可以固定, 目前设备做了限制必须要带 accessInsert.nDoorNum = 2; // 门个数 表示双门控制器 accessInsert.sznDoors[0] = 0; // 表示第一个门有权限 accessInsert.sznDoors[1] = 1; // 表示第二个门有权限 accessInsert.nTimeSectionNum = 2; // 与门数对应 accessInsert.nTimeSectionIndex[0] = 255; // 表示第一个门全天有效 accessInsert.nTimeSectionIndex[1] = 255; // 表示第二个门全天有效 if(!AccessCtlOperate.insert(accessInsert)){ System.err.println("Insert Password Failed." + getErrorCode()); return; } } /** * 更新密码 */ public void updatePassword() { NetSDKLib.NET_RECORDSET_ACCESS_CTL_PWD accessUpdate = new NetSDKLib.NET_RECORDSET_ACCESS_CTL_PWD(); accessUpdate.nRecNo = AccessCtlOperate.getRecordNo(); // 需要修改的记录集编号,由插入获得 /// 密码编号, 必填否则更新密码不起作用 final String userId = String.valueOf(accessUpdate.nRecNo); System.arraycopy(userId.getBytes(), 0, accessUpdate.szUserID, 0, userId.getBytes().length); // 新的开门密码 final String newPassord = "333333"; System.arraycopy(newPassord.getBytes(), 0, accessUpdate.szDoorOpenPwd, 0, newPassord.getBytes().length); /// 以下字段可以固定, 目前设备做了限制必须要带 accessUpdate.nDoorNum = 2; // 门个数 表示双门控制器 accessUpdate.sznDoors[0] = 0; // 表示第一个门有权限 accessUpdate.sznDoors[1] = 1; // 表示第二个门有权限 accessUpdate.nTimeSectionNum = 2; // 与门数对应 accessUpdate.nTimeSectionIndex[0] = 255; // 表示第一个门全天有效 accessUpdate.nTimeSectionIndex[1] = 255; // 表示第二个门全天有效 if(!AccessCtlOperate.update(accessUpdate)){ System.err.println("Update Password Failed." + getErrorCode()); return; } System.out.println("Update pawssword Success."); } /** * 删除密码 */ public void deletePassword() { if(!AccessCtlOperate.delete(EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLPWD, AccessCtlOperate.getRecordNo())){ System.err.println("delete pawssword failed. " + getErrorCode()); } System.out.println("delete pawssword RecordNo " + AccessCtlOperate.getRecordNo() + " Success!"); } /** * 清理记录 */ public void clearPassword() { if(!AccessCtlOperate.clear(EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLPWD)) { System.err.println("Clear pawssword Failed." + getErrorCode()); return; } System.out.println("Clear pawssword Success."); } /////////////////////////////////// 下发二维码 //////////////////////////////////////// /** * 插入二维码 1202B-D 不支持该接口. 参考发卡, 二维码和卡号等值 */ public void insertQRPassword() { NetSDKLib.NET_RECORD_ACCESSQRCODE_INFO qrcodeInsert = new NetSDKLib.NET_RECORD_ACCESSQRCODE_INFO(); // 有效次数: 该二维码可以使用多少次 qrcodeInsert.nLeftTimes = 2; // 二维码值 final String QRCode = "123456"; System.arraycopy(QRCode.getBytes(), 0, qrcodeInsert.szQRCode, 0, QRCode.getBytes().length); /// 全天有效如何设置 // 有效开始时间 qrcodeInsert.stuStartTime.dwYear = 2017; qrcodeInsert.stuStartTime.dwMonth = 11; qrcodeInsert.stuStartTime.dwDay = 15; qrcodeInsert.stuStartTime.dwHour = 0; qrcodeInsert.stuStartTime.dwMinute = 0; qrcodeInsert.stuStartTime.dwSecond = 0; // 有效结束时间 qrcodeInsert.stuEndTime.dwYear = 2017; qrcodeInsert.stuEndTime.dwMonth = 11; qrcodeInsert.stuEndTime.dwDay = 15; qrcodeInsert.stuEndTime.dwHour = 23; qrcodeInsert.stuEndTime.dwMinute = 59; qrcodeInsert.stuEndTime.dwSecond = 59; if(!AccessCtlOperate.insert(qrcodeInsert)){ System.err.println("Insert QR Failed." + getErrorCode()); return; } } /** * 更新二维码 1202B-D 不支持该接口. 参考发卡, 二维码和卡号等值 */ public void updateQRPassword() { NetSDKLib.NET_RECORD_ACCESSQRCODE_INFO qrcodeUpdate = new NetSDKLib.NET_RECORD_ACCESSQRCODE_INFO(); // 需要修改的记录集编号,由插入获得 qrcodeUpdate.nRecNo = AccessCtlOperate.getRecordNo(); // 新二维码, 可以为任意字符串 final String newQRCode = "444444"; System.arraycopy(newQRCode.getBytes(), 0, qrcodeUpdate.szQRCode, 0, newQRCode.getBytes().length); if(!AccessCtlOperate.update(qrcodeUpdate)){ System.err.println("Update QR Failed." + getErrorCode()); return; } System.out.println("Update QR Success."); } /** * 删除二维码 1202B-D 不支持该接口. 参考发卡, 二维码和卡号等值 */ public void deleteQRPassword() { if(!AccessCtlOperate.delete(EM_NET_RECORD_TYPE.NET_RECORD_ACCESSQRCODE, AccessCtlOperate.getRecordNo())){ System.err.println("delete QR Failed." + getErrorCode()); return; } System.out.println("delete QR RecordNo " + AccessCtlOperate.getRecordNo() + " Success!"); } /** * 清理二维码 1202B-D 不支持该接口. 参考发卡, 二维码和卡号等值 */ public void clearQRPassword() { if(!AccessCtlOperate.clear(EM_NET_RECORD_TYPE.NET_RECORD_ACCESSQRCODE)) { System.err.println("Clear QR Failed." + getErrorCode()); return; } System.out.println("Clear QR Success."); } ////////////////////////////////////// 记录集 /////////////////////////////////////// // 方法和字段均为静态的,不考虑并发或混合操作 public static class AccessCtlOperate { private static int nRecordNo = 0; // 记录集编号 private static LLong lFindeHandle = new LLong(0); /** * 插入记录集 */ public static boolean insert(SdkStructure object) { int ctrlType = CtrlType.CTRLTYPE_CTRL_RECORDSET_INSERT; int emType = getRecordType(object); if (emType == EM_NET_RECORD_TYPE.NET_RECORD_UNKNOWN) { System.err.println("the input SdkStructure [" + object.getClass() + "] invalid!"); return false; } // 插入信息必须用 CTRLTYPE_CTRL_RECORDSET_INSERTEX,不能用 CTRLTYPE_CTRL_RECORDSET_INSERT if (object instanceof NET_RECORDSET_ACCESS_CTL_CARD) { NET_RECORDSET_ACCESS_CTL_CARD accessCard = (NET_RECORDSET_ACCESS_CTL_CARD)object; if (accessCard.bEnableExtended == 1) { // 带信息 ctrlType = CtrlType.CTRLTYPE_CTRL_RECORDSET_INSERTEX; } } // 记录集新增操作(insert)参数 NET_CTRL_RECORDSET_INSERT_PARAM insert = new NET_CTRL_RECORDSET_INSERT_PARAM(); insert.stuCtrlRecordSetInfo.emType = emType; // 记录集类型 insert.stuCtrlRecordSetInfo.pBuf = object.getPointer(); object.write(); insert.write(); if (!netsdkApi.CLIENT_ControlDevice(loginHandle, ctrlType, insert.getPointer(), 5000)) { return false; } insert.read(); object.read(); System.out.println("insert nRecNo : " + insert.stuCtrlRecordSetResult.nRecNo); nRecordNo = insert.stuCtrlRecordSetResult.nRecNo; return true; } /** * 更新记录集 */ public static boolean update(SdkStructure object) { int ctrlType = CtrlType.CTRLTYPE_CTRL_RECORDSET_UPDATE; int emType = getRecordType(object); if (emType == EM_NET_RECORD_TYPE.NET_RECORD_UNKNOWN) { System.err.println("the input SdkStructure [" + object.getClass() + "] invalid!"); return false; } // 更新信息必须用 CTRLTYPE_CTRL_RECORDSET_UPDATEEX,不能用 CTRLTYPE_CTRL_RECORDSET_UPDATE if (object instanceof NET_RECORDSET_ACCESS_CTL_CARD) { NET_RECORDSET_ACCESS_CTL_CARD accessCard = (NET_RECORDSET_ACCESS_CTL_CARD)object; if (accessCard.bEnableExtended == 1) { // 带信息 ctrlType = CtrlType.CTRLTYPE_CTRL_RECORDSET_UPDATEEX; } } NetSDKLib.NET_CTRL_RECORDSET_PARAM update = new NetSDKLib.NET_CTRL_RECORDSET_PARAM(); update.emType = emType; // 记录集信息类型 update.pBuf = object.getPointer(); object.write(); update.write(); if (!netsdkApi.CLIENT_ControlDevice(loginHandle, ctrlType, update.getPointer(), 5000)) { return false; } // update.read(); // object.read(); return true; } /** * 删除指定记录 */ public static boolean delete(int emType, int nRecordNo) { NetSDKLib.NET_CTRL_RECORDSET_PARAM remove = new NetSDKLib.NET_CTRL_RECORDSET_PARAM(); remove.emType = emType; remove.pBuf = new IntByReference(nRecordNo).getPointer(); remove.write(); return netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_REMOVE, remove.getPointer(), 5000); // remove.read(); } /** * 清除记录 */ public static boolean clear(int emType) { NetSDKLib.NET_CTRL_RECORDSET_PARAM clear = new NetSDKLib.NET_CTRL_RECORDSET_PARAM(); clear.emType = emType; // 记录集信息类型 clear.write(); return netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_CLEAR, clear.getPointer(), 5000); // clear.read(); } /** * 查询记录 */ public static void queryRecord(SdkStructure queryCondition, SdkStructure[] records) { if(!findRecord(queryCondition)) { return; } /// 1202B-D 不支持该功能 // System.out.println("Total Record Count: " + getTotalRecordCount(lFindeHandle)); findNextRecord(records); findRecordClose(); } private static boolean findRecord(SdkStructure queryCondition) { int emType = getRecordType(queryCondition); if (emType == EM_NET_RECORD_TYPE.NET_RECORD_UNKNOWN) { System.err.println("the input query condition SdkStructure [" + queryCondition.getClass() + "] invalid!"); return false; } ///CLIENT_FindRecord入参 NetSDKLib.NET_IN_FIND_RECORD_PARAM findRecordIn = new NetSDKLib.NET_IN_FIND_RECORD_PARAM(); findRecordIn.emType = emType; findRecordIn.pQueryCondition = queryCondition.getPointer(); ///CLIENT_FindRecord出参 NetSDKLib.NET_OUT_FIND_RECORD_PARAM findRecordOut = new NetSDKLib.NET_OUT_FIND_RECORD_PARAM(); queryCondition.write(); findRecordIn.write(); findRecordOut.write(); if (!netsdkApi.CLIENT_FindRecord(loginHandle, findRecordIn, findRecordOut, 5000)) { System.err.println("Find Record Failed." + getErrorCode()); return false; } findRecordOut.read(); lFindeHandle = findRecordOut.lFindeHandle; return true; } private static boolean findNextRecord(SdkStructure[] records) { boolean bRet = true; int nRecordCount = records.length; ///CLIENT_FindNextRecord入参 NetSDKLib.NET_IN_FIND_NEXT_RECORD_PARAM findNextRecordIn = new NetSDKLib.NET_IN_FIND_NEXT_RECORD_PARAM(); findNextRecordIn.lFindeHandle = lFindeHandle; findNextRecordIn.nFileCount = nRecordCount; //想查询的记录条数 ///CLIENT_FindNextRecord出参 NetSDKLib.NET_OUT_FIND_NEXT_RECORD_PARAM findNextRecordOut = new NetSDKLib.NET_OUT_FIND_NEXT_RECORD_PARAM(); findNextRecordOut.nMaxRecordNum = nRecordCount; findNextRecordOut.pRecordList = new Memory(records[0].size() * nRecordCount); findNextRecordOut.pRecordList.clear(records[0].size() * nRecordCount); // 将 native 数据初始化 ToolKits.SetStructArrToPointerData(records, findNextRecordOut.pRecordList); int nLoop = 0; //循环的次数 int recordIndex = 1; while(true) { //循环查询 if(!netsdkApi.CLIENT_FindNextRecord(findNextRecordIn, findNextRecordOut, 5000) ) { System.err.println("FindNextRecord Failed" + getErrorCode()); bRet = false; break; } /// 将 native 数据转为 java 数据 ToolKits.GetPointerDataToStructArr(findNextRecordOut.pRecordList, records); for(int i = 0; i < findNextRecordOut.nRetRecordNum; i++) { recordIndex = i + nLoop * nRecordCount; System.out.println("----------------[" + recordIndex + "]----------------" ); output(records[i]); } if (findNextRecordOut.nRetRecordNum < nRecordCount) { break; } nLoop++; } // long peer = Pointer.nativeValue(findNextRecordOut.pRecordList); // Pointer.nativeValue(findNextRecordOut.pRecordList, 0); // Native.free(peer); return bRet; } private static void findRecordClose() { if (!netsdkApi.CLIENT_FindRecordClose(lFindeHandle)) { System.err.println("Find Record Failed." + getErrorCode()); } } public static boolean queryRecordState(SdkStructure condition) { int emType = getRecordType(condition); if (emType == EM_NET_RECORD_TYPE.NET_RECORD_UNKNOWN) { System.err.println("the input query condition SdkStructure [" + condition.getClass() + "] invalid!"); return false; } NetSDKLib.NET_CTRL_RECORDSET_PARAM record = new NetSDKLib.NET_CTRL_RECORDSET_PARAM(); record.emType = emType; record.pBuf = condition.getPointer(); IntByReference intRetLen = new IntByReference(); condition.write(); record.write(); if (!netsdkApi.CLIENT_QueryDevState(loginHandle, NetSDKLib.NET_DEVSTATE_DEV_RECORDSET, record.getPointer(), record.size(), intRetLen, 3000)) { return false; } record.read(); condition.read(); output(condition); return true; } private static void output(SdkStructure record) { // 具体输出在上层定义 if (record instanceof NET_RECORDSET_ACCESS_CTL_CARDREC) { printRecord((NET_RECORDSET_ACCESS_CTL_CARDREC)record); }else if(record instanceof NET_RECORDSET_ACCESS_CTL_CARD) { printRecord((NET_RECORDSET_ACCESS_CTL_CARD)record); } } public static int getRecordNo() { return nRecordNo; } private static int getRecordType(SdkStructure object) { int type = EM_NET_RECORD_TYPE.NET_RECORD_UNKNOWN; if (object instanceof NET_RECORDSET_ACCESS_CTL_CARD || object instanceof FIND_RECORD_ACCESSCTLCARD_CONDITION) { type = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD; }else if (object instanceof NET_RECORD_ACCESSQRCODE_INFO) { type = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSQRCODE; }else if (object instanceof NET_RECORDSET_ACCESS_CTL_PWD) { type = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLPWD; }else if (object instanceof NET_RECORDSET_ACCESS_CTL_CARDREC || object instanceof FIND_RECORD_ACCESSCTLCARDREC_CONDITION_EX) { type = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARDREC_EX; } return type; } } public void RunTest() { CaseMenu menu = new CaseMenu(); menu.addItem(new CaseMenu.Item(this , "订阅报警信息——startListen", "startListen")); // 开门一般通过门禁事件 menu.addItem(new CaseMenu.Item(this , "取消订阅报警信息——stopListen", "stopListen")); // 开门一般通过门禁事件 menu.addItem(new CaseMenu.Item(this , "智能订阅——realLoadPicture" , "realLoadPicture")); // 具体定义在AccessFaceOperate menu.addItem(new CaseMenu.Item(this , "取消智能订阅——stopRealLoadPicture" , "stopRealLoadPicture")); // 具体定义在AccessFaceOperate menu.addItem(new CaseMenu.Item(this , "开门——openDoor", "openDoor")); menu.addItem(new CaseMenu.Item(this , "关门——closeDoor", "closeDoor")); menu.addItem(new CaseMenu.Item(this , "查询门(开、关)状态——queryDoorStatus", "queryDoorStatus")); menu.addItem(new CaseMenu.Item(this , "信息采集——captureFingerprint", "captureFingerprint")); // 信息插入和更新用EX枚举, 信息及卡对应的删除和清除其实是一样的, 本质上卡和信息都是一样的, 实际上信息的操作包含了卡操作。 menu.addItem(new CaseMenu.Item(this , "下发信息——insertFingerprint", "insertFingerprint")); menu.addItem(new CaseMenu.Item(this , "更新信息——updateFingerprint", "updateFingerprint")); // menu.addItem(new CaseMenu.Item(this , "删除信息——deleteFingerprint", "deleteFingerprint")); // menu.addItem(new CaseMenu.Item(this , "清除信息——clearFingerprint", "clearFingerprint")); // 下发卡信息内包含下发人脸 -faceOperate menu.addItem(new CaseMenu.Item(this , "下发卡信息——insertCard" , "insertCard")); menu.addItem(new CaseMenu.Item(this , "更新卡信息——updateCard" , "updateCard")); menu.addItem(new CaseMenu.Item(this , "删除卡/信息信息——deleteCard", "deleteCard")); menu.addItem(new CaseMenu.Item(this , "清除卡/信息信息——clearCard", "clearCard")); menu.addItem(new CaseMenu.Item(this , "按记录集编号查询卡信息——queryCardByRecNo", "queryCardByRecNo")); menu.addItem(new CaseMenu.Item(this , "按卡号查询卡信息——queryCardByCardNo", "queryCardByCardNo")); menu.addItem(new CaseMenu.Item(this , "查询所有卡信息——queryAllCard", "queryAllCard")); menu.addItem(new CaseMenu.Item(this , "插入门禁出入记录——insertRecord" , "insertRecord")); menu.addItem(new CaseMenu.Item(this , "更新门禁出入记录——updateRecord" , "updateRecord")); menu.addItem(new CaseMenu.Item(this , "删除门禁出入记录——deleteRecord", "deleteRecord")); menu.addItem(new CaseMenu.Item(this , "清除门禁出入记录——clearRecord", "clearRecord")); menu.addItem(new CaseMenu.Item(this , "按记录集编号查询刷卡记录——queryRecordByRecNo", "queryRecordByRecNo")); menu.addItem(new CaseMenu.Item(this , "按卡号查询刷卡记录——queryRecordByCardNo", "queryRecordByCardNo")); menu.addItem(new CaseMenu.Item(this , "按时间查询刷卡记录——queryRecordByTime", "queryRecordByTime")); menu.addItem(new CaseMenu.Item(this , "查询所有刷卡记录——queryAllRecord", "queryAllRecord")); menu.addItem(new CaseMenu.Item(this , "下发密码——insertPassword", "insertPassword")); menu.addItem(new CaseMenu.Item(this , "更新密码——updatePassword", "updatePassword")); menu.addItem(new CaseMenu.Item(this , "删除密码——deletePassword", "deletePassword")); menu.addItem(new CaseMenu.Item(this , "清除密码——clearPassword", "clearPassword")); menu.addItem(new CaseMenu.Item(this , "下发二维码——insertQRPassword" , "insertQRPassword")); menu.addItem(new CaseMenu.Item(this , "更新二维码——updateQRPassword" , "updateQRPassword")); menu.addItem(new CaseMenu.Item(this , "删除二维码——deleteQRPassword", "deleteQRPassword")); menu.addItem(new CaseMenu.Item(this , "清除二维码——clearQRPassword", "clearQRPassword")); menu.run(); } public static void main(String[]args) { AccessControlNew demo = new AccessControlNew(); demo.InitTest(); demo.RunTest(); demo.EndTest(); } }