增加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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="GB2312"?>
<SdkLocal>
<SdkLog>
<logLevel>3</logLevel><!--req, 1-ERROR, 2-DEBUG, 3-INFO-->
<logDirectory>./SDKLOG/</logDirectory><!--the end of the string must be '/'-->
<autoDelete>true</autoDelete><!--true: There are less than 10 files in the directory, it will be auto deleted by sdk when the files are more than 10; false: No upper limit to the number of log files-->
</SdkLog>
<HeartbeatCfg>
<Interval>120</Interval> <!-- <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EBA3AC><EFBFBD><EFBFBD>0<EFBFBD><30>ʹ<EFBFBD><CAB9>Ĭ<EFBFBD><C4AC>ֵ120s<30><73>ȡֵ<C8A1><D6B5>ΧΪ[30, 120] С<><D0A1>30s<30><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ30s<30><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>120s<30><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ120s-->
<Count>1</Count> <!-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʹ<EFBFBD><CAB9>Ĭ<EFBFBD><C4AC>ֵ1<D6B5><31>-->
</HeartbeatCfg>
</SdkLocal>

Binary file not shown.

Binary file not shown.

BIN
lib/hik/linux64/libNPQos.so Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/hik/linux64/libhpr.so Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/hik/linux64/libz.so Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1 @@
The dll in this directory<72><79>iconv.dll,libxml2.dll,zlib1.dll,calib.dll<6C><6C>only used in ClientDemo.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

View File

@@ -0,0 +1,25 @@
{
"Devices": [{
"ID": 0,
"SerialNumber": "DS-K221020240130V010006CHGB5685986",
"ChannelNumber": 0,
"StartChannel": 1,
"AlarmInNum": 0,
"AlarmOutNum": 2,
"IPChanNum": 0,
"MirrorChanNum": 0,
"StartMirrorChanNo": 0,
"LocalNodeName": "192.168.110.196",
"DeviceType": 864,
"DiskNum": 0,
"LoginUserName": "admin",
"LoginUserPwd": "qweasd123",
"DeviceIP": "192.168.110.196",
"DeviceMultiIP": "0.0.0.0",
"DevicePort": 8000,
"DeviceName": "",
"LoginMode": 0,
"Https": 0,
"Channels": []
}]
}

BIN
lib/hik/win64/GdiPlus.dll Normal file

Binary file not shown.

BIN
lib/hik/win64/GdiPlus.lib Normal file

Binary file not shown.

BIN
lib/hik/win64/HCCore.dll Normal file

Binary file not shown.

BIN
lib/hik/win64/HCCore.lib Normal file

Binary file not shown.

BIN
lib/hik/win64/HCNetSDK.dll Normal file

Binary file not shown.

BIN
lib/hik/win64/HCNetSDK.lib Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/hik/win64/HXVA.dll Normal file

Binary file not shown.

BIN
lib/hik/win64/HmMerge.dll Normal file

Binary file not shown.

View File

BIN
lib/hik/win64/LocalXml.zip Normal file

Binary file not shown.

BIN
lib/hik/win64/MP_Render.dll Normal file

Binary file not shown.

BIN
lib/hik/win64/NPQos.dll Normal file

Binary file not shown.

BIN
lib/hik/win64/OpenAL32.dll Normal file

Binary file not shown.

BIN
lib/hik/win64/PlayCtrl.dll Normal file

Binary file not shown.

BIN
lib/hik/win64/PlayCtrl.lib Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/hik/win64/hlog.dll Normal file

Binary file not shown.

BIN
lib/hik/win64/hpr.dll Normal file

Binary file not shown.

Binary file not shown.

BIN
lib/hik/win64/libmmd.dll Normal file

Binary file not shown.

Binary file not shown.

BIN
lib/hik/win64/zlib1.dll Normal file

Binary file not shown.

29
pom.xml
View File

@@ -58,7 +58,8 @@
<warm-flow.version>1.7.3</warm-flow.version>
<!-- mq配置 -->
<rocketmq.version>2.3.0</rocketmq.version>
<!-- hik sdk 配置 -->
<hik-sdk.version>1.0</hik-sdk.version>
<!-- 插件版本 -->
<maven-compiler-plugin.version>3.11.0</maven-compiler-plugin.version>
<maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version>
@@ -73,8 +74,8 @@
<properties>
<!-- 环境标识,需要与配置文件的名称相对应 -->
<profiles.active>dev</profiles.active>
<!-- <nacos.server>127.0.0.1:8848</nacos.server>-->
<!-- <logstash.address>127.0.0.1:4560</logstash.address>-->
<!-- <nacos.server>127.0.0.1:8848</nacos.server>-->
<!-- <logstash.address>127.0.0.1:4560</logstash.address>-->
<nacos.server>47.109.37.87:8848</nacos.server>
<logstash.address>47.109.37.87:4560</logstash.address>
<nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>
@@ -92,8 +93,8 @@
<properties>
<!-- 环境标识,需要与配置文件的名称相对应 -->
<profiles.active>dev</profiles.active>
<!-- <nacos.server>127.0.0.1:8848</nacos.server>-->
<!-- <logstash.address>127.0.0.1:4560</logstash.address>-->
<!-- <nacos.server>127.0.0.1:8848</nacos.server>-->
<!-- <logstash.address>127.0.0.1:4560</logstash.address>-->
<nacos.server>47.109.37.87:8848</nacos.server>
<logstash.address>47.109.37.87:4560</logstash.address>
<nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>
@@ -108,15 +109,15 @@
<id>prod</id>
<properties>
<profiles.active>prod</profiles.active>
<!-- <nacos.server>127.0.0.1:8848</nacos.server>-->
<!-- <logstash.address>127.0.0.1:4560</logstash.address>-->
<!-- <nacos.server>127.0.0.1:8848</nacos.server>-->
<!-- <logstash.address>127.0.0.1:4560</logstash.address>-->
<nacos.server>47.109.37.87:8848</nacos.server>
<logstash.address>47.109.37.87:4560</logstash.address>
<nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>
<nacos.config.group>DEFAULT_GROUP</nacos.config.group>
<nacos.username>nacos</nacos.username>
<nacos.password>nacos</nacos.password>
<!-- <logstash.address>127.0.0.1:4560</logstash.address>-->
<!-- <logstash.address>127.0.0.1:4560</logstash.address>-->
</properties>
@@ -376,6 +377,18 @@
<version>${mapstruct-plus.version}</version>
</dependency>
<dependency>
<groupId>com.hik</groupId>
<artifactId>examples</artifactId>
<version>${hik-sdk.version}</version>
</dependency>
<dependency>
<groupId>com.hik</groupId>
<artifactId>jna</artifactId>
<version>${hik-sdk.version}</version>
</dependency>
<!--消息队列-->
<dependency>
<groupId>org.apache.rocketmq</groupId>

View File

@@ -111,6 +111,16 @@
<artifactId>property-api</artifactId>
</dependency>
<dependency>
<groupId>com.hik</groupId>
<artifactId>examples</artifactId>
</dependency>
<dependency>
<groupId>com.hik</groupId>
<artifactId>jna</artifactId>
</dependency>
</dependencies>
<build>

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