一、先去官网(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;
    }
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐