package Acs; import Commom.ConfigFileUtil; import NetSDKDemo.HCNetSDK; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import org.json.JSONException; import org.json.JSONObject; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.UUID; import cn.iocoder.yudao.module.md.service.*; import static Commom.ConfigFileUtil.replace; /** * 功能:人脸下发、查询、删除、人员计划模板配置 */ public class UserManage { /** * 添加人员 * * @param lUserID 登录句柄 * @param name 下发人员的信息 * @return * @throws UnsupportedEncodingException * @throws InterruptedException * @throws JSONException */ public static String addUserInfo(int lUserID, String employeeNo,String name) throws UnsupportedEncodingException, InterruptedException, JSONException { HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024); //数组 String strInBuffer = "POST /ISAPI/AccessControl/UserInfo/Record?format=json"; //此URL也是下发人员 System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中 ptrByteArray.write(); int lHandler = AcsService.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 失败,错误码为" + AcsService.hCNetSDK.NET_DVR_GetLastError()); return strInBuffer; } else { System.out.println("AddUserInfo NET_DVR_StartRemoteConfig 成功!"); Map parameter = new HashMap<>(); parameter.put("employeeNo", employeeNo); // 员工ID parameter.put("name", name); // 员工名称 parameter.put("enable", true); // 是否启用 parameter.put("doorNo", 1); // 门编号 //输入参数,XML或者JSON数据,下发人员信息json报文,其他参数设置参考conf/acs/AddUserInfoParam.json中报文参数 String input = ConfigFileUtil.getReqBodyFromTemplate("AddUserInfoParam.json", parameter); System.out.println("下发人员参数:" + input); byte[] byInbuffer = input.getBytes("utf-8"); int iInBufLen = byInbuffer.length; HCNetSDK.BYTE_ARRAY ptrInBuffer = new HCNetSDK.BYTE_ARRAY(iInBufLen); ptrInBuffer.read(); System.arraycopy(byInbuffer, 0, ptrInBuffer.byValue, 0, iInBufLen); ptrInBuffer.write(); HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(1024); IntByReference pInt = new IntByReference(0); while (true) { int dwState = AcsService.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInBuffer.getPointer(), iInBufLen, ptrOutuff.getPointer(), 1024, pInt); if (dwState == -1) { System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsService.hCNetSDK.NET_DVR_GetLastError()); break; } //读取返回的json并解析 ptrOutuff.read(); String strResult = new String(ptrOutuff.byValue).trim(); System.out.println("dwState:" + dwState + ",strResult:" + strResult); JSONObject jsonResult = new JSONObject(strResult); int statusCode = jsonResult.getInt("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 (!AcsService.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)) { System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsService.hCNetSDK.NET_DVR_GetLastError()); } else { System.out.println("NET_DVR_StopRemoteConfig接口成功"); } } return strInBuffer; } /** * 查询人员信息 * * @param userID * @return * @throws JSONException */ public static String searchUserInfo(int userID) 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 = AcsService.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null); HCNetSDK.BYTE_ARRAY ptrOutuff; if (lHandler < 0) { System.out.println("SearchUserInfo NET_DVR_StartRemoteConfig 失败,错误码为" + AcsService.hCNetSDK.NET_DVR_GetLastError()); return strInBuffer; } else { //输入参数,XML或者JSON数据,查询多条人员信息json报文 Map parameter = new HashMap<>(); parameter.put("searchID", UUID.randomUUID()); // 查询id parameter.put("maxResults", 30); // 最大查询数量 String strInbuff = ConfigFileUtil.getReqBodyFromTemplate("SearchUserInfoParam.json", parameter); // 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(); //定义接收结果的结构体 ptrOutuff = new HCNetSDK.BYTE_ARRAY(10 * 1024); IntByReference pInt = new IntByReference(0); while (true) { /* dwOutBuffSize是输出缓冲区大小,需要自定义指定大小,如果接口报错错误码43.说明接收设备数据的缓冲区或存放图片缓冲区不足,应扩大缓冲区大小 */ int dwState = AcsService.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接口调用失败,错误码:" + AcsService.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 (!AcsService.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)) { System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsService.hCNetSDK.NET_DVR_GetLastError()); } else { System.out.println("NET_DVR_StopRemoteConfig接口成功"); lHandler = -1; } } return new String(ptrOutuff.byValue).trim(); } //lsq public static String getUserInfo(int lUserID , 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 = AcsService.hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null); HCNetSDK.BYTE_ARRAY ptrOutuff; if (lHandler < 0) { System.out.println("SearchUserInfo NET_DVR_StartRemoteConfig 失败,错误码为" + AcsService.hCNetSDK.NET_DVR_GetLastError()); return null; } else { Map parameter = new HashMap<>(); parameter.put("searchID", UUID.randomUUID()); // 查询id parameter.put("maxResults",10); parameter.put("UserInfo.employeeNo",employeeNo);//查询学号对应的人 System.out.println("查询条件"+parameter); String template = "{\n" + " \"UserInfoSearchCond\": {\n" + " \"searchID\": \"${searchID}\",\n" + " \"searchResultPosition\": 0,\n" + " \"maxResults\": ${maxResults},\n" + " \"EmployeeNoList\": [{\n" + " \"employeeNo\": \"${UserInfo.employeeNo}\"\n" + " }]\n" + " }\n" + "}"; // 生成请求体 String requestJson = replace(template, parameter); System.out.println("生成的请求体:"+requestJson); HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(requestJson.length()); System.arraycopy(requestJson.getBytes(), 0, ptrInbuff.byValue, 0, requestJson.length()); ptrInbuff.write(); ptrOutuff = new HCNetSDK.BYTE_ARRAY(10 * 1024); IntByReference pInt = new IntByReference(0); while (true) { int dwState = AcsService.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInbuff.getPointer(),requestJson.length(), ptrOutuff.getPointer(), 20 * 1024, pInt); if (dwState == -1) { System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsService.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("查询人员失败"); 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 (!AcsService.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)) { System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsService.hCNetSDK.NET_DVR_GetLastError()); } else { System.out.println("NET_DVR_StopRemoteConfig接口成功"); } } return new String(ptrOutuff.byValue).trim(); } /** * 删除人员信息 * * @param userID * @return * @throws JSONException */ public static String deleteUserInfo(int userID,String EmployeeNo) throws JSONException { //删除单个人员 //输入参数,XML或者JSON数据,删除人员信息json报文 Map parameter = new HashMap<>(); parameter.put("mode", "byEmployeeNo"); // 删除方式, byEmployeeNo: 按员工ID号 parameter.put("employeeNo", EmployeeNo); // 员工ID号 String deleteUserjson = ConfigFileUtil.getReqBodyFromTemplate("DeleteUserInfoParam.json", parameter); 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 = new JSONObject(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; } } return deleteUserjson; } }