前言
此功能开发是基于基础环境搭建完之后的功能代码,如果没有搭建基础环境还需看下网上的教程自己搭建一下。
实战代码
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接口成功");
}
}
}