springboot集成大华人脸机
·
一、先去官网(support)下载对应的demo
![]()
二、将demo中全量文件复制到springboot新建的包下,然后全局替换 com.netsdk. 为 自己建的包名前缀
三、将res下文件复制到resources文件夹下,将libs复制到resources文件夹下



四、将jna.jar通过mvn安装到本地maven库中,然后通过pom引入项目
<dependency>
<groupId>com.dahua.netsdk</groupId>
<artifactId>dahua-netsdk-jna</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.4.0</version>
</dependency>
五、win+R输入 %temp%,将下图win64下文件复制到temp文件夹中

六、编写测试代码,默认连接地址:默认ip:192.168.1.108 port 37777
public class Test {
public static void main(String[] args) throws InterruptedException {
LoginModule.init(new NetSDKLib.fDisConnect() {
@Override
public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
System.out.println(1);
}
}, new NetSDKLib.fHaveReConnect() {
@Override
public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
System.out.println(2);
}
});
boolean login = LoginModule.login("192.168.1.108", 37777, "admin", "admin123");
System.out.println(login);
// AttendanceModule.UserData user = AttendanceModule.getUser("006");
// System.out.println(user.userName);
AttendanceModule.realLoadPicture(new fAnalyzerDataCB());
Thread.sleep(1*60*60*1000);
}
public static class fAnalyzerDataCB implements NetSDKLib.fAnalyzerDataCallBack {
public final EventQueue eventQueue = Toolkit.getDefaultToolkit().getSystemEventQueue();
@Override
public int invoke(NetSDKLib.LLong lAnalyzerHandle, int dwAlarmType,
Pointer pAlarmInfo, Pointer pBuffer, int dwBufSize,
Pointer dwUser, int nSequence, Pointer reserved) {
if(pAlarmInfo == null) {
return 0;
}
System.out.println("门禁事件回调");
switch(dwAlarmType) {
case NetSDKLib.EVENT_IVS_ACCESS_CTL: // 门禁事件
NetSDKLib.DEV_EVENT_ACCESS_CTL_INFO event = new NetSDKLib.DEV_EVENT_ACCESS_CTL_INFO();
ToolKits.GetPointerData(pAlarmInfo, event);
System.out.println("门禁事件回调信息");
System.out.println("id:"+new String(event.szUserID).trim());
System.out.println("卡名:"+new String(event.szCardName).trim());
break;
default:
break;
}
return 0;
}
}
}
七、多设备登录原生代码
package com.ruoyi.protect.facemachine.fk;
import com.ruoyi.protect.facemachine.lib.NetSDKLib;
import com.ruoyi.protect.facemachine.lib.ToolKits;
import com.ruoyi.protect.facemachine.lib.enumeration.EM_EVENT_IVS_TYPE;
import com.ruoyi.protect.facemachine.lib.enumeration.EM_EVENT_TYPE;
import com.sun.jna.Memory;
import com.sun.jna.Pointer;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.*;
import static com.ruoyi.protect.facemachine.lib.Utils.getOsPrefix;
/**
* @author 291189
* @version 1.0
* @description 2022基线功能
* 多设备登录,智能订阅 ,取消智能订阅;以及智能订阅dwUser的使用。
* @date 2022/10/10 15:54
*/
public class BaseMoreLoginDemo {
public static NetSDKLib netSdk = NetSDKLib.NETSDK_INSTANCE;
static List<Device> deviceList=new ArrayList<>();
static {
// 初始化SDK库
netSdk.CLIENT_Init(DisconnectCallback.getInstance(), null);
// 设置断线重连成功回调函数
netSdk.CLIENT_SetAutoReconnect(HaveReconnectCallback.getInstance(), null);
//打开日志,可选0
NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO();
String logPath = new File(".").getAbsoluteFile().getParent() + File.separator + "sdk_log" + File.separator + "sdk.log";
setLog.bSetFilePath = 1;
System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length);
setLog.bSetPrintStrategy = 1;
setLog.nPrintStrategy = 0;
if (!netSdk.CLIENT_LogOpen(setLog)){
System.err.println("Open SDK Log Failed!!!");
}
}
/**
* 设备断线回调
*/
private static class DisconnectCallback implements NetSDKLib.fDisConnect {
private static DisconnectCallback instance = new DisconnectCallback();
private DisconnectCallback() {
}
public static DisconnectCallback getInstance() {
return instance;
}
public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
System.out.printf("Device[%s:%d] Disconnect!\n", pchDVRIP, nDVRPort);
System.out.println(deviceList);
}
}
/**
* 设备重连回调
*/
private static class HaveReconnectCallback implements NetSDKLib.fHaveReConnect {
private static HaveReconnectCallback instance = new HaveReconnectCallback();
private HaveReconnectCallback() {
}
public static HaveReconnectCallback getInstance() {
return instance;
}
public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
System.out.printf("Device[%s:%d] HaveReconnected!\n", pchDVRIP, nDVRPort);
System.out.println(deviceList);
}
}
/**
* 高安全登录
*/
public NetSDKLib.LLong loginWithHighLevel(String ip,int port,String user,String password) {
// 输入结构体参数
NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstlnParam = new NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY() {
{
szIP = ip.getBytes();
nPort = port;
szUserName = user.getBytes();
szPassword = password.getBytes();
}
};
// 输出结构体参数
NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY pstOutParam = new NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY();
// 写入sdk
NetSDKLib.LLong loginHandle = netSdk.CLIENT_LoginWithHighLevelSecurity(pstlnParam, pstOutParam);
if (loginHandle.longValue() == 0) {
// System.err.printf("Login Device[%s] Port[%d]Failed. %s\n", ip, port, netSdk.CLIENT_GetLastError());
System.out.println("Login Device[%s] Port[%d]Failed. "+ ip+":"+ port+":"+ netSdk.CLIENT_GetLastError());
} else {
NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = pstOutParam.stuDeviceInfo; // 获取设备信息
System.out.println("Login Success");
System.out.println("Device Address:" + ip);
System.out.println("设备包含:" + deviceInfo.byChanNum + "个通道");
}
return loginHandle;
}
/**
* 退出清理环境
*/
public void LoginOut(NetSDKLib.LLong lLong){
System.out.println("End Test");
if( lLong.longValue() != 0)
{
netSdk.CLIENT_Logout(lLong);
}
System.out.println("See You...");
}
public class Device{
public String ip;
public int port;
public NetSDKLib.LLong loginHandler=new NetSDKLib.LLong(0);//登录句柄
public List<DeviceHandler> deviceHandlers=new ArrayList<>();//订阅句柄
public Device() {
}
@Override
public String toString() {
return "Device{" +
"ip='" + ip + '\'' +
", port=" + port +
", loginHandler=" + loginHandler.longValue()+
'}';
}
}
public class DeviceHandler{
public int channel;
public NetSDKLib.LLong attachHandler=new NetSDKLib.LLong(0);//订阅句柄
public String dwUser;
@Override
public String toString() {
return "DeviceHandler{" +
"channel=" + channel +
", attachHandler=" + attachHandler +
", dwUser=" + dwUser +
'}';
}
}
/**
* 订阅智能任务
*/
//存储dwuser,防止回收
static HashMap<NetSDKLib.LLong,Pointer> pointers=new HashMap<>();
public NetSDKLib.LLong AttachEventRealLoadPic(NetSDKLib.LLong loginHandle,NetSDKLib.LLong attachHandle,int channel,String dwUser) {
// 先退订,设备不会对重复订阅作校验,重复订阅后会有重复的事件返回
if(attachHandle.longValue()!=0){
this.DetachEventRealLoadPic(attachHandle);
}
Pointer dwUserData = GetStringToPointer(dwUser,encode);
// 需要图片
int bNeedPicture = 1;
attachHandle = netSdk.CLIENT_RealLoadPictureEx(loginHandle, channel, EM_EVENT_TYPE.EVENT_IVS_ALL.getType(), bNeedPicture,
AnalyzerDataCB.getInstance(), dwUserData, null);
if (attachHandle.longValue() != 0) {
System.out.printf("Chn[%d] CLIENT_RealLoadPictureEx Success\n", channel);
pointers.put(attachHandle,dwUserData);
} else {
System.out.printf("Chn[%d] CLIENT_RealLoadPictureEx Failed!LastError = %s\n", channel,
ToolKits.getErrorCodePrint());
}
return attachHandle;
}
public static Pointer GetStringToPointer(String src,String charset) {
Pointer pointer = null;
try {
byte[] b = src.getBytes(charset);
pointer = new Memory(b.length + 1);
pointer.clear(b.length + 1);
pointer.write(0, b, 0, b.length);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return pointer;
}
public static String GetPointerDataToString(Pointer pointer,String charset) {
String str = "";
if (pointer == null) {
return str;
}
int length = 0;
byte[] bufferPlace = new byte[1];
for (int i = 0; i < 2048; i++) {
pointer.read(i, bufferPlace, 0, 1);
if (bufferPlace[0] == '\0') {
length = i;
break;
}
}
if (length > 0) {
byte[] buffer = new byte[length];
pointer.read(0, buffer, 0, length);
try {
str = new String(buffer, charset).trim();
} catch (UnsupportedEncodingException e) {
return str;
}
}
return str;
}
/**
* 报警事件(智能)回调
*/
public static class AnalyzerDataCB implements NetSDKLib.fAnalyzerDataCallBack {
private final File picturePath;
private static AnalyzerDataCB instance;
private AnalyzerDataCB() {
picturePath = new File("./AnalyzerPicture/");
if (!picturePath.exists()) {
picturePath.mkdirs();
}
}
public static AnalyzerDataCB getInstance() {
if (instance == null) {
synchronized (AnalyzerDataCB.class) {
if (instance == null) {
instance = new AnalyzerDataCB();
}
}
}
return instance;
}
@Override
public int invoke(NetSDKLib.LLong lAnalyzerHandle, int dwAlarmType, Pointer pAlarmInfo, Pointer pBuffer, int dwBufSize,
Pointer dwUser, int nSequence, Pointer reserved) {
if (lAnalyzerHandle == null || lAnalyzerHandle.longValue() == 0) {
return -1;
}
String s = GetPointerDataToString(dwUser,encode);
System.out.println("方法一 dwUser的值:"+s);
for(int i=0;i<deviceList.size();i++){
Device device = deviceList.get(i);
List<DeviceHandler> deviceHandlers = device.deviceHandlers;
for(DeviceHandler deviceHandler:deviceHandlers){
if(deviceHandler.attachHandler.longValue()==lAnalyzerHandle.longValue()){
System.out.println("方法二 根据句柄关联:"+ "订阅句柄:"+deviceHandler.attachHandler+
",设备信息:"+device.ip+":"+device.port+",通道号:"+deviceHandler.channel);
}
}
}
switch (Objects.requireNonNull(EM_EVENT_IVS_TYPE.getEventType(dwAlarmType))) {
case EVENT_IVS_FACEDETECT : {
System.out.println("目标检测事件");
break;
}
//目标识别事件
case EVENT_IVS_FACERECOGNITION:{
System.out.println("目标识别事件");
break;
}
case EVENT_IVS_NUMBERSTAT:{
System.out.println("数量统计事件");
break;
}
default:
System.out.println("其他事件--------------------"+ dwAlarmType);
NetSDKLib.DEV_EVENT_ACCESS_CTL_INFO event = new NetSDKLib.DEV_EVENT_ACCESS_CTL_INFO();
ToolKits.GetPointerData(pAlarmInfo, event);
System.out.println(new String(event.szCardName).trim());
break;
}
return 0;
}
}
/**
* 停止侦听智能事件
*/
public void DetachEventRealLoadPic( NetSDKLib.LLong attachHandle) {
if (attachHandle.longValue() != 0) {
boolean b = netSdk.CLIENT_StopLoadPic(attachHandle);
if(b){
System.out.println("CLIENT_StopLoadPic success");
}else {
System.out.println("CLIENT_StopLoadPic fail!"+ToolKits.getErrorCodeShow());
}
}
}
static Scanner scanner=new Scanner(System.in);
public static void main(String[] args) {
BaseMoreLoginDemo baseMoreLoginDemo=new BaseMoreLoginDemo();
baseMoreLoginDemo.runLogic();
}
public void runLogic(){
while (true){
System.out.println("0.退出");
System.out.println("1.设备登录");
System.out.println("2.选择设备 通道 智能订阅");
System.out.println("3.选择设备 通道 取消订阅");
for(int i=0;i<deviceList.size();i++){
Device device = deviceList.get(i);
System.out.println("设备下标:"+i+":"+device.toString());
List<DeviceHandler> deviceHandlers = device.deviceHandlers;
for(int j=0;j<deviceHandlers.size();j++){
DeviceHandler deviceHandler = deviceHandlers.get(j);
System.out.println("订阅通道下标:"+j+":"+deviceHandler.toString());
}
}
try {
int nextInt = scanner.nextInt();
if(nextInt==0){
break;
}else if(nextInt==1){
System.out.println("输入设备ip,端口,用户名,密码 逗号隔开;如:10.34.3.159,37777,admin,admin");
String next = scanner.next();
String[] split = next.split(",");
NetSDKLib.LLong lLong = loginWithHighLevel(split[0].trim(), Integer.parseInt(split[1].trim()), split[2], split[3]);
Device device=new Device();
device.ip=split[0].trim();
device.port=Integer.parseInt(split[1].trim());
device.loginHandler=lLong;
deviceList.add(device);
System.out.println("login_id:"+lLong.toString());
}else if(nextInt==2){
System.out.println("选择设备下标和通道号进行订阅 逗号隔开 如 1,-1 ");
String next = scanner.next();
String[] split = next.split(",");
Device device = deviceList.get(Integer.parseInt(split[0].trim()));
int channl = Integer.parseInt(split[1].trim());
List<DeviceHandler> deviceHandlers = device.deviceHandlers;
NetSDKLib.LLong attachHandler=new NetSDKLib.LLong(0);
boolean flag=false;
int m=-1;
//轮询 设备的订阅通道
for( int i=0;i<deviceHandlers.size();i++){
DeviceHandler deviceHandler= deviceHandlers.get(i);
if(deviceHandler.channel==channl){
m=i;
attachHandler=deviceHandler.attachHandler;
flag=true;
break;
}
}
DeviceHandler deviceHandler=new DeviceHandler();
String dwUser= "设备信息:"+device.ip + ":" + device.port+": 通道号:"+channl;
deviceHandler.dwUser=dwUser;
deviceHandler.channel=channl;
attachHandler = AttachEventRealLoadPic(device.loginHandler, attachHandler,channl ,dwUser);
deviceHandler.attachHandler=attachHandler;
if(!flag){
deviceHandlers.add(deviceHandler);
}else {
deviceHandlers.remove(m);
deviceHandlers.add(deviceHandler);
}
}else if(nextInt==3){
System.out.println("选择设备下标 和 订阅通道下标 进行取消订阅 逗号隔开 如 1,1 ");
String next = scanner.next();
String[] split = next.split(",");
Device device = deviceList.get(Integer.parseInt(split[0].trim()));
List<DeviceHandler> deviceHandlers = device.deviceHandlers;
DeviceHandler deviceHandler
= deviceHandlers.get(Integer.parseInt(split[1].trim()));
DetachEventRealLoadPic(deviceHandler.attachHandler);
pointers.remove(deviceHandler.attachHandler);
deviceHandlers.remove(Integer.parseInt(split[1].trim()));
}else {
System.out.println("输入有误");
}
}catch (Exception e){
e.printStackTrace();
}
}
Iterator<Device> iterator = deviceList.iterator();
while (iterator.hasNext()){
Device next = iterator.next();
if(next!=null&&next.loginHandler!=null&&next.loginHandler.longValue()!=0){
LoginOut(next.loginHandler);
}
}
netSdk.CLIENT_Cleanup();
}
// 编码格式
public static String encode;
static {
String osPrefix = getOsPrefix();
if (osPrefix.toLowerCase().startsWith("win32-amd64")) {
encode = "GBK";
} else if (osPrefix.toLowerCase().startsWith("linux-amd64")) {
encode = "UTF-8";
}
}
}
八、改成集成到springboot中写法
package com.ruoyi.protect.facemachine.fk;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.ruoyi.protect.bean.door.po.TDoor;
import com.ruoyi.protect.dao.TDoorMapper;
import com.ruoyi.protect.enums.DoorStatusEnum;
import com.ruoyi.protect.facemachine.lib.NetSDKLib;
import com.ruoyi.protect.facemachine.lib.ToolKits;
import com.ruoyi.protect.facemachine.lib.enumeration.EM_EVENT_TYPE;
import com.sun.jna.Memory;
import com.sun.jna.Pointer;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.UnsupportedEncodingException;
import java.util.*;
import static com.ruoyi.protect.facemachine.lib.Utils.getOsPrefix;
@Component
@Slf4j
@RequiredArgsConstructor
public class DoorServiceNew {
private final TDoorMapper tDoorMapper ;
private final DisconnectCallback disconnectCallback ;
private final HaveReconnectCallback haveReconnectCallback ;
private final AnalyzerDataCB analyzerDataCB ;
public NetSDKLib netSdk = NetSDKLib.NETSDK_INSTANCE;
static List<DoorServiceNew.Device> deviceList=new ArrayList<>();
@PostConstruct
public void init(){
log.info("门禁设备开始初始化");
// 初始化SDK库
netSdk.CLIENT_Init(disconnectCallback, null);
// 设置断线重连成功回调函数
netSdk.CLIENT_SetAutoReconnect(haveReconnectCallback, null);
log.info("门禁设备初始化成功");
initLogin();
}
/**
* 高安全登录
*/
public NetSDKLib.LLong loginWithHighLevel(String ip,int port,String user,String password) {
// 输入结构体参数
NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstlnParam = new NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY() {
{
szIP = ip.getBytes();
nPort = port;
szUserName = user.getBytes();
szPassword = password.getBytes();
}
};
// 输出结构体参数
NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY pstOutParam = new NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY();
// 写入sdk
NetSDKLib.LLong loginHandle = netSdk.CLIENT_LoginWithHighLevelSecurity(pstlnParam, pstOutParam);
if (loginHandle.longValue() == 0) {
System.out.println("Login Device[%s] Port[%d]Failed. "+ ip+":"+ port+":"+ netSdk.CLIENT_GetLastError());
} else {
// 获取设备信息
NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = pstOutParam.stuDeviceInfo;
System.out.println("设备包含:" + deviceInfo.byChanNum + "个通道");
}
return loginHandle;
}
/**
* 退出清理环境
*/
public void LoginOut(NetSDKLib.LLong lLong){
System.out.println("End Test");
if( lLong.longValue() != 0)
{
netSdk.CLIENT_Logout(lLong);
}
System.out.println("See You...");
}
public class Device{
public Long id;
public String ip;
public int port;
public NetSDKLib.LLong loginHandler=new NetSDKLib.LLong(0);//登录句柄
public List<DoorServiceNew.DeviceHandler> deviceHandlers=new ArrayList<>();//订阅句柄
public Device() {
}
@Override
public String toString() {
return "Device{" +
"ip='" + ip + '\'' +
", port=" + port +
", loginHandler=" + loginHandler.longValue()+
'}';
}
}
public class DeviceHandler{
public int channel;
public NetSDKLib.LLong attachHandler=new NetSDKLib.LLong(0);//订阅句柄
public String dwUser;
@Override
public String toString() {
return "DeviceHandler{" +
"channel=" + channel +
", attachHandler=" + attachHandler +
", dwUser=" + dwUser +
'}';
}
}
/**
* 订阅智能任务
*/
//存储dwuser,防止回收
static HashMap<NetSDKLib.LLong,Pointer> pointers=new HashMap<>();
public NetSDKLib.LLong AttachEventRealLoadPic(NetSDKLib.LLong loginHandle,NetSDKLib.LLong attachHandle,int channel,String dwUser) {
// 先退订,设备不会对重复订阅作校验,重复订阅后会有重复的事件返回
if(attachHandle.longValue()!=0){
this.DetachEventRealLoadPic(attachHandle);
}
Pointer dwUserData = GetStringToPointer(dwUser,encode);
// 需要图片
int bNeedPicture = 1;
attachHandle = netSdk.CLIENT_RealLoadPictureEx(loginHandle, channel, EM_EVENT_TYPE.EVENT_IVS_ALL.getType(), bNeedPicture,
analyzerDataCB, dwUserData, null);
if (attachHandle.longValue() != 0) {
System.out.printf("Chn[%d] CLIENT_RealLoadPictureEx Success\n", channel);
pointers.put(attachHandle,dwUserData);
} else {
System.out.printf("Chn[%d] CLIENT_RealLoadPictureEx Failed!LastError = %s\n", channel,
ToolKits.getErrorCodePrint());
}
return attachHandle;
}
public static Pointer GetStringToPointer(String src,String charset) {
Pointer pointer = null;
try {
byte[] b = src.getBytes(charset);
pointer = new Memory(b.length + 1);
pointer.clear(b.length + 1);
pointer.write(0, b, 0, b.length);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return pointer;
}
/**
* 停止侦听智能事件
*/
public void DetachEventRealLoadPic( NetSDKLib.LLong attachHandle) {
if (attachHandle.longValue() != 0) {
boolean b = netSdk.CLIENT_StopLoadPic(attachHandle);
if(b){
System.out.println("CLIENT_StopLoadPic success");
}else {
System.out.println("CLIENT_StopLoadPic fail!"+ToolKits.getErrorCodeShow());
}
}
}
private void initLogin(){
List<TDoor> tDoors = tDoorMapper.selectList(new QueryWrapper<>());
if(tDoors != null && tDoors.size() > 0){
for (TDoor door : tDoors){
login(door.getId());
}
}
}
private void login(Long id){
TDoor door = tDoorMapper.selectById(id);
// -1代表所以通道
int channl = -1;
// 移除之前登录记录
if(deviceList != null & deviceList.size()>0){
Iterator<Device> it=deviceList.iterator();
while(it.hasNext()){
Device device = it.next();
if(device.id.equals(id)){
// 取消订阅
List<DoorServiceNew.DeviceHandler> deviceHandlers = device.deviceHandlers;
DoorServiceNew.DeviceHandler deviceHandler
= deviceHandlers.get(channl);
DetachEventRealLoadPic(deviceHandler.attachHandler);
pointers.remove(deviceHandler.attachHandler);
deviceHandlers.remove(channl);
log.info("取消订阅成功,id:{}", id);
// 退出登陆
LoginOut(device.loginHandler);
it.remove();
tDoorMapper.updateStatus(device.loginHandler.toString(), DoorStatusEnum.UN_LOGIN.getCode());
log.info("退出登陆成功,id:{}", id);
}
}
}
// 登录
NetSDKLib.LLong lLong = loginWithHighLevel(door.getIp(), door.getPort(), door.getUsername(), door.getPassword());
DoorServiceNew.Device device=new DoorServiceNew.Device();
device.id = door.getId();
device.ip=door.getIp();
device.port=door.getPort();
device.loginHandler=lLong;
deviceList.add(device);
log.info("登陆成功,id:{}", id);
// 订阅
List<DoorServiceNew.DeviceHandler> deviceHandlers = device.deviceHandlers;
NetSDKLib.LLong attachHandler=new NetSDKLib.LLong(0);
boolean flag=false;
int m=-1;
//轮询 设备的订阅通道
for( int i=0;i<deviceHandlers.size();i++){
DoorServiceNew.DeviceHandler deviceHandler= deviceHandlers.get(i);
if(deviceHandler.channel==channl){
m=i;
attachHandler=deviceHandler.attachHandler;
flag=true;
break;
}
}
DoorServiceNew.DeviceHandler deviceHandler=new DoorServiceNew.DeviceHandler();
String dwUser= "设备信息:"+device.ip + ":" + device.port+": 通道号:"+channl;
deviceHandler.dwUser=dwUser;
deviceHandler.channel=channl;
attachHandler = AttachEventRealLoadPic(device.loginHandler, attachHandler,channl ,dwUser);
deviceHandler.attachHandler=attachHandler;
if(!flag){
deviceHandlers.add(deviceHandler);
}else {
deviceHandlers.remove(m);
deviceHandlers.add(deviceHandler);
}
updateStatus(id, DoorStatusEnum.LOGIN.getCode(), lLong.toString());
log.info("订阅成功,id:{}", id);
}
private void updateStatus(Long id, Integer status, String loginId){
UpdateWrapper<TDoor> uw = new UpdateWrapper<>();
uw.lambda().eq(TDoor::getId, id);
uw.lambda().set(TDoor::getStatus, status);
uw.lambda().set(TDoor::getLoginId, loginId);
tDoorMapper.update(null, uw);
}
// 编码格式
public static String encode;
static {
String osPrefix = getOsPrefix();
if (osPrefix.toLowerCase().startsWith("win32-amd64")) {
encode = "GBK";
} else if (osPrefix.toLowerCase().startsWith("linux-amd64")) {
encode = "UTF-8";
}
}
}
三个回调类
/**
* 设备断线回调
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class DisconnectCallback implements NetSDKLib.fDisConnect {
private final TDoorMapper tDoorMapper;
public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
tDoorMapper.updateStatus(lLoginID.toString(), DoorStatusEnum.UN_LINE.getCode());
}
}
/**
* 设备重连回调
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class HaveReconnectCallback implements NetSDKLib.fHaveReConnect {
private final TDoorMapper tDoorMapper;
public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) {
tDoorMapper.updateStatus(lLoginID.toString(), DoorStatusEnum.LOGIN.getCode());
}
}
package com.ruoyi.protect.facemachine.fk;
/**
* @Author: WXM
* @Description:
* @Date: create in 2025/4/14 14:00
*/
import com.ruoyi.protect.dao.TDoorMapper;
import com.ruoyi.protect.facemachine.lib.NetSDKLib;
import com.ruoyi.protect.facemachine.lib.ToolKits;
import com.ruoyi.protect.facemachine.lib.enumeration.EM_EVENT_IVS_TYPE;
import com.ruoyi.protect.service.task.TaskScreenService;
import com.ruoyi.protect.utils.GetBeanUtil;
import com.sun.jna.Pointer;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.File;
import java.util.Objects;
/**
* 报警事件(智能)回调
*/
@Slf4j
@Component
public class AnalyzerDataCB implements NetSDKLib.fAnalyzerDataCallBack {
@Autowired
private TaskScreenService taskScreenService;
private final File picturePath;
public AnalyzerDataCB() {
picturePath = new File("./AnalyzerPicture/");
if (!picturePath.exists()) {
picturePath.mkdirs();
}
}
@Override
public int invoke(NetSDKLib.LLong lAnalyzerHandle, int dwAlarmType, Pointer pAlarmInfo, Pointer pBuffer, int dwBufSize,
Pointer dwUser, int nSequence, Pointer reserved) {
if (lAnalyzerHandle == null || lAnalyzerHandle.longValue() == 0) {
return -1;
}
switch (Objects.requireNonNull(EM_EVENT_IVS_TYPE.getEventType(dwAlarmType))) {
case EVENT_IVS_ACCESS_CTL : {
System.out.println("门禁事件:"+dwAlarmType);
NetSDKLib.DEV_EVENT_ACCESS_CTL_INFO event = new NetSDKLib.DEV_EVENT_ACCESS_CTL_INFO();
ToolKits.GetPointerData(pAlarmInfo, event);
taskScreenService.sendTaskInfo(new String(event.szCardName).trim());
break;
}
default:
System.out.println("其他事件:"+dwAlarmType);
break;
}
return 0;
}
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)