增加hik梯控操作

This commit is contained in:
lxj
2025-07-09 18:10:52 +08:00
parent ba9202e6ca
commit c7ff295d76
91 changed files with 12083 additions and 8 deletions

View File

@@ -1,6 +1,7 @@
package org.dromara.sis;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.dromara.sis.sdk.hik.service.SdkBaseServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
@@ -14,6 +15,8 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
@SpringBootApplication
public class SisApplication {
public static void main(String[] args) {
// 加载hik sdk
SdkBaseServer.initSdk();
SpringApplication application = new SpringApplication(SisApplication.class);
application.setApplicationStartup(new BufferingApplicationStartup(2048));
application.run(args);

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,20 @@
package org.dromara.sis.sdk.hik;
public interface HikApi {
Boolean login(String ip, short port, String user, String psw);
void getAcsStatus(String deviceIp);
Boolean controlGateway(String deviceIp, Integer floorNum, Integer cmd);
/**
* 设备登出
*
* @param deviceIp 设备ip
*/
Boolean loginOut(String deviceIp);
}

View File

@@ -0,0 +1,103 @@
package org.dromara.sis.sdk.hik;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sis.sdk.hik.service.DoorService;
import org.dromara.sis.sdk.hik.service.LoginService;
import org.dromara.sis.sdk.hik.service.SdkBaseServer;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
public class HikApiService {
private HikApiService() {
}
private static volatile HikApiService instance;
public static HikApiService getInstance() {
if (instance == null) {
synchronized (HikApiService.class) {
if (instance == null) {
instance = new HikApiService();
}
}
}
return instance;
}
/**
* 缓存设备登录句柄的map
*/
private static final ConcurrentHashMap<String, Integer> CACHE = new ConcurrentHashMap<>(16);
/**
* 执行hiksdk登录
*
* @param ip 设备ip
* @param port 设备端口
* @param user 设备账号
* @param psw 设备密码
* @return 返回会否登录成功
*/
public Boolean login(String ip, short port, String user, String psw) {
int i = LoginService.loginDevice(ip, port, user, psw);
boolean result = (i != SdkBaseServer.LOGIN_FAIL_CODE);
if (result) {
CACHE.put(ip, i);
}
return result;
}
/**
* 获取梯控主机工作状态
*
* @param deviceIp 设备ip
*/
public void getAcsStatus(String deviceIp) {
// 获取登录句柄
Integer lHandel = CACHE.get(deviceIp);
if (lHandel == null) {
log.error("设备[{}]不在线, 无法登出。", deviceIp);
return;
}
return;
}
/**
* 远程梯控
*
* @param deviceIp 设备ip
* @param floorNum 电梯层数编号 从1开始,-1代表所有
* @param cmd 控制指令
* 0- 关闭(对于梯控,表示受控),
* 1- 打开(对于梯控,表示开门),
* 2- 常开(对于梯控,表示自由、通道状态),
* 3- 常关(对于梯控,表示禁用),
* 4- 恢复(梯控,普通状态),
* 5- 访客呼梯(梯控),
* 6- 住户呼梯(梯控)
*/
public Boolean controlGateway(String deviceIp, Integer floorNum, Integer cmd) {
// 获取登录句柄
Integer lHandel = CACHE.get(deviceIp);
if (lHandel == null) {
log.error("设备[{}]不在线, 无法进行梯控操作。", deviceIp);
return false;
}
return DoorService.controlGateway(lHandel, floorNum, cmd);
}
public Boolean loginOut(String deviceIp) {
Integer lHandel = CACHE.get(deviceIp);
if (lHandel == null) {
log.error("设备[{}]不在线, 无法登出。", deviceIp);
return true;
}
boolean logout = LoginService.logout(lHandel);
if (logout) {
CACHE.remove(deviceIp);
}
return logout;
}
}

View File

@@ -0,0 +1,29 @@
package org.dromara.sis.sdk.hik.calback;
import com.alibaba.fastjson2.JSON;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sis.sdk.hik.HCNetSDK;
import org.springframework.stereotype.Component;
/**
* 设备状态信息的回调
* 设备巡查回调
*
* @author xukai
*/
@Slf4j
@Component
public class HikDevWorkStateCallBack implements HCNetSDK.DEV_WORK_STATE_CB {
@Override
public boolean invoke(Pointer pUserdata, int iUserID, HCNetSDK.NET_DVR_WORKSTATE_V40 lpWorkState) {
if (lpWorkState == null) {
log.info("lpWorkState为null");
return false;
}
lpWorkState.read();
log.info(JSON.toJSONString(lpWorkState));
return true;
}
}

View File

@@ -0,0 +1,57 @@
package org.dromara.sis.sdk.hik.common;
/**
* @Author: jiangxin14
* @Date: 2024-08-09 14:13
*/
public enum ErrorCode {
NET_ERR_TIME_OVERLAP(1900, "时间段重叠"),
NET_ERR_HOLIDAY_PLAN_OVERLAP(1901, "假日计划重叠"),
NET_ERR_CARDNO_NOT_SORT(1902, "卡号未排序"),
NET_ERR_CARDNO_NOT_EXIST(1903, "卡号不存在"),
NET_ERR_ILLEGAL_CARDNO(1904, "卡号错误"),
NET_ERR_ZONE_ALARM(1905, "防区处于布防状态(参数修改不允许)"),
NET_ERR_NOT_SUPPORT_ONE_MORE_CARD ( 1920,"不支持一人多卡"),
NET_ERR_DELETE_NO_EXISTENCE_FACE(1921,"删除的人脸不存在"),
NET_ERR_OFFLINE_CAPTURING(1929, "离线采集中,无法响应"),
NET_DVR_ERR_OUTDOOR_COMMUNICATION(1950, "与门口机通信异常"),
NET_DVR_ERR_ROOMNO_UNDEFINED(1951, "未设置房间号"),
NET_DVR_ERR_NO_CALLING(1952, "无呼叫"),
NET_DVR_ERR_RINGING(1953, "响铃"),
NET_DVR_ERR_IS_CALLING_NOW(1954, "正在通话"),
NET_DVR_ERR_LOCK_PASSWORD_WRONG(1955, "智能锁密码错误"),
NET_DVR_ERR_CONTROL_LOCK_FAILURE(1956, "开关锁失败"),
NET_DVR_ERR_CONTROL_LOCK_OVERTIME(1957, "开关锁超时"),
NET_DVR_ERR_LOCK_DEVICE_BUSY(1958, "智能锁设备繁忙"),
NET_DVR_ERR_UNOPEN_REMOTE_LOCK_FUNCTION(1959, "远程开锁功能未打开");
private final int code;
private final String description;
ErrorCode(int code, String description) {
this.code = code;
this.description = description;
}
public int getCode() {
return code;
}
public String getDescription() {
return description;
}
// 根据错误码获取描述的方法
public static String getDescription(int code) {
for (ErrorCode errorCode : ErrorCode.values()) {
if (errorCode.getCode() == code) {
return errorCode.getDescription();
}
}
return "未知错误码";
}
}

View File

@@ -0,0 +1,12 @@
package org.dromara.sis.sdk.hik.common;
public class osSelect {
public static boolean isLinux() {
return System.getProperty("os.name").toLowerCase().contains("linux");
}
public static boolean isWindows() {
return System.getProperty("os.name").toLowerCase().contains("windows");
}
}

View File

@@ -0,0 +1,83 @@
package org.dromara.sis.sdk.hik.service;
import com.alibaba.fastjson2.JSONObject;
import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sis.sdk.hik.HCNetSDK;
/**
* 门禁设备管理:
* 1、获取设置门禁主机参数
* 2、获取门禁主机工作状态
*/
@Slf4j
public class AcsService extends SdkBaseServer {
/**
* 获取(设置)门禁主机参数
*
* @param lUserID 用户登录句柄
*/
public static boolean 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 = getHcNetSDK().NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_ACS_CFG, 0xFFFFFFFF, struAcsCfg.getPointer(),
struAcsCfg.size(), intByReference);
if (!b_GetAcsCfg) {
log.info("获取门禁主机参数失败,错误码={}", getHcNetSDK().NET_DVR_GetLastError());
return false;
} else {
struAcsCfg.read();
log.info("获取门禁主机参数成功,result={}", JSONObject.toJSONString(struAcsCfg));
}
/**设置门禁主机参数*/
struAcsCfg.byShowCardNo = 1; //开启显示卡号
struAcsCfg.byVoicePrompt = 0; //关闭语音提示
struAcsCfg.byUploadCapPic = 1; //开启联动抓图后,设备上抓拍的图片才会通过报警布防上传,否则没有不上传
struAcsCfg.byShowCapPic = 1;
struAcsCfg.write();
boolean b_SetAcsCfg = getHcNetSDK().NET_DVR_SetDVRConfig(lUserID, HCNetSDK.NET_DVR_SET_ACS_CFG, 0xFFFFFFFF, struAcsCfg.getPointer(), struAcsCfg.size());
if (!b_SetAcsCfg) {
log.info("设置门禁主机参数,错误码为:{}", getHcNetSDK().NET_DVR_GetLastError());
}
return b_SetAcsCfg;
}
/**
* 获取梯控主机工作状态
* 梯控楼层状态
*
* @param lUserID 用户登录句柄
*/
public static HCNetSDK.NET_DVR_ACS_WORK_STATUS_V50 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 = getHcNetSDK().NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_ACS_WORK_STATUS_V50, 0xFFFFFFFF,
netDvrAcsWorkStatusV50.getPointer(), netDvrAcsWorkStatusV50.size(), intByReference);
if (!b_GetAcsStatus) {
log.info("获取梯控主机工作状态,错误码为:{}", getHcNetSDK().NET_DVR_GetLastError());
return null;
} else {
log.info("获取梯控主机工作状态成功!!!");
netDvrAcsWorkStatusV50.read();
// for (int i = 0; i < 128; i++) {
// int floor = i + 1;
// log.info("楼层" + floor + " 继电器开合状态:" + netDvrAcsWorkStatusV50.byDoorLockStatus[i] + "\n"); //门锁状态0- 正常关1- 正常开2- 短路报警3- 断路报警4- 异常报警
// log.info("楼层" + floor + " 梯控状态:" + netDvrAcsWorkStatusV50.byDoorStatus[i] + "\n"); //门状态或者梯控的楼层状态1- 休眠2- 常开状态对于梯控表示自由状态3- 常闭状态对于梯控表示禁用状态4- 普通状态(对于梯控,表示受控状态)
// }
// log.info("3.门磁状态:" + netDvrAcsWorkStatusV50.byMagneticStatus[0] + "\n"); //门磁状态0-正常关1-正常开2-短路报警3-断路报警4-异常报警
// log.info("4.事件报警输入状态:" + netDvrAcsWorkStatusV50.byCaseStatus[0] + "\n"); //事件报警输入状态0- 无输入1- 有输入
log.info(JSONObject.toJSONString(netDvrAcsWorkStatusV50));
return netDvrAcsWorkStatusV50;
}
}
}

View File

@@ -0,0 +1,642 @@
package org.dromara.sis.sdk.hik.service;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sis.sdk.hik.HCNetSDK;
import org.dromara.sis.sdk.hik.common.ErrorCode;
import java.io.UnsupportedEncodingException;
/**
* @create 2021-03-12-13:53
* 以卡为中心,先下发卡参数(可以一起下发工号),再根据卡号下发人脸、指纹等参数
* 卡管理模块,实现功能:卡下发、卡获取(单张、所有)、卡删除(单张、所有)、卡计划模块设置
*/
@Slf4j
public class CardService extends SdkBaseServer {
public static short iPlanTemplateNumber;
//设备字符集
/**
* 卡下发
*
* @param lUserID 用户登录句柄
* @param CardNo 卡号
* @param iPlanTemplateNumber 关联门计划模板,计划模板的配置可以参考卡计划模板配置模块,(下发卡前要设置好计划模板)
* @throws UnsupportedEncodingException
* @throws InterruptedException
*/
public static void setOneCard(int lUserID, String CardNo, short iPlanTemplateNumber) throws UnsupportedEncodingException, InterruptedException {
HCNetSDK.NET_DVR_CARD_COND struCardCond = new HCNetSDK.NET_DVR_CARD_COND();
struCardCond.read();
struCardCond.dwSize = struCardCond.size();
struCardCond.dwCardNum = 1; //下发一张
struCardCond.write();
Pointer ptrStruCond = struCardCond.getPointer();
int m_lSetCardCfgHandle = getHcNetSDK().NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_SET_CARD, ptrStruCond, struCardCond.size(), null, null);
if (m_lSetCardCfgHandle == -1) {
System.out.println("建立下发卡长连接失败,错误码为" + getHcNetSDK().NET_DVR_GetLastError());
return;
} else {
System.out.println("建立下发卡长连接成功!");
}
HCNetSDK.NET_DVR_CARD_RECORD struCardRecord = new HCNetSDK.NET_DVR_CARD_RECORD();
struCardRecord.read();
struCardRecord.dwSize = struCardRecord.size();
for (int i = 0; i < HCNetSDK.ACS_CARD_NO_LEN; i++) {
struCardRecord.byCardNo[i] = 0;
}
for (int i = 0; i < CardNo.length(); i++) {
struCardRecord.byCardNo[i] = CardNo.getBytes()[i];
}
struCardRecord.byCardType = 1; //普通卡
struCardRecord.byLeaderCard = 0; //是否为首卡0-否1-是
struCardRecord.byUserType = 0; //用户类型0 普通用户1- 管理员用户
//门权限(梯控的楼层权限、锁权限),数组下标对应门编号-1值为1表示有权限0表示无权限
struCardRecord.byDoorRight[0] = 1; //1层有权限
struCardRecord.byDoorRight[1] = 1; //2层有权限
struCardRecord.wCardRightPlan[0] = iPlanTemplateNumber; //关联门计划模板,计划模板的配置可以参考卡计划模板配置模块,(下发卡前要设置好计划模板)
struCardRecord.struValid.byEnable = 1; //卡有效期使能下面是卡有效期从2000-1-1 11:11:11到2030-1-1 11:11:11
struCardRecord.struValid.byBeginTimeFlag = 1;
struCardRecord.struValid.byEnableTimeFlag = 1;
struCardRecord.struValid.struBeginTime.wYear = 2023;
struCardRecord.struValid.struBeginTime.byMonth = 1;
struCardRecord.struValid.struBeginTime.byDay = 1;
struCardRecord.struValid.struBeginTime.byHour = 0;
struCardRecord.struValid.struBeginTime.byMinute = 0;
struCardRecord.struValid.struBeginTime.bySecond = 0;
struCardRecord.struValid.struEndTime.wYear = 2030;
struCardRecord.struValid.struEndTime.byMonth = 12;
struCardRecord.struValid.struEndTime.byDay = 30;
struCardRecord.struValid.struEndTime.byHour = 23;
struCardRecord.struValid.struEndTime.byMinute = 59;
struCardRecord.struValid.struEndTime.bySecond = 59;
struCardRecord.write();
HCNetSDK.NET_DVR_CARD_STATUS struCardStatus = new HCNetSDK.NET_DVR_CARD_STATUS();
struCardStatus.read();
struCardStatus.dwSize = struCardStatus.size();
struCardStatus.write();
IntByReference pInt = new IntByReference(0);
while (true) {
int dwState = getHcNetSDK().NET_DVR_SendWithRecvRemoteConfig(m_lSetCardCfgHandle, struCardRecord.getPointer(), struCardRecord.size(), struCardStatus.getPointer(), struCardStatus.size(), pInt);
struCardStatus.read();
if (dwState == -1) {
System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败错误码" + getHcNetSDK().NET_DVR_GetLastError());
break;
} else 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("下发卡失败, 卡号: " + new String(struCardStatus.byCardNo).trim() + ", 错误信息:" + ErrorCode.getDescription(struCardStatus.dwErrorCode));
break;
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
System.out.println("下发卡异常, 卡号: " + new String(struCardStatus.byCardNo).trim() + ", 错误信息:" + ErrorCode.getDescription(struCardStatus.dwErrorCode));
break;
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
if (struCardStatus.dwErrorCode != 0) {
System.out.println("下发卡成功,但是错误码信息: " + ErrorCode.getDescription(struCardStatus.dwErrorCode) + ", 卡号:" + new String(struCardStatus.byCardNo).trim());
} else {
System.out.println("下发卡成功, 卡号: " + new String(struCardStatus.byCardNo).trim() + ", 状态:" + struCardStatus.byStatus);
}
continue;
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
System.out.println("下发卡完成");
break;
}
}
if (!getHcNetSDK().NET_DVR_StopRemoteConfig(m_lSetCardCfgHandle)) {
System.out.println("NET_DVR_StopRemoteConfig接口调用失败错误码" + getHcNetSDK().NET_DVR_GetLastError());
} else {
System.out.println("NET_DVR_StopRemoteConfig接口成功\n");
}
}
/**
* 批量卡号下发
*
* @param lUserID 用户登录句柄
* @param CardNo 卡号
* @param iEmployeeNo 工号
* @param iNum 下发张数
* @throws UnsupportedEncodingException
* @throws InterruptedException
*/
public static void setMultiCard(int lUserID, String[] CardNo, int[] iEmployeeNo, int iNum) throws UnsupportedEncodingException, InterruptedException {
HCNetSDK.NET_DVR_CARD_COND struCardCond = new HCNetSDK.NET_DVR_CARD_COND();
struCardCond.read();
struCardCond.dwSize = struCardCond.size();
struCardCond.dwCardNum = iNum; //下发张数
struCardCond.write();
Pointer ptrStruCond = struCardCond.getPointer();
int m_lSetMultiCardCfgHandle = getHcNetSDK().NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_SET_CARD, ptrStruCond, struCardCond.size(), null, null);
if (m_lSetMultiCardCfgHandle == -1) {
System.out.println("建立下发卡长连接失败,错误码为" + getHcNetSDK().NET_DVR_GetLastError());
return;
} else {
System.out.println("建立下发卡长连接成功!");
}
HCNetSDK.NET_DVR_CARD_RECORD[] struCardRecord = (HCNetSDK.NET_DVR_CARD_RECORD[]) new HCNetSDK.NET_DVR_CARD_RECORD().toArray(iNum);
HCNetSDK.NET_DVR_CARD_STATUS struCardStatus = new HCNetSDK.NET_DVR_CARD_STATUS();
struCardStatus.read();
struCardStatus.dwSize = struCardStatus.size();
struCardStatus.write();
IntByReference pInt = new IntByReference(0);
for (int i = 0; i < iNum; i++) {
struCardRecord[i].read();
struCardRecord[i].dwSize = struCardRecord[i].size();
for (int j = 0; j < HCNetSDK.ACS_CARD_NO_LEN; j++) {
struCardRecord[i].byCardNo[j] = 0;
}
System.arraycopy(CardNo[i].getBytes(), 0, struCardRecord[i].byCardNo, 0, CardNo[i].getBytes().length);
struCardRecord[i].byCardType = 1; //普通卡
struCardRecord[i].byLeaderCard = 0; //是否为首卡0-否1-是
struCardRecord[i].byUserType = 0;
struCardRecord[i].byDoorRight[0] = 1; //门1有权限
struCardRecord[i].wCardRightPlan[0] = iPlanTemplateNumber;//关联门计划模板,使用了前面配置的计划模板
struCardRecord[i].struValid.byEnable = 1; //卡有效期使能下面是卡有效期从2000-1-1 11:11:11到2030-1-1 11:11:11
struCardRecord[i].struValid.struBeginTime.wYear = 2000;
struCardRecord[i].struValid.struBeginTime.byMonth = 1;
struCardRecord[i].struValid.struBeginTime.byDay = 1;
struCardRecord[i].struValid.struBeginTime.byHour = 11;
struCardRecord[i].struValid.struBeginTime.byMinute = 11;
struCardRecord[i].struValid.struBeginTime.bySecond = 11;
struCardRecord[i].struValid.struEndTime.wYear = 2030;
struCardRecord[i].struValid.struEndTime.byMonth = 1;
struCardRecord[i].struValid.struEndTime.byDay = 1;
struCardRecord[i].struValid.struEndTime.byHour = 11;
struCardRecord[i].struValid.struEndTime.byMinute = 11;
struCardRecord[i].struValid.struEndTime.bySecond = 11;
struCardRecord[i].dwEmployeeNo = iEmployeeNo[i]; //工号
if ((iCharEncodeType == 0) || (iCharEncodeType == 1) || (iCharEncodeType == 2)) {
byte[] strCardName = "张三".getBytes("GBK"); //姓名
for (int j = 0; j < HCNetSDK.NAME_LEN; j++) {
struCardRecord[i].byName[j] = 0;
}
System.arraycopy(strCardName, 0, struCardRecord[i].byName, 0, strCardName.length);
}
if (iCharEncodeType == 6) {
byte[] strCardName = "张三".getBytes("UTF-8"); //姓名
for (int j = 0; j < HCNetSDK.NAME_LEN; j++) {
struCardRecord[i].byName[j] = 0;
}
System.arraycopy(strCardName, 0, struCardRecord[i].byName, 0, strCardName.length);
}
struCardRecord[i].write();
int dwState = getHcNetSDK().NET_DVR_SendWithRecvRemoteConfig(m_lSetMultiCardCfgHandle, struCardRecord[i].getPointer(), struCardRecord[i].size(), struCardStatus.getPointer(), struCardStatus.size(), pInt);
struCardStatus.read();
if (dwState == -1) {
System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败错误码" + getHcNetSDK().NET_DVR_GetLastError());
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) {
System.out.println("下发卡失败, 卡号: " + new String(struCardStatus.byCardNo).trim() + ", 错误码信息:" + ErrorCode.getDescription(struCardStatus.dwErrorCode));
//可以继续下发下一个
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
System.out.println("下发卡异常, 卡号: " + new String(struCardStatus.byCardNo).trim() + ",错误码信息:" + ErrorCode.getDescription(struCardStatus.dwErrorCode));
//异常是长连接异常,不能继续下发后面的数据,需要重新建立长连接
break;
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
if (struCardStatus.dwErrorCode != 0) {
System.out.println("下发卡失败,错误码信息:" + ErrorCode.getDescription(struCardStatus.dwErrorCode) + ", 卡号:" + new String(struCardStatus.byCardNo).trim());
} else {
System.out.println("下发卡成功, 卡号: " + new String(struCardStatus.byCardNo).trim() + ", 状态:" + struCardStatus.byStatus);
}
//可以继续下发下一个
} else {
System.out.println("其他状态:" + dwState);
}
}
if (!getHcNetSDK().NET_DVR_StopRemoteConfig(m_lSetMultiCardCfgHandle)) {
System.out.println("NET_DVR_StopRemoteConfig接口调用失败错误码" + getHcNetSDK().NET_DVR_GetLastError());
} else {
System.out.println("NET_DVR_StopRemoteConfig接口成功\n");
}
}
/**
* 获取(查询)一张卡
*
* @param lUserID 用户登录句柄
* @param CardNo 卡号
*/
public static void getOneCard(int lUserID, String CardNo) {
HCNetSDK.NET_DVR_CARD_COND struCardCond = new HCNetSDK.NET_DVR_CARD_COND();
struCardCond.read();
struCardCond.dwSize = struCardCond.size();
struCardCond.dwCardNum = 1; //查询一个卡参数
struCardCond.write();
Pointer ptrStruCond = struCardCond.getPointer();
int m_lGetCardCfgHandle = getHcNetSDK().NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_GET_CARD, ptrStruCond, struCardCond.size(), null, null);
if (m_lGetCardCfgHandle == -1) {
System.out.println("建立查询卡参数长连接失败,错误码为:" + getHcNetSDK().NET_DVR_GetLastError());
return;
} else {
System.out.println("建立查询卡参数长连接成功!");
}
//查找指定卡号的参数,需要下发查找的卡号条件
HCNetSDK.NET_DVR_CARD_SEND_DATA struCardNo = new HCNetSDK.NET_DVR_CARD_SEND_DATA();
struCardNo.read();
struCardNo.dwSize = struCardNo.size();
for (int i = 0; i < HCNetSDK.ACS_CARD_NO_LEN; i++) {
struCardNo.byCardNo[i] = 0;
}
for (int i = 0; i < CardNo.length(); i++) {
struCardNo.byCardNo[i] = CardNo.getBytes()[i];
}
struCardNo.write();
HCNetSDK.NET_DVR_CARD_RECORD struCardRecord = new HCNetSDK.NET_DVR_CARD_RECORD();
struCardRecord.read();
IntByReference pInt = new IntByReference(0);
while (true) {
int dwState = getHcNetSDK().NET_DVR_SendWithRecvRemoteConfig(m_lGetCardCfgHandle, struCardNo.getPointer(), struCardNo.size(),
struCardRecord.getPointer(), struCardRecord.size(), pInt);
struCardRecord.read();
if (dwState == -1) {
System.out.println("NET_DVR_SendWithRecvRemoteConfig查询卡参数调用失败错误码" + getHcNetSDK().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("获取卡参数失败, 卡号: " + CardNo);
break;
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
System.out.println("获取卡参数异常, 卡号: " + CardNo);
break;
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
try {
String strName = "";
if ((iCharEncodeType == 0) || (iCharEncodeType == 1) || (iCharEncodeType == 2)) {
strName = new String(struCardRecord.byName, "GBK").trim();
}
if (iCharEncodeType == 6) {
strName = new String(struCardRecord.byName, "UTF-8").trim();
}
//获取的卡信息打印
System.out.println("获取卡参数成功, 卡号: " + new String(struCardRecord.byCardNo).trim()
+ ", 卡类型:" + struCardRecord.byCardType
+ ", 姓名:" + strName + ",卡计划模板:" + Short.parseShort(String.valueOf(struCardRecord.wCardRightPlan[0])));
System.out.println("是否限制起始时间的标志byBeginTimeFlag :" + struCardRecord.struValid.byEnableTimeFlag);
System.out.println("是否限制终止时间的标志byEnableTimeFlag :" + struCardRecord.struValid.byBeginTimeFlag);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
System.out.println("获取卡参数完成");
break;
}
}
if (!getHcNetSDK().NET_DVR_StopRemoteConfig(m_lGetCardCfgHandle)) {
System.out.println("NET_DVR_StopRemoteConfig接口调用失败错误码" + getHcNetSDK().NET_DVR_GetLastError());
} else {
System.out.println("NET_DVR_StopRemoteConfig接口成功\n");
}
}
/**
* 获取所有卡
*
* @param lUserID 用户登录句柄
*/
public static void getAllCard(int lUserID) {
HCNetSDK.NET_DVR_CARD_COND struCardCond = new HCNetSDK.NET_DVR_CARD_COND();
struCardCond.read();
struCardCond.dwSize = struCardCond.size();
struCardCond.dwCardNum = 0xffffffff; //查询所有卡
struCardCond.write();
Pointer ptrStruCond = struCardCond.getPointer();
int m_lGetAllCardCfgHandle = getHcNetSDK().NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_GET_CARD, ptrStruCond, struCardCond.size(), null, null);
if (m_lGetAllCardCfgHandle == -1) {
System.out.println("建立查询卡长连接失败,错误码为" + getHcNetSDK().NET_DVR_GetLastError());
return;
} else {
System.out.println("建立查询卡长连接成功!");
}
HCNetSDK.NET_DVR_CARD_RECORD struCardRecord = new HCNetSDK.NET_DVR_CARD_RECORD();
struCardRecord.read();
struCardRecord.dwSize = struCardRecord.size();
struCardRecord.write();
IntByReference pInt = new IntByReference(0);
while (true) {
int dwState = getHcNetSDK().NET_DVR_GetNextRemoteConfig(m_lGetAllCardCfgHandle, struCardRecord.getPointer(), struCardRecord.size());
struCardRecord.read();
if (dwState == -1) {
System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败错误码" + getHcNetSDK().NET_DVR_GetLastError());
break;
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_NEED_WAIT) {
System.out.println("配置等待");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
continue;
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FAILED) {
System.out.println("获取卡参数失败");
break;
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
System.out.println("获取卡参数异常");
break;
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
try {
String strName = "";
if ((iCharEncodeType == 0) || (iCharEncodeType == 1) || (iCharEncodeType == 2)) {
strName = new String(struCardRecord.byName, "GBK").trim();
}
if (iCharEncodeType == 6) {
strName = new String(struCardRecord.byName, "UTF-8").trim();
}
//获取的卡信息打印
System.out.println("获取卡参数成功, 卡号: " + new String(struCardRecord.byCardNo).trim()
+ ", 卡类型:" + struCardRecord.byCardType
+ ", 姓名:" + strName);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
System.out.println("获取卡参数完成");
break;
}
}
if (!getHcNetSDK().NET_DVR_StopRemoteConfig(m_lGetAllCardCfgHandle)) {
System.out.println("NET_DVR_StopRemoteConfig接口调用失败错误码" + getHcNetSDK().NET_DVR_GetLastError());
} else {
System.out.println("NET_DVR_StopRemoteConfig接口成功\n");
}
}
/**
* 删除单张卡(删除单张卡号之前要先删除这张卡关联的人脸和指纹信息)
*
* @param lUserID 用户登录句柄
* @param CardNo 卡号
* @throws UnsupportedEncodingException
* @throws InterruptedException
*/
public static void delOneCard(int lUserID, String CardNo) throws UnsupportedEncodingException, InterruptedException {
HCNetSDK.NET_DVR_CARD_COND struCardCond = new HCNetSDK.NET_DVR_CARD_COND();
struCardCond.read();
struCardCond.dwSize = struCardCond.size();
struCardCond.dwCardNum = 1; //删除一张卡号
struCardCond.write();
Pointer ptrStruCond = struCardCond.getPointer();
int m_lDelCardCfgHandle = getHcNetSDK().NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_DEL_CARD, ptrStruCond, struCardCond.size(), null, null);
if (m_lDelCardCfgHandle == -1) {
System.out.println("建立删除卡长连接失败,错误码为" + getHcNetSDK().NET_DVR_GetLastError());
return;
} else {
System.out.println("建立删除卡长连接成功!");
}
HCNetSDK.NET_DVR_CARD_SEND_DATA struCardData = new HCNetSDK.NET_DVR_CARD_SEND_DATA();
struCardData.read();
struCardData.dwSize = struCardData.size();
for (int i = 0; i < HCNetSDK.ACS_CARD_NO_LEN; i++) {
struCardData.byCardNo[i] = 0;
}
for (int i = 0; i < CardNo.length(); i++) {
struCardData.byCardNo[i] = CardNo.getBytes()[i];
}
struCardData.write();
HCNetSDK.NET_DVR_CARD_STATUS struCardStatus = new HCNetSDK.NET_DVR_CARD_STATUS();
struCardStatus.read();
struCardStatus.dwSize = struCardStatus.size();
struCardStatus.write();
IntByReference pInt = new IntByReference(0);
while (true) {
int dwState = getHcNetSDK().NET_DVR_SendWithRecvRemoteConfig(m_lDelCardCfgHandle, struCardData.getPointer(), struCardData.size(), struCardStatus.getPointer(), struCardStatus.size(), pInt);
struCardStatus.read();
if (dwState == -1) {
System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败错误码" + getHcNetSDK().NET_DVR_GetLastError());
break;
} else 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("删除卡失败, 卡号: " + new String(struCardStatus.byCardNo).trim() + ",错误码信息:" + ErrorCode.getDescription(struCardStatus.dwErrorCode));
break;
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
System.out.println("删除卡异常, 卡号: " + new String(struCardStatus.byCardNo).trim() + ", 错误码信息:" + ErrorCode.getDescription(struCardStatus.dwErrorCode));
break;
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
if (struCardStatus.dwErrorCode != 0) {
System.out.println("删除卡成功,但是错误码信息:" + ErrorCode.getDescription(struCardStatus.dwErrorCode) + ", 卡号:" + new String(struCardStatus.byCardNo).trim());
} else {
System.out.println("删除卡成功, 卡号: " + new String(struCardStatus.byCardNo).trim() + ", 状态:" + struCardStatus.byStatus);
}
} else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
System.out.println("删除卡完成");
break;
}
}
if (!getHcNetSDK().NET_DVR_StopRemoteConfig(m_lDelCardCfgHandle)) {
System.out.println("NET_DVR_StopRemoteConfig接口调用失败错误码" + getHcNetSDK().NET_DVR_GetLastError());
} else {
System.out.println("NET_DVR_StopRemoteConfig接口成功\n");
}
}
/**
* 设备中要清除所有已经下发的卡号
*
* @param lUserID 用户登录句柄
*/
public static void cleanCardInfo(int lUserID) {
//清空所有卡号
HCNetSDK.NET_DVR_ACS_PARAM_TYPE struAcsPapamType = new HCNetSDK.NET_DVR_ACS_PARAM_TYPE();
struAcsPapamType.read();
struAcsPapamType.dwSize = struAcsPapamType.size();
struAcsPapamType.dwParamType = HCNetSDK.ACS_PARAM_CARD; //清空卡参数
struAcsPapamType.wLocalControllerID = 0; // 就地控制器序号[1,255],0代表门禁主机
struAcsPapamType.write();
boolean b_AcsCard = getHcNetSDK().NET_DVR_RemoteControl(lUserID, HCNetSDK.NET_DVR_CLEAR_ACS_PARAM, struAcsPapamType.getPointer(), struAcsPapamType.size());
if (!b_AcsCard) {
System.out.println("清空卡号错误,错误码为" + getHcNetSDK().NET_DVR_GetLastError());
return;
} else {
System.out.println("清空卡号成功");
}
}
/**
* 卡计划模板配置
*
* @param lUserID 用户登录句柄
* @param iPlanTemplateNumber 计划模板编号从1开始最大值从门禁能力集获取
*/
public static void setCardTemplate(int lUserID, 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) {
e.printStackTrace();
}
struPlanTemCfg.write();
IntByReference pInt = new IntByReference(0);
Pointer lpStatusList = pInt.getPointer();
boolean b = getHcNetSDK().NET_DVR_SetDeviceConfig(
lUserID,
HCNetSDK.NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50,
1,
struPlanCond.getPointer(),
struPlanCond.size(),
lpStatusList,
struPlanTemCfg.getPointer(),
struPlanTemCfg.size()
);
if (!b) {
System.out.println("NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50失败错误号" + getHcNetSDK().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();
boolean b2 = getHcNetSDK().NET_DVR_GetDeviceConfig(lUserID, HCNetSDK.NET_DVR_GET_CARD_RIGHT_WEEK_PLAN_V50, 1, lpCond, struWeekPlanCond.size(), lpStatusList, lpInbuferCfg, struWeekPlanCfg.size());
if (!b2) {
System.out.println("NET_DVR_GET_CARD_RIGHT_WEEK_PLAN_V50失败错误号" + getHcNetSDK().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 = 14;
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 = 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 = 0;
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 = 11;
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byMinute = 59;
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.bySecond = 59;
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].byEnable = 1;
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.byHour = 13;
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.byMinute = 30;
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.bySecond = 0;
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.byHour = 19;
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.byMinute = 59;
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.bySecond = 59;
}*/
struWeekPlanCfg.write();
//设置卡权限周计划参数
boolean b1 = getHcNetSDK().NET_DVR_SetDeviceConfig(lUserID, HCNetSDK.NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50, 1, lpCond, struWeekPlanCond.size(), lpStatusList, lpInbuferCfg, struWeekPlanCfg.size());
if (!b1) {
System.out.println("NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50失败错误号" + getHcNetSDK().NET_DVR_GetLastError());
} else {
System.out.println("NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50成功");
}
}
/**
* 获取/设置事件卡号联动配置参数
*
* @param userID 登录设备句柄ID
*/
public static void SetEventCardLingageCfg(int userID) {
HCNetSDK.NET_DVR_EVENT_CARD_LINKAGE_COND struEventCardLinkCond = new HCNetSDK.NET_DVR_EVENT_CARD_LINKAGE_COND();
struEventCardLinkCond.dwSize = struEventCardLinkCond.size();
struEventCardLinkCond.dwEventID = 1;
struEventCardLinkCond.wLocalControllerID = 0;
struEventCardLinkCond.write();
HCNetSDK.NET_DVR_EVENT_LINKAGE_CARD_CFG_V51 netDvrEventCardLinkageCfgV51 = new HCNetSDK.NET_DVR_EVENT_LINKAGE_CARD_CFG_V51();
netDvrEventCardLinkageCfgV51.read();
netDvrEventCardLinkageCfgV51.dwSize = netDvrEventCardLinkageCfgV51.size();
netDvrEventCardLinkageCfgV51.write();
Pointer lpCond1 = struEventCardLinkCond.getPointer();
Pointer lpInbuferCfg1 = netDvrEventCardLinkageCfgV51.getPointer();
IntByReference intByReference = new IntByReference(0);
Pointer lpStatusList1 = intByReference.getPointer();
boolean b_GetCfg = getHcNetSDK().NET_DVR_GetDeviceConfig(userID, HCNetSDK.NET_DVR_GET_EVENT_CARD_LINKAGE_CFG_V51, 1,
lpCond1, struEventCardLinkCond.size(), lpStatusList1, lpInbuferCfg1, netDvrEventCardLinkageCfgV51.size());
if (b_GetCfg) {
System.out.println("获取事件/卡号联动配置参数成功");
netDvrEventCardLinkageCfgV51.uLinkageInfo.setType(HCNetSDK.NET_DVR_EVENT_LINKAGE_INFO.class);
netDvrEventCardLinkageCfgV51.read();
System.out.printf("是否联动抓拍: %d\n", netDvrEventCardLinkageCfgV51.byCapturePic);
System.out.printf("事件源 ID: %d\n", netDvrEventCardLinkageCfgV51.dwEventSourceID);
System.out.printf("事件联动参数-事件主类型: %s\n", netDvrEventCardLinkageCfgV51.uLinkageInfo.struEventLinkage.wMainEventType);
System.out.printf("事件联动参数-事件次类型: %s\n", netDvrEventCardLinkageCfgV51.uLinkageInfo.struEventLinkage.wSubEventType);
} else {
System.out.println("获取事件/卡号联动配置参数失败,错误码为 " + getHcNetSDK().NET_DVR_GetLastError());
return;
}
netDvrEventCardLinkageCfgV51.dwEventSourceID = 1;
netDvrEventCardLinkageCfgV51.byProMode = 0;
netDvrEventCardLinkageCfgV51.byCapturePic = 1;//联动抓图
netDvrEventCardLinkageCfgV51.byRecordVideo = 0;
netDvrEventCardLinkageCfgV51.byMainDevStopBuzzer = 0;
netDvrEventCardLinkageCfgV51.wAudioDisplayID = 0;
netDvrEventCardLinkageCfgV51.byAudioDisplayMode = 0;
netDvrEventCardLinkageCfgV51.uLinkageInfo.struEventLinkage.wMainEventType = 3;//事件主类型0-设备事件1-报警输入事件2-门事件3-读卡器事件
netDvrEventCardLinkageCfgV51.uLinkageInfo.struEventLinkage.wSubEventType = 25;//EVENT_ACS_FINGERPRINT_PASSWD_VERIFY_PASS;
struEventCardLinkCond.dwEventID = 1;
struEventCardLinkCond.wLocalControllerID = 0;
struEventCardLinkCond.write();
netDvrEventCardLinkageCfgV51.write();
boolean b = getHcNetSDK().NET_DVR_SetDeviceConfig(userID, HCNetSDK.NET_DVR_SET_EVENT_CARD_LINKAGE_CFG_V51, 1, lpCond1, struEventCardLinkCond.size(),
lpStatusList1, lpInbuferCfg1, netDvrEventCardLinkageCfgV51.size());
if (!b) {
int iErr = getHcNetSDK().NET_DVR_GetLastError();
System.out.println("设置事件/卡号联动配置参数失败,错误码为" + iErr);
} else {
System.out.println("设置事件/卡号联动配置参数成功");
}
}
}

View File

@@ -0,0 +1,191 @@
package org.dromara.sis.sdk.hik.service;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sis.sdk.hik.HCNetSDK;
import java.io.UnsupportedEncodingException;
/**
* 梯控参数配置、梯控计划模板配置,远程梯控
*
* @create 2021-03-11-14:12
*/
@Slf4j
public class DoorService extends SdkBaseServer {
/**
* 获取梯控楼层参数
*
* @param lUserID
* @param floor 楼层编号
*/
public static void GetAndSetFloorCfg(int lUserID, int floor) {
/**获取梯控楼层参数*/
HCNetSDK.NET_DVR_DOOR_CFG struFloorCfg = new HCNetSDK.NET_DVR_DOOR_CFG();
struFloorCfg.dwSize = struFloorCfg.size();
struFloorCfg.write();
IntByReference intByReference = new IntByReference(0);
boolean b_Get = getHcNetSDK().NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_DOOR_CFG, 1, struFloorCfg.getPointer(),
struFloorCfg.size(), intByReference);
if (!b_Get) {
log.info("获取梯控楼层参数,错误码为:{}", getHcNetSDK().NET_DVR_GetLastError());
return;
} else {
log.info("获取梯控楼层参数成功");
struFloorCfg.read();
/**
* 楼层继电器动作时间:普通卡刷卡后,继电器闭合时间。即刷卡授权后可使用电梯按钮的时间。默认5秒。
* 梯控访客延迟时间:访客呼梯后,访客可使用电梯按钮的时间。默认5分钟。
*/
log.info("楼层名称:{}", new String(struFloorCfg.byDoorName).trim());
log.info("楼层继电器动作时间: {}", struFloorCfg.byOpenDuration);
log.info("关门延迟时间: {}", struFloorCfg.byDisabledOpenDuration);
log.info("梯控访客延迟时间: {}", struFloorCfg.byLadderControlDelayTime);
}
/**设置梯控楼层参数*/
struFloorCfg.byDoorName = "floor111".getBytes();
struFloorCfg.write();
boolean b_Set = getHcNetSDK().NET_DVR_SetDVRConfig(lUserID, HCNetSDK.NET_DVR_SET_DOOR_CFG, 1, struFloorCfg.getPointer(), struFloorCfg.size());
if (!b_Set) {
log.info("设置梯控楼层参数成功,错误码为:{}", getHcNetSDK().NET_DVR_GetLastError());
} else {
log.info("设置梯控楼层参数成功!!!");
}
}
/**
* 梯控计划模板配置
*
* @param lUserID 用户登录句柄
* @param iDoorTemplateNo 计划模板编号为0表示取消关联恢复默认状态普通状态
*/
public static void doorTemplate(int lUserID, int iDoorTemplateNo, int floorID) {
//设置梯控计划参数:对不同楼层下发不同的权限计划模板
HCNetSDK.NET_DVR_DOOR_STATUS_PLAN struDoorStatus = new HCNetSDK.NET_DVR_DOOR_STATUS_PLAN();
struDoorStatus.read();
struDoorStatus.dwSize = struDoorStatus.size();
struDoorStatus.dwTemplateNo = iDoorTemplateNo; //计划模板编号为0表示取消关联、恢复默认状态普通状态。非0回复关联门序号与相同序号的门状态计划模板关联
struDoorStatus.write();
boolean b_SetDoorStatus = getHcNetSDK().NET_DVR_SetDVRConfig(lUserID, HCNetSDK.NET_DVR_SET_DOOR_STATUS_PLAN, floorID, struDoorStatus.getPointer(), struDoorStatus.size());
if (!b_SetDoorStatus) {
log.info("设置梯控计划参数,错误码为: {}", getHcNetSDK().NET_DVR_GetLastError());
return;
} else {
log.info("设置梯控计划参数成功");
}
//设置梯控计划模板参数
HCNetSDK.NET_DVR_PLAN_TEMPLATE struDoorTemp = new HCNetSDK.NET_DVR_PLAN_TEMPLATE();
struDoorTemp.read();
struDoorTemp.dwSize = struDoorTemp.size();
struDoorTemp.byEnable = 1; //使能
struDoorTemp.dwWeekPlanNo = 1; //周计划模板编号;
byte[] byTemplateName;
try {
byTemplateName = "DoorTemplatePlan_1".getBytes("GBK");
//计划模板名称
for (int i = 0; i < HCNetSDK.NAME_LEN; i++) {
struDoorTemp.byTemplateName[i] = 0;
}
System.arraycopy(byTemplateName, 0, struDoorTemp.byTemplateName, 0, byTemplateName.length);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
struDoorTemp.write();
boolean b_SetDoorTemp = getHcNetSDK().NET_DVR_SetDVRConfig(lUserID, HCNetSDK.NET_DVR_SET_DOOR_STATUS_PLAN_TEMPLATE, iDoorTemplateNo, struDoorTemp.getPointer(), struDoorTemp.size());
if (!b_SetDoorTemp) {
log.info("设置梯控计划模板失败,错误码为: {}", getHcNetSDK().NET_DVR_GetLastError());
return;
} else {
log.info("设置梯控计划模板成功");
}
//获取(设置)门状态周计划参数
HCNetSDK.NET_DVR_WEEK_PLAN_CFG struDoorWeekPlan = new HCNetSDK.NET_DVR_WEEK_PLAN_CFG();
struDoorWeekPlan.read();
Pointer pstruDoorWeekPlan = struDoorWeekPlan.getPointer();
IntByReference Ipint = new IntByReference(0);
boolean b_GetPlan = getHcNetSDK().NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_WEEK_PLAN_CFG, 1, pstruDoorWeekPlan, struDoorWeekPlan.size(), Ipint);
if (!b_GetPlan) {
log.info("获取梯控周计划参数失败,错误码为: {}", getHcNetSDK().NET_DVR_GetLastError());
return;
} else {
log.info("获取梯控周计划参数成功");
}
struDoorWeekPlan.read();
struDoorWeekPlan.byEnable = 1; //是否使能0- 否1- 是
/**避免时间段交叉,先初始化*/
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 8; j++) {
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[j].byEnable = 0;
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.byHour = 0;
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.byMinute = 0;
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struBeginTime.bySecond = 0;
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.byHour = 0;
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.byMinute = 0;
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[j].struTimeSegment.struEndTime.bySecond = 0;
}
}
/**一周7天全天24小时*/
for (int i = 0; i < 7; i++) {
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[0].byEnable = 1;
//对接梯控主机需要下发此参数
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[0].byDoorStatus = 2; //2- 常开状态梯控的自由状态3- 常闭状态(梯控的禁用状态)
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byHour = 0;
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.byMinute = 0;
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struBeginTime.bySecond = 0;
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byHour = 23;
struDoorWeekPlan.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byMinute = 0;
struDoorWeekPlan.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 = 0;
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 = 11;
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.byMinute = 59;
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[0].struTimeSegment.struEndTime.bySecond = 59;
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].byEnable = 1;
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.byHour = 13;
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.byMinute = 30;
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struBeginTime.bySecond = 0;
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.byHour = 19;
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.byMinute = 59;
struWeekPlanCfg.struPlanCfg[i].struPlanCfgDay[1].struTimeSegment.struEndTime.bySecond = 59;
}*/
struDoorWeekPlan.write();
boolean b_SetPlan = getHcNetSDK().NET_DVR_SetDVRConfig(lUserID, HCNetSDK.NET_DVR_SET_WEEK_PLAN_CFG, 2, pstruDoorWeekPlan, struDoorWeekPlan.size());
if (!b_SetPlan) {
log.info("设置门状态周计划参数失败,错误码为: {}", getHcNetSDK().NET_DVR_GetLastError());
return;
} else {
log.info("设置门状态周计划参数成功");
}
}
/**
* 远程梯控
*
* @param lUserID 用户登录句柄
* @param lGatewayIndex 楼层编号从1开始-1表示对所有门或者梯控的所有楼层进行操作
* @param dwStaic 命令值0- 关闭对于梯控表示受控1- 打开对于梯控表示开门2- 常开对于梯控表示自由、通道状态3- 常关对于梯控表示禁用4- 恢复梯控普通状态5- 访客呼梯梯控6- 住户呼梯(梯控)
* 禁用**:电梯不可到达所选楼层。
* **受控**:需刷卡后才可以按下所选楼层的按钮,电梯才到达指定楼层。
* **自由**:所选楼层按钮一直有效。
* **开门**:只能在指定时间内按下所选楼层的按钮。
* **访客呼梯**:电梯到达一楼,访客进入电梯后仅可按下所选楼层的按钮。
* **住户呼梯**:电梯自动到达所选楼层。
*/
public static boolean controlGateway(int lUserID, int lGatewayIndex, int dwStaic) {
boolean b = getHcNetSDK().NET_DVR_ControlGateway(lUserID, lGatewayIndex, dwStaic);
if (!b) {
int i = getHcNetSDK().NET_DVR_GetLastError();
log.error("梯控控制失败, errCode={}", i);
}
return b;
}
}

View File

@@ -0,0 +1,58 @@
package org.dromara.sis.sdk.hik.service;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sis.sdk.hik.HCNetSDK;
/**
* 海康sdk接口服务
*
* @author LXJ
* @since 25-07-08
*/
@Slf4j
public class LoginService extends SdkBaseServer {
/**
* 登录设备,支持 V40 和 V30 版本,功能一致。
*
* @param ip 设备IP地址
* @param port SDK端口默认为设备的8000端口
* @param user 设备用户名
* @param psw 设备密码
* @return 登录成功返回用户ID失败返回-1
*/
public static int loginDevice(String ip, short port, String user, String psw) {
// 创建设备登录信息和设备信息对象
HCNetSDK.NET_DVR_USER_LOGIN_INFO loginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();
HCNetSDK.NET_DVR_DEVICEINFO_V40 deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();
// 设置设备IP地址
byte[] deviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
byte[] ipBytes = ip.getBytes();
System.arraycopy(ipBytes, 0, deviceAddress, 0, Math.min(ipBytes.length, deviceAddress.length));
loginInfo.sDeviceAddress = deviceAddress;
// 设置用户名和密码
byte[] userName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
byte[] password = psw.getBytes();
System.arraycopy(user.getBytes(), 0, userName, 0, Math.min(user.length(), userName.length));
System.arraycopy(password, 0, loginInfo.sPassword, 0, Math.min(password.length, loginInfo.sPassword.length));
loginInfo.sUserName = userName;
// 设置端口和登录模式
loginInfo.wPort = port;
loginInfo.bUseAsynLogin = false; // 同步登录
loginInfo.byLoginMode = 0; // 使用SDK私有协议
// 执行登录操作
int userID = hcNetSDK.NET_DVR_Login_V40(loginInfo, deviceInfo);
if (userID == -1) {
log.error("登录失败,错误码为: {}", hcNetSDK.NET_DVR_GetLastError());
} else {
log.info("设备[{}]登录成功.", ip);
deviceInfo.read();
//获取设备字符编码格式
iCharEncodeType = deviceInfo.byCharEncodeType;
}
return userID; // 返回登录结果
}
}

View File

@@ -0,0 +1,104 @@
package org.dromara.sis.sdk.hik.service;
import com.sun.jna.Native;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sis.sdk.hik.HCNetSDK;
import org.springframework.util.Assert;
import static org.dromara.sis.sdk.hik.common.osSelect.isWindows;
@Slf4j
public class SdkBaseServer {
public static HCNetSDK hcNetSDK;
public static int iCharEncodeType = 0;
/**
* 海康登录失败code
*/
public static final int LOGIN_FAIL_CODE = -1;
public static HCNetSDK getHcNetSDK() {
if (hcNetSDK == null) {
throw new RuntimeException("HIK sdk 初始化失败!");
}
return hcNetSDK;
}
public static void initSdk() {
if (isWindows()) {
String dllFilePath = System.getProperty("user.dir") + "\\lib\\hik\\win64\\HCNetSDK.dll";
log.info("win系统加载库路径: {}", dllFilePath);
hcNetSDK = (HCNetSDK) Native.loadLibrary(dllFilePath, HCNetSDK.class);
log.info("window-sdk加载完成。");
} else {
String dllFilePath = System.getProperty("user.dir") + "/lib/libhcnetsdk.so";
log.info("linux系统加载库路径: {}", dllFilePath);
hcNetSDK = (HCNetSDK) Native.loadLibrary(dllFilePath, HCNetSDK.class);
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());
log.info("window-sdk加载完成。");
}
//SDK初始化和进程保持同步仅需要调用一次
hcNetSDK.NET_DVR_Init();
//开启SDK日志打印
hcNetSDK.NET_DVR_SetLogToFile(3, "./sdklog", false);
}
/**
* 开启定时巡检设备
*
* @param time 巡检时间
* @param workStateCallBack 巡检回调
*/
public static boolean regularInspection(int time, HCNetSDK.DEV_WORK_STATE_CB workStateCallBack) {
Assert.notNull(workStateCallBack, "开启定时巡检设备失败, msg: HCNetSDK.FMSGCallBack 不能为null");
HCNetSDK.NET_DVR_CHECK_DEV_STATE struCheckStatus = new HCNetSDK.NET_DVR_CHECK_DEV_STATE();
struCheckStatus.read();
//定时检测设备工作状态单位ms0表示使用默认值(30000)最小值为1000 30分钟更新一次
struCheckStatus.dwTimeout = time;
struCheckStatus.fnStateCB = workStateCallBack;
struCheckStatus.write();
boolean state = hcNetSDK.NET_DVR_StartGetDevState(struCheckStatus);
if (!state) {
log.info("定时巡检设备开启失败:{}", hcNetSDK.NET_DVR_GetLastError());
} else {
log.info("定时巡检设备开启成功");
}
return state;
}
/**
* 登出操作
*/
public static boolean logout(int lUserID) {
if (lUserID >= 0) {
return hcNetSDK.NET_DVR_Logout(lUserID);
}
return false;
}
public static void clearSdk() {
if (hcNetSDK != null) {
hcNetSDK.NET_DVR_Cleanup();
}
}
}