package com.netsdk.demo.accessControl; 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 AccessControl { 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.10.6.187"; // 172.26.6.104 int port = 37777; String username = "admin"; String password = "admin123"; 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) { 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); // 向设备登入 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); } /** * 获取接口错误码 * @return */ public static String getErrorCode() { return " { error code: ( 0x80000000|" + (netsdkApi.CLIENT_GetLastError() & 0x7fffffff) +" ). 参考 NetSDKLib.java }"; } ////////////////////////////////////开关门 /////////////////////////////////////// /** * 开门 */ 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())); } } /** * 订阅报警信息 * @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; } } //////////////////////////////////// 下发信息 ////////////////////////////////////// /** * 信息采集 * @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()); } } /** * 插入信息成功后返回的编号, 用于后续的更新、删除等操作 * 插入信息必须用 CTRLTYPE_CTRL_RECORDSET_INSERTEX,不能用 CTRLTYPE_CTRL_RECORDSET_INSERT */ private static int fingerprintRecordNo = 0; /** * 插入信息 */ public static void insertFingerprint() { String finggerStr = "xR5jAAOIEiX/NCfFhIliVhAHpkYeiirZ+HP4g4WIyu43S4ZJVoZ7UshNtwgxibuh+C4mxkqGU67RD8YFM4pryfhyFoY/h7Pt4JYoijKGpIIZS6nGtYbkfQiyOUe5iLSB30WZBEKJtIr4MheEVogkwdYvygi3ibTdJ8XIg7eHZPbgvg8bSoi89eZ0KQSuh2ytCM5LUaeHFQ0hvk+Wh4oiFRf/t4RrhuhB8n2wyOH+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(); // 卡号 String cardNo = "1011"; System.arraycopy(cardNo.getBytes(), 0, accessInsert.szCardNo, 0, cardNo.getBytes().length); // 启用成员 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(2018, 12, 19, 14, 1, 1); // 使用次数 accessInsert.nUserTime = 200; // 有效开始/结束时间 accessInsert.bIsValid = 1; accessInsert.stuValidStartTime.setTime(2018, 12, 18, 10, 1, 1); accessInsert.stuValidEndTime.setTime(2018, 12, 20, 10, 1, 1); // 工作班别 //String szWorkClass = "1024"; //System.arraycopy(szWorkClass.getBytes(), 0, accessInsert.szWorkClass, 0, szWorkClass.getBytes().length); // 记录集新增操作(insert)参数 NET_CTRL_RECORDSET_INSERT_PARAM insert = new NET_CTRL_RECORDSET_INSERT_PARAM(); insert.stuCtrlRecordSetInfo.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD; // 记录集类型 insert.stuCtrlRecordSetInfo.pBuf = accessInsert.getPointer(); accessInsert.write(); insert.write(); boolean success = netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_INSERTEX, insert.getPointer(), 5000); insert.read(); accessInsert.read(); if(!success) { System.err.println("insert password failed." + getErrorCode()); return; } System.out.println("Fingerprint nRecNo : " + insert.stuCtrlRecordSetResult.nRecNo); fingerprintRecordNo = insert.stuCtrlRecordSetResult.nRecNo; } /** * 更新信息 */ 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 = fingerprintRecordNo; // 需要修改的记录集编号,由插入获得 // 卡号 String cardNo = "1011"; System.arraycopy(cardNo.getBytes(), 0, accessUpdate.szCardNo, 0, cardNo.getBytes().length); // 启用成员 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); NetSDKLib.NET_CTRL_RECORDSET_PARAM update = new NetSDKLib.NET_CTRL_RECORDSET_PARAM(); update.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD; // 记录集信息类型 update.pBuf = accessUpdate.getPointer(); accessUpdate.write(); update.write(); boolean result = netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_UPDATEEX, update.getPointer(), 5000); update.read(); accessUpdate.read(); if (!result) { System.err.println("update password failed." + getErrorCode()); } } /** * 删除信息 */ public void removeFingerprint() { NetSDKLib.NET_CTRL_RECORDSET_PARAM remove = new NetSDKLib.NET_CTRL_RECORDSET_PARAM(); remove.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD; remove.pBuf = new IntByReference(fingerprintRecordNo).getPointer(); remove.write(); boolean result = netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_REMOVE, remove.getPointer(), 5000); remove.read(); if(!result){ System.err.println("remove fingerprint failed." + getErrorCode()); } } /** * 清除记录 */ public void clearFingerprint() { NetSDKLib.NET_CTRL_RECORDSET_PARAM clear = new NetSDKLib.NET_CTRL_RECORDSET_PARAM(); clear.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD; // 记录集信息类型 clear.write(); boolean result = netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_CLEAR, clear.getPointer(), 5000); clear.read(); if(!result){ System.err.println("clear fingerprint failed." + getErrorCode()); } } ////////////////////////////////////下发密码 /////////////////////////////////////// /** * 插入密码成功后返回的编号, 用于后续的更新、删除等操作 */ private int passwordRecordNo = 0; /** * 插入密码 */ 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; // 表示第二个门全天有效 NetSDKLib.NET_CTRL_RECORDSET_INSERT_PARAM insert = new NetSDKLib.NET_CTRL_RECORDSET_INSERT_PARAM(); insert.stuCtrlRecordSetInfo.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLPWD; // 记录集信息类型 insert.stuCtrlRecordSetInfo.pBuf = accessInsert.getPointer(); accessInsert.write(); insert.write(); boolean success = netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_INSERT, insert.getPointer(), 5000); insert.read(); accessInsert.read(); if(!success) { System.err.println("insert password failed. 0x" + Long.toHexString(netsdkApi.CLIENT_GetLastError())); return; } System.out.println("Password nRecNo : " + insert.stuCtrlRecordSetResult.nRecNo); passwordRecordNo = insert.stuCtrlRecordSetResult.nRecNo; } /** * 更新密码 */ public void updatePassword() { NetSDKLib.NET_RECORDSET_ACCESS_CTL_PWD accessUpdate = new NetSDKLib.NET_RECORDSET_ACCESS_CTL_PWD(); accessUpdate.nRecNo = passwordRecordNo; // 需要修改的记录集编号,由插入获得 /// 密码编号, 必填否则更新密码不起作用 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; // 表示第二个门全天有效 NetSDKLib.NET_CTRL_RECORDSET_PARAM update = new NetSDKLib.NET_CTRL_RECORDSET_PARAM(); update.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLPWD; // 记录集信息类型 update.pBuf = accessUpdate.getPointer(); accessUpdate.write(); update.write(); boolean result = netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_UPDATE, update.getPointer(), 5000); update.read(); accessUpdate.read(); if (!result) { System.err.println("update password failed. 0x" + Long.toHexString(netsdkApi.CLIENT_GetLastError())); } } /** * 删除密码 */ public void deletePassword() { NetSDKLib.NET_CTRL_RECORDSET_PARAM remove = new NetSDKLib.NET_CTRL_RECORDSET_PARAM(); remove.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLPWD; remove.pBuf = new IntByReference(passwordRecordNo).getPointer(); remove.write(); boolean result = netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_REMOVE, remove.getPointer(), 5000); remove.read(); if(!result){ System.err.println(" remove pawssword failed. 0x" + Long.toHexString(netsdkApi.CLIENT_GetLastError())); } } /** * 清理记录 */ public void clearPassword() { NetSDKLib.NET_CTRL_RECORDSET_PARAM clear = new NetSDKLib.NET_CTRL_RECORDSET_PARAM(); clear.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLPWD; // 记录集信息类型 clear.write(); boolean result = netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_CLEAR, clear.getPointer(), 5000); clear.read(); if(!result){ System.err.println(" clear pawssword failed. 0x" + Long.toHexString(netsdkApi.CLIENT_GetLastError())); } } /////////////////////////////////// 下发二维码 //////////////////////////////////////// /** * 插入二维码成功后返回的编号, 用于后续的更新、删除等操作 */ private int QRRecordNo = 0; /** * 插入二维码 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; NetSDKLib.NET_CTRL_RECORDSET_INSERT_PARAM insert = new NetSDKLib.NET_CTRL_RECORDSET_INSERT_PARAM(); insert.stuCtrlRecordSetInfo.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSQRCODE; // 记录集信息类型 insert.stuCtrlRecordSetInfo.pBuf = qrcodeInsert.getPointer(); insert.write(); qrcodeInsert.write(); boolean result = netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_INSERT, insert.getPointer(), 5000); qrcodeInsert.read(); insert.read(); if(!result){ System.err.printf("Insert QR Failed. %x \n", netsdkApi.CLIENT_GetLastError()); return; } System.out.println("QR nRecNo : " + insert.stuCtrlRecordSetResult.nRecNo); QRRecordNo = insert.stuCtrlRecordSetResult.nRecNo; } /** * 更新二维码 1202B-D 不支持该接口. 参考发卡, 二维码和卡号等值 */ public void updateQRPassword() { NetSDKLib.NET_RECORD_ACCESSQRCODE_INFO qrcodeUpdate = new NetSDKLib.NET_RECORD_ACCESSQRCODE_INFO(); // 需要修改的记录集编号,由插入获得 qrcodeUpdate.nRecNo = QRRecordNo; // 新二维码, 可以为任意字符串 final String newQRCode = "444444"; System.arraycopy(newQRCode.getBytes(), 0, qrcodeUpdate.szQRCode, 0, newQRCode.getBytes().length); NetSDKLib.NET_CTRL_RECORDSET_PARAM update = new NetSDKLib.NET_CTRL_RECORDSET_PARAM(); update.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSQRCODE; // 记录集信息类型 update.pBuf = qrcodeUpdate.getPointer(); update.write(); qrcodeUpdate.write(); boolean result = netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_UPDATE, update.getPointer(), 5000); qrcodeUpdate.read(); update.read(); if(!result){ System.err.printf("Update RQ Failed. %x \n", netsdkApi.CLIENT_GetLastError()); return; } } /** * 删除二维码 1202B-D 不支持该接口. 参考发卡, 二维码和卡号等值 */ public void deleteQRPassword() { NetSDKLib.NET_CTRL_RECORDSET_PARAM remove = new NetSDKLib.NET_CTRL_RECORDSET_PARAM(); remove.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSQRCODE; // 记录集信息类型 remove.pBuf = new IntByReference(QRRecordNo).getPointer(); remove.write(); boolean result = netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_REMOVE, remove.getPointer(), 5000); remove.read(); if(!result){ System.err.printf("Remove QR Failed. %x \n", netsdkApi.CLIENT_GetLastError()); return; } } /** * 清理二维码 1202B-D 不支持该接口. 参考发卡, 二维码和卡号等值 */ public void clearQRPassword() { NetSDKLib.NET_CTRL_RECORDSET_PARAM clear = new NetSDKLib.NET_CTRL_RECORDSET_PARAM(); clear.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSQRCODE; // 记录集信息类型 clear.write(); boolean result = netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_CLEAR, clear.getPointer(), 5000); clear.read(); if(!result) { System.err.printf("Clear Failed. %x \n", netsdkApi.CLIENT_GetLastError()); } } ////////////////////////////////////// 下发卡 ////////////////////////////////////////// /** * 卡编号 */ private int cardRecordNo = 0; /** * 插入卡信息 */ public void insertCard() { NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARD cardInsert = new NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARD(); /// 卡号, 16进制, 最大支持8位, 不要为负数的值 final String cardNo = "7FFFFFFF"; System.arraycopy(cardNo.getBytes(), 0, cardInsert.szCardNo, 0, cardNo.getBytes().length); /// 用户ID final String useId = "1122"; System.arraycopy(useId.getBytes(), 0, cardInsert.szUserID, 0, useId.getBytes().length); /// 设置有效时间 cardInsert.stuValidStartTime.dwYear = 2017; cardInsert.stuValidStartTime.dwMonth = 11; cardInsert.stuValidEndTime.dwYear = cardInsert.stuValidStartTime.dwYear + 10; // 10 年有效 cardInsert.stuValidEndTime.dwMonth = 11; ///-- 设置开门权限 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次后将失效 NetSDKLib.NET_CTRL_RECORDSET_INSERT_PARAM insert = new NetSDKLib.NET_CTRL_RECORDSET_INSERT_PARAM(); insert.stuCtrlRecordSetInfo.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD; // 门禁卡 insert.stuCtrlRecordSetInfo.pBuf = cardInsert.getPointer(); cardInsert.write(); insert.write(); boolean success = netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_INSERT, insert.getPointer(), 5000); insert.read(); cardInsert.read(); if(!success) { System.err.printf("Insert Card Failed. %x \n", netsdkApi.CLIENT_GetLastError()); return; } // 返回的为CardNo 的10进制:即插入卡号3344 成功, 返回13124 cardRecordNo = insert.stuCtrlRecordSetResult.nRecNo; System.out.println("Insert Success. Card nRecNo " + cardRecordNo + ": [ Hex = " + Integer.toHexString(cardRecordNo) + " ]"); } /** * 更新卡信息: * 主要:不能更新卡号,原来插入的信息也要保留,仅修改对应的字段 * */ public void updateCard() { System.out.println("Update Card RecordNo " + cardRecordNo); NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARD cardUpdate = new NetSDKLib.NET_RECORDSET_ACCESS_CTL_CARD(); /// 注意:原来插入卡的字段要保留 cardUpdate.nRecNo = cardRecordNo; /// 卡号, 16进制, 最大支持8位, 不要为负数的值 final String cardNo = "7FFFFFFF"; System.arraycopy(cardNo.getBytes(), 0, cardUpdate.szCardNo, 0, cardNo.getBytes().length); /// 用户ID final String useId = "1122"; System.arraycopy(useId.getBytes(), 0, cardUpdate.szUserID, 0, useId.getBytes().length); /// 设置有效时间 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; // 表示第一个门全天有效 NetSDKLib.NET_CTRL_RECORDSET_PARAM update = new NetSDKLib.NET_CTRL_RECORDSET_PARAM(); update.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD; // 记录集信息类型 update.pBuf = cardUpdate.getPointer(); cardUpdate.write(); update.write(); boolean result = netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_UPDATE, update.getPointer(), 5000); update.read(); cardUpdate.read(); if (!result) { System.err.printf("Update Card Failed. %x \n", netsdkApi.CLIENT_GetLastError()); return; } } /** * 删除卡信息 */ public void deleteCard() { System.out.println("Delete Card RecordNo " + cardRecordNo); NetSDKLib.NET_CTRL_RECORDSET_PARAM remove = new NetSDKLib.NET_CTRL_RECORDSET_PARAM(); remove.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD; remove.pBuf = new IntByReference(cardRecordNo).getPointer(); remove.write(); boolean result = netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_REMOVE, remove.getPointer(), 5000); remove.read(); if(!result){ System.err.printf("Remove Card Failed. %x \n", netsdkApi.CLIENT_GetLastError()); return; } } /** * 清除卡 */ public void clearCard() { NetSDKLib.NET_CTRL_RECORDSET_PARAM clear = new NetSDKLib.NET_CTRL_RECORDSET_PARAM(); clear.emType = EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARD; // 记录集信息类型 clear.write(); boolean result = netsdkApi.CLIENT_ControlDevice(loginHandle, CtrlType.CTRLTYPE_CTRL_RECORDSET_CLEAR, clear.getPointer(), 5000); clear.read(); if(!result) { System.err.printf("Clear Card Failed. %x \n", netsdkApi.CLIENT_GetLastError()); } } ////////////////////////////////////// 查询刷卡记录 /////////////////////////////////////// /** * 查询门禁刷卡记录 */ public void queryAccessRecord(NetSDKLib.FIND_RECORD_ACCESSCTLCARDREC_CONDITION_EX queryCondition) { /// 由于1202B-D性能问题, 不能按卡号或者时间条件过滤查询数据 if (queryCondition == null) { queryCondition = new NetSDKLib.FIND_RECORD_ACCESSCTLCARDREC_CONDITION_EX(); } ///CLIENT_FindRecord入参 NetSDKLib.NET_IN_FIND_RECORD_PARAM findRecordIn = new NetSDKLib.NET_IN_FIND_RECORD_PARAM(); findRecordIn.emType = NetSDKLib.EM_NET_RECORD_TYPE.NET_RECORD_ACCESSCTLCARDREC_EX; 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(); boolean success = netsdkApi.CLIENT_FindRecord(loginHandle, findRecordIn, findRecordOut, 5000); findRecordOut.read(); findRecordIn.read(); queryCondition.read(); if(!success) { System.err.println("Can Not Find This Record: " + String.format("0x%x", netsdkApi.CLIENT_GetLastError())); return; } System.out.println("FindRecord Succeed" + "\n" + "FindHandle :" + findRecordOut.lFindeHandle); /// 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(); } ///CLIENT_FindNextRecord入参 NetSDKLib.NET_IN_FIND_NEXT_RECORD_PARAM findNextRecordIn = new NetSDKLib.NET_IN_FIND_NEXT_RECORD_PARAM(); findNextRecordIn.lFindeHandle = findRecordOut.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].dwSize * nRecordCount); findNextRecordOut.pRecordList.clear(records[0].dwSize * nRecordCount); // 将 native 数据初始化 ToolKits.SetStructArrToPointerData(records, findNextRecordOut.pRecordList); int count = 0; //循环的次数 int recordIndex = 1; while(true) { //循环查询 if(!netsdkApi.CLIENT_FindNextRecord(findNextRecordIn, findNextRecordOut, 5000) ) { System.err.println("FindNextRecord Failed" + netsdkApi.CLIENT_GetLastError()); break; } /// 将 native 数据转为 java 数据 ToolKits.GetPointerDataToStructArr(findNextRecordOut.pRecordList, records); for(int i = 0; i < findNextRecordOut.nRetRecordNum; i++) { recordIndex = i + count * nRecordCount; System.out.println("----------------[" + recordIndex + "]----------------" ); System.out.println("刷卡时间:" + records[i].stuTime.toStringTime() + "\n" + "卡号:" + new String(records[i].szCardNo).trim() + "\n" + "卡类型:" + records[i].emCardType + "\n" + "门号:" + records[i].nDoor + "\n" + "密码:" + new String(records[i].szPwd).trim() + "\n" + "开门方式:" + records[i].emMethod + "\n" + "开门结果:" + (records[i].bStatus == 1 ? "成功" : "失败") ); } if (findNextRecordOut.nRetRecordNum < nRecordCount) { break; } count ++; } success = netsdkApi.CLIENT_FindRecordClose(findRecordOut.lFindeHandle); if (!success) { System.err.println("Failed to Close: " + String.format("0x%x", netsdkApi.CLIENT_GetLastError())); } } /** * 按卡号查询 刷卡记录 * 由于1202B-D性能问题, 不能按卡号或者时间条件过滤查询数据 */ public void queryRecordByNo() { final NetSDKLib.FIND_RECORD_ACCESSCTLCARDREC_CONDITION_EX queryCondition = new NetSDKLib.FIND_RECORD_ACCESSCTLCARDREC_CONDITION_EX(); queryCondition.bCardNoEnable = 1; final String cardNo = "12345"; 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(2017, 12, 11, 15, 39, 0); queryCondition.stEndTime.setTime(2017, 12, 11, 16, 39, 0); queryAccessRecord(queryCondition); } /** * 不按时间或卡号查询刷卡记录 * 由于1202B-D性能问题, 不能按卡号或者时间条件过滤查询数据 */ public void queryAllRecords() { final NetSDKLib.FIND_RECORD_ACCESSCTLCARDREC_CONDITION_EX queryCondition = new NetSDKLib.FIND_RECORD_ACCESSCTLCARDREC_CONDITION_EX(); queryAccessRecord(queryCondition); } /** * 获取查询总记录条数 * @param findHandle 查询句柄 * @return */ public int getTotalRecordCount(long findHandle) { NET_IN_QUEYT_RECORD_COUNT_PARAM paramIn = new NET_IN_QUEYT_RECORD_COUNT_PARAM(); paramIn.lFindeHandle.setValue(findHandle); NET_OUT_QUEYT_RECORD_COUNT_PARAM paramOut = new NET_OUT_QUEYT_RECORD_COUNT_PARAM(); boolean bRet = netsdkApi.CLIENT_QueryRecordCount(paramIn, paramOut, 3000); if (!bRet) { System.err.println("Can't FindNextRecord" + Integer.toHexString(netsdkApi.CLIENT_GetLastError())); return -1; } return paramOut.nRecordCount; } /** * 查询门(开、关)状态 */ 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]); } public void RunTest() { CaseMenu menu = new CaseMenu(); menu.addItem(new CaseMenu.Item(this , "captureFingerprint", "captureFingerprint")); menu.addItem(new CaseMenu.Item(this , "insertFingerprint", "insertFingerprint")); menu.addItem(new CaseMenu.Item(this , "startListen", "startListen")); // 开门一般通过门禁事件 menu.addItem(new CaseMenu.Item(this , "Door Open", "openDoor")); menu.addItem(new CaseMenu.Item(this , "Door Close", "closeDoor")); menu.addItem(new CaseMenu.Item(this , "Pwd Insert : id - 1010, pwd - 888888 ", "insertPassword")); menu.addItem(new CaseMenu.Item(this , "Pwd Update : id - 1010, pwd - 333333 ", "updatePassword")); menu.addItem(new CaseMenu.Item(this , "Pwd Delete : id - 1010", "deletePassword")); menu.addItem(new CaseMenu.Item(this , "Pwd Clear", "clearPassword")); menu.addItem(new CaseMenu.Item(this , "QR Insert : QR - 123456 " , "insertQRPassword")); menu.addItem(new CaseMenu.Item(this , "QR Update : QR - 444444" , "updateQRPassword")); menu.addItem(new CaseMenu.Item(this , "QR Delete", "deleteQRPassword")); menu.addItem(new CaseMenu.Item(this , "QR Clear", "clearQRPassword")); menu.addItem(new CaseMenu.Item(this , "Card Insert : cardNo - 3344" , "insertCard")); menu.addItem(new CaseMenu.Item(this , "Card Update : cardNo - 4455" , "updateCard")); menu.addItem(new CaseMenu.Item(this , "Card Delete", "deleteCard")); menu.addItem(new CaseMenu.Item(this , "Card Clear", "clearCard")); menu.addItem(new CaseMenu.Item(this , "Query All Records", "queryAllRecords")); menu.addItem(new CaseMenu.Item(this , "Query Records By Time", "queryRecordByTime")); menu.addItem(new CaseMenu.Item(this , "Query Records By Car No", "queryRecordByNo")); menu.addItem(new CaseMenu.Item(this , "Query Door Status", "queryDoorStatus")); menu.run(); } public static void main(String[]args) { AccessControl demo = new AccessControl(); demo.InitTest(); demo.RunTest(); demo.EndTest(); } }