海康设备对接单独拆分

This commit is contained in:
lxj
2025-08-20 17:57:09 +08:00
parent d5d8b80f49
commit 62d9a21627
38 changed files with 215 additions and 13088 deletions

View File

@@ -9,6 +9,7 @@ public interface RemoteHikSdkService {
/**
* 海康sdk 登录操作
*
* @param item 登录参数
* @return 是否登录成功
*/
@@ -16,6 +17,7 @@ public interface RemoteHikSdkService {
/**
* 获取nvr设备通道信息
*
* @param deviceIp 设备ip
* @return 返回通道信息
*/

View File

@@ -139,6 +139,7 @@
<artifactId>j2mod</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>

View File

@@ -1,7 +1,6 @@
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;
@@ -17,8 +16,6 @@ import org.springframework.scheduling.annotation.EnableScheduling;
@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);

View File

@@ -28,6 +28,7 @@ public class CleanLiftAuthRocketConsumer implements RocketMQListener<MessageExt>
private final ISisElevatorInfoService sisElevatorInfoService;
private final ISisElevatorFloorRefService sisElevatorFloorRefService;
private final HikApiService hikApiService;
@Override
public void onMessage(MessageExt ext) {
@@ -61,7 +62,7 @@ public class CleanLiftAuthRocketConsumer implements RocketMQListener<MessageExt>
// }
// todo 暂时应急处理,后续调整业务逻辑
for (int i = 1; i < 5; i++) {
HikApiService.getInstance().controlGateway("192.168.24.150", i, 3);
hikApiService.controlGateway("192.168.24.150", i, 3);
}
log.info("梯控清除权限完成");
}

View File

@@ -19,7 +19,7 @@ public class ZkMediaHookController {
@ResponseBody
@PostMapping(value = "/on_server_keepalive", produces = "application/json;charset=UTF-8")
public HookResult onServerKeepalive(@RequestBody OnServerKeepaliveHookParam param) {
log.debug("ZLM心跳上报,params: {}", param);
log.info("ZLM心跳上报,params: {}", param);
return HookResult.SUCCESS();
}

View File

@@ -5,7 +5,7 @@ import org.dromara.sis.api.domain.RemoteSisDeviceChannel;
import org.dromara.sis.api.domain.RemoteSisDeviceManage;
import org.dromara.sis.domain.SisDeviceChannel;
import org.dromara.sis.domain.SisDeviceManage;
import org.dromara.sis.sdk.hik.model.DeviceInfo;
import org.dromara.sis.sdk.hik.DeviceInfo;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

View File

@@ -137,6 +137,9 @@ public class SisAlarmEventsVo implements Serializable {
*/
private Date solveTime;
/**
* 创建时间
*/
private Date createTime;
/**
@@ -144,5 +147,8 @@ public class SisAlarmEventsVo implements Serializable {
*/
private Date finishTime;
/**
* 报警信息描述
*/
private String description;
}

View File

@@ -11,7 +11,7 @@ import org.dromara.sis.api.domain.RemoteSisDeviceManage;
import org.dromara.sis.domain.SisDeviceChannel;
import org.dromara.sis.domain.SisDeviceManage;
import org.dromara.sis.domain.covert.CommonBeanCovert;
import org.dromara.sis.sdk.hik.HikSdkConstans;
import org.dromara.sis.sdk.hik.HikConstants;
import org.dromara.sis.service.ISisDeviceChannelService;
import org.dromara.sis.service.ISisDeviceManageService;
import org.springframework.stereotype.Component;
@@ -77,25 +77,25 @@ public class RemoteDeviceServiceImpl implements RemoteDeviceService {
channel.setDeviceAccount(item.getChannelAccount());
// 目前没发获取通道设备厂商,默认跟着录像机走
channel.setFactoryNo(item.getNvrFactoryNo());
channel.setChannelNo(HikSdkConstans.DEFAULT_CHANNEL);
channel.setChannelNo(HikConstants.DEFAULT_CHANNEL);
channel.setChannelState(item.getChannelStatus());
if (StrUtil.isNotEmpty(item.getChannelPwd())) {
channel.setDevicePwd(item.getChannelPwd());
}
// nvr 设备信息
channel.setNvrIp(item.getNvrIp());
channel.setNvrPort(HikSdkConstans.DEFAULT_RTSP_PORT);
channel.setNvrPort(HikConstants.DEFAULT_RTSP_PORT);
channel.setNvrAccount(item.getNvrAccount());
channel.setNvrPwd(item.getNvrPwd());
channel.setNvrFactoryNo(item.getNvrFactoryNo());
channel.setNvrChannelNo(item.getChannelId() + HikSdkConstans.DEFAULT_CHANNEL_PREFX);
channel.setNvrChannelNo(item.getChannelId() + HikConstants.DEFAULT_CHANNEL_PREFX);
// 系统设备信息
// 将设备id 更改为nvr的设备id
channel.setDeviceId(item.getDeviceId());
channel.setGroupId(item.getGroupId());
channel.setChannelName(item.getChannelName());
channel.setChannelNo(item.getChannelId() + HikSdkConstans.DEFAULT_CHANNEL_PREFX);
channel.setChannelNo(item.getChannelId() + HikConstants.DEFAULT_CHANNEL_PREFX);
channel.setTenantId(item.getTenantId());
return channel;
}).toList();

View File

@@ -7,8 +7,8 @@ import org.dromara.sis.api.RemoteHikSdkService;
import org.dromara.sis.api.domain.RemoteSdkChannel;
import org.dromara.sis.api.domain.RemoteSisDeviceManage;
import org.dromara.sis.domain.covert.CommonBeanCovert;
import org.dromara.sis.sdk.hik.DeviceInfo;
import org.dromara.sis.sdk.hik.HikApiService;
import org.dromara.sis.sdk.hik.model.DeviceInfo;
import org.springframework.stereotype.Component;
import java.util.List;
@@ -18,17 +18,19 @@ import java.util.List;
@Component
public class RemoteSdkServiceImpl implements RemoteHikSdkService {
private final HikApiService hikApiService;
@Override
public Boolean deviceLogin(RemoteSisDeviceManage item) {
if (item == null) {
throw new RuntimeException("设备信息为null");
}
return HikApiService.getInstance().login(item.getDeviceIp(), item.getDevicePort().shortValue(), item.getDevicePwd(), item.getDeviceAccount());
return hikApiService.login(item.getDeviceIp(), item.getDevicePort().shortValue(), item.getDevicePwd(), item.getDeviceAccount(), item.getDeviceType());
}
@Override
public List<RemoteSdkChannel> getDeviceChannel(String deviceIp) {
DeviceInfo channelInfo = HikApiService.getInstance().getChannelInfo(deviceIp);
DeviceInfo channelInfo = hikApiService.getChannelInfo(deviceIp);
if (channelInfo == null) {
return List.of();
}

View File

@@ -1,93 +1,83 @@
//package org.dromara.sis.runner;
//
//import cn.dev33.satoken.context.mock.SaTokenContextMockUtil;
//import cn.dev33.satoken.stp.StpUtil;
//import cn.hutool.core.collection.CollUtil;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.dubbo.config.annotation.DubboReference;
//import org.dromara.common.core.utils.SpringUtils;
//import org.dromara.property.api.RemoteFloorService;
//import org.dromara.property.api.domain.vo.RemoteFloorVo;
//import org.dromara.sis.domain.SisDeviceManage;
//import org.dromara.sis.domain.vo.SisElevatorInfoVo;
//import org.dromara.sis.sdk.hik.HikApiService;
//import org.dromara.sis.sdk.hik.calback.HikAlarmCallBack;
//import org.dromara.sis.service.ISisDeviceManageService;
//import org.dromara.sis.service.ISisElevatorInfoService;
//import org.springframework.boot.ApplicationArguments;
//import org.springframework.boot.ApplicationRunner;
//import org.springframework.scheduling.annotation.Async;
//import org.springframework.stereotype.Component;
//
//import java.util.List;
//import java.util.concurrent.atomic.AtomicReference;
//
//@Slf4j
//@Component
//@RequiredArgsConstructor
//public class HikDeviceApplicationRunner implements ApplicationRunner {
//
// private final HikAlarmCallBack hikAlarmCallBack;
// private final ISisDeviceManageService deviceManageService;
// private final ISisElevatorInfoService elevatorInfoService;
//
// @DubboReference
// private RemoteFloorService remoteFloorService;
//
// @Override
// public void run(ApplicationArguments args) throws Exception {
// // 先布放,在登录
// HikApiService.getInstance().setAlarmCallBack(0, hikAlarmCallBack);
// // 现在查询全部,后面要更具需要查询指定厂商的设备
// HikDeviceApplicationRunner runner = SpringUtils.getAopProxy(this);
// // 梯控登录
//// runner.hikElevatorInfoLogin();
// // 网络摄像头登录
// runner.hikNetCameraLogin();
// }
//
// @Async
// public void hikElevatorInfoLogin() {
// List<SisElevatorInfoVo> sisElevatorInfoVos = elevatorInfoService.queryAll();
// if (CollUtil.isNotEmpty(sisElevatorInfoVos)) {
// sisElevatorInfoVos.forEach(item -> {
// // 执行设备登录操作
// HikApiService.getInstance().login(item.getControlIp(), item.getControlPort().shortValue(), item.getControlAccount(), item.getControlPwd());
//
// AtomicReference<List<RemoteFloorVo>> floorInfoRef = new AtomicReference<>();
// // 模拟上下文
// SaTokenContextMockUtil.setMockContext(() -> {
// // 模拟登录
// StpUtil.login(-8);
// floorInfoRef.set(remoteFloorService.queryByBuildingId(item.getBuildingId()));
// });
//
// // 根据单元ID获取楼层信息
// List<RemoteFloorVo> floorInfo = floorInfoRef.get();
//
// // 下发权限
// for (int i = 0; i < floorInfo.size(); i++) {
// // 初始权限默认禁用状态
// HikApiService.getInstance().controlGateway(item.getControlIp(), (i + 1), 3);
// }
// });
// }
// }
//
// @Async
// public void hikNetCameraLogin() {
// List<SisDeviceManage> deviceList = deviceManageService.queryHikDevices();
// if (CollUtil.isEmpty(deviceList)) {
// log.info("没有查询到摄像设备信息,不执行登录");
// return;
// }
// deviceList.forEach(item -> {
// boolean isLogin = HikApiService.getInstance().login(item.getDeviceIp(), item.getDevicePort().shortValue(), item.getDeviceAccount(), item.getDevicePwd());
// log.info("设备[{}]执行登录完成result={}", item.getDeviceIp(), isLogin);
// if (isLogin) {
// HikApiService.getInstance().setAlarmChan(item.getDeviceIp());
// }
// });
// }
//}
package org.dromara.sis.runner;
import cn.dev33.satoken.context.mock.SaTokenContextMockUtil;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.collection.CollUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.property.api.RemoteFloorService;
import org.dromara.property.api.domain.vo.RemoteFloorVo;
import org.dromara.sis.domain.SisDeviceManage;
import org.dromara.sis.domain.vo.SisElevatorInfoVo;
import org.dromara.sis.sdk.hik.HikApiService;
import org.dromara.sis.service.ISisDeviceManageService;
import org.dromara.sis.service.ISisElevatorInfoService;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
@Slf4j
@Component
@RequiredArgsConstructor
public class HikDeviceApplicationRunner implements ApplicationRunner {
private final ISisDeviceManageService deviceManageService;
private final ISisElevatorInfoService elevatorInfoService;
private final HikApiService hikApiService;
@DubboReference
private RemoteFloorService remoteFloorService;
@Override
public void run(ApplicationArguments args) throws Exception {
HikDeviceApplicationRunner runner = SpringUtils.getAopProxy(this);
// 梯控登录
// runner.hikElevatorInfoLogin();
// 网络摄像头登录
runner.hikNetCameraLogin();
}
@Async
public void hikElevatorInfoLogin() {
List<SisElevatorInfoVo> sisElevatorInfoVos = elevatorInfoService.queryAll();
if (CollUtil.isNotEmpty(sisElevatorInfoVos)) {
sisElevatorInfoVos.forEach(item -> {
// 执行设备登录操作
hikApiService.login(item.getControlIp(), item.getControlPort().shortValue(), item.getControlAccount(), item.getControlPwd(), 4);
AtomicReference<List<RemoteFloorVo>> floorInfoRef = new AtomicReference<>();
// 模拟上下文
SaTokenContextMockUtil.setMockContext(() -> {
// 模拟登录
StpUtil.login(-8);
floorInfoRef.set(remoteFloorService.queryByBuildingId(item.getBuildingId()));
});
// 根据单元ID获取楼层信息
List<RemoteFloorVo> floorInfo = floorInfoRef.get();
// 下发权限
for (int i = 0; i < floorInfo.size(); i++) {
// 初始权限默认禁用状态
hikApiService.controlGateway(item.getControlIp(), (i + 1), 3);
}
});
}
}
@Async
public void hikNetCameraLogin() {
List<SisDeviceManage> deviceList = deviceManageService.queryHikDevices();
if (CollUtil.isEmpty(deviceList)) {
log.info("没有查询到摄像设备信息,不执行登录");
return;
}
deviceList.forEach(item -> {
boolean isLogin = hikApiService.login(item.getDeviceIp(), item.getDevicePort().shortValue(), item.getDeviceAccount(), item.getDevicePwd(), 1);
log.info("设备[{}]执行登录完成result={}", item.getDeviceIp(), isLogin);
});
}
}

View File

@@ -1,7 +1,6 @@
package org.dromara.sis.sdk.hik.model;
package org.dromara.sis.sdk.hik;
import lombok.Data;
import org.dromara.sis.api.enums.FactoryNoEnum;
import java.util.List;
@@ -28,8 +27,6 @@ public class DeviceInfo {
*/
private Integer dwStartDChan;
private String factoryNo = FactoryNoEnum.HIK.getCode();
private List<DeviceChannelInfo> channelInfo;
@Data

View File

@@ -1,72 +1,59 @@
package org.dromara.sis.sdk.hik.model.upload;
package org.dromara.sis.sdk.hik;
import jakarta.xml.bind.annotation.*;
import lombok.Data;
/**
* 上传图片的附件信息
* 人像库参数上传bo
*
* @author lxj
*/
@Data
@XmlRootElement(name = "FaceAppendData")
@XmlAccessorType(XmlAccessType.FIELD)
public class FaceAppendData {
public class FlibFaceAddBo {
@XmlAttribute
private String version = "2.0";
private String deviceIp;
@XmlAttribute
private String xmlns = "http://www.isapi.org/ver20/XMLSchema";
private byte[] face;
private Integer libId;
/**
* 出生日期,例如:2014-12-12T00:00:00Z
*/
@XmlElement
private String bornTime;
@XmlElement
private String name;
/**
* male, female
*/
@XmlElement
private String sex;
/**
* 省份,代码索引具体请参考"全国各省份城市列表
*/
@XmlElement
private String province;
/**
* ,城市,代码索引具体请参考"全国各省份城市列表
*/
@XmlElement
private String city;
/**
* 证件类型: ID-身份证, passportID-护照, other-其他
*/
@XmlElement
private String certificateType;
/**
* 证件号
*/
@XmlElement
private String certificateNumber;
/**
* 电话号码
*/
@XmlElement
private String phoneNumber;
/**
* 自定人员id
*/
@XmlElement
private String customHumanID;
}

View File

@@ -1,17 +1,11 @@
package org.dromara.sis.sdk.hik;
import cn.hutool.core.util.IdUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.Base64Utils;
import org.dromara.sis.sdk.hik.model.DeviceInfo;
import org.dromara.sis.sdk.hik.model.upload.FaceAppendData;
import org.dromara.sis.sdk.hik.model.upload.UploadStatus;
import org.dromara.sis.sdk.hik.service.*;
import java.io.FileInputStream;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import org.dromara.sis.sdk.zkmedia.model.R;
import org.springframework.stereotype.Component;
/**
* 海康sdk 接口服务
@@ -20,31 +14,34 @@ import java.util.concurrent.ConcurrentHashMap;
* @since 25-07-10
*/
@Slf4j
@Component
public class HikApiService {
private static final String URL_PREFIX = "http://127.0.0.1/eqp/hik/";
private static final String LOGIN_URI = "login";
private static final String LOGOUT_URI = "logout";
private static final String CHANNEL_LIST = "channel/list";
private static final String FACE_UPLOAD = "flib/add";
/**
* 缓存设备登录句柄的map
* 发起海康设备对接模块请求
*
* @param uri 请求uri
* @param params 请求参数
* @param cls 返回数据类型
* @return 返回请求数据
*/
private static final ConcurrentHashMap<String, Integer> CACHE = new ConcurrentHashMap<>(16);
private HikApiService() {
}
private static volatile HikApiService instance;
public static HikApiService getInstance() {
if (instance == null) {
synchronized (HikApiService.class) {
if (instance == null) {
instance = new HikApiService();
}
}
public <T> T request(String uri, String params, Class<T> cls) {
String url = URL_PREFIX + uri;
log.info("url: {},params: {}", url, params);
String post = HttpUtil.post(url, params);
R<T> result = JSONObject.parseObject(post, new TypeReference<R<T>>(cls) {
});
if (result != null && result.getCode() == 200) {
return result.getData();
}
return instance;
}
public static void init() {
SdkBaseServer.initSdk();
return null;
}
@@ -55,45 +52,35 @@ public class HikApiService {
* @param port 设备端口
* @param user 设备账号
* @param psw 设备密码
* @param deviceType 1 摄像机2: nvr, 3:cvr,4: 梯控
* @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) {
// 上次登录信息依然存在
if (CACHE.get(ip) != null && CACHE.get(ip) != i) {
loginOut(ip);
}
CACHE.put(ip, i);
} else {
CACHE.remove(ip);
}
return result;
public boolean login(String ip, short port, String user, String psw, Integer deviceType) {
JSONObject params = new JSONObject();
params.put("deviceIp", ip);
params.put("devicePort", port);
params.put("deviceAccount", user);
params.put("devicePassword", psw);
params.put("deviceType", deviceType);
return request(LOGIN_URI, params.toJSONString(), Boolean.class);
}
public Boolean loginOut(String deviceIp) {
JSONObject params = new JSONObject();
params.put("deviceIp", deviceIp);
return request(LOGOUT_URI, params.toJSONString(), Boolean.class);
}
/**
* 注册报警信息回调函数。
*
* @param callBack 报警信回调
*/
public boolean setAlarmCallBack(int iIndex, HCNetSDK.FMSGCallBack_V31 callBack) {
return SdkBaseServer.setAlarmCallBack(iIndex, callBack);
}
/**
* 获取梯控主机工作状态
* 通过sdk 获取hik设备通道信息
*
* @param deviceIp 设备ip
* @return 范湖通道信息
*/
public void getAcsStatus(String deviceIp) {
// 获取登录句柄
Integer lHandel = CACHE.get(deviceIp);
if (lHandel == null) {
log.error("设备[{}]不在线, 无法登出。", deviceIp);
return;
}
return;
public DeviceInfo getChannelInfo(String deviceIp) {
JSONObject params = new JSONObject();
params.put("deviceIp", deviceIp);
return request(CHANNEL_LIST, params.toJSONString(), DeviceInfo.class);
}
/**
@@ -111,160 +98,21 @@ public class HikApiService {
* 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);
JSONObject params = new JSONObject();
params.put("deviceIp", deviceIp);
params.put("floorNum", floorNum);
params.put("cmd", cmd);
return request(LOGOUT_URI, params.toJSONString(), Boolean.class);
}
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) {
log.info("设备[{}]注销完成", deviceIp);
CACHE.remove(deviceIp);
}
return logout;
}
/**
* 设备报警
*
* @param deviceIp
* @return
*/
public Boolean setAlarmChan(String deviceIp) {
Integer lHandel = CACHE.get(deviceIp);
return SdkBaseServer.setAlarmChan(lHandel);
}
/**
* 通过sdk 获取hik设备通道信息
*
* @param deviceIp 设备ip
* @return 范湖通道信息
*/
public DeviceInfo getChannelInfo(String deviceIp) {
Integer lHandel = CACHE.get(deviceIp);
return CamearService.getDeviceChannelInfo(lHandel);
}
// 允许上传的文件类型
private static final List<String> ALLOW_PIC_TYPES = Arrays.asList("jpg");
/**
* 人像比对文件上传
*
* @param deviceIp 设备ip
* @param file 上传文件
* @param addBo 上传参数
* @return 返回上传文件名称
*/
public static String fdLibUpload(String deviceIp, byte[] file, int libId, FaceAppendData data) {
long startTime = System.currentTimeMillis();
// 文件名称
String fileNamePrefix = IdUtil.fastSimpleUUID();
int luserId = CACHE.get(deviceIp);
if (luserId == -1) {
log.error("海康设备[{}]未登录,上传文件失败.", deviceIp);
return null;
}
int uploadId = -1;
// 获取文件类型
String type = Base64Utils.getType(file);
log.info("获取上传的文件类型,type: {}", type);
if (type == null) {
log.error("上传文件获取类型失败.");
return null;
}
if (!ALLOW_PIC_TYPES.contains(type)) {
log.error("不允许的上传文件类型, type: {}", type);
return null;
}
// 生成文件名称
String fileName = fileNamePrefix + "." + type;
// 上传状态
int statusCode = -1;
// 已发送的数据
int fileLen = file.length;
log.info("开始文件上传fileName={} len={}", fileName, fileLen);
try {
// 1 发起上传
uploadId = FdLibUploadService.uploadFile(luserId, libId);
log.info("开始发起hik上传操作uploadId={}", uploadId);
if (uploadId == -1) {
log.info("发起上传失败,errCode: {}", FdLibUploadService.getErrorCode());
return null;
}
// 2 发送图片的二进制数据
byte fileType = getFileType(type);
FdLibUploadService.uploadSend(uploadId, file, fileType, data);
// 3 循环查询, 上传进度 总共查询300次 每次等待20ms
int num = 200; // 循环次数
int sleepTime = 40; // 每次循环休眠时间
int allowQueryErrorNum = 5; // 最多允许接口调用异常
int errorNum = 0; // 错误次数
for (int i = 0; i < num; i++) {
UploadStatus uploadState = FdLibUploadService.getUploadState(uploadId);
log.info("循环获取文件上传进度, uploadState= {}", uploadState);
if (uploadState.getStatusCode() == -1) {
int errorCode = FdLibUploadService.getErrorCode();
log.info("文件进度查询失败, errorCode:{}", errorCode);
errorNum += 1;
if (errorNum == allowQueryErrorNum) {
log.info("sdk 接口错误次数达到设置上限,退出文件上传");
throw new RuntimeException("sdk接口错误次数达到设置上限退出文件上传 maxErrorNum=" + allowQueryErrorNum);
}
} else {
// 上传成功
if (uploadState.getStatusCode() == 1) {
statusCode = 1;
break;
}
// 上传中
else if (uploadState.getStatusCode() == 2) {
Thread.sleep(sleepTime);
}
// 上传失败
else if (uploadState.getStatusCode() == 3) {
throw new RuntimeException("文件上传失败, 返回码3");
}
// 其他异常
else {
throw new RuntimeException("文件上传失败, 返回码:" + uploadState);
}
}
}
if (statusCode == -1) {
log.info("图片上传失败,取消上传.");
return null;
}
// 4 获取上传图片的路径
String uploadResult = FdLibUploadService.getUploadResult(uploadId);
log.info("文件上传完成, result= {}, 耗时={}ms", uploadResult, System.currentTimeMillis() - startTime);
return uploadResult;
} catch (Exception e) {
if (uploadId != -1) {
FdLibUploadService.uploadClose(uploadId);
}
e.printStackTrace();
}
return null;
public String fdLibUpload(FlibFaceAddBo addBo) {
return request("FACE_UPLOAD", JSONObject.toJSONString(addBo), String.class);
}
private static byte getFileType(String type) {
return switch (type) {
case "jpg" -> 1;
case "png" -> 3;
case "bmp" -> 2;
case "gif" -> 5;
default -> throw new RuntimeException("不允许上传的图片类型:" + type);
};
}
}

View File

@@ -1,14 +1,10 @@
package org.dromara.sis.sdk.hik;
public class HikSdkConstans {
public class HikConstants {
/**
* IPc 的默认通道信息
*/
public static final String DEFAULT_CHANNEL = "101";
public static final Integer DEFAULT_RTSP_PORT = 554;
public static final String DEFAULT_CHANNEL_PREFX = "01";
}

View File

@@ -1,28 +0,0 @@
package org.dromara.sis.sdk.hik;
import com.sun.jna.Structure;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;
public class SDK_Structure extends Structure {
protected List<String> getFieldOrder() {
List<String> fieldOrderList = new ArrayList<String>();
for (Class<?> cls = getClass(); !cls.equals(SDK_Structure.class); cls = cls.getSuperclass()) {
Field[] fields = cls.getDeclaredFields();
int modifiers;
for (Field field : fields) {
modifiers = field.getModifiers();
if (Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) {
continue;
}
fieldOrderList.add(field.getName());
}
}
//System.out.println(fieldOrderList);
return fieldOrderList;
}
}

View File

@@ -1,323 +0,0 @@
package org.dromara.sis.sdk.hik.calback;
import cn.hutool.core.date.TimeInterval;
import com.sun.jna.Pointer;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sis.domain.SisDeviceManage;
import org.dromara.sis.sdk.hik.HCNetSDK;
import org.dromara.sis.service.ISisDeviceManageService;
import org.dromara.sis.service.IZeroSensationPassageService;
import org.springframework.stereotype.Component;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.Date;
import static org.dromara.sis.sdk.hik.HCNetSDK.*;
@Slf4j
@Component
@RequiredArgsConstructor
public class HikAlarmCallBack implements HCNetSDK.FMSGCallBack_V31 {
private final ISisDeviceManageService sisDeviceManageService;
private final IZeroSensationPassageService zeroSensationPassageService;
@Override
public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
switch (lCommand) {
//实时特征抓拍上传
case COMM_UPLOAD_FACESNAP_RESULT: {
log.info("hik 抓拍信息上报完成,lCommand={}", lCommand);
HCNetSDK.NET_VCA_FACESNAP_RESULT strFaceSnapInfo = new HCNetSDK.NET_VCA_FACESNAP_RESULT();
strFaceSnapInfo.write();
Pointer pFaceSnapInfo = strFaceSnapInfo.getPointer();
pFaceSnapInfo.write(0, pAlarmInfo.getByteArray(0, strFaceSnapInfo.size()), 0, strFaceSnapInfo.size());
strFaceSnapInfo.read();
handleFaceSnap(strFaceSnapInfo, pAlarmer);
break;
}
// 异常行为检测
case COMM_ALARM_RULE: {
// 读数据
HCNetSDK.NET_VCA_RULE_ALARM strVcaAlarm = new HCNetSDK.NET_VCA_RULE_ALARM();
strVcaAlarm.write();
Pointer pVCAInfo = strVcaAlarm.getPointer();
pVCAInfo.write(0, pAlarmInfo.getByteArray(0, strVcaAlarm.size()), 0, strVcaAlarm.size());
strVcaAlarm.read();
switch (strVcaAlarm.struRuleInfo.wEventTypeEx) {
case 1: //穿越警戒面 (越界侦测)
System.out.println("越界侦测报警发生");
strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_TRAVERSE_PLANE.class);
System.out.println("检测目标:" + strVcaAlarm.struRuleInfo.uEventParam.struTraversePlane.byDetectionTarget); //检测目标0表示所有目标表示不锁定检测目标所有目标都将进行检测其他取值按位表示不同的检测目标0x01-人0x02-车
//图片保存
if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) {
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
String newName = sf.format(new Date());
FileOutputStream fout;
try {
String filename = "./pic/" + newName + "VCA_TRAVERSE_PLANE" + ".jpg";
fout = new FileOutputStream(filename);
//将字节写入文件
long offset = 0;
ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen);
byte[] bytes = new byte[strVcaAlarm.dwPicDataLen];
buffers.rewind();
buffers.get(bytes);
fout.write(bytes);
fout.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
case 2: //目标进入区域
System.out.println("目标进入区域报警发生");
strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_AREA.class);
System.out.println("检测目标:" + strVcaAlarm.struRuleInfo.uEventParam.struArea.byDetectionTarget);
//图片保存
if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) {
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
String newName = sf.format(new Date());
FileOutputStream fout;
try {
String filename = "./pic/" + newName + "_TargetEnter" + ".jpg";
fout = new FileOutputStream(filename);
//将字节写入文件
long offset = 0;
ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen);
byte[] bytes = new byte[strVcaAlarm.dwPicDataLen];
buffers.rewind();
buffers.get(bytes);
fout.write(bytes);
fout.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
case 3: //目标离开区域
System.out.println("目标离开区域报警触发");
strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_AREA.class);
System.out.println("检测目标:" + strVcaAlarm.struRuleInfo.uEventParam.struArea.byDetectionTarget);
//图片保存
if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) {
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
String newName = sf.format(new Date());
FileOutputStream fout;
try {
String filename = "./pic/" + newName + "_TargetLeave" + ".jpg";
fout = new FileOutputStream(filename);
//将字节写入文件
long offset = 0;
ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen);
byte[] bytes = new byte[strVcaAlarm.dwPicDataLen];
buffers.rewind();
buffers.get(bytes);
fout.write(bytes);
fout.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
case 4: //周界入侵
System.out.println("周界入侵报警发生");
strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_INTRUSION.class);
System.out.println("检测目标:" + strVcaAlarm.struRuleInfo.uEventParam.struIntrusion.byDetectionTarget);
//图片保存
if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) {
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
String newName = sf.format(new Date());
FileOutputStream fout;
try {
String filename = "./pic/" + newName + "VCA_INTRUSION" + ".jpg";
fout = new FileOutputStream(filename);
//将字节写入文件
long offset = 0;
ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen);
byte[] bytes = new byte[strVcaAlarm.dwPicDataLen];
buffers.rewind();
buffers.get(bytes);
fout.write(bytes);
fout.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
case 5: //徘徊
System.out.println("徘徊事件触发");
break;
case 8: //快速移动(奔跑)
System.out.println("快速移动(奔跑)事件触发");
break;
case 15:
System.out.println("事件触发");
strVcaAlarm.struRuleInfo.uEventParam.setType(HCNetSDK.NET_VCA_LEAVE_POSITION.class);
System.out.println(strVcaAlarm.struRuleInfo.uEventParam.struLeavePos.byOnPosition);
//图片保存
if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) {
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
String newName = sf.format(new Date());
FileOutputStream fout;
try {
String filename = "./pic/" + newName + "VCA_LEAVE_POSITION_" + ".jpg";
fout = new FileOutputStream(filename);
//将字节写入文件
long offset = 0;
ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen);
byte[] bytes = new byte[strVcaAlarm.dwPicDataLen];
buffers.rewind();
buffers.get(bytes);
fout.write(bytes);
fout.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
case 20: //倒地检测
System.out.println("倒地事件触发");
break;
case 44: //玩手机
System.out.println("玩手机报警发生");
//图片保存
if ((strVcaAlarm.dwPicDataLen > 0) && (strVcaAlarm.byPicTransType == 0)) {
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
String newName = sf.format(new Date());
FileOutputStream fout;
try {
String filename = "./pic/" + newName + "PLAY_CELLPHONE_" + ".jpg";
fout = new FileOutputStream(filename);
//将字节写入文件
long offset = 0;
ByteBuffer buffers = strVcaAlarm.pImage.getByteBuffer(offset, strVcaAlarm.dwPicDataLen);
byte[] bytes = new byte[strVcaAlarm.dwPicDataLen];
buffers.rewind();
buffers.get(bytes);
fout.write(bytes);
fout.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
case 45: //持续检测
System.out.println("持续检测事件触发");
default:
System.out.println("行为事件类型:" + strVcaAlarm.struRuleInfo.wEventTypeEx);
break;
}
break;
}
// 人脸比对结果上报
case COMM_SNAP_MATCH_ALARM: {
TimeInterval interval = new TimeInterval();
HCNetSDK.NET_VCA_FACESNAP_MATCH_ALARM strFaceSnapMatch = new HCNetSDK.NET_VCA_FACESNAP_MATCH_ALARM();
strFaceSnapMatch.write();
Pointer pFaceSnapMatch = strFaceSnapMatch.getPointer();
pFaceSnapMatch.write(0, pAlarmInfo.getByteArray(0, strFaceSnapMatch.size()), 0, strFaceSnapMatch.size());
strFaceSnapMatch.read();
handleFaceComparison(strFaceSnapMatch, pAlarmer, interval);
break;
}
default: {
}
}
return true;
}
/**
* 处理人脸抓拍上报
*
* @param result 人脸数据
* @param pAlarmer 设备数据
*/
private void handleFaceSnap(HCNetSDK.NET_VCA_FACESNAP_RESULT result, HCNetSDK.NET_DVR_ALARMER pAlarmer) {
// 读取人脸小图
ByteBuffer buffers = result.pBuffer1.getByteBuffer(0, result.dwFacePicLen);
byte[] smallImg = new byte[result.dwFacePicLen];
buffers.rewind();
buffers.get(smallImg);
// 人脸大图
ByteBuffer buffers1 = result.pBuffer2.getByteBuffer(0, result.dwBackgroundPicLen);
byte[] bigImg = new byte[result.dwBackgroundPicLen];
buffers1.rewind();
buffers1.get(bigImg);
//设备ip
String sAlarmInfo = new String(pAlarmer.sDeviceIP).trim();
log.info("海康设备告警信息上传,设备={}, 人脸图片大小={} 背景图片大小={}", sAlarmInfo, smallImg.length, bigImg.length);
zeroSensationPassageService.pass(sAlarmInfo, smallImg, bigImg);
}
/**
* 处理人脸比对上报
*/
private void handleFaceComparison(HCNetSDK.NET_VCA_FACESNAP_MATCH_ALARM result, HCNetSDK.NET_DVR_ALARMER pAlarmer, TimeInterval interval) {
// 读取比对结果比对结果0-保留1-比对成功2-比对失败
int compareResults = result.byContrastStatus;
// 比对不成功,不处理
if (compareResults != 1) {
log.info("前置人脸比对失败,设备:{}", new String(pAlarmer.sDeviceIP).trim());
return;
}
// 获取相似度
float similarity = result.fSimilarity;
// 相似度小于70不处理
if (similarity < 0.7) {
log.info("前置人脸比对相似度小于70设备{}", new String(pAlarmer.sDeviceIP).trim());
return;
}
// 读取名字
String name = new String(result.struBlockListInfo.struBlockListInfo.struAttribute.byName, Charset.forName("GBK")).trim();
// 人员id为空不处理
if (result.struBlockListInfo.pPID == null) return;
// 读取人员id
ByteBuffer buffers = result.struBlockListInfo.pPID.getByteBuffer(0, result.struBlockListInfo.dwPIDLen);
byte[] pidByte = new byte[result.struBlockListInfo.dwPIDLen];
buffers.rewind();
buffers.get(pidByte);
int pid = Integer.parseInt(new String(pidByte));
log.info("比对结果:{},相似度:{},人员:{}id:{}", compareResults, similarity, name, pid);
log.info("处理前置人脸比对结果,耗时:{}", interval.interval());
}
}

View File

@@ -1,30 +0,0 @@
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));
log.info("海康sdk心跳信息上报 tda = {}", JSON.toJSONString(lpWorkState));
return true;
}
}

View File

@@ -1,57 +0,0 @@
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

@@ -1,12 +0,0 @@
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

@@ -1,11 +0,0 @@
package org.dromara.sis.sdk.hik.model.upload;
import com.sun.jna.Memory;
public class SimpleMemory extends Memory {
public SimpleMemory(long size) {
super(size);
}
}

View File

@@ -1,18 +0,0 @@
package org.dromara.sis.sdk.hik.model.upload;
import lombok.Data;
@Data
public class UploadStatus {
/**
* 上传状态码
*/
private Integer statusCode;
/**
* 上传进度
*/
private Integer process;
}

View File

@@ -1,83 +0,0 @@
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

@@ -1,156 +0,0 @@
package org.dromara.sis.sdk.hik.service;
import com.sun.jna.Memory;
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.model.DeviceInfo;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import static org.dromara.sis.sdk.hik.HCNetSDK.NET_DVR_GET_IPPARACFG_V40;
@Slf4j
public class CamearService extends SdkBaseServer {
/**
* 获取设备通道信息
*
* @return DeviceInfo
*/
public static DeviceInfo getDeviceChannelInfo(int lUserID) {
HCNetSDK.NET_DVR_IPPARACFG_V40 lpOutBuffer = new HCNetSDK.NET_DVR_IPPARACFG_V40();
lpOutBuffer.read();
lpOutBuffer.dwSize = lpOutBuffer.size();
IntByReference bytesReturned = new IntByReference(0);
boolean success = getHcNetSDK().NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_IPPARACFG_V40, 0, lpOutBuffer.getPointer(), lpOutBuffer.size(), bytesReturned);
if (success) {
lpOutBuffer.read();
}
DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.setDwGroupNum(lpOutBuffer.dwGroupNum);
deviceInfo.setDwAChanNum(lpOutBuffer.dwAChanNum);
deviceInfo.setDwDChanNum(lpOutBuffer.dwDChanNum);
deviceInfo.setDwStartDChan(lpOutBuffer.dwStartDChan);
List<DeviceInfo.DeviceChannelInfo> channelInfo = new ArrayList<>(64);
deviceInfo.setChannelInfo(channelInfo);
int num = 0;
for (int i = 0; i < lpOutBuffer.dwDChanNum; i++) {
HCNetSDK.NET_DVR_PICCFG_V30 dvrPiccfgV30 = new HCNetSDK.NET_DVR_PICCFG_V30();
dvrPiccfgV30.dwSize = dvrPiccfgV30.size();
IntByReference lpBytesReturned = new IntByReference(0);
int channelNum = i + lpOutBuffer.dwStartDChan;
getHcNetSDK().NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_PICCFG_V30, channelNum, dvrPiccfgV30.getPointer(), dvrPiccfgV30.dwSize, lpBytesReturned);
dvrPiccfgV30.read();
if (dvrPiccfgV30.dwSize == 0) {
// 代表此通道不存在数据那次此次不操作
log.info("通道[{}],无数据,不处理", channelNum);
} else {
String channelName = new String(dvrPiccfgV30.sChanName, Charset.forName("GBK")).trim();
HCNetSDK.NET_DVR_IPDEVINFO_V31 netDvrIpdevinfoV31 = lpOutBuffer.struIPDevInfo[num];
String sUserName = new String(netDvrIpdevinfoV31.sUserName, StandardCharsets.UTF_8).trim();
String sPassword = new String(netDvrIpdevinfoV31.sPassword, StandardCharsets.UTF_8).trim();
String ip = new String(netDvrIpdevinfoV31.struIP.sIpV4, StandardCharsets.UTF_8).trim();
short wDVRPort = netDvrIpdevinfoV31.wDVRPort;
DeviceInfo.DeviceChannelInfo deviceChannelInfo = new DeviceInfo.DeviceChannelInfo();
deviceChannelInfo.setChannelId(channelNum);
deviceChannelInfo.setChannelName(channelName);
deviceChannelInfo.setChannelIp(ip);
deviceChannelInfo.setChannelPort(wDVRPort);
deviceChannelInfo.setChannelAccount(sUserName);
deviceChannelInfo.setChannelPwd(sPassword);
deviceChannelInfo.setChannelStatus(0);
// 通道是否在线
byte byEnable = lpOutBuffer.struStreamMode[i].uGetStream.struChanInfo.byEnable;
deviceChannelInfo.setChannelStatus((int) byEnable);
channelInfo.add(deviceChannelInfo);
num++;
}
}
return deviceInfo;
}
public static void isAPI(int lUserID, String url) {
// 输入参数
HCNetSDK.NET_DVR_XML_CONFIG_INPUT strInput = new HCNetSDK.NET_DVR_XML_CONFIG_INPUT();
strInput.dwSize = strInput.size(); // 初始化结构体内存
// 2. 构造URL - 必须包含 \r\n 结束符
// String url = "GET /ISAPI/Intelligent/capabilities\r\n";
byte[] urlBytes = url.getBytes();
Memory urlMemory = new Memory(urlBytes.length + 1); // +1 for null terminator
urlMemory.write(0, urlBytes, 0, urlBytes.length);
urlMemory.setByte(urlBytes.length, (byte) 0); // 添加NUL终止符
strInput.lpRequestUrl = urlMemory;
strInput.dwRequestUrlLen = urlBytes.length; // 不包括NUL终止符
// 3. 输入缓冲区设为空指针
strInput.lpInBuffer = Pointer.NULL;
strInput.dwInBufferSize = 0;
// 输出参数
HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT strOutput = new HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT();
strOutput.dwSize = strOutput.size();
// 5. 分配输出缓冲区 (8KB)
int outBufSize = 8 * 1024;
Memory outBuffer = new Memory(outBufSize);
outBuffer.clear(); // 清零缓冲区
// 6. 分配状态缓冲区 (1KB)
int statusSize = 1024;
Memory statusBuffer = new Memory(statusSize);
statusBuffer.clear(); // 清零缓冲区
strOutput.lpOutBuffer = outBuffer;
strOutput.dwOutBufferSize = outBufSize;
strOutput.lpStatusBuffer = statusBuffer;
strOutput.dwStatusSize = statusSize;
// 7. 调用前写入结构体
strOutput.write(); // 将Java结构体写入本地内存
strOutput.write(); // 将Java结构体写入本地内存
// 调用SDK方法
boolean success = hcNetSDK.NET_DVR_STDXMLConfig(lUserID, strInput, strOutput);
if (!success) {
int errorCode = hcNetSDK.NET_DVR_GetLastError();
System.err.println("NET_DVR_STDXMLConfig failed, error code: " + errorCode);
// 打印状态信息帮助调试
if (strOutput.dwReturnedXMLSize > 0) {
String status = statusBuffer.getString(0);
System.err.println("Status: " + status);
}
} else {
System.out.println("NET_DVR_STDXMLConfig successfully!");
// 9. 读取前同步结构体字段
strOutput.read(); // 从本地内存读取更新后的结构体
// 检查实际返回的数据大小
int returnedSize = strOutput.dwReturnedXMLSize;
if (returnedSize > 0) {
// 使用正确的长度读取字符串
String xmlResponse = outBuffer.getString(0);
System.out.println("Response size: " + returnedSize);
System.out.println(xmlResponse);
} else {
System.out.println("No data returned");
}
}
}
}

View File

@@ -1,642 +0,0 @@
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

@@ -1,192 +0,0 @@
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);
log.info("楼层数据下发结果,楼层={}result={}", lGatewayIndex, b);
if (!b) {
int i = getHcNetSDK().NET_DVR_GetLastError();
log.error("梯控控制失败, errCode={}", i);
}
return b;
}
}

View File

@@ -1,4 +0,0 @@
package org.dromara.sis.sdk.hik.service;
public class FaceService extends SdkBaseServer{
}

View File

@@ -1,155 +0,0 @@
package org.dromara.sis.sdk.hik.service;
import cn.hutool.core.util.StrUtil;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBException;
import jakarta.xml.bind.Marshaller;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.Base64Utils;
import org.dromara.sis.sdk.hik.HCNetSDK;
import org.dromara.sis.sdk.hik.model.upload.FaceAppendData;
import org.dromara.sis.sdk.hik.model.upload.SimpleMemory;
import org.dromara.sis.sdk.hik.model.upload.UploadStatus;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import static org.dromara.sis.sdk.hik.HCNetSDK.IMPORT_DATA_TO_FACELIB;
/**
* 海康上传服务
*/
@Slf4j
public class FdLibUploadService extends SdkBaseServer {
/**
* 上传文件到人脸库
*
* @param luserId 登录句柄
* @return 返回上传句柄
*/
public static int uploadFile(int luserId, int libId) {
HCNetSDK.NET_DVR_FACELIB_COND param = new HCNetSDK.NET_DVR_FACELIB_COND();
param.dwSize = param.size();
byte[] bytes = String.valueOf(libId).getBytes();
System.arraycopy(bytes, 0, param.szFDID, 0, bytes.length);
param.byConcurrent = 0; // 设备并发处理0- 不开启(设备自动会建模)1- 开始(设备不会自动进行建模)
param.byCover = 1;
param.byCustomFaceLibID = 0;
param.byPictureSaveMode = 0;
int dwInBufferSize = param.size();
param.write();
return hcNetSDK.NET_DVR_UploadFile_V40(luserId, IMPORT_DATA_TO_FACELIB, param.getPointer(), dwInBufferSize, null, null, 0);
}
/**
* 上传数据发送
*
* @param lUploadHandle 文件上传句柄NET_DVR_UploadFile_V40的返回值
* @param data 上传文件的二进制数据
* @param fileType 文件的类型
* @return -1表示失败大于等于0表示本次发送成功的字节数未发送成功的剩余字节数可以再次调用该接口进行发送。
*/
public static int uploadSend(int lUploadHandle, byte[] data, byte fileType, FaceAppendData userInfo) throws JAXBException {
HCNetSDK.NET_DVR_SEND_PARAM_IN param = new HCNetSDK.NET_DVR_SEND_PARAM_IN();
SimpleMemory memory = new SimpleMemory(data.length);
memory.write(0, data, 0, data.length);
// 设置人像附加信息
JAXBContext context = JAXBContext.newInstance(FaceAppendData.class);
Marshaller marshaller = context.createMarshaller();
// 转换为字符串
StringWriter writer = new StringWriter();
marshaller.marshal(userInfo, writer);
String xmlString = writer.toString();
byte[] faceBytes = xmlString.getBytes();
SimpleMemory addendData = new SimpleMemory(faceBytes.length);
addendData.write(0, faceBytes, 0, faceBytes.length);
param.pSendData = memory;
param.dwSendDataLen = data.length;
param.byPicType = fileType;
param.pSendAppendData = addendData;
param.dwSendAppendDataLen = faceBytes.length;
return hcNetSDK.NET_DVR_UploadSend(lUploadHandle, param, null);
}
/**
* 查询上传数据进度
*
* @param lUploadHandle 文件上传句柄NET_DVR_UploadFile_V40的返回值
* @return -1表示函数调用失败其他为上传的状态值见下表说明。接口返回失败请调用NET_DVR_GetLastError获取错误码通过错误码判断出错原因。
* -1表示调用失败
* 1上传成功
* 2正在上传
* 3上传失败
* 其他状态码请参考sdk开发文档
*/
public static UploadStatus getUploadState(int lUploadHandle) {
IntByReference reference = new IntByReference(0);
int i = hcNetSDK.NET_DVR_GetUploadState(lUploadHandle, reference.getPointer());
UploadStatus status = new UploadStatus();
status.setStatusCode(i);
status.setProcess(reference.getValue());
return status;
}
public static String getUploadResult(int lUploadHandle) {
HCNetSDK.NET_DVR_UPLOAD_FILE_RET params = new HCNetSDK.NET_DVR_UPLOAD_FILE_RET();
params.write();
Pointer lpOutBuffer = params.getPointer();
int dwOutBufferSize = params.size();
boolean b = hcNetSDK.NET_DVR_GetUploadResult(lUploadHandle, lpOutBuffer, dwOutBufferSize);
if (b) {
params.read();
String url = new String(params.sUrl, StandardCharsets.UTF_8);
if (StrUtil.isNotEmpty(url)) {
return url.trim();
}
}
return null;
}
public static boolean uploadClose(int lUploadHandle) {
// TRUE表示成功FALSE表示失败。接口返回失败请调用NET_DVR_GetLastError获取错误码通过错误码判断出错原因。
boolean b = hcNetSDK.NET_DVR_UploadClose(lUploadHandle);
if (b) {
log.info("文件上传关闭成功, lUploadHandle:{}", lUploadHandle);
} else {
int errorCode = hcNetSDK.NET_DVR_GetLastError();
System.out.println("文件上传关闭失败, errorCode:" + errorCode);
}
return b;
}
public static int download(int luserId, String url, HCNetSDK.DownloadCallBack callback) {
HCNetSDK.NET_DVR_DOWNLOAD_FILEVOLUME_PARAM param = new HCNetSDK.NET_DVR_DOWNLOAD_FILEVOLUME_PARAM();
byte[] fns = url.getBytes();
System.arraycopy(fns, 0, param.sUrl, 0, fns.length);
param.fnDownloadDataCB = callback;
param.write();
param.dwSize = param.size();
int i = hcNetSDK.NET_DVR_StartDownload(luserId, 20, param, param.dwSize, null);
if (i == -1) {
log.info("发起图片下载失败lDownloadHandle={}, errorCode={}", i, getErrorCode());
}
return i;
}
/**
* 关闭文件下载
*
* @param lDownloadHandle 下载句柄
*/
public static void stopDownload(int lDownloadHandle) {
boolean b = hcNetSDK.NET_DVR_StopDownload(lDownloadHandle);
if (b) {
log.info("文件下载关闭成功, lDownloadHandle={}", lDownloadHandle);
} else {
System.out.println("文件下载关闭失败, errorCode:" + getErrorCode());
}
}
}

View File

@@ -1,58 +0,0 @@
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

@@ -1,140 +0,0 @@
package org.dromara.sis.sdk.hik.service;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
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 soFilePath = System.getProperty("user.dir") + "/lib/libhcnetsdk.so";
log.info("linux系统加载库路径: {}", soFilePath);
hcNetSDK = (HCNetSDK) Native.loadLibrary(soFilePath, 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;
}
/**
* 开启hik 设备报警
*
* @param iIndex 回调函数索引,取值范围:[0,15]
* @param callBack 回调函数
* @return
*/
public static boolean setAlarmCallBack(int iIndex, HCNetSDK.FMSGCallBack_V31 callBack) {
boolean b = hcNetSDK.NET_DVR_SetDVRMessageCallBack_V50(iIndex, callBack, null);
if (b) {
log.info("hik 报警回调函数设置完成iIndex={}", iIndex);
}
return b;
}
public static boolean setAlarmChan(int lUserID) {
//报警布防参数设置
HCNetSDK.NET_DVR_SETUPALARM_PARAM_V50 m_strAlarmInfoV50 = new HCNetSDK.NET_DVR_SETUPALARM_PARAM_V50();
m_strAlarmInfoV50.dwSize = m_strAlarmInfoV50.size();
m_strAlarmInfoV50.byLevel = 0; //布防等级
m_strAlarmInfoV50.byAlarmInfoType = 1; // 智能交通报警信息上传类型0- 老报警信息NET_DVR_PLATE_RESULT1- 新报警信息(NET_ITS_PLATE_RESULT)
m_strAlarmInfoV50.byRetAlarmTypeV40 = 1; //0- 移动侦测、视频丢失、遮挡、IO信号量等报警信息以普通方式上传报警类型COMM_ALARM_V30报警信息结构体NET_DVR_ALARMINFO_V30
// 1- 报警信息以数据可变长方式上传报警类型COMM_ALARM_V40报警信息结构体NET_DVR_ALARMINFO_V40设备若不支持则仍以普通方式上传
m_strAlarmInfoV50.byDeployType = 0; //布防类型0-客户端布防1-实时布防
m_strAlarmInfoV50.write();
int lAlarmHandle = hcNetSDK.NET_DVR_SetupAlarmChan_V50(lUserID, m_strAlarmInfoV50, Pointer.NULL, 0);
if (lAlarmHandle == -1) {
System.err.println("布防失败,错误码为" + hcNetSDK.NET_DVR_GetLastError());
return false;
} else {
System.out.println("布防成功");
return true;
}
}
public static int getErrorCode() {
return getHcNetSDK().NET_DVR_GetLastError();
}
/**
* 登出操作
*/
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();
}
}
}

View File

@@ -31,6 +31,7 @@ public class VideoAlarmService {
private final E8PlatformApi e8PlatformApi;
private final ISisAccessControlService sisAccessControlService;
private final ISisDeviceBindRefService deviceBindRefService;
private final HikApiService hikApiService;
public void handleAlarmData(UvModel.AlarmReportInfo alarmReportData) {
@@ -132,9 +133,9 @@ public class VideoAlarmService {
compareResults.forEach(result -> {
// 下发梯控权限数据
// List<Integer> arrs = Arrays.asList(2, 2, 2, 3, 3, 3 ,3, 3, 3, 3, 3, 3, 3, 3, 3, 3);
List<Integer> arrs = Arrays.asList(3, 3, 3, 2, 2, 2 ,2, 2, 2, 2, 2, 2, 2, 2, 2, 2);
List<Integer> arrs = Arrays.asList(3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2);
for (int i = 0; i < arrs.size(); i++) {
HikApiService.getInstance().controlGateway("192.168.24.188", (i + 1), arrs.get(i));
hikApiService.controlGateway("192.168.24.188", (i + 1), arrs.get(i));
}
});

View File

@@ -155,7 +155,6 @@ public class ZLMediaKitServiceImpl implements ZLMediaKitService {
}
}
private AddStreamProxyResp addStreamProxy(String app, String stream, String url) {
Map<String, Object> commonParams = getCommonParams();
commonParams.put("vhost", zlmConfig.getVhost());
@@ -243,8 +242,8 @@ public class ZLMediaKitServiceImpl implements ZLMediaKitService {
commonParams.put("src_url", url);
commonParams.put("dst_url", targetUrl);
commonParams.put("timeout_ms", 10000);
commonParams.put("enable_hls", true);
commonParams.put("enable_mp4", true);
commonParams.put("enable_hls", false);
commonParams.put("enable_mp4", false);
R<AddStreamProxyResp> result = HttpClientUtil.get(getRequestUrl("addFFmpegSource"), commonParams, AddStreamProxyResp.class);
if (result != null) {
if (result.getCode() == 0) {

View File

@@ -193,7 +193,7 @@ public class SisAlarmEventsServiceImpl implements ISisAlarmEventsService {
Date now = new Date();
SisAlarmEvents alarmEvents = new SisAlarmEvents();
alarmEvents.setBigType(EventBigTypeEnum.EQUIPMENT_UP.getCode());
alarmEvents.setSmallType(EventSmallTypeEnum.EQP_REPORT_SBSB.getCode());
alarmEvents.setSmallType(EventSmallTypeEnum.SMART_REPORT_ZJCR.getCode());
alarmEvents.setLevel(Long.valueOf(level));
alarmEvents.setDeviceIp(deviceIp);
alarmEvents.setDeviceName(sisDeviceManage.getDeviceName());
@@ -202,11 +202,12 @@ public class SisAlarmEventsServiceImpl implements ISisAlarmEventsService {
alarmEvents.setState(AlarmStatus.REPORTED.getCode());
alarmEvents.setTenantId(sisDeviceManage.getTenantId());
alarmEvents.setCreateDept(sisDeviceManage.getCreateDept());
// -1 默认为系统创建
alarmEvents.setCreateBy(-1L);
// 默认服务时间为2个小时
alarmEvents.setServBeginTime(now);
alarmEvents.setServEndTime(DateUtil.offset(now, DateField.HOUR, 2));
alarmEvents.setDescription(EventSmallTypeEnum.SMART_REPORT_ZJCR.getDesc());
int insert = this.baseMapper.insert(alarmEvents);
log.info("写入报警事件表完成num={}", insert);

View File

@@ -21,9 +21,9 @@ import org.dromara.sis.domain.bo.SisDeviceManageBo;
import org.dromara.sis.domain.vo.SisDeviceChannelVo;
import org.dromara.sis.domain.vo.SisDeviceGroupVo;
import org.dromara.sis.mapper.SisDeviceChannelMapper;
import org.dromara.sis.sdk.hik.DeviceInfo;
import org.dromara.sis.sdk.hik.HikApiService;
import org.dromara.sis.sdk.hik.HikSdkConstans;
import org.dromara.sis.sdk.hik.model.DeviceInfo;
import org.dromara.sis.sdk.hik.HikConstants;
import org.dromara.sis.service.ISisDeviceChannelService;
import org.dromara.sis.service.ISisDeviceGroupService;
import org.springframework.scheduling.annotation.Async;
@@ -47,6 +47,9 @@ public class SisDeviceChannelServiceImpl implements ISisDeviceChannelService {
private final SisDeviceChannelMapper baseMapper;
private final ISisDeviceGroupService deviceGroupService;
private HikApiService hikApiService;
/**
* 查询设备通道管理
@@ -206,7 +209,7 @@ public class SisDeviceChannelServiceImpl implements ISisDeviceChannelService {
@Override
public void handleHikDeviceChannel(SisDeviceManageBo bo) {
// 调用hik sdk登录
boolean isLogin = HikApiService.getInstance().login(bo.getDeviceIp(), bo.getDevicePort().shortValue(), bo.getDeviceAccount(), bo.getDevicePwd());
boolean isLogin = hikApiService.login(bo.getDeviceIp(), bo.getDevicePort().shortValue(), bo.getDeviceAccount(), bo.getDevicePwd(), bo.getDeviceType());
if (!isLogin) {
throw new RuntimeException("海康设备添加失败.");
}
@@ -220,12 +223,12 @@ public class SisDeviceChannelServiceImpl implements ISisDeviceChannelService {
channel.setChannelName(bo.getDeviceName());
channel.setGroupId(bo.getGroupId());
channel.setDeviceIp(bo.getDeviceIp());
channel.setDevicePort(HikSdkConstans.DEFAULT_RTSP_PORT);
channel.setDevicePort(HikConstants.DEFAULT_RTSP_PORT);
channel.setFactoryNo(bo.getFactoryNo());
channel.setDeviceAccount(bo.getDeviceAccount());
channel.setDevicePwd(bo.getDevicePwd());
channel.setDeviceMac(bo.getDeviceMac());
channel.setChannelNo(HikSdkConstans.DEFAULT_CHANNEL);
channel.setChannelNo(HikConstants.DEFAULT_CHANNEL);
channel.setTenantId(bo.getTenantId());
// 默认设备在线
channel.setChannelState(1);
@@ -235,7 +238,7 @@ public class SisDeviceChannelServiceImpl implements ISisDeviceChannelService {
log.info("设备通道[{}]已存在,放弃添加通道信息", bo.getDeviceIp());
}
} else if (DeviceTypeEnum.NVR.getType().equals(bo.getDeviceType()) || DeviceTypeEnum.DVR.getType().equals(bo.getDeviceType())) {
DeviceInfo channelInfo = HikApiService.getInstance().getChannelInfo(bo.getDeviceIp());
DeviceInfo channelInfo = hikApiService.getChannelInfo(bo.getDeviceIp());
if (channelInfo != null && CollUtil.isNotEmpty(channelInfo.getChannelInfo())) {
List<SisDeviceChannel> insertChannels = new ArrayList<>(channelInfo.getChannelInfo().size());
List<SisDeviceChannel> updateChannels = new ArrayList<>(channelInfo.getChannelInfo().size());
@@ -251,19 +254,19 @@ public class SisDeviceChannelServiceImpl implements ISisDeviceChannelService {
channel.setDeviceIp(item.getChannelIp());
channel.setDevicePort(Integer.valueOf(item.getChannelPort()));
channel.setDeviceAccount(item.getChannelAccount());
channel.setFactoryNo(channelInfo.getFactoryNo());
channel.setChannelNo(HikSdkConstans.DEFAULT_CHANNEL);
channel.setFactoryNo(bo.getFactoryNo());
channel.setChannelNo(HikConstants.DEFAULT_CHANNEL);
channel.setChannelState(item.getChannelStatus());
if (StrUtil.isNotEmpty(item.getChannelPwd())) {
channel.setDevicePwd(item.getChannelPwd());
}
// nvr 设备信息
channel.setNvrIp(bo.getDeviceIp());
channel.setNvrPort(HikSdkConstans.DEFAULT_RTSP_PORT);
channel.setNvrPort(HikConstants.DEFAULT_RTSP_PORT);
channel.setNvrAccount(bo.getDeviceAccount());
channel.setNvrPwd(bo.getDevicePwd());
channel.setNvrFactoryNo(bo.getFactoryNo());
channel.setNvrChannelNo(item.getChannelId() + HikSdkConstans.DEFAULT_CHANNEL_PREFX);
channel.setNvrChannelNo(item.getChannelId() + HikConstants.DEFAULT_CHANNEL_PREFX);
// 系统设备信息
channel.setDeviceMac(bo.getDeviceMac());
@@ -271,7 +274,7 @@ public class SisDeviceChannelServiceImpl implements ISisDeviceChannelService {
channel.setDeviceId(bo.getId());
channel.setGroupId(bo.getGroupId());
channel.setChannelName(item.getChannelName());
channel.setChannelNo(item.getChannelId() + HikSdkConstans.DEFAULT_CHANNEL_PREFX);
channel.setChannelNo(item.getChannelId() + HikConstants.DEFAULT_CHANNEL_PREFX);
channel.setTenantId(bo.getTenantId());
if (isUpdate) {
updateChannels.add(channel);

View File

@@ -42,6 +42,7 @@ public class SisDeviceManageServiceImpl implements ISisDeviceManageService {
private final SisDeviceManageMapper baseMapper;
private final ISisDeviceChannelService deviceChannelService;
private final HikApiService hikApiService;
/**
* 查询设备管理
@@ -172,7 +173,7 @@ public class SisDeviceManageServiceImpl implements ISisDeviceManageService {
// 删除设备
deviceIds.add(item.getId());
if (FactoryNoEnum.HIK.getCode().equals(item.getFactoryNo())) {
HikApiService.getInstance().loginOut(item.getDeviceIp());
hikApiService.loginOut(item.getDeviceIp());
}
});
int num = deviceChannelService.deleteByDeviceIds(deviceIds);

View File

@@ -50,7 +50,7 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer
private final ISisElevatorFloorChannelRefService elevatorFloorChannelRefService;
private final E8PlatformApi e8PlatformApi;
private final ISisAlarmEventsService alarmEventsService;
private final HikApiService hikApiService;
private final CleanLiftAuthRocketProducer cleanLiftAuthRocketProducer;
@DubboReference
@@ -150,11 +150,11 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer
if (channelRefVo != null) {
if (channelRefVo.getDownChannel() != null) {
HikApiService.getInstance().controlGateway(ele.getControlIp(), channelRefVo.getDownChannel().intValue(), 2);
hikApiService.controlGateway(ele.getControlIp(), channelRefVo.getDownChannel().intValue(), 2);
}
if (channelRefVo.getUpChannel() != null) {
HikApiService.getInstance().controlGateway(ele.getControlIp(), channelRefVo.getUpChannel().intValue(), 2);
hikApiService.controlGateway(ele.getControlIp(), channelRefVo.getUpChannel().intValue(), 2);
}
}
cleanLiftAuthRocketProducer.sendMessage(item.getBindId(), 0L, item.getDeviceFloorId(), "清除电梯" + item.getBindId() + "梯控权限", 3);
@@ -210,11 +210,11 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer
log.info("开始下发外部面板梯控权限....");
for (SisElevatorFloorRefVo ref : eleRef) {
if (ref.getUpChannel() != null && Objects.equals(ref.getFloorId(), deviceFloorId)) {
HikApiService.getInstance().controlGateway(ele.getControlIp(), ref.getUpChannel().intValue(), 2);
hikApiService.controlGateway(ele.getControlIp(), ref.getUpChannel().intValue(), 2);
}
if (ref.getDownChannel() != null && Objects.equals(ref.getFloorId(), deviceFloorId)) {
HikApiService.getInstance().controlGateway(ele.getControlIp(), ref.getDownChannel().intValue(), 2);
hikApiService.controlGateway(ele.getControlIp(), ref.getDownChannel().intValue(), 2);
}
}
cleanLiftAuthRocketProducer.sendMessage(deviceId, groupId, deviceFloorId, "清除电梯" + deviceId + "梯控权限", 3);

View File

@@ -31,6 +31,7 @@ import java.util.Objects;
public class SyncLiftAuthTask {
private final E8PlatformApi apiService;
private final HikApiService hikApiService;
/**
* 同步电梯权限
@@ -88,7 +89,7 @@ public class SyncLiftAuthTask {
RedisUtils.setCacheObject(redisKey, recordId);
RedisUtils.expire(redisKey, 10);
for (int i = 0; i < 18; i++) {
HikApiService.getInstance().controlGateway(controlIP, (i + 1), 2);
hikApiService.controlGateway(controlIP, (i + 1), 2);
}
}
} else {
@@ -96,7 +97,7 @@ public class SyncLiftAuthTask {
RedisUtils.setCacheObject(redisKey, recordId);
RedisUtils.expire(redisKey, 10);
for (int i = 0; i < 18; i++) {
HikApiService.getInstance().controlGateway(controlIP, (i + 1), 2);
hikApiService.controlGateway(controlIP, (i + 1), 2);
}
}
}

View File

@@ -152,6 +152,13 @@ public class HikDeviceCheckStateTask {
* @return 返回设备是否在线
*/
private boolean updateDeviceStatus(RemoteSisDeviceManage item) {
Integer deviceType = item.getDeviceType();
if(item.getDeviceType().equals(DeviceTypeEnum.IPC.getType())) {
} else {
}
// 调用设备登录验证次设备在线
Boolean isLogin = remoteHikSdkService.deviceLogin(item);
int onLineState = isLogin ? 1 : 0;