JAVA对接海康门禁实现人员、卡的添加

前言

此功能开发是基于基础环境搭建完之后的功能代码,如果没有搭建基础环境还需看下网上的教程自己搭建一下。

实战代码

1、实体类

public class UserInfoRequest {

	//是否校验用户
	@JsonProperty("checkUser")
	private Boolean checkUser = false;

	//门权限(楼层权限),按位表示,1为有权限,空字符为无权限,从低位到高位表示对门1-N是否有权限
	@JsonProperty("doorRight")
	private String doorRight = "1";

	//工号
	@JsonProperty("employeeNo")
	private String employeeNo;

	//层号
	@JsonProperty("floorNumber")
	private Integer floorNumber = 0;

	//最大开门次数
	@JsonProperty("maxOpenDoorTime")
	private String maxOpenDoorTime = "0";

	//姓名
	@JsonProperty("name")
	private String name;

	//性别
	@JsonProperty("gender")
	private String gender;

	//开门延时
	@JsonProperty("openDelayEnabled")
	private Boolean openDelayEnabled = false;

	//密码
	@JsonProperty("password")
	private String password = "123456";

	//房间号
	@JsonProperty("roomNumber")
	private Integer roomNumber = 0;

	//用户类型 normal  普通人(主人),visitor 来宾(访客),blackList 非授权名单人
	@JsonProperty("userType")
	private String userType = "normal";

	//有效期参数
	@JsonProperty(value = "enable", defaultValue = "true")
	private Boolean enable = true;

	//开始时间
	@JsonProperty("beginTime")
	private String beginTime = "2019-08-01T17:30:08";

	//结束时间
	@JsonProperty("endTime")
	private String endTime = "2030-08-01T17:30:08";

	//门编号
	@JsonProperty("doorNo ")
	private Integer doorNo = 1;

	//计划模板编号
	@JsonProperty("planTemplateNo")
	private String planTemplateNo = "1,3,5";

	//卡号数组
	cardNos[] cardNos;

	//卡号
	String cardNo;

	//卡类型
	String cardType;

	//工号数组
	int[] iEmployeeNo;

	//工号数量
	int iNum;

	//认证类型
	// cardAndPw 刷卡+密码  card 刷卡  cardOrPw 刷卡或密码  fp 指纹  fpAndPw  指纹+密码  fpOrCard 指纹或刷卡 fpAndCard 指纹+刷卡 fpAndCardAndPw 指纹+刷卡+密码
	// faceOrFpOrCardOrPw 人脸或指纹或刷卡或密码 faceAndFp 人脸+指纹  faceAndPw 人脸+密码 faceAndCard 人脸+刷卡 face 人脸 employeeNoAndPw 工号+密码
	// fpOrPw 指纹或密码  employeeNoAndFp 工号+指纹 employeeNoAndFpAndPw 工号+指纹+密码 faceAndFpAndCard 人脸+指纹+刷卡 faceAndPwAndFp 人脸+密码+指纹 employeeNoAndFace 工号+人脸 faceOrfaceAndCard 人脸或人脸+刷卡 fpOrface 指纹或人脸
	// cardOrfaceOrPw 刷卡或人脸或密码 cardOrFace 刷卡或人脸 cardOrFaceOrFp 刷卡或人脸或指纹  faceOrPw 人脸或密码
	// employeeNoAndFaceAndPw 工号+人脸+密码 cardOrFaceOrFaceAndCard 刷卡或人脸或人脸+刷卡  desc:人员验证方式的优先级高于读卡器验证方式
	String userVerifyMode;

	//访问本地UI控制
	Boolean localUIRight = false;

	@NoArgsConstructor
	@Data
	public static class cardNos {
		//卡号
		private String cardNo;
		//卡类型
		//卡类型, subType:, [normalCard#普通卡,patrolCard#巡更卡,hijackCard#胁迫卡,superCard#超级卡,dismissingCard#解除卡,emergencyCard#应急管理卡], desc:(用于授权临时卡权限,本身不能开门)*/
		private String cardType;
	}

	//页数
	private int current;
	//每页条数
	private int size;
	//模糊查询
	private String fuzzySearch;

	/**
	 * 用户数
	 */
	private int userCount;
	//人脸url
	private String faceUrl;

	/**
	 * IP地址
	 */
	String ipadress;

	/**
	 * 用户
	 */
	String user;

	/**
	 * 密码
	 */
	String psw;

	/**
	 * 端口
	 */
	short port;

	/**
	 * 设备id
	 */
	Long deviceId;
}

 2、业务层核心代码

 用户登录手柄在Map中获取设备ip获取的,获取之后调用的添加人员及卡信息的接口

    /**
     * 添加用户
     *
     * @param request
     * @return
     */
    @Override
    public Boolean addUserInfo(UserInfoRequest request) {
        Integer lUserID = lUserIDMap.get(request.getIpadress());
        if (Objects.isNull(lUserID) || lUserID < 0) {
            //登陆设备
            UserManageService.login_V40(request.getIpadress(), request.getUser(), request.getPsw(), request.getPort());
        }
        lUserID = lUserIDMap.get(request.getIpadress());
        try {
            Boolean aBoolean = UserManageService.addUserInfo(lUserID, request);
            UserManageService.userMap.put(request.getEmployeeNo(), request.getName());
            System.out.println("添加用户返回的结果:" + aBoolean);
            if (aBoolean && request.getCardNos().length > 0) {
                UserInfoRequest.cardNos[] cardNo = request.getCardNos();
                for (UserInfoRequest.cardNos cardNos : cardNo) {
                    CardManageService.addCardInfo(lUserID, cardNos.getCardNo(), request.getEmployeeNo(),cardNos.getCardType());
                }
            }
            return aBoolean;
        } catch (UnsupportedEncodingException | InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

 人员、卡的添加方法

/**
     * 添加人员
     *
     * @param lUserID 登录句柄
     * @param request 工号
     * @return
     * @throws UnsupportedEncodingException
     * @throws InterruptedException
     * @throws JSONException
     */
    public static Boolean addUserInfo(int lUserID, UserInfoRequest request) throws UnsupportedEncodingException, InterruptedException, JSONException {
        Boolean result = false;
        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 = 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 失败,错误码为" + hCNetSDK.NET_DVR_GetLastError());
            return result;
        } else {
            System.out.println("AddUserInfo NET_DVR_StartRemoteConfig 成功!");
            //根据iCharEncodeType判断,如果iCharEncodeType返回6,则是UTF-8编码。
            //如果是0或者1或者2,则是GBK编码

            String strInBuffer1 = "{\"UserInfo\":{\"Valid\":{\"beginTime\":\"" + request.getBeginTime() + "\",\"enable\":" + request.getEnable() + ",\"endTime\":" + "\"" + request.getEndTime() + "\"}," + "\"checkUser\":\"" + request.getCheckUser() + "\",\"doorRight\":\"" + request.getDoorRight() + "\",\"RightPlan\":[{\"doorNo\": " + request.getDoorNo() + ",\"planTemplateNo\": \"" + request.getPlanTemplateNo() + "\"}]," + "\"employeeNo\":\"" + request.getEmployeeNo() + "\",\"floorNumber\":" + request.getFloorNumber() + ",\"localUIRight\":" + request.getLocalUIRight() + ",\"name\":\"" + request.getName() + "\",\"maxOpenDoorTime\":" + request.getMaxOpenDoorTime() + ",\"gender\":\"" + request.getGender() + "\",\"openDelayEnabled\":" + request.getOpenDelayEnabled() + ",\"password\":\"" + request.getPassword() + "\",\"roomNumber\":" + request.getRoomNumber() + ",\"userType\":\"" + request.getUserType() + "\"";

            if (!StringUtils.isEmpty(request.getUserVerifyMode())) {
                strInBuffer1 = strInBuffer1 + ",\"userVerifyMode\":\"" + request.getUserVerifyMode() + "\"";
            }
            //结尾
            strInBuffer1 = strInBuffer1 + "}}";
            int iStringSize = strInBuffer1.getBytes().length;
            System.out.println("长度:" + iStringSize + "参数:" + strInBuffer1.getBytes().length);

            HCNetSDK.BYTE_ARRAY ptrByte = new HCNetSDK.BYTE_ARRAY(iStringSize);
            try {
                System.arraycopy(strInBuffer1.getBytes(), 0, ptrByte.byValue, 0, strInBuffer1.getBytes().length);
            } catch (Exception e) {
                System.out.println("异常有没有:" + e);
                e.printStackTrace();
            }

            ptrByte.write();
            //添加人员入参 ptrByte
            System.out.println("添加人员入参:" + new String(ptrByte.byValue));

            HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(1024);

            IntByReference pInt = new IntByReference(0);
            while (true) {
                //分页查询所有人员信息
                //输入参数为UserInfoSearchCond(JSON报文),输出结果为UserInfoSearch(JSON报文)。
                int dwState = hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrByte.getPointer(), iStringSize, ptrOutuff.getPointer(), 1024, pInt);
                if (dwState == -1) {
                    System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + 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 (!hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)) {
                System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
            } else {
                System.out.println("NET_DVR_StopRemoteConfig接口成功");
                return true;
            }
        }
        return result;
    }

/**
	 * 下发卡号,
	 *
	 * @param userID 用户注册ID
	 * @param cardNo 卡号
	 * @throws JSONException
	 */
	public static void addCardInfo(int userID, String cardNo, String employeeNo,String cardType) 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 = 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 失败,错误码为" + hCNetSDK.NET_DVR_GetLastError());
			return;
		} else {
			System.out.println("AddCardInfo NET_DVR_StartRemoteConfig 成功!");
			HCNetSDK.BYTE_ARRAY lpInput = new HCNetSDK.BYTE_ARRAY(1024);    //数组
			//卡类型, subType:, [normalCard#普通卡,patrolCard#巡更卡,hijackCard#胁迫卡,superCard#超级卡,dismissingCard#解除卡,emergencyCard#应急管理卡], desc:(用于授权临时卡权限,本身不能开门)*/
			String strJsonData = "{\n" +
				"    \"CardInfo\" : {\n" +
				"        \"employeeNo\":\"" + employeeNo + "\", \n" +
				"        \"cardNo\":\"" + cardNo + "\", \n" +
				"        \"cardType\":\""+ cardType +"\" \n" +
				"        } \n" +
				"}";
			System.out.println(strJsonData);
			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 = 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 = new JSONObject(strResult);
				int statusCode = jsonResult.getInt("statusCode");
				String statusString = jsonResult.getString("statusString");

				if (dwState == -1) {
					System.out.println("NET_DVR_SendWith RecvRemoteConfig接口调用失败,错误码:" + 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 (!hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)) {
				System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
			} else {
				System.out.println("NET_DVR_StopRemoteConfig接口成功");
			}
		}
	}


  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
对接海康门禁添加人脸需要使用海康门禁SDK,以下是Java调用海康门禁SDK实现门禁设备添加人脸的示例代码: ```java import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.ptr.ByteByReference; import com.sun.jna.ptr.IntByReference; public class HikvisionFaceController { public interface HikvisionLibrary extends com.sun.jna.Library { HikvisionLibrary INSTANCE = (HikvisionLibrary) Native.loadLibrary("HCNetSDK", HikvisionLibrary.class); int NET_DVR_Init(); int NET_DVR_Login_V40(); int NET_DVR_Logout_V30(); int NET_DVR_GetLastError(); int NET_DVR_SetDVRConfig(); int NET_DVR_GetDVRConfig(); int NET_DVR_SendRemoteConfig(); int NET_DVR_StopRemoteConfig(); } public static void main(String[] args) { // 初始化SDK HikvisionLibrary.INSTANCE.NET_DVR_Init(); // 登录门禁 IntByReference lUserID = new IntByReference(); HikvisionLibrary.NET_DVR_DEVICEINFO_V40 struDeviceInfo = new HikvisionLibrary.NET_DVR_DEVICEINFO_V40(); lUserID.setValue(HikvisionLibrary.INSTANCE.NET_DVR_Login_V40("192.168.1.64", (short) 8000, "admin", "password", struDeviceInfo)); // 添加人脸 HikvisionLibrary.NET_DVR_XML_CONFIG_INPUT struInput = new HikvisionLibrary.NET_DVR_XML_CONFIG_INPUT(); struInput.dwSize = struInput.size(); String str = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<FaceAppendData>" + "<name>test</name>" + "<gender>1</gender>" + "<bornTime>19900101</bornTime>" + "<certificateType>111</certificateType>" + "<certificateNumber>123456789012345678</certificateNumber>" + "<certificatePicUrl>http://192.168.1.64/certificate.jpg</certificatePicUrl>" + "<facePicUrl>http://192.168.1.64/face.jpg</facePicUrl>" + "</FaceAppendData>"; byte[] byInput = str.getBytes(); struInput.lpRequestUrl = "POST /ISAPI/Intelligent/FDLib/FDSearch/AddFaceDataInFDLib?format=json".getBytes(); struInput.dwRequestUrlLen = struInput.lpRequestUrl.length; struInput.lpInBuffer = byInput; struInput.dwInBufferSize = byInput.length; struInput.write(); Pointer lpInBuffer = struInput.getPointer(); HikvisionLibrary.NET_DVR_XML_CONFIG_OUTPUT struOutput = new HikvisionLibrary.NET_DVR_XML_CONFIG_OUTPUT(); struOutput.dwSize = struOutput.size(); struOutput.lpOutBuffer = new byte[1024]; struOutput.dwOutBufferSize = struOutput.lpOutBuffer.length; struOutput.write(); Pointer lpOutBuffer = struOutput.getPointer(); boolean result = HikvisionLibrary.INSTANCE.NET_DVR_SendRemoteConfig(lUserID.getValue(), 255, HikvisionLibrary.NET_DVR_SET_FACEAPPEND_DATA, lpInBuffer, struInput.size(), lpOutBuffer, struOutput.size()); if (!result) { System.out.println("添加人脸失败,错误码:" + HikvisionLibrary.INSTANCE.NET_DVR_GetLastError()); } // 注销登录 HikvisionLibrary.INSTANCE.NET_DVR_Logout_V30(lUserID.getValue()); } } ``` 需要注意的是,代码中的IP地址、端口、用户名、密码等信息需要替换为实际的门禁设备信息。同时,需要将海康门禁SDK的库文件 HCNetSDK.dll 放置在Java工程的运行路径下。人脸信息需要按照门禁设备接口要求的XML格式进行组装,并通过海康门禁SDK的接口发送到门禁设备。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2024暴富

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值