From 7243f75a457bc08a26a65a03d16666ec996205c8 Mon Sep 17 00:00:00 2001 From: haidong Date: Wed, 13 Sep 2023 15:57:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=B7=E5=BA=B7=E4=BA=BA=E8=84=B8=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E5=88=86=E6=97=B6=E6=AE=B5=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: haidong --- pom.xml | 30 +- .../java/com/hkversion/Acs/ACSManage.java | 99 ++++ src/main/java/com/hkversion/Acs/AcsMain.java | 224 ++++++++ .../java/com/hkversion/Acs/CardManage.java | 219 ++++++++ .../java/com/hkversion/Acs/DeviceAbility.java | 28 + .../java/com/hkversion/Acs/EventSearch.java | 121 +++++ .../java/com/hkversion/Acs/FaceManage.java | 494 ++++++++++++++++++ .../java/com/hkversion/Acs/FingerManage.java | 380 ++++++++++++++ .../java/com/hkversion/Acs/MutilCard.java | 76 +++ .../java/com/hkversion/Acs/TransIsapi.java | 99 ++++ .../java/com/hkversion/Acs/UserManage.java | 462 ++++++++++++++++ .../java/com/hkversion/AlarmDataParse.java | 2 +- src/main/java/com/yzx/Main.java | 33 +- 13 files changed, 2249 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/hkversion/Acs/ACSManage.java create mode 100644 src/main/java/com/hkversion/Acs/AcsMain.java create mode 100644 src/main/java/com/hkversion/Acs/CardManage.java create mode 100644 src/main/java/com/hkversion/Acs/DeviceAbility.java create mode 100644 src/main/java/com/hkversion/Acs/EventSearch.java create mode 100644 src/main/java/com/hkversion/Acs/FaceManage.java create mode 100644 src/main/java/com/hkversion/Acs/FingerManage.java create mode 100644 src/main/java/com/hkversion/Acs/MutilCard.java create mode 100644 src/main/java/com/hkversion/Acs/TransIsapi.java create mode 100644 src/main/java/com/hkversion/Acs/UserManage.java diff --git a/pom.xml b/pom.xml index d29ebed..82744db 100644 --- a/pom.xml +++ b/pom.xml @@ -43,18 +43,46 @@ + + + + + + + + + + + + + + + org.apache.maven.plugins maven-assembly-plugin + + + - com.yzx.Main + com.hkversion.Acs.AcsMain jar-with-dependencies + + + make-assembly + package + + + single + + + diff --git a/src/main/java/com/hkversion/Acs/ACSManage.java b/src/main/java/com/hkversion/Acs/ACSManage.java new file mode 100644 index 0000000..becf67d --- /dev/null +++ b/src/main/java/com/hkversion/Acs/ACSManage.java @@ -0,0 +1,99 @@ +package com.hkversion.Acs; + + +import com.hkversion.HCNetSDK; +import com.sun.jna.ptr.IntByReference; + +/** + * 门禁设备管理: + * 1、获取(设置)门禁主机参数 + * 2、获取门禁主机工作状态 + */ +public final class ACSManage { + + /** + * 获取(设置)门禁主机参数 + * + * @param lUserID 用户登录句柄 + */ + public static void acsCfg(int lUserID) { + + /**获取门禁主机参数*/ + HCNetSDK.NET_DVR_ACS_CFG struAcsCfg = new HCNetSDK.NET_DVR_ACS_CFG(); + struAcsCfg.dwSize = struAcsCfg.size(); + struAcsCfg.write(); + IntByReference intByReference = new IntByReference(0); + boolean b_GetAcsCfg = AcsMain.hCNetSDK.NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_ACS_CFG, 0xFFFFFFFF, struAcsCfg.getPointer(), + struAcsCfg.size(), intByReference); + if (b_GetAcsCfg = false) { + System.out.println("获取门禁主机参数,错误码为" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + return; + } else { + System.out.println("获取门禁主机参数成功"); + struAcsCfg.read(); + System.out.println("1.是否显示抓拍图片:" + struAcsCfg.byShowCapPic + "\n"); //是否显示抓拍图片, 0-不显示,1-显示 + System.out.println("2.是否显示卡号:" + struAcsCfg.byShowCardNo + "\n"); //是否显示卡号,0-不显示,1-显示 + System.out.println("3.是否开启语音提示:" + struAcsCfg.byVoicePrompt + "\n"); //是否启用语音提示,0-不启用,1-启用 + System.out.println("4.联动抓图是否上传:" + struAcsCfg.byUploadCapPic + "\n"); //联动抓拍是否上传图片,0-不上传,1-上传 + } + + /**设置门禁主机参数*/ + struAcsCfg.byShowCardNo = 1; //开启显示卡号 + struAcsCfg.byVoicePrompt = 0; //关闭语音提示 + struAcsCfg.byUploadCapPic = 1; //开启联动抓图后,设备上抓拍的图片才会通过报警布防上传,否则没有不上传 + struAcsCfg.byShowCapPic = 1; + struAcsCfg.write(); + boolean b_SetAcsCfg = AcsMain.hCNetSDK.NET_DVR_SetDVRConfig(lUserID, HCNetSDK.NET_DVR_SET_ACS_CFG, 0xFFFFFFFF, struAcsCfg.getPointer(), struAcsCfg.size()); + if (b_SetAcsCfg = false) { + System.out.println("设置门禁主机参数,错误码为:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + return; + } else { + System.out.println("设置门禁主机参数成功!!!"); + } + } + + /** + * 获取门禁主机工作状态 + * + * @param lUserID 用户登录句柄 + */ + public static void getAcsStatus(int lUserID){ + HCNetSDK.NET_DVR_ACS_WORK_STATUS_V50 netDvrAcsWorkStatusV50 = new HCNetSDK.NET_DVR_ACS_WORK_STATUS_V50(); + netDvrAcsWorkStatusV50.dwSize = netDvrAcsWorkStatusV50.size(); + netDvrAcsWorkStatusV50.write(); + IntByReference intByReference = new IntByReference(0); + boolean b_GetAcsStatus = AcsMain.hCNetSDK.NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_ACS_WORK_STATUS_V50, 0xFFFFFFFF, netDvrAcsWorkStatusV50.getPointer(), + netDvrAcsWorkStatusV50.size(), intByReference); + if (b_GetAcsStatus = false) { + System.out.println("获取门禁主机工作状态,错误码为:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + return; + } else { + System.out.println("获取门禁主机工作状态成功!!!"); + netDvrAcsWorkStatusV50.read(); + System.out.println("1.门锁状态(或者梯控的继电器开合状态):" + netDvrAcsWorkStatusV50.byDoorLockStatus[0] + "\n"); //门锁状态:0- 正常关,1- 正常开,2- 短路报警,3- 断路报警,4- 异常报警 + System.out.println("2.门状态(或者梯控的楼层状态):" + netDvrAcsWorkStatusV50.byDoorStatus[0] + "\n"); //门状态(或者梯控的楼层状态):1- 休眠,2- 常开状态(对于梯控,表示自由状态),3- 常闭状态(对于梯控,表示禁用状态),4- 普通状态(对于梯控,表示受控状态) + System.out.println("3.门磁状态:" + netDvrAcsWorkStatusV50.byMagneticStatus[0] + "\n"); //门磁状态,0-正常关,1-正常开,2-短路报警,3-断路报警,4-异常报警 + System.out.println("4.事件报警输入状态:" + netDvrAcsWorkStatusV50.byCaseStatus[0] + "\n"); //事件报警输入状态:0- 无输入,1- 有输入 + } + } + + /** + * 远程控门 + * @param userID + */ + public static void remoteControlGate(int userID) + { + /**第二个参数lGatewayIndex + [in] 门禁序号(楼层编号、锁ID),从1开始,-1表示对所有门(或者梯控的所有楼层)进行操作 + 第三个参数dwStaic + [in] 命令值:0- 关闭(对于梯控,表示受控),1- 打开(对于梯控,表示开门),2- 常开(对于梯控,表示自由、通道状态),3- 常关(对于梯控,表示禁用),4- 恢复(梯控,普通状态),5- 访客呼梯(梯控),6- 住户呼梯(梯控)*/ + boolean b_gate=AcsMain.hCNetSDK.NET_DVR_ControlGateway(userID,1,1); + if (b_gate==false) + { + System.out.println("远程控门失败,err="+AcsMain.hCNetSDK.NET_DVR_GetLastError()); + return; + } + System.out.println("远程控门成功"); + return; + } +} diff --git a/src/main/java/com/hkversion/Acs/AcsMain.java b/src/main/java/com/hkversion/Acs/AcsMain.java new file mode 100644 index 0000000..0008f9b --- /dev/null +++ b/src/main/java/com/hkversion/Acs/AcsMain.java @@ -0,0 +1,224 @@ +package com.hkversion.Acs; + + +import com.alibaba.fastjson.JSONException; +import com.common.osSelect; +import com.hkversion.HCNetSDK; +import com.sun.jna.Native; + +import java.io.UnsupportedEncodingException; + + +public class AcsMain { + + static HCNetSDK hCNetSDK = null; + static int lUserID = -1;//用户句柄 + static int iCharEncodeType = 0;//设备字符集 + + + + /** + * 根据不同操作系统选择不同的库文件和库路径 + * @return + */ + private static boolean createSDKInstance() + { + if(hCNetSDK == null) + { + synchronized (HCNetSDK.class) + { + String strDllPath = ""; + try + { + //System.setProperty("jna.debug_load", "true"); + if(osSelect.isWindows()) + //win系统加载库路径 + strDllPath = System.getProperty("user.dir") + "\\lib\\HCNetSDK.dll"; + else if(osSelect.isLinux()) + //Linux系统加载库路径 + strDllPath = System.getProperty("user.dir") + "/lib/libhcnetsdk.so"; + hCNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class); + }catch (Exception ex) { + System.out.println("loadLibrary: " + strDllPath + " Error: " + ex.getMessage()); + return false; + } + } + } + return true; + } + + /** + * @param args + * @throws UnsupportedEncodingException + * @throws InterruptedException + */ + public static void main(String[] args) throws UnsupportedEncodingException, InterruptedException, JSONException { + + + if(hCNetSDK == null) + { + if(!createSDKInstance()) + { + System.out.println("Load SDK fail"); + return; + } + } + //linux系统建议调用以下接口加载组件库 + if (osSelect.isLinux()) + { + HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256); + HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256); + //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限 + String strPath1 = System.getProperty("user.dir") + "/lib/libcrypto.so.1.1"; + String strPath2 = System.getProperty("user.dir") + "/lib/libssl.so.1.1"; + + System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length()); + ptrByteArray1.write(); + hCNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArray1.getPointer()); + + System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length()); + ptrByteArray2.write(); + hCNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArray2.getPointer()); + + String strPathCom = System.getProperty("user.dir") + "/lib/"; + HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH(); + System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length()); + struComPath.write(); + hCNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer()); + } + + hCNetSDK.NET_DVR_Init(); + //开启SDK日志打印 + boolean i= hCNetSDK.NET_DVR_SetLogToFile(3, "./sdklog", false); + + login_V40("175.155.64.18","admin","ADMIN12345",(short) 50021); //登陆设备 + /** + * 人员管理模块 + */ + UserManage.searchUserInfo(lUserID,"u10"); //查询所有人员 +// UserManage.deleteUserInfo(lUserID); +// UserManage.addUserInfo(lUserID,"test20221122"); //添加人员 +// UserManage.modifyUserInfo(lUserID,"s00001",9); + + /** + * 人脸管理模块 + */ +// FaceManage.searchFaceInfo(lUserID,"u10"); +// FaceManage.addFaceByBinary(lUserID,"test20221122"); +// FaceManage.addFaceByUrl(lUserID,"test111"); +// FaceManage.deleteFaceInfo(lUserID,"test111"); +// FaceManage.captureFaceInfo(lUserID); + + /** + * 卡号管理模块 + */ +// CardManage.searchCardInfo(lUserID,"ceshi1"); +// CardManage.addCardInfo(lUserID,"12345"); +// CardManage.searchCardInfo(lUserID,"test111"); +// CardManage.searchAllCardInfo(lUserID); +// CardManage.deleteCardInfo(lUserID,"111"); +// CardManage.deleteAllCardInfo(lUserID); +// CardManage.getAllCardNumber(lUserID); + /** + * 指纹管理模块 + */ +// FingerManage.fingerCapture(lUserID); +// FingerManage.fingerCpaureByisapi(lUserID); +// FingerManage.fingerCpaureByisapi(lUserID); +// FingerManage.SearchFingerInfo(lUserID,"2222"); + //指纹数据的BASE64编码 +// String fingerdata=""; +// FingerManage.setOneFinger(lUserID,"zhangsan",fingerdata); +// FingerManage.deleteFinger(lUserID,"zhangsan"); + + /** + * 事件查询 + */ +// EventSearch.searchAllEvent(lUserID); + + //多重认证 +// MutilCard.setGroupCfg(lUserID); +// MutilCard.setMultiCardCfg(lUserID); + //计划模板 +// UserManage.setCardTemplate(lUserID,9); + + //设备能力获取 +// DeviceAbility.getDeviceAbility(lUserID,0x01); + + + /** + * 增加sleep时间,保证程序一直运行, + + */ +// Thread.sleep(20000); + /** + * 撤防,端口监听,注销设备 + */ + AcsMain.logout(); + + //释放SDK,程序退出前调用 + hCNetSDK.NET_DVR_Cleanup(); + + } + + + /** + * 设备登录 + * @param ipadress IP地址 + * @param user 用户名 + * @param psw 密码 + * @param port 端口,默认8000 + */ + public static void login_V40(String ipadress, String user, String psw, short port) { + //注册 + HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();//设备登录信息 + String m_sDeviceIP = ipadress;//设备ip地址 + m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN]; + System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length()); + String m_sUsername = user;//设备用户名 + m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN]; + System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length()); + String m_sPassword = psw;//设备密码 + m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN]; + System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length()); + m_strLoginInfo.wPort = port; //sdk端口 + m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是 + m_strLoginInfo.write(); + HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();//设备信息 + lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo); + if (lUserID == -1) { + System.out.println("登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError()); + return; + } else { + System.out.println("登录成功!"); + m_strDeviceInfo.read(); + iCharEncodeType = m_strDeviceInfo.byCharEncodeType; + return; + + } + } + + + /** + * 登出操作 + * + */ + public static void logout(){ + /**登出和清理,释放SDK资源*/ + if (lUserID>=0) + { + if (!hCNetSDK.NET_DVR_Logout(lUserID)) + { + System.out.println("设备注销失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); + return; + } + System.out.println("设备注销成功!!!"); + } + + } + + + + + +}//AcsMain Class结束 diff --git a/src/main/java/com/hkversion/Acs/CardManage.java b/src/main/java/com/hkversion/Acs/CardManage.java new file mode 100644 index 0000000..9e8d5c4 --- /dev/null +++ b/src/main/java/com/hkversion/Acs/CardManage.java @@ -0,0 +1,219 @@ +package com.hkversion.Acs; + + +import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.JSONObject; +import com.hkversion.HCNetSDK; +import com.sun.jna.ptr.IntByReference; + +/** + * 卡管理,以人为中心,要先下发工号,卡号要关联在人员工号上 + */ +public final class CardManage { + + + /** + * 下发卡号, + * @param userID 用户注册ID + * @param cardNo 卡号 + * @throws JSONException + */ + public static void addCardInfo(int userID,String cardNo) throws JSONException { + HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组 + String strInBuffer = "POST /ISAPI/AccessControl/CardInfo/Record?format=json"; + System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中 + ptrByteArray.write(); + + int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null); + if (lHandler < 0) + { + System.out.println("AddCardInfo NET_DVR_StartRemoteConfig 失败,错误码为"+AcsMain.hCNetSDK.NET_DVR_GetLastError()); + return; + } + else{ + System.out.println("AddCardInfo NET_DVR_StartRemoteConfig 成功!"); + HCNetSDK.BYTE_ARRAY lpInput = new HCNetSDK.BYTE_ARRAY(1024); //数组 + String strJsonData = "{\n" + + " \"CardInfo\" : {\n" + + " \"employeeNo\":\"ceshi1\", \n" + + " \"cardNo\":\""+cardNo+"\", \n" + + " \"cardType\":\"normalCard\"\n" + + " } \n" + + "}"; + System.arraycopy(strJsonData.getBytes(), 0, lpInput.byValue, 0, strJsonData.length());//字符串拷贝到数组中 + lpInput.write(); + HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(1024); + IntByReference pInt = new IntByReference(0); + while(true){ + /* + 如果需要批量下发,循环调用NET_DVR_SendWithRecvRemoteConfig接口进行下发不同的卡号,下发结束完成后关闭下发卡号长连接 + */ + int dwState = AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, lpInput.getPointer(), lpInput.byValue.length ,ptrOutuff.getPointer(), 1024, pInt); + //读取返回的json并解析 + ptrOutuff.read(); + String strResult = new String(ptrOutuff.byValue).trim(); + System.out.println("dwState:" + dwState + ",strResult:" + strResult); + + JSONObject jsonResult = JSONObject.parseObject(strResult); + int statusCode = jsonResult.getInteger("statusCode"); + String statusString = jsonResult.getString("statusString"); + + if(dwState == -1){ + System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) + { + System.out.println("配置等待"); + try { + Thread.sleep(10); + } catch (InterruptedException e) { + e.printStackTrace(); + } + continue; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) + { + System.out.println("下发卡号失败, json retun:" + jsonResult.toString()); + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) + { + System.out.println("下发卡号异常, json retun:" + jsonResult.toString()); + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) + { + if (statusCode != 1){ + System.out.println("下发卡号成功,但是有异常情况:" + jsonResult.toString()); + } + else{ + System.out.println("下发卡号成功, json retun:" + jsonResult.toString()); + } + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) { + + System.out.println("下发卡号完成"); + break; + } + } + if(!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)){ + System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + } + else{ + System.out.println("NET_DVR_StopRemoteConfig接口成功"); + } + } + } + + + /** + * 按照人员工号查询卡号 + * @param userID + * @param employeeNo + */ + public static void searchCardInfo(int userID, String employeeNo) + { + String searchCardInfoUrl="POST /ISAPI/AccessControl/CardInfo/Search?format=json"; + String searchCardInfojson="{\n" + + " \"CardInfoSearchCond\": {\n" + + " \"searchID\": \"20201014001\",\n" + + " \"searchResultPosition\": 0,\n" + + " \"maxResults\": 30,\n" + + " \"EmployeeNoList\" : [\n" + + " {\n" + + " \"employeeNo\": \""+employeeNo+"\"\n" + + " }\n" + + " ]\n" + + " }\n" + + "}"; + String result= TransIsapi.put_isapi(userID,searchCardInfoUrl,searchCardInfojson); + System.out.println(result); + + } + + /** + * 查询所有卡号 + * @param userID + */ + public static void searchAllCardInfo(int userID) + { + String searchCardInfoUrl="POST /ISAPI/AccessControl/CardInfo/Search?format=json"; + /* + "searchID": "", //必填,搜索记录唯一标识,用来确认上层客户端是否为同一个(倘若是同一个,设备记录内存, + 下次搜索加快速度),string类型 + "searchResultPosition": 0, //必填,查询结果在结果列表中的起始位置,integer32类型;当记录条数很多时, + 一次查询不能获取所有的记录,下一次查询时指定位置可以查询后面的记录 + "maxResults": 30, //必填,本次协议调用可获取的最大记录数,integer32类型(如maxResults值大于设备能力集返回的范围, + 则设备按照能力集最大值返回,设备不进行报错 + */ + String searchCardInfojson="{\n" + + " \"CardInfoSearchCond\": {\n" + + " \"searchID\": \"20211129001\",\n" + + " \"searchResultPosition\": 0,\n" + + " \"maxResults\": 30\n" + + " }\n" + + "}"; + String result= TransIsapi.put_isapi(userID,searchCardInfoUrl,searchCardInfojson); + System.out.println(result); + } + + + /** + * 根据工号删除卡号, + * @param userID + * @param employeeNo + */ + public static void deleteCardInfo(int userID,String employeeNo ) + { + String deleteCardInfoURL="PUT /ISAPI/AccessControl/CardInfo/Delete?format=json "; + String deleteCardInfojson="{\n" + + " \"CardInfoDelCond\" : {\n" + + " \"EmployeeNoList\" : [ \n" + + " {\n" + + " \"employeeNo\": \""+employeeNo+"\" \n" + + " }\n" + + " ]\n" + + " }\n" + + "}\n"; + String result= TransIsapi.put_isapi(userID,deleteCardInfoURL,deleteCardInfojson); + System.out.println(result); + } + + + /** + * 删除全部卡号信息, + * @param userID + */ + public static void deleteAllCardInfo(int userID) + { + String deleteAllCardInfoURL="PUT /ISAPI/AccessControl/CardInfo/Delete?format=json"; + String deleteAllCardInfoJson="{\"CardInfoDelCond\" : {}}"; + /* + 如果涉及大批量卡号删除,设备需要一定的时间去处理,需要将超时时间设置成60s,put_isapi中的NET_DVR_XML_CONFIG_INPUT中dwRecvTimeOut + 参数设置成60000 + */ + String result= TransIsapi.put_isapi(userID,deleteAllCardInfoURL,deleteAllCardInfoJson); + System.out.println(result); + } + + + /** + * 获取所有卡数量 + * @param userID + * @return + * @throws JSONException + */ + public static int getAllCardNumber(int userID) throws JSONException { + String getAllCardNumberUrl="GET /ISAPI/AccessControl/CardInfo/Count?format=json"; + String result= TransIsapi.get_isapi(userID,getAllCardNumberUrl); + System.out.println(result); + JSONObject jsonObject=JSONObject.parseObject(result); + int num=jsonObject.getJSONObject("CardInfoCount").getInteger("cardNumber"); + return num; + } + + + +} diff --git a/src/main/java/com/hkversion/Acs/DeviceAbility.java b/src/main/java/com/hkversion/Acs/DeviceAbility.java new file mode 100644 index 0000000..5a48b55 --- /dev/null +++ b/src/main/java/com/hkversion/Acs/DeviceAbility.java @@ -0,0 +1,28 @@ +package com.hkversion.Acs; + +import com.alibaba.fastjson.JSONException; +import com.hkversion.HCNetSDK; +import com.sun.jna.Pointer; +import com.sun.jna.StringArray; + +import java.io.UnsupportedEncodingException; + +/** + * 门禁能力集 + */ +public class DeviceAbility { + /** + * 获取门禁能力集 + * @param lUserID + * @throws UnsupportedEncodingException + * @throws InterruptedException + * @throws JSONException + */ + public static void getDeviceAbility(int lUserID,int dwAbilityType) throws UnsupportedEncodingException, InterruptedException, JSONException { + HCNetSDK.NET_DVR_STD_ABILITY ability = new HCNetSDK.NET_DVR_STD_ABILITY(); + ability.dwOutSize = ability.size(); + ability.write(); + AcsMain.hCNetSDK.NET_DVR_GetDeviceAbility(lUserID,dwAbilityType,null,0,ability.getPointer(),ability.size()); + ability.read(); + } +} diff --git a/src/main/java/com/hkversion/Acs/EventSearch.java b/src/main/java/com/hkversion/Acs/EventSearch.java new file mode 100644 index 0000000..90248e4 --- /dev/null +++ b/src/main/java/com/hkversion/Acs/EventSearch.java @@ -0,0 +1,121 @@ +package com.hkversion.Acs; + +import com.hkversion.HCNetSDK; +import com.sun.jna.Pointer; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; + +/** + * 事件查询模块 + */ +public final class EventSearch { + + public static void searchAllEvent(int lUserID) throws UnsupportedEncodingException, InterruptedException { + int i = 0; //事件条数 + HCNetSDK.NET_DVR_ACS_EVENT_COND struAcsEventCond = new HCNetSDK.NET_DVR_ACS_EVENT_COND(); + struAcsEventCond.read(); + struAcsEventCond.dwSize = struAcsEventCond.size(); + //查询全部主次类型的报警 + struAcsEventCond.dwMajor = 0; // 主次事件类型设为0,代表查询所有事件 + struAcsEventCond.dwMinor = 0; // + //开始时间 + struAcsEventCond.struStartTime.dwYear = 2022; + struAcsEventCond.struStartTime.dwMonth = 4; + struAcsEventCond.struStartTime.dwDay = 27; + struAcsEventCond.struStartTime.dwHour = 9; + struAcsEventCond.struStartTime.dwMinute = 0; + struAcsEventCond.struStartTime.dwSecond = 0; + //结束时间 + struAcsEventCond.struEndTime.dwYear = 2022; + struAcsEventCond.struEndTime.dwMonth = 4; + struAcsEventCond.struEndTime.dwDay = 30; + struAcsEventCond.struEndTime.dwHour = 16; + struAcsEventCond.struEndTime.dwMinute = 0; + struAcsEventCond.struEndTime.dwSecond = 0; + struAcsEventCond.wInductiveEventType = 1; + struAcsEventCond.byPicEnable = 1; //是否带图片,0-不带图片,1-带图片 + struAcsEventCond.write(); + Pointer ptrStruEventCond = struAcsEventCond.getPointer(); + int m_lSearchEventHandle = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_GET_ACS_EVENT, ptrStruEventCond, struAcsEventCond.size(), null, null); + if (m_lSearchEventHandle<=-1) + { + System.out.println("NET_DVR_StartRemoteConfig调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + } + HCNetSDK.NET_DVR_ACS_EVENT_CFG struAcsEventCfg = new HCNetSDK.NET_DVR_ACS_EVENT_CFG(); + struAcsEventCfg.read(); + struAcsEventCfg.dwSize = struAcsEventCfg.size(); + struAcsEventCfg.write(); + Pointer ptrStruEventCfg = struAcsEventCfg.getPointer(); + while (true) { + System.out.println("i=" + i); + int dwEventSearch = AcsMain.hCNetSDK.NET_DVR_GetNextRemoteConfig(m_lSearchEventHandle, ptrStruEventCfg, struAcsEventCfg.size()); + if (dwEventSearch <= -1) { + System.out.println("NET_DVR_GetNextRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + } + if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_NEED_WAIT) { + System.out.println("配置等待...."); + Thread.sleep(10); + continue; + } else if (dwEventSearch == HCNetSDK.NET_SDK_NEXT_STATUS__FINISH) { + System.out.println("获取事件完成"); + break; + } else if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_FAILED) { + System.out.println("获取事件出现异常"); + break; + } else if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS) { + struAcsEventCfg.read(); + //获取的事件信息通过struAcsEventCfg结构体进行解析, + System.out.println(i + "获取事件成功, 报警主类型:" + Integer.toHexString(struAcsEventCfg.dwMajor) + "报警次类型:" + Integer.toHexString(struAcsEventCfg.dwMinor) + "卡号:" + new String(struAcsEventCfg.struAcsEventInfo.byCardNo).trim()); + /** + * 工号有两个字段,dwEmployeeNo表示工号,当值为0时,表示无效,解析byEmployeeNo参数 + */ + System.out.println("工号1:"+struAcsEventCfg.struAcsEventInfo.dwEmployeeNo); + System.out.println("工号2:"+new String(struAcsEventCfg.struAcsEventInfo.byEmployeeNo)); + //人脸温度数据,需要设备和支持测温功能 + System.out.println("人脸温度:" + struAcsEventCfg.struAcsEventInfo.fCurrTemperature + "是否异常:" + struAcsEventCfg.struAcsEventInfo.byIsAbnomalTemperature); + //口罩功能,需要设备支持此功能 0-保留,1-未知,2-不戴口罩,3-戴口罩 + System.out.println("是否带口罩:"+struAcsEventCfg.struAcsEventInfo.byMask); + //人脸图片保存 + if (struAcsEventCfg.dwPicDataLen>0 || struAcsEventCfg.pPicData != null ) + { + FileOutputStream fout; + try { + /** + * 人脸图片保存路径 + */ + String filename = "..\\pic\\"+i+"_event.jpg"; + fout = new FileOutputStream(filename); + //将字节写入文件 + long offset = 0; + ByteBuffer buffers = struAcsEventCfg.pPicData.getByteBuffer(offset, struAcsEventCfg.dwPicDataLen); + byte[] bytes = new byte[struAcsEventCfg.dwPicDataLen]; + buffers.rewind(); + buffers.get(bytes); + fout.write(bytes); + fout.close(); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + i++; + continue; + } + } + i = 0; + if (!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(m_lSearchEventHandle)) { + System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + } else { + System.out.println("NET_DVR_StopRemoteConfig接口成功"); + } + return; + } + +} diff --git a/src/main/java/com/hkversion/Acs/FaceManage.java b/src/main/java/com/hkversion/Acs/FaceManage.java new file mode 100644 index 0000000..a7aa29c --- /dev/null +++ b/src/main/java/com/hkversion/Acs/FaceManage.java @@ -0,0 +1,494 @@ +package com.hkversion.Acs; + + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.JSONObject; +import com.hkversion.HCNetSDK; +import com.sun.jna.Pointer; +import com.sun.jna.ptr.IntByReference; + +import java.io.*; +import java.nio.ByteBuffer; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 功能模块:人员管理,下发、查询、删除人脸图片,注:下发人脸图片前,先下发人员工号。 + */ +public final class FaceManage { + + + /** + * 功能:按照二进制方式下发人脸图片 + * @param userID 用户注册ID + * @param employeeNo 人员工号 + * @throws JSONException + * @throws InterruptedException + */ + public static void addFaceByBinary(int userID,String employeeNo ) throws JSONException, InterruptedException{ + HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组 + String strInBuffer = "PUT /ISAPI/Intelligent/FDLib/FDSetUp?format=json"; + System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中 + ptrByteArray.write(); + + int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_FACE_DATA_RECORD, ptrByteArray.getPointer(), strInBuffer.length(), null, null); + if (lHandler < 0) + { + System.out.println("Addface NET_DVR_StartRemoteConfig 失败,错误码为"+AcsMain.hCNetSDK.NET_DVR_GetLastError()); + return; + } + else{ + System.out.println("Addface NET_DVR_StartRemoteConfig 成功!"); + + HCNetSDK.NET_DVR_JSON_DATA_CFG struAddFaceDataCfg = new HCNetSDK.NET_DVR_JSON_DATA_CFG(); + struAddFaceDataCfg.read(); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("faceLibType", "blackFD"); + jsonObject.put("FDID", "1"); + jsonObject.put("FPID", employeeNo);//人脸下发关联的工号 + + String strJsonData = jsonObject.toString(); + System.arraycopy(strJsonData.getBytes(), 0, ptrByteArray.byValue, 0, strJsonData.length());//字符串拷贝到数组中 + ptrByteArray.write(); + struAddFaceDataCfg.dwSize = struAddFaceDataCfg.size(); + struAddFaceDataCfg.lpJsonData = ptrByteArray.getPointer(); + struAddFaceDataCfg.dwJsonDataSize = strJsonData.length(); + + /***************************************** + * 从本地文件里面读取JPEG图片二进制数据 + *****************************************/ + FileInputStream picfile = null; + int picdataLength = 0; + try{ + + picfile = new FileInputStream(new File(".//pic//FDLib.jpg")); + } + catch(FileNotFoundException e) + { + e.printStackTrace(); + } + + try{ + picdataLength = picfile.available(); + } + catch(IOException e1) + { + e1.printStackTrace(); + } + if(picdataLength < 0) + { + System.out.println("input file dataSize < 0"); + return; + } + + HCNetSDK.BYTE_ARRAY ptrpicByte = new HCNetSDK.BYTE_ARRAY(picdataLength); + try { + picfile.read(ptrpicByte.byValue); + } catch (IOException e2) { + e2.printStackTrace(); + } + ptrpicByte.write(); + struAddFaceDataCfg.dwPicDataSize = picdataLength; + struAddFaceDataCfg.lpPicData = ptrpicByte.getPointer(); + struAddFaceDataCfg.write(); + + HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(1024); + + IntByReference pInt = new IntByReference(0); + + while(true){ + int dwState = AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, struAddFaceDataCfg.getPointer(), struAddFaceDataCfg.dwSize ,ptrOutuff.getPointer(), 1024, pInt); + if(dwState == -1){ + System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + break; + } + //读取返回的json并解析 + ptrOutuff.read(); + String strResult = new String(ptrOutuff.byValue).trim(); + System.out.println("dwState:" + dwState + ",strResult:" + strResult); + + JSONObject jsonResult = JSONObject.parseObject(strResult); + int statusCode = jsonResult.getInteger("statusCode"); + String statusString = jsonResult.getString("statusString"); + if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) + { + System.out.println("配置等待"); + Thread.sleep(10); + continue; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) + { + System.out.println("下发人脸失败, json retun:" + jsonResult.toString()); + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) + { + System.out.println("下发人脸异常, json retun:" + jsonResult.toString()); + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) + {//返回NET_SDK_CONFIG_STATUS_SUCCESS代表流程走通了,但并不代表下发成功,比如人脸图片不符合设备规范等原因,所以需要解析Json报文 + if (statusCode != 1){ + System.out.println("下发人脸成功,但是有异常情况:" + jsonResult.toString()); + } + else{ + System.out.println("下发人脸成功, json retun:" + jsonResult.toString()); + } + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) { + //下发人脸时:dwState其实不会走到这里,因为设备不知道我们会下发多少个人,所以长连接需要我们主动关闭 + System.out.println("下发人脸完成"); + break; + } + } + if(!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)){ + System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + } + else{ + System.out.println("NET_DVR_StopRemoteConfig接口成功"); + } + } + + } + + + /** + * 按URL方式下发人脸图片 + * @param userID 用户注销ID + * @param employeeNo 人员工号 + * @throws JSONException + */ + public static void addFaceByUrl(int userID,String employeeNo) throws JSONException { + HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组 + String strInBuffer = "PUT /ISAPI/Intelligent/FDLib/FDSetUp?format=json"; + System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中 + ptrByteArray.write(); + + int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_FACE_DATA_RECORD, ptrByteArray.getPointer(), strInBuffer.length(), null, null); + if (lHandler < 0) + { + System.out.println("Addface NET_DVR_StartRemoteConfig 失败,错误码为"+AcsMain.hCNetSDK.NET_DVR_GetLastError()); + return; + } + else{ + System.out.println("Addface NET_DVR_StartRemoteConfig 成功!"); + + HCNetSDK.NET_DVR_JSON_DATA_CFG struAddFaceDataCfg = new HCNetSDK.NET_DVR_JSON_DATA_CFG(); + struAddFaceDataCfg.read(); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("faceURL","http://10.17.34.106:6011/pic?7DD9D70207A9D7F576F99AC197B2D6CAface.jpg"); //人脸图片URL + jsonObject.put("faceLibType", "blackFD"); + jsonObject.put("FDID", "1"); + jsonObject.put("FPID", employeeNo);//人脸下发关联的工号 + + String strJsonData = jsonObject.toString(); + System.arraycopy(strJsonData.getBytes(), 0, ptrByteArray.byValue, 0, strJsonData.length());//字符串拷贝到数组中 + ptrByteArray.write(); + struAddFaceDataCfg.dwSize = struAddFaceDataCfg.size(); + struAddFaceDataCfg.lpJsonData = ptrByteArray.getPointer(); + struAddFaceDataCfg.dwJsonDataSize = strJsonData.length(); + struAddFaceDataCfg.lpPicData = null; + struAddFaceDataCfg.dwPicDataSize=0; + struAddFaceDataCfg.write(); + HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(1024); + + IntByReference pInt = new IntByReference(0); + + while(true){ + int dwState = AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, struAddFaceDataCfg.getPointer(), struAddFaceDataCfg.dwSize ,ptrOutuff.getPointer(), 1024, pInt); + + if(dwState == -1){ + System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + break; + } + //读取返回的json并解析 + ptrOutuff.read(); + String strResult = new String(ptrOutuff.byValue).trim(); + System.out.println("dwState:" + dwState + ",strResult:" + strResult); + + JSONObject jsonResult = JSONObject.parseObject(strResult); + int statusCode = jsonResult.getInteger("statusCode"); + String statusString = jsonResult.getString("statusString"); + if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) + { + System.out.println("配置等待"); + try { + Thread.sleep(10); + } catch (InterruptedException e) { + e.printStackTrace(); + } + continue; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) + { + System.out.println("下发人脸失败, json retun:" + jsonResult.toString()); + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) + { + System.out.println("下发人脸异常, json retun:" + jsonResult.toString()); + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) + {//返回NET_SDK_CONFIG_STATUS_SUCCESS代表流程走通了,但并不代表下发成功,比如人脸图片不符合设备规范等原因,所以需要解析Json报文 + if (statusCode != 1){ + System.out.println("下发人脸成功,但是有异常情况:" + jsonResult.toString()); + } + else{ + System.out.println("下发人脸成功, json retun:" + jsonResult.toString()); + } + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) { + //下发人脸时:dwState其实不会走到这里,因为设备不知道我们会下发多少个人,所以长连接需要我们主动关闭 + System.out.println("下发人脸完成"); + break; + } + } + if(!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)){ + System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + } + else{ + System.out.println("NET_DVR_StopRemoteConfig接口成功"); + } + } + } + + + /** + * 查询人脸 + * @param userID + * @param employeeNo + * @throws JSONException + */ + public static void searchFaceInfo(int userID,String employeeNo) throws JSONException{ + HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组 + String strInBuffer = "POST /ISAPI/Intelligent/FDLib/FDSearch?format=json"; + System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中 + ptrByteArray.write(); + + int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_FACE_DATA_SEARCH, ptrByteArray.getPointer(), strInBuffer.length(), null, null); + if (lHandler < 0) + { + System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig 失败,错误码为"+AcsMain.hCNetSDK.NET_DVR_GetLastError()); + return; + } + else{ + System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig成功!"); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("searchResultPosition", 0); + jsonObject.put("maxResults", 1); + jsonObject.put("faceLibType", "blackFD"); + jsonObject.put("FDID","1"); + jsonObject.put("FPID", employeeNo);//人脸关联的工号,同下发人员时的employeeNo字段 + + String strInbuff = jsonObject.toString(); + System.out.println("查询的json报文:" + strInbuff); + + //把string传递到Byte数组中,后续用.getPointer()方法传入指针地址中。 + HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(strInbuff.length()); + System.arraycopy(strInbuff.getBytes(), 0, ptrInbuff.byValue, 0, strInbuff.length()); + ptrInbuff.write(); + + HCNetSDK.NET_DVR_JSON_DATA_CFG m_struJsonData = new HCNetSDK.NET_DVR_JSON_DATA_CFG(); + m_struJsonData.write(); + + IntByReference pInt = new IntByReference(0); + + while(true){ + int dwState =AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInbuff.getPointer(), strInbuff.length(), m_struJsonData.getPointer(), m_struJsonData.size(), pInt); + m_struJsonData.read(); + System.out.println(dwState); + if(dwState == -1){ + System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) + { + System.out.println("配置等待"); + try { + Thread.sleep(10); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + continue; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) + { + System.out.println("查询人脸失败"); + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) + { + System.out.println("查询人脸异常"); + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) + { + System.out.println("查询人脸成功"); + + //解析JSON字符串 + HCNetSDK.BYTE_ARRAY pJsonData = new HCNetSDK.BYTE_ARRAY(m_struJsonData.dwJsonDataSize); + pJsonData.write(); + Pointer pPlateInfo = pJsonData.getPointer(); + pPlateInfo.write(0, m_struJsonData.lpJsonData.getByteArray(0, pJsonData.size()), 0, pJsonData.size()); + pJsonData.read(); + String strResult = new String(pJsonData.byValue).trim(); + System.out.println("strResult:" + strResult); + JSONObject jsonResult = JSONObject.parseObject(strResult); + + int numOfMatches = jsonResult.getInteger("numOfMatches"); + if(numOfMatches != 0){//确认有人脸 + JSONArray MatchList = jsonResult.getJSONArray("MatchList"); + JSONObject MatchList_1 = MatchList.getJSONObject(0); + String FPID = MatchList_1.getString("FPID"); //获取json中人脸关联的工号 + + FileOutputStream fout; + try { + fout = new FileOutputStream("..//AddFacePicture//["+ FPID +"]_FacePic.jpg"); + //将字节写入文件 + long offset = 0; + ByteBuffer buffers = m_struJsonData.lpPicData.getByteBuffer(offset, m_struJsonData.dwPicDataSize); + byte [] bytes = new byte[m_struJsonData.dwPicDataSize]; + buffers.rewind(); + buffers.get(bytes); + fout.write(bytes); + fout.close(); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) { + System.out.println("获取人脸完成"); + break; + } + } + if(!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)){ + System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + } + else{ + System.out.println("NET_DVR_StopRemoteConfig接口成功"); + lHandler = -1; + } + + } + + } + + /** + * 人脸删除,支持批量删除,json中添加多个工号 + * @param userID + * @param employeeNo + */ + + public static void deleteFaceInfo(int userID,String employeeNo) + { + String deleteFaceUrl="PUT /ISAPI/Intelligent/FDLib/FDSearch/Delete?format=json&FDID=1&faceLibType=blackFD"; + String deleteFaceJson="{\n" + + " \"FPID\": [{\n" + + " \"value\": \""+employeeNo+"\"\n" + + " }]\n" + + "}"; + String result= TransIsapi.put_isapi(userID,deleteFaceUrl,deleteFaceJson); + System.out.println("删除人员结果:"+result); + } + + /** + * 人脸采集,下发人脸采集命令,从设备中采集人脸图片保存到本地 + * @param userID 用户注册ID + */ + public static void captureFaceInfo(int userID) + { + HCNetSDK.NET_DVR_CAPTURE_FACE_COND struCapCond = new HCNetSDK.NET_DVR_CAPTURE_FACE_COND(); + struCapCond.read(); + struCapCond.dwSize = struCapCond.size(); + struCapCond.write(); + int lCaptureFaceHandle = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_CAPTURE_FACE_INFO, struCapCond.getPointer(), struCapCond.size(), null, null); + if (lCaptureFaceHandle == -1) { + System.out.println("建立采集人脸长连接失败,错误码为" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + return; + } else { + System.out.println("建立采集人脸长连接成功!"); + } + //采集的人脸信息 + HCNetSDK.NET_DVR_CAPTURE_FACE_CFG struFaceInfo = new HCNetSDK.NET_DVR_CAPTURE_FACE_CFG(); + struFaceInfo.read(); + while (true) { + int dwState = AcsMain.hCNetSDK.NET_DVR_GetNextRemoteConfig(lCaptureFaceHandle, struFaceInfo.getPointer(), struFaceInfo.size()); + struFaceInfo.read(); + if (dwState == -1) { + System.out.println("NET_DVR_GetNextRemoteConfig采集人脸失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + break; + } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) { + System.out.println("正在采集中,请等待..."); + try { + Thread.sleep(10); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + continue; + } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) { + System.out.println("采集人脸失败"); + break; + } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) { + //超时时间5秒内设备本地人脸采集失败就会返回失败,连接会断开 + System.out.println("采集人脸异常, 网络异常导致连接断开 "); + break; + } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) { + if ((struFaceInfo.dwFacePicSize > 0) && (struFaceInfo.pFacePicBuffer != null)) { + SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss"); + String newName = sf.format(new Date()); + FileOutputStream fout; + try { + String filename = "..\\pic\\" + newName + "_capFaceInfo.jpg"; + fout = new FileOutputStream(filename); + //将字节写入文件 + long offset = 0; + ByteBuffer buffers = struFaceInfo.pFacePicBuffer.getByteBuffer(offset, struFaceInfo.dwFacePicSize); + byte[] bytes = new byte[struFaceInfo.dwFacePicSize]; + buffers.rewind(); + buffers.get(bytes); + fout.write(bytes); + fout.close(); + System.out.println("采集人脸成功, 图片保存路径: " + filename); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + break; + } else { + System.out.println("其他异常, dwState: " + dwState); + break; + } + } + //采集成功之后断开连接、释放资源 + if (!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lCaptureFaceHandle)) { + System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + } else { + System.out.println("NET_DVR_StopRemoteConfig接口成功"); + } + } + + + + + + +} diff --git a/src/main/java/com/hkversion/Acs/FingerManage.java b/src/main/java/com/hkversion/Acs/FingerManage.java new file mode 100644 index 0000000..01db8d0 --- /dev/null +++ b/src/main/java/com/hkversion/Acs/FingerManage.java @@ -0,0 +1,380 @@ +package com.hkversion.Acs; + + +import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.JSONObject; +import com.hkversion.HCNetSDK; +import com.sun.jna.Pointer; +import com.sun.jna.ptr.IntByReference; + +import java.io.*; +import java.nio.ByteBuffer; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 指纹管理:指纹采集,指纹下发,指纹信息查询,指纹删除 + */ +public final class FingerManage { + /** + * 采集指纹模块,采集指纹数据为二进制 + * @param userID + */ + public static void fingerCapture(int userID) + { + + HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_COND strFingerCond = new HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_COND(); + strFingerCond.read(); + strFingerCond.dwSize = strFingerCond.size(); + strFingerCond.byFingerPrintPicType = 1; //指纹读卡器 + strFingerCond.byFingerNo = 1; //指纹编号 + strFingerCond.write(); + int lGetFingerHandle = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_INFO, strFingerCond.getPointer(), strFingerCond.dwSize, null, null); + if (lGetFingerHandle == -1) { + System.out.println("建立采集指纹长连接失败,错误码为:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + return; + } else { + System.out.println("建立采集指纹长连接成功!"); + } + HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_CFG strFingerCfg = new HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_CFG(); + strFingerCfg.dwSize=strFingerCfg.size(); + strFingerCfg.write(); + while (true) { + int dwFingerState = AcsMain.hCNetSDK.NET_DVR_GetNextRemoteConfig(lGetFingerHandle, strFingerCfg.getPointer(), strFingerCfg.size()); + + if (dwFingerState == -1) { + System.out.println("NET_DVR_GetNextRemoteConfig采集指纹失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + break; + } else if (dwFingerState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_FAILED) { + System.out.println("采集指纹失败"); + break; + } else if (dwFingerState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_NEED_WAIT) { + System.out.println("正在采集指纹中,请等待..."); + try { + Thread.sleep(10); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + continue; + } else if (dwFingerState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) { + //超时时间5秒内设备本地人脸采集失败就会返回失败,连接会断开 + System.out.println("采集指纹异常, 网络异常导致连接断开 "); + break; + } else if (dwFingerState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS) { + strFingerCfg.read(); + SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss"); + String newName = sf.format(new Date()); + String fileName = newName + "_capFinger.data"; + String filePath = "..\\pic\\" + fileName; + BufferedOutputStream bos = null; + FileOutputStream fos = null; + File file = null; + try { + File dir = new File(filePath); + if (!dir.exists() && dir.isDirectory()) {//判断文件目录是否存在 + dir.mkdirs(); + } + file = new File(filePath); + fos = new FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(strFingerCfg.byFingerData); + System.out.println("采集指纹成功!"); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + } + if ((strFingerCfg.dwFingerPrintPicSize > 0) && (strFingerCfg.pFingerPrintPicBuffer != null)) { + FileOutputStream fout; + try { + String filename = "..\\pic\\" + newName + "_FingerPrintPic.jpg"; + fout = new FileOutputStream(filename); + //将字节写入文件 + long offset = 0; + ByteBuffer buffers = strFingerCfg.pFingerPrintPicBuffer.getByteBuffer(offset, strFingerCfg.dwFingerPrintPicSize); + byte[] bytes = new byte[strFingerCfg.dwFingerPrintPicSize]; + buffers.rewind(); + buffers.get(bytes); + fout.write(bytes); + fout.close(); + System.out.println("采集指纹成功, 图片保存路径: " + filename); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + break; + } else { + System.out.println("其他异常, dwState: " + dwFingerState); + break; + } + } + //采集成功之后断开连接、释放资源 + if (!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lGetFingerHandle)) { + System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + } else { + System.out.println("NET_DVR_StopRemoteConfig接口成功"); + } + } + + /** + * 采用透传ISAPI协议方式采集指纹,获取的指纹信息为BASE64编码, + */ + public static void fingerCpaureByisapi(int userID) + { + //采集指纹URL + String fingerCapUrl="POST /ISAPI/AccessControl/CaptureFingerPrint"; + String XmlInput="\n" + + "\n" + + " 1\n" + + ""; + String result= TransIsapi.put_isapi(userID,fingerCapUrl,XmlInput); + System.out.println("采集指纹结果:"+result); + } + + + + public static void setOneFinger(int userID, String employeeNo,String figerdata) throws JSONException { + HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组 + String strInBuffer = "POST /ISAPI/AccessControl/FingerPrint/SetUp?format=json"; + System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中 + ptrByteArray.write(); + + int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null); + if (lHandler < 0) + { + System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig 失败,错误码为"+AcsMain.hCNetSDK.NET_DVR_GetLastError()); + return; + } + else{ + System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig成功!"); + + JSONObject jsonObject = new JSONObject(); + JSONObject j_FingerPrintCond=new JSONObject(); + j_FingerPrintCond.put("employeeNo", employeeNo); + int[] CardReader = {1}; + j_FingerPrintCond.put("enableCardReader",CardReader); //人员工号 + j_FingerPrintCond.put("fingerPrintID", 1); + j_FingerPrintCond.put("fingerType", "normalFP"); + j_FingerPrintCond.put("fingerData",figerdata); + jsonObject.put("FingerPrintCfg",j_FingerPrintCond); + + String strInbuff = jsonObject.toString(); + System.out.println("查询的json报文:" + strInbuff); + + //把string传递到Byte数组中,后续用.getPointer()方法传入指针地址中。 + HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(strInbuff.length()); + System.arraycopy(strInbuff.getBytes(), 0, ptrInbuff.byValue, 0, strInbuff.length()); + ptrInbuff.write(); + + HCNetSDK.NET_DVR_STRING_POINTER ptrOutbuff = new HCNetSDK.NET_DVR_STRING_POINTER(3*1024); + ptrOutbuff.write(); + + IntByReference pInt = new IntByReference(0); + + while(true){ + int dwState =AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInbuff.getPointer(), strInbuff.length(), ptrOutbuff.getPointer(), ptrOutbuff.size(), pInt); + ptrOutbuff.read(); + System.out.println(dwState); + if(dwState == -1){ + System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) + { + System.out.println("配置等待"); + try { + Thread.sleep(10); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + continue; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) + { + System.out.println("下发指纹失败"); + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) + { + System.out.println("下发指纹异常"); + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) + { + System.out.println("下发指纹成功"); + //解析JSON字符串 + ptrOutbuff.read(); + System.out.println("返回的报文:"+new String(ptrOutbuff.byString)); + + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) { + System.out.println("下发指纹完成"); + break; + } + } + if(!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)){ + System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + } + else{ + System.out.println("NET_DVR_StopRemoteConfig接口成功"); + lHandler = -1; + } + } + } + + public static void SearchFingerInfo(int userID,String employeeNo) throws JSONException { + HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组 + String strInBuffer = "POST /ISAPI/AccessControl/FingerPrintUpload?format=json"; + System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中 + ptrByteArray.write(); + + int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null); + if (lHandler < 0) + { + System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig 失败,错误码为"+AcsMain.hCNetSDK.NET_DVR_GetLastError()); + return; + } + else{ + System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig成功!"); + + JSONObject jsonObject = new JSONObject(); + JSONObject j_FingerPrintCond=new JSONObject(); + j_FingerPrintCond.put("searchID", "20211223"); + j_FingerPrintCond.put("employeeNo", employeeNo); //人员工号 + j_FingerPrintCond.put("cardReaderNo", 1); + j_FingerPrintCond.put("fingerPrintID", 1); + jsonObject.put("FingerPrintCond",j_FingerPrintCond); + + String strInbuff = jsonObject.toString(); + System.out.println("查询的json报文:" + strInbuff); + + //把string传递到Byte数组中,后续用.getPointer()方法传入指针地址中。 + HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(strInbuff.length()); + System.arraycopy(strInbuff.getBytes(), 0, ptrInbuff.byValue, 0, strInbuff.length()); + ptrInbuff.write(); + + HCNetSDK.NET_DVR_STRING_POINTER ptrOutbuff = new HCNetSDK.NET_DVR_STRING_POINTER(3*1024); + ptrOutbuff.write(); + + IntByReference pInt = new IntByReference(0); + + while(true){ + int dwState =AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInbuff.getPointer(), strInbuff.length(), ptrOutbuff.getPointer(), ptrOutbuff.size(), pInt); + ptrOutbuff.read(); + System.out.println(dwState); + if(dwState == -1){ + System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) + { + System.out.println("配置等待"); + try { + Thread.sleep(10); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + continue; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) + { + System.out.println("查询指纹失败"); + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) + { + System.out.println("查询指纹异常"); + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) + { + System.out.println("查询指纹成功"); + //解析JSON字符串 + ptrOutbuff.read(); + System.out.println("查询的报文:"+new String(ptrOutbuff.byString)); + + break; + } + else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) { + System.out.println("获取指纹完成"); + break; + } + } + if(!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)){ + System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + } + else{ + System.out.println("NET_DVR_StopRemoteConfig接口成功"); + lHandler = -1; + } + + } + } + + /** + * 按工号和读卡器删除指纹,按工号是逐个删除,按读卡器是批量删除指定读卡器上所有的指纹数据 + * @param userID + * @param employeeNo + */ + public static void deleteFinger(int userID,String employeeNo ) + { + int iErr = 0; + HCNetSDK.NET_DVR_FINGER_PRINT_INFO_CTRL_V50 m_struFingerDelInfoParam = new HCNetSDK.NET_DVR_FINGER_PRINT_INFO_CTRL_V50(); + m_struFingerDelInfoParam.dwSize = m_struFingerDelInfoParam.size(); + m_struFingerDelInfoParam.byMode = 0;// 删除方式,0-按卡号(人员ID)方式删除,1-按读卡器删除 + m_struFingerDelInfoParam.struProcessMode.setType(HCNetSDK.NET_DVR_FINGER_PRINT_BYCARD_V50.class); + for (int i = 0; i < employeeNo.length(); i++) { + m_struFingerDelInfoParam.struProcessMode.struByCard.byEmployeeNo[i] = employeeNo.getBytes()[i]; + } + m_struFingerDelInfoParam.struProcessMode.struByCard.byEnableCardReader[0] = 1;//指纹的读卡器信息,按位表示 + m_struFingerDelInfoParam.struProcessMode.struByCard.byFingerPrintID[0] = 1;//需要删除的指纹编号,按数组下标,值表示0-不删除,1-删除该指纹 ,指纹编号1删除 + + + Pointer lpInBuffer1 = m_struFingerDelInfoParam.getPointer(); + m_struFingerDelInfoParam.write(); + + + int lHandle = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_DEL_FINGERPRINT, lpInBuffer1, m_struFingerDelInfoParam.size(), null, null); + if (lHandle < 0) { + iErr = AcsMain.hCNetSDK.NET_DVR_GetLastError(); + System.out.println("NET_DVR_DEL_FINGERPRINT_CFG_V50 建立长连接失败,错误号:" + iErr); + return; + } + while (true) { + HCNetSDK.NET_DVR_FINGER_PRINT_INFO_CTRL_V50 v50 = new HCNetSDK.NET_DVR_FINGER_PRINT_INFO_CTRL_V50(); + v50.dwSize = v50.size(); + v50.write(); + int res = AcsMain.hCNetSDK.NET_DVR_GetNextRemoteConfig(lHandle, v50.getPointer(), v50.size()); + if (res == 1002) { + AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandle); + System.out.println("删除指纹成功!!!"); + break; + } else if (res == 1003) { + System.out.println("接口失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandle); + break; + } + } + } +} diff --git a/src/main/java/com/hkversion/Acs/MutilCard.java b/src/main/java/com/hkversion/Acs/MutilCard.java new file mode 100644 index 0000000..2bf0cfd --- /dev/null +++ b/src/main/java/com/hkversion/Acs/MutilCard.java @@ -0,0 +1,76 @@ +package com.hkversion.Acs; + + +import com.hkversion.HCNetSDK; + +/** + * 多重卡认证功能,下发人员的输入json中参数belongGroup绑定人员群组 + */ +public class MutilCard { + + + //设置群组参数 + public static void setGroupCfg(int lUserID) + { + HCNetSDK.NET_DVR_GROUP_CFG struGroupCfg = new HCNetSDK.NET_DVR_GROUP_CFG(); + struGroupCfg.read(); + + struGroupCfg.dwSize = struGroupCfg.size(); + struGroupCfg.byEnable = 1; + struGroupCfg.byGroupName = "test".getBytes(); // + struGroupCfg.struValidPeriodCfg.byEnable = 1; + struGroupCfg.struValidPeriodCfg.struBeginTime.wYear = 2021; + struGroupCfg.struValidPeriodCfg.struBeginTime.byMonth = 1; + struGroupCfg.struValidPeriodCfg.struBeginTime.byDay = 1; + struGroupCfg.struValidPeriodCfg.struBeginTime.byHour = 0; + struGroupCfg.struValidPeriodCfg.struBeginTime.byMinute = 0; + struGroupCfg.struValidPeriodCfg.struBeginTime.bySecond = 0; + struGroupCfg.struValidPeriodCfg.struEndTime.wYear = 2037; + struGroupCfg.struValidPeriodCfg.struEndTime.byMonth = 12; + struGroupCfg.struValidPeriodCfg.struEndTime.byDay = 31; + struGroupCfg.struValidPeriodCfg.struEndTime.byHour = 23; + struGroupCfg.struValidPeriodCfg.struEndTime.byMinute = 59; + struGroupCfg.struValidPeriodCfg.struEndTime.bySecond = 59; + struGroupCfg.write(); + if(!AcsMain.hCNetSDK.NET_DVR_SetDVRConfig(lUserID,2113,1,struGroupCfg.getPointer(),struGroupCfg.size())) + { + System.out.println("NET_DVR_SetDVRConfig NET_DVR_SET_GROUP_CFG失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + } else { + System.out.println("NET_DVR_SetDVRConfig NET_DVR_SET_GROUP_CFG成功"); + } + } + + + + //设置多重认证参数 + + /** + * 多重卡刷卡开门功能: + * 有权限的任意n张卡刷卡之后才能开门,不限制先后次序,则只需要设置一个群组组合(卡号都配置关联该群组),byMemberNum设为n,bySequenceNo设为1。 + * 有权限的n张A类卡和m张B类卡刷卡之后才能开门,而且先刷A类卡再刷B类卡,则需要设置2个群组组合,2个群组组合的byMemberNum分别为n和m, + * bySequenceNo分别为1、2;如果不需要限制刷卡先后次序,则bySequenceNo都设为0,0表示无序。 + * @param lUserID + */ + public static void setMultiCardCfg(int lUserID) + { + HCNetSDK.NET_DVR_MULTI_CARD_CFG_V50 struMultiCardCfg = new HCNetSDK.NET_DVR_MULTI_CARD_CFG_V50(); + struMultiCardCfg.read(); + struMultiCardCfg.dwSize = struMultiCardCfg.size(); + struMultiCardCfg.byEnable = 1; + struMultiCardCfg.bySwipeIntervalTimeout = 30; //刷卡认证超时时间 + struMultiCardCfg.struGroupCfg[0].byEnable = 1; + struMultiCardCfg.struGroupCfg[0].dwTemplateNo = 1; + struMultiCardCfg.struGroupCfg[0].struGroupCombination[0].byEnable = 1; + struMultiCardCfg.struGroupCfg[0].struGroupCombination[0].byMemberNum = 2; //刷卡成员数量,群组里面需要刷卡的卡个数 + struMultiCardCfg.struGroupCfg[0].struGroupCombination[0].bySequenceNo = 1; //群组刷卡次序号 + struMultiCardCfg.struGroupCfg[0].struGroupCombination[0].dwGroupNo = 1; //群组编号 //刷卡认证组 + struMultiCardCfg.write(); + + if(!AcsMain.hCNetSDK.NET_DVR_SetDVRConfig(lUserID, HCNetSDK.NET_DVR_SET_MULTI_CARD_CFG_V50,1,struMultiCardCfg.getPointer(),struMultiCardCfg.size())) + { + System.out.println("NET_DVR_SetDVRConfig NET_DVR_SET_MULTI_CARD_CFG_V50 失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + } else { + System.out.println("NET_DVR_SetDVRConfig NET_DVR_SET_MULTI_CARD_CFG_V50 成功"); + } + } +} diff --git a/src/main/java/com/hkversion/Acs/TransIsapi.java b/src/main/java/com/hkversion/Acs/TransIsapi.java new file mode 100644 index 0000000..213ddb1 --- /dev/null +++ b/src/main/java/com/hkversion/Acs/TransIsapi.java @@ -0,0 +1,99 @@ +package com.hkversion.Acs; + +import com.hkversion.HCNetSDK; + +/** + * @create 2021-04-13-15:23 + * 功能:透传接口实现,透传ISAPI命令 + */ +public final class TransIsapi { + public static String get_isapi(int lUserID, String url) { + HCNetSDK.NET_DVR_XML_CONFIG_INPUT struXMLInput = new HCNetSDK.NET_DVR_XML_CONFIG_INPUT(); + struXMLInput.read(); + HCNetSDK.BYTE_ARRAY stringRequest = new HCNetSDK.BYTE_ARRAY(1024); + stringRequest.read(); + //输入ISAPI协议命令 + System.arraycopy(url.getBytes(), 0, stringRequest.byValue, 0, url.length()); + stringRequest.write(); + struXMLInput.dwSize = struXMLInput.size(); + struXMLInput.lpRequestUrl = stringRequest.getPointer(); + struXMLInput.dwRequestUrlLen = url.length(); + struXMLInput.lpInBuffer = null; + struXMLInput.dwInBufferSize = 0; + struXMLInput.write(); + + HCNetSDK.BYTE_ARRAY stringXMLOut = new HCNetSDK.BYTE_ARRAY(8 * 1024); + stringXMLOut.read(); + HCNetSDK.BYTE_ARRAY struXMLStatus = new HCNetSDK.BYTE_ARRAY(1024); + struXMLStatus.read(); + HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT struXMLOutput = new HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT(); + struXMLOutput.read(); + struXMLOutput.dwSize = struXMLOutput.size(); + struXMLOutput.lpOutBuffer = stringXMLOut.getPointer(); + struXMLOutput.dwOutBufferSize = stringXMLOut.size(); + struXMLOutput.lpStatusBuffer = struXMLStatus.getPointer(); + struXMLOutput.dwStatusSize = struXMLStatus.size(); + struXMLOutput.write(); + if (!AcsMain.hCNetSDK.NET_DVR_STDXMLConfig(lUserID, struXMLInput, struXMLOutput)) { + int iErr = AcsMain.hCNetSDK.NET_DVR_GetLastError(); + System.err.println("NET_DVR_STDXMLConfig失败,错误号" + iErr+"----URL:"+url); + return null; + } else { + stringXMLOut.read(); + System.out.println("输出文本大小:" + struXMLOutput.dwReturnedXMLSize); + //打印输出XML文本 + String strOutXML = new String(stringXMLOut.byValue).trim(); + System.out.println(strOutXML); + struXMLStatus.read(); + String strStatus = new String(struXMLStatus.byValue).trim(); + System.out.println(strStatus); + return strOutXML; + } + } + + + public static String put_isapi(int lUserID, String url, String inputXml) { + HCNetSDK.NET_DVR_XML_CONFIG_INPUT struXMLInput = new HCNetSDK.NET_DVR_XML_CONFIG_INPUT(); + struXMLInput.read(); + HCNetSDK.BYTE_ARRAY stringRequest = new HCNetSDK.BYTE_ARRAY(1024); + stringRequest.read(); + //输入ISAPI协议命令 + System.arraycopy(url.getBytes(), 0, stringRequest.byValue, 0, url.length()); + stringRequest.write(); + struXMLInput.dwSize = struXMLInput.size(); + struXMLInput.lpRequestUrl = stringRequest.getPointer(); + struXMLInput.dwRequestUrlLen = url.length(); + HCNetSDK.BYTE_ARRAY ptrInBuffer = new HCNetSDK.BYTE_ARRAY(inputXml.length()); + ptrInBuffer.read(); + System.arraycopy(inputXml.getBytes(), 0, ptrInBuffer.byValue, 0, inputXml.length()); + ptrInBuffer.write(); + struXMLInput.lpInBuffer = ptrInBuffer.getPointer(); + struXMLInput.dwInBufferSize = inputXml.length(); + struXMLInput.write(); + HCNetSDK.BYTE_ARRAY stringXMLOut = new HCNetSDK.BYTE_ARRAY(8 * 1024); + stringXMLOut.read(); + HCNetSDK.BYTE_ARRAY struXMLStatus = new HCNetSDK.BYTE_ARRAY(1024); + struXMLStatus.read(); + HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT struXMLOutput = new HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT(); + struXMLOutput.read(); + struXMLOutput.dwSize = struXMLOutput.size(); + struXMLOutput.lpOutBuffer = stringXMLOut.getPointer(); + struXMLOutput.dwOutBufferSize = stringXMLOut.size(); + struXMLOutput.lpStatusBuffer = struXMLStatus.getPointer(); + struXMLOutput.dwStatusSize = struXMLStatus.size(); + struXMLOutput.write(); + if (!AcsMain.hCNetSDK.NET_DVR_STDXMLConfig(lUserID, struXMLInput, struXMLOutput)){ + int iErr = AcsMain.hCNetSDK.NET_DVR_GetLastError(); + System.err.println("NET_DVR_STDXMLConfig失败,错误号" + iErr+"----URL:"+url); + return null; + } else { + stringXMLOut.read(); + System.out.println("输出文本大小:" + struXMLOutput.dwReturnedXMLSize); + //打印输出XML文本 + String strOutXML = new String(stringXMLOut.byValue).trim(); + struXMLStatus.read(); + String strStatus = new String(struXMLStatus.byValue).trim(); + return strOutXML; + } + } +} diff --git a/src/main/java/com/hkversion/Acs/UserManage.java b/src/main/java/com/hkversion/Acs/UserManage.java new file mode 100644 index 0000000..329f923 --- /dev/null +++ b/src/main/java/com/hkversion/Acs/UserManage.java @@ -0,0 +1,462 @@ +package com.hkversion.Acs; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.JSONObject; +import com.hkversion.HCNetSDK; +import com.sun.jna.Pointer; +import com.sun.jna.ptr.IntByReference; + +import java.io.UnsupportedEncodingException; + +/** + * 功能:人脸下发、查询、删除、人员计划模板配置 + */ +public class UserManage { + /** + * 添加人员 + * + * @param lUserID 登录句柄 + * @param employeeNo 工号 + * @throws UnsupportedEncodingException + * @throws InterruptedException + * @throws JSONException + */ + public static void addUserInfo(int lUserID, String employeeNo) throws UnsupportedEncodingException, InterruptedException, JSONException { + HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组 + //"POST /ISAPI/AccessControl/UserInfo/Record?format=json" 此URL也是下发人员 + String strInBuffer = "PUT /ISAPI/AccessControl/UserInfo/SetUp?format=json"; + System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中 + ptrByteArray.write(); + + int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null); + if (lHandler < 0) { + System.out.println("AddUserInfo NET_DVR_StartRemoteConfig 失败,错误码为" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + return; + } else { + System.out.println("AddUserInfo NET_DVR_StartRemoteConfig 成功!"); + + byte[] Name = "测试1".getBytes("utf-8"); //根据iCharEncodeType判断,如果iCharEncodeType返回6,则是UTF-8编码。 + //如果是0或者1或者2,则是GBK编码 + + //将中文字符编码之后用数组拷贝的方式,避免因为编码导致的长度问题 + String strInBuffer1 = "{\n" + + " \"UserInfo\":{\n" + + " \"employeeNo\":\""+employeeNo+"\",\n" + + " \"name\":\""; + String strInBuffer2 = "\",\n" + + " \"userType\":\"normal\",\n" + + " \"Valid\":{\n" + + " \"enable\":true,\n" + + " \"beginTime\":\"2019-08-01T17:30:08\",\n" + + " \"endTime\":\"2030-08-01T17:30:08\",\n" + + " \"timeType\":\"local\"\n" + + " },\n" + + " \"belongGroup\":\"1\",\n" + + " \"doorRight\":\"1\",\n" + + " \"RightPlan\":[\n" + + " {\n" + + " \"doorNo\":1,\n" + + " \"planTemplateNo\":\"1\"\n" + + " }\n" + + " ]\n" + + " }\n" + + "}"; + int iStringSize = Name.length + strInBuffer1.length() + strInBuffer2.length(); + + HCNetSDK.BYTE_ARRAY ptrByte = new HCNetSDK.BYTE_ARRAY(iStringSize); + System.arraycopy(strInBuffer1.getBytes(), 0, ptrByte.byValue, 0, strInBuffer1.length()); + System.arraycopy(Name, 0, ptrByte.byValue, strInBuffer1.length(), Name.length); + System.arraycopy(strInBuffer2.getBytes(), 0, ptrByte.byValue, strInBuffer1.length() + Name.length, strInBuffer2.length()); + ptrByte.write(); + + System.out.println(new String(ptrByte.byValue)); + + HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(1024); + + IntByReference pInt = new IntByReference(0); + while (true) { + int dwState = AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrByte.getPointer(), iStringSize, ptrOutuff.getPointer(), 1024, pInt); + if (dwState == -1) { + System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + break; + } + //读取返回的json并解析 + ptrOutuff.read(); + String strResult = new String(ptrOutuff.byValue).trim(); + System.out.println("dwState:" + dwState + ",strResult:" + strResult); + + JSONObject jsonResult = JSONObject.parseObject(strResult); + int statusCode = jsonResult.getInteger("statusCode"); + String statusString = jsonResult.getString("statusString"); + if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) { + System.out.println("配置等待"); + Thread.sleep(10); + continue; + } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) { + System.out.println("下发人员失败, json retun:" + jsonResult.toString()); + break; + } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) { + System.out.println("下发人员异常, json retun:" + jsonResult.toString()); + break; + } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {//返回NET_SDK_CONFIG_STATUS_SUCCESS代表流程走通了,但并不代表下发成功,比如有些设备可能因为人员已存在等原因下发失败,所以需要解析Json报文 + if (statusCode != 1) { + System.out.println("下发人员成功,但是有异常情况:" + jsonResult.toString()); + } else { + System.out.println("下发人员成功: json retun:" + jsonResult.toString()); + } + break; + } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) { + //下发人员时:dwState其实不会走到这里,因为设备不知道我们会下发多少个人,所以长连接需要我们主动关闭 + System.out.println("下发人员完成"); + break; + } + } + if (!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)) { + System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + } else { + System.out.println("NET_DVR_StopRemoteConfig接口成功"); + } + } + } + + public static void modifyUserInfo(int lUserID, String employeeNo,int planTemplateNo) throws UnsupportedEncodingException, InterruptedException, JSONException { + HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组 + //"POST /ISAPI/AccessControl/UserInfo/Record?format=json" 此URL也是下发人员 + String strInBuffer = "PUT /ISAPI/AccessControl/UserInfo/Modify?format=json"; + System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中 + ptrByteArray.write(); + + int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null); + if (lHandler < 0) { + System.out.println("AddUserInfo NET_DVR_StartRemoteConfig 失败,错误码为" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + return; + } else { + System.out.println("AddUserInfo NET_DVR_StartRemoteConfig 成功!"); + + //如果是0或者1或者2,则是GBK编码 + + //将中文字符编码之后用数组拷贝的方式,避免因为编码导致的长度问题 + String strInBuffer1 = "{\n" + + " \"UserInfo\":{\n" + + " \"employeeNo\":\""+employeeNo+"\",\n" + + " \"RightPlan\":[\n" + + " {\n" + + " \"doorNo\":1,\n" + + " \"planTemplateNo\":\""+planTemplateNo+"\"\n" + + " }\n" + + " ]\n" + + " }\n" + + "}"; + int iStringSize = strInBuffer1.length(); + + HCNetSDK.BYTE_ARRAY ptrByte = new HCNetSDK.BYTE_ARRAY(iStringSize); + System.arraycopy(strInBuffer1.getBytes(), 0, ptrByte.byValue, 0, strInBuffer1.length()); + ptrByte.write(); + + System.out.println(new String(ptrByte.byValue)); + + HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(1024); + + IntByReference pInt = new IntByReference(0); + while (true) { + int dwState = AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrByte.getPointer(), iStringSize, ptrOutuff.getPointer(), 1024, pInt); + if (dwState == -1) { + System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + break; + } + //读取返回的json并解析 + ptrOutuff.read(); + String strResult = new String(ptrOutuff.byValue).trim(); + System.out.println("dwState:" + dwState + ",strResult:" + strResult); + + JSONObject jsonResult = JSONObject.parseObject(strResult); + int statusCode = jsonResult.getInteger("statusCode"); + String statusString = jsonResult.getString("statusString"); + if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) { + System.out.println("配置等待"); + Thread.sleep(10); + continue; + } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) { + System.out.println("更新人员失败, json retun:" + jsonResult.toString()); + break; + } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) { + System.out.println("更新人员异常, json retun:" + jsonResult.toString()); + break; + } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {//返回NET_SDK_CONFIG_STATUS_SUCCESS代表流程走通了,但并不代表下发成功,比如有些设备可能因为人员已存在等原因下发失败,所以需要解析Json报文 + if (statusCode != 1) { + System.out.println("更新人员成功,但是有异常情况:" + jsonResult.toString()); + } else { + System.out.println("更新人员成功: json retun:" + jsonResult.toString()); + } + break; + } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) { + //下发人员时:dwState其实不会走到这里,因为设备不知道我们会下发多少个人,所以长连接需要我们主动关闭 + System.out.println("更新人员完成"); + break; + } + } + if (!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)) { + System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + } else { + System.out.println("NET_DVR_StopRemoteConfig接口成功"); + } + } + } + + /** + * 查询人员信息 + * @param userID + * @throws JSONException + */ + public static void searchUserInfo(int userID,String...employeeNo) throws JSONException { + HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组 + String strInBuffer = "POST /ISAPI/AccessControl/UserInfo/Search?format=json"; + System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中 + ptrByteArray.write(); + + int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null); + if (lHandler < 0) { + System.out.println("SearchUserInfo NET_DVR_StartRemoteConfig 失败,错误码为" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + return; + } else { + //组装查询的JSON报文,这边查询的是所有的人员 + JSONObject jsonObject = new JSONObject(); + JSONObject jsonSearchCond = new JSONObject(); + + //如果需要查询指定的工号人员信息,把下面注释的内容去除掉即可 + JSONArray EmployeeNoList = new JSONArray(); + JSONObject employeeNo1 = new JSONObject(); + employeeNo1.put("employeeNo", employeeNo[0]); +// JSONObject employeeNo2 = new JSONObject(); +// employeeNo2.put("employeeNo", "u10"); + EmployeeNoList.add(employeeNo1); +// EmployeeNoList.add(employeeNo2); + jsonSearchCond.put("EmployeeNoList", EmployeeNoList); + + jsonSearchCond.put("searchID", "20230912"); + jsonSearchCond.put("searchResultPosition", 0); + jsonSearchCond.put("maxResults", 50); + jsonObject.put("UserInfoSearchCond", jsonSearchCond); + + String strInbuff = jsonObject.toString(); + System.out.println("查询的json报文:" + strInbuff); + + //把string传递到Byte数组中,后续用.getPointer()方法传入指针地址中。 + HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(strInbuff.length()); + System.arraycopy(strInbuff.getBytes(), 0, ptrInbuff.byValue, 0, strInbuff.length()); + ptrInbuff.write(); + + //定义接收结果的结构体 + HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(10 * 1024); + + IntByReference pInt = new IntByReference(0); + + while (true) { + /* + dwOutBuffSize是输出缓冲区大小,需要自定义指定大小,如果接口报错错误码43.说明接收设备数据的缓冲区或存放图片缓冲区不足,应扩大缓冲区大小 + */ + int dwState = AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInbuff.getPointer(), strInbuff.length(), ptrOutuff.getPointer(), 20 * 1024, pInt); + System.out.println(dwState); + if (dwState == -1) { + System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + break; + } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) { + System.out.println("配置等待"); + try { + Thread.sleep(10); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + continue; + } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) { + System.out.println("查询人员失败"); + break; + } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) { + System.out.println("查询人员异常"); + break; + } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) { + ptrOutuff.read(); + System.out.println("查询人员成功, json:" + new String(ptrOutuff.byValue).trim()); + break; + } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) { + System.out.println("获取人员完成"); + break; + } + } + + if (!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)) { + System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + } else { + System.out.println("NET_DVR_StopRemoteConfig接口成功"); + lHandler = -1; + } + } + + + } + + public static void deleteUserInfo(int userID) throws JSONException { + //删除单个人员 +// String deleteUserjson="{\n" + +// "\t\"UserInfoDetail\": {\t\n" + +// "\t\t\"mode\": \"byEmployeeNo\",\t\n" + +// "\t\t\"EmployeeNoList\": [\t\n" + +// "\t\t\t{\n" + +// "\t\t\t\t\"employeeNo\": \"test\"\t\n" + +// "\t\t\t}\n" + +// "\t\t]\n" + +// "\n" + +// "\t}\n" + +// "}"; + //删除所有人员 + String deleteUserjson = "{\n" + + "\t\"UserInfoDetail\": {\t\n" + + "\t\t\"mode\": \"all\",\t\n" + + "\t\t\"EmployeeNoList\": [\t\n" + + "\t\t]\n" + + "\n" + + "\t}\n" + + "}"; + String deleteUserUrl = "PUT /ISAPI/AccessControl/UserInfoDetail/Delete?format=json"; + String result = TransIsapi.put_isapi(userID, deleteUserUrl, deleteUserjson); + System.out.println(result); + //获取删除进度 + while (true) { + String getDeleteProcessUrl = "GET /ISAPI/AccessControl/UserInfoDetail/DeleteProcess?format=json"; + String deleteResult = TransIsapi.get_isapi(userID, getDeleteProcessUrl); + JSONObject jsonObject = JSONObject.parseObject(deleteResult); + JSONObject jsonObject1 = jsonObject.getJSONObject("UserInfoDetailDeleteProcess"); + String process = jsonObject1.getString("status"); + System.out.println("process ="+process); + if (process.equals("processing")) { + System.out.println("正在删除"); + continue; + } else if (process.equals("success")) { + System.out.println("删除成功"); + break; + }else if(process.equals("failed")){ + System.out.println("删除失败"); + break; + } + } + } + + /** + * 人员计划模板配置 + * + * @param userID 用户登录句柄 + * @param iPlanTemplateNumber 计划模板编号,从1开始,最大值从门禁能力集获取 + */ + public static void setCardTemplate(int userID, int iPlanTemplateNumber) { + //设置卡权限计划模板参数 + HCNetSDK.NET_DVR_PLAN_TEMPLATE_COND struPlanCond = new HCNetSDK.NET_DVR_PLAN_TEMPLATE_COND(); + struPlanCond.dwSize = struPlanCond.size(); + struPlanCond.dwPlanTemplateNumber = iPlanTemplateNumber;//计划模板编号,从1开始,最大值从门禁能力集获取 + struPlanCond.wLocalControllerID = 0;//就地控制器序号[1,64],0表示门禁主机 + struPlanCond.write(); + HCNetSDK.NET_DVR_PLAN_TEMPLATE struPlanTemCfg = new HCNetSDK.NET_DVR_PLAN_TEMPLATE(); + struPlanTemCfg.dwSize = struPlanTemCfg.size(); + struPlanTemCfg.byEnable = 1; //是否使能:0- 否,1- 是 + struPlanTemCfg.dwWeekPlanNo = 2;//周计划编号,0表示无效 + struPlanTemCfg.dwHolidayGroupNo[0] = 0;//假日组编号,按值表示,采用紧凑型排列,中间遇到0则后续无效 + byte[] byTemplateName; + try { + byTemplateName = "CardTemplatePlan_2".getBytes("GBK"); + //计划模板名称 + for (int i = 0; i < HCNetSDK.NAME_LEN; i++) { + struPlanTemCfg.byTemplateName[i] = 0; + } + System.arraycopy(byTemplateName, 0, struPlanTemCfg.byTemplateName, 0, byTemplateName.length); + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + struPlanTemCfg.write(); + IntByReference pInt = new IntByReference(0); + Pointer lpStatusList = pInt.getPointer(); + if (false == AcsMain.hCNetSDK.NET_DVR_SetDeviceConfig(userID, HCNetSDK.NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50, 1, struPlanCond.getPointer(), struPlanCond.size(), lpStatusList, struPlanTemCfg.getPointer(), struPlanTemCfg.size())) { + System.out.println("NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50失败,错误号:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + return; + } + System.out.println("NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50成功!"); + //获取卡权限周计划参数 + HCNetSDK.NET_DVR_WEEK_PLAN_COND struWeekPlanCond = new HCNetSDK.NET_DVR_WEEK_PLAN_COND(); + struWeekPlanCond.dwSize = struWeekPlanCond.size(); + struWeekPlanCond.dwWeekPlanNumber = 2; + struWeekPlanCond.wLocalControllerID = 0; + HCNetSDK.NET_DVR_WEEK_PLAN_CFG struWeekPlanCfg = new HCNetSDK.NET_DVR_WEEK_PLAN_CFG(); + struWeekPlanCond.write(); + struWeekPlanCfg.write(); + Pointer lpCond = struWeekPlanCond.getPointer(); + Pointer lpInbuferCfg = struWeekPlanCfg.getPointer(); + if (false == AcsMain.hCNetSDK.NET_DVR_GetDeviceConfig(userID, HCNetSDK.NET_DVR_GET_CARD_RIGHT_WEEK_PLAN_V50, 1, lpCond, struWeekPlanCond.size(), lpStatusList, lpInbuferCfg, struWeekPlanCfg.size())) { + System.out.println("NET_DVR_GET_CARD_RIGHT_WEEK_PLAN_V50失败,错误号:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + return; + } + struWeekPlanCfg.read(); + struWeekPlanCfg.byEnable = 1; //是否使能:0- 否,1- 是 + /**避免时间段交叉,先初始化, 七天八小时*/ + for (int i = 0; i < 7; i++) { + for (int j = 0; j < 8; j++) { + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].byEnable = 0; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.byHour = 0; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.byMinute = 0; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.bySecond = 0; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.byHour = 0; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.byMinute = 0; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.bySecond = 0; + } + } + /**一周7天,全天24小时*/ +// for (int i = 0; i < 7; i++) { +// struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].byEnable = 1; +// struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byHour = 21; +// struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byMinute = 0; +// struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.bySecond = 0; +// struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byHour = 23; +// struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byMinute = 0; +// struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.bySecond = 0; +// } + /**一周7天,每天设置2个时间段*/ + for(int i=0;i<7;i++) + { + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].byEnable = 1; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byHour = 16; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byMinute = 0; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.bySecond = 0; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byHour = 16; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byMinute = 30; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.bySecond = 0; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].byEnable = 1; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.byHour = 17; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.byMinute = 5; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.bySecond = 0; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.byHour = 17; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.byMinute = 10; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.bySecond = 0; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[2].byEnable = 1; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[2].struTimeSegment.struBeginTime.byHour = 18; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[2].struTimeSegment.struBeginTime.byMinute = 0; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[2].struTimeSegment.struBeginTime.bySecond = 0; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[2].struTimeSegment.struEndTime.byHour = 18; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[2].struTimeSegment.struEndTime.byMinute = 30; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[2].struTimeSegment.struEndTime.bySecond = 0; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[3].byEnable = 1; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[3].struTimeSegment.struBeginTime.byHour = 19; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[3].struTimeSegment.struBeginTime.byMinute = 0; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[3].struTimeSegment.struBeginTime.bySecond = 0; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[3].struTimeSegment.struEndTime.byHour = 19; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[3].struTimeSegment.struEndTime.byMinute = 30; + struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[3].struTimeSegment.struEndTime.bySecond = 0; + } + struWeekPlanCfg.write(); + //设置卡权限周计划参数 + if (false == AcsMain.hCNetSDK.NET_DVR_SetDeviceConfig(userID, HCNetSDK.NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50, 1, lpCond, struWeekPlanCond.size(), lpStatusList, lpInbuferCfg, struWeekPlanCfg.size())) { + System.out.println("NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50失败,错误号:" + AcsMain.hCNetSDK.NET_DVR_GetLastError()); + } else { + System.out.println("NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50成功!"); + } + } +} diff --git a/src/main/java/com/hkversion/AlarmDataParse.java b/src/main/java/com/hkversion/AlarmDataParse.java index ffaf786..941b0f2 100644 --- a/src/main/java/com/hkversion/AlarmDataParse.java +++ b/src/main/java/com/hkversion/AlarmDataParse.java @@ -21,7 +21,7 @@ import java.util.Date; public class AlarmDataParse { public static void alarmDataHandle(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser, AlarmCallback callback) { - //System.out.println("报警事件类型: lCommand:" + Integer.toHexString(lCommand)); + System.out.println("报警事件类型: lCommand:" + Integer.toHexString(lCommand)); String sTime; String MonitoringSiteID; //lCommand是传的报警类型 diff --git a/src/main/java/com/yzx/Main.java b/src/main/java/com/yzx/Main.java index 899a0e2..917cf2b 100644 --- a/src/main/java/com/yzx/Main.java +++ b/src/main/java/com/yzx/Main.java @@ -25,24 +25,25 @@ public class Main { //3.如果文件上传失败,需要重试,如果失败了,先存在本地,利用数据库的id作为标识,写一个定时任务,重新更新和上传. new Thread(() -> { - IHardwareEquipment hardwareEquipment1 = new HKVersion(new HardwareEquipmentInfo("192.168.69.128",(short) 8000,"admin","yzx123456",alarmCallback)); - if(hardwareEquipment1.getStatus() == 1){ - String deployInfo1 = hardwareEquipment1.getDeployInfo(); - System.out.println("deployInfo = " + deployInfo1); - hardwareEquipmentList.add(hardwareEquipment1); - while(true){} - } + IHardwareEquipment hardwareEquipment1 = new HKVersion(new HardwareEquipmentInfo("192.168.69.64",(short) 8000,"admin","yzx123456.",alarmCallback)); + while (true){} +// if(hardwareEquipment1.getStatus() == 1){ +// String deployInfo1 = hardwareEquipment1.getDeployInfo(); +// System.out.println("deployInfo = " + deployInfo1); +// hardwareEquipmentList.add(hardwareEquipment1); +// while(true){} +// } }).start(); - new Thread(() -> { - IHardwareEquipment hardwareEquipment2 = new HKVersion(new HardwareEquipmentInfo("192.168.69.140",(short) 8000,"admin","yzx123456",alarmCallback)); - if(hardwareEquipment2.getStatus() == 1){ - String deployInfo2 = hardwareEquipment2.getDeployInfo(); - System.out.println("deployInfo = " + deployInfo2); - hardwareEquipmentList.add(hardwareEquipment2); - while(true){} - } - }).start(); +// new Thread(() -> { +// IHardwareEquipment hardwareEquipment2 = new HKVersion(new HardwareEquipmentInfo("192.168.69.140",(short) 8000,"admin","yzx123456",alarmCallback)); +// if(hardwareEquipment2.getStatus() == 1){ +// String deployInfo2 = hardwareEquipment2.getDeployInfo(); +// System.out.println("deployInfo = " + deployInfo2); +// hardwareEquipmentList.add(hardwareEquipment2); +// while(true){} +// } +// }).start(); } private static class AlarmCallbackImpl implements AlarmCallback{