Преглед изворни кода

海康人脸设备分时段配置

Signed-off-by: haidong <chenloveguitar@qq.com>
doorRight设置
haidong пре 2 година
родитељ
комит
7243f75a45
13 измењених фајлова са 2249 додато и 18 уклоњено
  1. +29
    -1
      pom.xml
  2. +99
    -0
      src/main/java/com/hkversion/Acs/ACSManage.java
  3. +224
    -0
      src/main/java/com/hkversion/Acs/AcsMain.java
  4. +219
    -0
      src/main/java/com/hkversion/Acs/CardManage.java
  5. +28
    -0
      src/main/java/com/hkversion/Acs/DeviceAbility.java
  6. +121
    -0
      src/main/java/com/hkversion/Acs/EventSearch.java
  7. +494
    -0
      src/main/java/com/hkversion/Acs/FaceManage.java
  8. +380
    -0
      src/main/java/com/hkversion/Acs/FingerManage.java
  9. +76
    -0
      src/main/java/com/hkversion/Acs/MutilCard.java
  10. +99
    -0
      src/main/java/com/hkversion/Acs/TransIsapi.java
  11. +462
    -0
      src/main/java/com/hkversion/Acs/UserManage.java
  12. +1
    -1
      src/main/java/com/hkversion/AlarmDataParse.java
  13. +17
    -16
      src/main/java/com/yzx/Main.java

+ 29
- 1
pom.xml Прегледај датотеку

@@ -43,18 +43,46 @@
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>
<!-- <plugin>-->
<!-- <artifactId>maven-assembly-plugin</artifactId>-->
<!-- <configuration>-->
<!-- <archive>-->
<!-- <manifest>-->
<!-- <mainClass>com.yzx.Main</mainClass>-->
<!-- </manifest>-->
<!-- </archive>-->
<!-- <descriptorRefs>-->
<!-- <descriptorRef>jar-with-dependencies</descriptorRef>-->
<!-- </descriptorRefs>-->
<!-- </configuration>-->
<!-- </plugin>-->

<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId> <artifactId>maven-assembly-plugin</artifactId>
<!--3.0.0可以报红,但是问题不大,能用-->
<!-- <version>3.0.0</version>-->
<configuration> <configuration>
<archive> <archive>
<!--指定程序运行主类-->
<manifest> <manifest>
<mainClass>com.yzx.Main</mainClass>
<mainClass>com.hkversion.Acs.AcsMain</mainClass>
</manifest> </manifest>
</archive> </archive>
<descriptorRefs> <descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef> <descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs> </descriptorRefs>
</configuration> </configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<!--这一行在idea里面可能会报红,但是没有报错,而且这句才是关键,如果去掉这一句不会生成拥有全部依赖的jar包-->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>

+ 99
- 0
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;
}
}

+ 224
- 0
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结束

+ 219
- 0
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;
}



}

+ 28
- 0
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();
}
}

+ 121
- 0
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;
}

}

+ 494
- 0
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接口成功");
}
}






}

+ 380
- 0
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="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<CaptureFingerPrintCond xmlns=\"http://www.isapi.org/ver20/XMLSchema\" version=\"2.0\">\n" +
" <fingerNo>1</fingerNo>\n" +
"</CaptureFingerPrintCond>";
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;
}
}
}
}

+ 76
- 0
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 成功");
}
}
}

+ 99
- 0
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;
}
}
}

+ 462
- 0
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成功!");
}
}
}

+ 1
- 1
src/main/java/com/hkversion/AlarmDataParse.java Прегледај датотеку

@@ -21,7 +21,7 @@ import java.util.Date;
public class AlarmDataParse { public class AlarmDataParse {


public static void alarmDataHandle(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser, AlarmCallback callback) { 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 sTime;
String MonitoringSiteID; String MonitoringSiteID;
//lCommand是传的报警类型 //lCommand是传的报警类型


+ 17
- 16
src/main/java/com/yzx/Main.java Прегледај датотеку

@@ -25,24 +25,25 @@ public class Main {
//3.如果文件上传失败,需要重试,如果失败了,先存在本地,利用数据库的id作为标识,写一个定时任务,重新更新和上传. //3.如果文件上传失败,需要重试,如果失败了,先存在本地,利用数据库的id作为标识,写一个定时任务,重新更新和上传.


new Thread(() -> { 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(); }).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{ private static class AlarmCallbackImpl implements AlarmCallback{


Loading…
Откажи
Сачувај