whyclxw
2024-03-11 525166acab2b1219417f1e3953c0b7836995bc2c
修改事件
6个文件已修改
12个文件已添加
13241 ■■■■■ 已修改文件
sdklog/SdkLog_1_W.log 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/carCamera/Acs/AcsMain.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/carCamera/Acs/FaceManage.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/CarCameraHisController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/peopleCamera/Acs/ACSManage.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/peopleCamera/Acs/AcsMain.java 288 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/peopleCamera/Acs/CardManage.java 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/peopleCamera/Acs/EventSearch.java 254 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/peopleCamera/Acs/FaceManage.java 494 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/peopleCamera/Acs/FingerManage.java 380 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/peopleCamera/Acs/MutilCard.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/peopleCamera/Acs/TransIsapi.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/peopleCamera/Acs/UserManage.java 364 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/peopleCamera/Commom/osSelect.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/peopleCamera/NetSDKDemo/HCNetSDK.java 10678 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/PeopleCarmera.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/CarCameraHisService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/CarCameraService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sdklog/SdkLog_1_W.log
@@ -1,49 +1,26 @@
[2023-08-22 15:15:10.830][DBG] CCoreGlobalCtrlBase::LoadDSo, HPR_LoadDSo Succ, Path[D:/IDEAWorkSpace/EnvirMonitorSys/lib/zlib1.dll], hHandleRet[1485570048]
[2023-08-22 15:15:10.830][INF] The COM:HCCoreBase ver is 6.1.4.15, 2020_03_05. Async:1.
[2023-08-22 15:15:10.830][INF] The COM:Core ver is 6.1.9.48, 2023_04_10. Async:1.
[2023-08-22 15:15:10.830][INF] This HCNetSDK ver is 6.1.9.48 Ver 2023_04_10.
[2023-08-22 15:15:10.831][INF] Login dev 192.168.10.3:8000.
[2023-08-22 15:15:10.831][INF] dwTotalNum[2048]
[2023-08-22 15:15:10.858][INF] Private connect 192.168.10.3:8000 sock=4008 this=0x2d1ccfa4 cmd=0x10000 port=64329
[2023-08-22 15:15:10.858][INF] LogonDev1 in[192.168.10.3:8000]
[2023-08-22 15:15:11.375][INF] The COM:HCCoreBase ver is 6.1.4.15, 2020_03_05. Async:1.
[2023-08-22 15:15:11.375][INF] The COM:Core ver is 6.1.9.48, 2023_04_10. Async:1.
[2023-08-22 15:15:11.375][INF] This HCNetSDK ver is 6.1.9.48 Ver 2023_04_10.
[2023-08-22 15:15:11.375][INF] The COM:HCCoreBase ver is 6.1.4.15, 2020_03_05. Async:1.
[2023-08-22 15:15:11.375][INF] The COM:Core ver is 6.1.9.48, 2023_04_10. Async:1.
[2023-08-22 15:15:11.375][INF] This HCNetSDK ver is 6.1.9.48 Ver 2023_04_10.
[2023-08-22 15:15:11.376][INF] Login dev 192.168.10.5:8000.
[2023-08-22 15:15:11.376][INF] Login dev 192.168.10.3:8000.
[2023-08-22 15:15:11.398][INF] Private connect 192.168.10.5:8000 sock=3484 this=0x2d1cd710 cmd=0x10000 port=64330
[2023-08-22 15:15:11.398][INF] LogonDev1 in[192.168.10.5:8000]
[2023-08-22 15:15:11.414][INF] Private connect 192.168.10.3:8000 sock=5528 this=0x2d1cde7c cmd=0x10000 port=64331
[2023-08-22 15:15:11.414][INF] LogonDev1 in[192.168.10.3:8000]
[2023-08-22 15:15:11.494][DBG] CComBase::Load, Load szDllPath[D:/IDEAWorkSpace/EnvirMonitorSys/lib/HCNetSDKCom/HCVoiceTalk.dll] SUCC
[2023-08-22 15:15:11.494][INF] AbilityAnalyze---Init-- start
[2023-08-22 15:15:11.494][ERR] AbilityAnalyze---open zip package error, package path D:/IDEAWorkSpace/EnvirMonitorSys/lib/LocalXml.zip
[2023-08-22 15:15:11.494][INF] The COM:VoiceTalk ver is 6.1.9.48, 2023_04_10.
[2023-08-22 15:15:11.498][DBG] CComBase::Load, Load szDllPath[D:/IDEAWorkSpace/EnvirMonitorSys/lib/HCNetSDKCom/HCGeneralCfgMgr.dll] SUCC
[2023-08-22 15:15:11.499][INF] The COM:HCGeneralCfgMgr ver is 6.1.9.48, 2023_04_10.
[2023-08-22 15:15:11.502][DBG] CComBase::Load, Load szDllPath[D:/IDEAWorkSpace/EnvirMonitorSys/lib/HCNetSDKCom/HCPlayBack.dll] SUCC
[2023-08-22 15:15:11.502][INF] The COM:HCPlayback ver is 6.1.9.48, 2023_04_10.
[2023-08-22 15:15:11.505][DBG] CComBase::Load, Load szDllPath[D:/IDEAWorkSpace/EnvirMonitorSys/lib/HCNetSDKCom/HCIndustry.dll] SUCC
[2023-08-22 15:15:11.505][INF] The COM:HCIndustry ver is 6.1.9.48, 2023_04_10.
[2023-08-22 15:15:11.508][DBG] CComBase::Load, Load szDllPath[D:/IDEAWorkSpace/EnvirMonitorSys/lib/HCNetSDKCom/HCDisplay.dll] SUCC
[2023-08-22 15:15:11.508][INF] The COM:HCDisplay ver is 6.1.9.48, 2023_04_10.
[2023-08-22 15:15:11.511][DBG] CComBase::Load, Load szDllPath[D:/IDEAWorkSpace/EnvirMonitorSys/lib/HCNetSDKCom/HCPreview.dll] SUCC
[2023-08-22 15:15:11.511][INF] The COM:Preview ver is 6.1.9.48, 2023_04_10.
[2023-08-22 15:15:11.514][DBG] CComBase::Load, Load szDllPath[D:/IDEAWorkSpace/EnvirMonitorSys/lib/HCNetSDKCom/HCAlarm.dll] SUCC
[2023-08-22 15:15:11.515][INF] The COM:HCAlarm ver is 6.1.9.48, 2023_04_10.
[2023-08-22 15:15:11.517][INF] Private connect 192.168.10.3:8000 sock=3676 this=0x2d1cd710 cmd=0x112029 port=64332
[2023-08-22 15:15:11.517][INF] Private connect 192.168.10.5:8000 sock=5544 this=0x2d1ccfa4 cmd=0x112029 port=64333
[2023-08-22 15:15:11.522][INF] COM_Logout[0][0]
[2023-08-22 15:15:11.522][DBG] CUserMgr::UnRegisterHeartProxy[0]
[2023-08-22 15:15:11.536][INF] COM_Logout[2][0]
[2023-08-22 15:15:11.536][DBG] CUserMgr::UnRegisterHeartProxy[2]
[2023-08-22 15:15:11.540][INF] Private connect 192.168.10.3:8000 sock=5544 this=0x2d1ccfa4 cmd=0x10100 port=64334
[2023-08-22 15:15:11.556][INF] Private connect 192.168.10.3:8000 sock=3676 this=0x2d1cd710 cmd=0x10100 port=64336
[2023-08-22 15:15:11.556][INF] Private connect 192.168.10.3:8000 sock=5528 this=0x2d1cde7c cmd=0x112029 port=64335
[2023-08-22 15:15:11.563][INF] COM_Logout[2][0]
[2023-08-22 15:15:11.565][INF] CTransUnitMgr::UnloadTransUnitLib
[2023-08-22 15:15:11.572][DBG] CUserMgr::UnRegisterHeartProxy[1]
[2023-08-22 15:15:11.587][INF] Private connect 192.168.10.5:8000 sock=4944 this=0x2d1ccfa4 cmd=0x10100 port=64337
[2024-03-11 13:39:17.837][ERR] CCoreGlobalCtrlBase::LoadDSo, HPR_LoadDSo Failed, Path[E:/GitWorkSpace/EnvirMonitorSys/lib/zlib1.dll] syserror[126]
[2024-03-11 13:39:17.837][ERR] Load zlib failed[syserr: 126]
[2024-03-11 13:39:17.837][INF] The COM:HCCoreBase ver is 6.1.4.15, 2020_03_05. Async:1.
[2024-03-11 13:39:17.837][INF] The COM:Core ver is 6.1.9.48, 2023_04_10. Async:1.
[2024-03-11 13:39:17.837][INF] This HCNetSDK ver is 6.1.9.48 Ver 2023_04_10.
[2024-03-11 13:39:18.977][INF] Login dev 192.168.0.18:8000.
[2024-03-11 13:39:18.977][INF] dwTotalNum[2048]
[2024-03-11 13:39:22.481][ERR] Private connect 192.168.0.18:8000 sock=3908 this=0x2c614e94 cmd=0x10000 sys_err=10060, timeout= 3500 port=0
[2024-03-11 13:39:22.481][ERR] [192.168.0.18:8000]LogonDevice Link_CreateLink fail[7].
[2024-03-11 13:39:22.481][ERR] CMemberMgrBase::AllocIndex2, MemberStart Failed, iIndex[0]
[2024-03-11 13:39:25.242][DBG] CComBase::Load, Load szDllPath[E:/GitWorkSpace/EnvirMonitorSys/lib/HCNetSDKCom/HCVoiceTalk.dll] SUCC
[2024-03-11 13:39:25.242][INF] AbilityAnalyze---Init-- start
[2024-03-11 13:39:25.242][ERR] AbilityAnalyze---open zip package error, package path E:/GitWorkSpace/EnvirMonitorSys/lib/LocalXml.zip
[2024-03-11 13:39:25.242][INF] The COM:VoiceTalk ver is 6.1.9.48, 2023_04_10.
[2024-03-11 13:39:25.243][DBG] CComBase::Load, Load szDllPath[E:/GitWorkSpace/EnvirMonitorSys/lib/HCNetSDKCom/HCGeneralCfgMgr.dll] SUCC
[2024-03-11 13:39:25.243][INF] The COM:HCGeneralCfgMgr ver is 6.1.9.48, 2023_04_10.
[2024-03-11 13:39:25.244][DBG] CComBase::Load, Load szDllPath[E:/GitWorkSpace/EnvirMonitorSys/lib/HCNetSDKCom/HCPlayBack.dll] SUCC
[2024-03-11 13:39:25.244][INF] The COM:HCPlayback ver is 6.1.9.48, 2023_04_10.
[2024-03-11 13:39:25.245][DBG] CComBase::Load, Load szDllPath[E:/GitWorkSpace/EnvirMonitorSys/lib/HCNetSDKCom/HCIndustry.dll] SUCC
[2024-03-11 13:39:25.245][INF] The COM:HCIndustry ver is 6.1.9.48, 2023_04_10.
[2024-03-11 13:39:25.245][DBG] CComBase::Load, Load szDllPath[E:/GitWorkSpace/EnvirMonitorSys/lib/HCNetSDKCom/HCDisplay.dll] SUCC
[2024-03-11 13:39:25.246][INF] The COM:HCDisplay ver is 6.1.9.48, 2023_04_10.
[2024-03-11 13:39:25.246][DBG] CComBase::Load, Load szDllPath[E:/GitWorkSpace/EnvirMonitorSys/lib/HCNetSDKCom/HCPreview.dll] SUCC
[2024-03-11 13:39:25.246][INF] The COM:Preview ver is 6.1.9.48, 2023_04_10.
[2024-03-11 13:39:25.247][DBG] CComBase::Load, Load szDllPath[E:/GitWorkSpace/EnvirMonitorSys/lib/HCNetSDKCom/HCAlarm.dll] SUCC
[2024-03-11 13:39:25.247][INF] The COM:HCAlarm ver is 6.1.9.48, 2023_04_10.
src/main/java/com/whyc/carCamera/Acs/AcsMain.java
@@ -354,4 +354,65 @@
        return bl;
    }
    /**
     * 获取门禁状态
     *
     */
    public static String getFaceCInfo(Login login,String carId){
        if(hCNetSDK == null)
        {
            if(!createSDKInstance())
            {
                System.out.println("Load SDK fail");
                return null;
            }
        }
        //linux系统建议调用以下接口加载组件库
        if (osSelect.isLinux())
        {
            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());
        }
        /**初始化*/
        hCNetSDK.NET_DVR_Init();
        /**加载日志*/
        boolean i= hCNetSDK.NET_DVR_SetLogToFile(3, "./sdklog", false);
        /**登录*/
        login_V40(login.getIp(),login.getUserName(),login.getPassword(),(short)login.getPort());
        /**查询单张卡号关联的人脸信息*/
        String facePath=FaceManage.getFaceCInfo(lUserID,carId);
        /**登出操作*/
        AcsMain.logout();
        //释放SDK,程序退出前调用
        hCNetSDK.NET_DVR_Cleanup();
        return facePath;
    }
}
src/main/java/com/whyc/carCamera/Acs/FaceManage.java
@@ -291,6 +291,92 @@
            System.out.println("NET_DVR_StopRemoteConfig接口成功");
        }
    }
    /**
     * 查询单张卡号关联的人脸信息
     *
     * @param lUserID 用户登录句柄
     * @param CardNo 卡号
     */
    public static String getFaceCInfo(int lUserID, String CardNo) {
        String filename ="";
        HCNetSDK.NET_DVR_FACE_COND struFaceCond = new HCNetSDK.NET_DVR_FACE_COND();
        struFaceCond.read();
        struFaceCond.dwSize = struFaceCond.size();
        struFaceCond.dwFaceNum = 1; //查询一个人脸参数
        struFaceCond.dwEnableReaderNo = 1;//读卡器编号
        for (int j = 0; j < HCNetSDK.ACS_CARD_NO_LEN; j++) {
            struFaceCond.byCardNo[j] = 0;
        }
        System.arraycopy(CardNo.getBytes(), 0, struFaceCond.byCardNo, 0, CardNo.getBytes().length);
        struFaceCond.write();
        int m_lGetFaceHandle = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_GET_FACE, struFaceCond.getPointer(), struFaceCond.size(), null, null);
        if (m_lGetFaceHandle == -1) {
            System.out.println("建立查询人脸参数长连接失败,错误码为" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
            return filename;
        } else {
            System.out.println("建立查询人脸参数长连接成功!");
        }
        //查询结果
        HCNetSDK.NET_DVR_FACE_RECORD struFaceRecord = new HCNetSDK.NET_DVR_FACE_RECORD();
        struFaceRecord.read();
        while (true) {
            dwState = AcsMain.hCNetSDK.NET_DVR_GetNextRemoteConfig(m_lGetFaceHandle, struFaceRecord.getPointer(), struFaceRecord.size());
            struFaceRecord.read();
            if (dwState == -1) {
                System.out.println("NET_DVR_GetNextRemoteConfig查询人脸调用失败,错误码:" + AcsMain.hCNetSDK.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) {
                if ((struFaceRecord.dwFaceLen > 0) && (struFaceRecord.pFaceBuffer != null)) {
                    FileOutputStream fout;
                    try {
                        filename = System.getProperty("user.dir") + "\\pic\\" + CardNo + "_Face.jpg";
                        fout = new FileOutputStream(filename);
                        //将字节写入文件
                        long offset = 0;
                        ByteBuffer buffers = struFaceRecord.pFaceBuffer.getByteBuffer(offset, struFaceRecord.dwFaceLen);
                        byte[] bytes = new byte[struFaceRecord.dwFaceLen];
                        buffers.rewind();
                        buffers.get(bytes);
                        fout.write(bytes);
                        fout.close();
                        System.out.println("获取人脸参数成功, 卡号: " + CardNo + "图片保存路径: " + filename);
                    } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                break;
            } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
                System.out.println("获取卡参数完成");
                break;
            }
        }
        if (!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(m_lGetFaceHandle)) {
            System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
        } else {
            System.out.println("NET_DVR_StopRemoteConfig接口成功");
        }
        return filename;
    }
    /**
     * 删除单独人脸信息
src/main/java/com/whyc/controller/CarCameraHisController.java
@@ -9,6 +9,8 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.io.UnsupportedEncodingException;
@Api(tags = "门禁历史")
@RestController
@RequestMapping("CarCameraHis")
@@ -22,4 +24,10 @@
    public Response getCarCameraHis(@RequestParam int carCameraId,@RequestParam int pageCurr,@RequestParam int pageSize){
        return service.getCarCameraHis(carCameraId,pageCurr,pageSize);
    }
    @ApiOperation(value = "获取门禁历史数据(以人为主)")
    @PostMapping("getCarCameraHis_people")
    public Response getCarCameraHis_people(@RequestBody Login login) throws UnsupportedEncodingException, InterruptedException {
        return service.getCarCameraHis_people(login);
    }
}
src/main/java/com/whyc/peopleCamera/Acs/ACSManage.java
New file
@@ -0,0 +1,99 @@
package com.whyc.peopleCamera.Acs;
import com.sun.jna.ptr.IntByReference;
import com.whyc.peopleCamera.NetSDKDemo.HCNetSDK;
/**
 * 门禁设备管理:
 * 1、获取(设置)门禁主机参数
 * 2、获取门禁主机工作状态
 */
public final class ACSManage {
    /**
     * 获取(设置)门禁主机参数
     *
     * @param lUserID 用户登录句柄
     */
    public static void 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 = AcsMain.hCNetSDK.NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_ACS_CFG, 0xFFFFFFFF, struAcsCfg.getPointer(),
                struAcsCfg.size(), intByReference);
        if (b_GetAcsCfg = false) {
            System.out.println("获取门禁主机参数,错误码为" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
            return;
        } else {
            System.out.println("获取门禁主机参数成功");
            struAcsCfg.read();
            System.out.println("1.是否显示抓拍图片:" + struAcsCfg.byShowCapPic + "\n");  //是否显示抓拍图片, 0-不显示,1-显示
            System.out.println("2.是否显示卡号:" + struAcsCfg.byShowCardNo + "\n");   //是否显示卡号,0-不显示,1-显示
            System.out.println("3.是否开启语音提示:" + struAcsCfg.byVoicePrompt + "\n");  //是否启用语音提示,0-不启用,1-启用
            System.out.println("4.联动抓图是否上传:" + struAcsCfg.byUploadCapPic + "\n"); //联动抓拍是否上传图片,0-不上传,1-上传
        }
        /**设置门禁主机参数*/
        struAcsCfg.byShowCardNo = 1;     //开启显示卡号
        struAcsCfg.byVoicePrompt = 0;    //关闭语音提示
        struAcsCfg.byUploadCapPic = 1;   //开启联动抓图后,设备上抓拍的图片才会通过报警布防上传,否则没有不上传
        struAcsCfg.byShowCapPic = 1;
        struAcsCfg.write();
        boolean b_SetAcsCfg = AcsMain.hCNetSDK.NET_DVR_SetDVRConfig(lUserID, HCNetSDK.NET_DVR_SET_ACS_CFG, 0xFFFFFFFF, struAcsCfg.getPointer(), struAcsCfg.size());
        if (b_SetAcsCfg = false) {
            System.out.println("设置门禁主机参数,错误码为:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
            return;
        } else {
            System.out.println("设置门禁主机参数成功!!!");
        }
    }
    /**
     * 获取门禁主机工作状态
     *
     * @param lUserID 用户登录句柄
     */
    public static void 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 = AcsMain.hCNetSDK.NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_ACS_WORK_STATUS_V50, 0xFFFFFFFF, netDvrAcsWorkStatusV50.getPointer(),
                netDvrAcsWorkStatusV50.size(), intByReference);
        if (b_GetAcsStatus = false) {
            System.out.println("获取门禁主机工作状态,错误码为:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
            return;
        } else {
            System.out.println("获取门禁主机工作状态成功!!!");
            netDvrAcsWorkStatusV50.read();
            System.out.println("1.门锁状态(或者梯控的继电器开合状态):" + netDvrAcsWorkStatusV50.byDoorLockStatus[0] + "\n"); //门锁状态:0- 正常关,1- 正常开,2- 短路报警,3- 断路报警,4- 异常报警
            System.out.println("2.门状态(或者梯控的楼层状态):" + netDvrAcsWorkStatusV50.byDoorStatus[0] + "\n"); //门状态(或者梯控的楼层状态):1- 休眠,2- 常开状态(对于梯控,表示自由状态),3- 常闭状态(对于梯控,表示禁用状态),4- 普通状态(对于梯控,表示受控状态)
            System.out.println("3.门磁状态:" + netDvrAcsWorkStatusV50.byMagneticStatus[0] + "\n"); //门磁状态,0-正常关,1-正常开,2-短路报警,3-断路报警,4-异常报警
            System.out.println("4.事件报警输入状态:" + netDvrAcsWorkStatusV50.byCaseStatus[0] + "\n"); //事件报警输入状态:0- 无输入,1- 有输入
        }
    }
    /**
     * 远程控门
     * @param userID
     */
    public  static void remoteControlGate(int userID)
    {
        /**第二个参数lGatewayIndex
         [in] 门禁序号(楼层编号、锁ID),从1开始,-1表示对所有门(或者梯控的所有楼层)进行操作
            第三个参数dwStaic
         [in] 命令值:0- 关闭(对于梯控,表示受控),1- 打开(对于梯控,表示开门),2- 常开(对于梯控,表示自由、通道状态),3- 常关(对于梯控,表示禁用),4- 恢复(梯控,普通状态),5- 访客呼梯(梯控),6- 住户呼梯(梯控)*/
        boolean b_gate=AcsMain.hCNetSDK.NET_DVR_ControlGateway(userID,1,1);
        if (b_gate==false)
        {
            System.out.println("远程控门失败,err="+AcsMain.hCNetSDK.NET_DVR_GetLastError());
            return;
        }
        System.out.println("远程控门成功");
        return;
    }
}
src/main/java/com/whyc/peopleCamera/Acs/AcsMain.java
New file
@@ -0,0 +1,288 @@
package com.whyc.peopleCamera.Acs;
import com.sun.jna.Native;
import com.whyc.dto.Login;
import com.whyc.peopleCamera.NetSDKDemo.HCNetSDK;
import com.whyc.peopleCamera.Commom.osSelect;
import com.whyc.pojo.PeopleCarmera;
import org.json.JSONException;
import java.io.UnsupportedEncodingException;
import java.util.List;
public class AcsMain {
    static HCNetSDK hCNetSDK = null;
    static int lUserID = -1;//用户句柄
    static int iCharEncodeType = 0;//设备字符集
    /**
     * 根据不同操作系统选择不同的库文件和库路径
     * @return
     */
    private static boolean createSDKInstance()
    {
        if(hCNetSDK == null)
        {
            synchronized (HCNetSDK.class)
            {
                String strDllPath = "";
                try
                {
                    //System.setProperty("jna.debug_load", "true");
                    if(osSelect.isWindows())
                        //win系统加载库路径
                        strDllPath = System.getProperty("user.dir") + "\\lib\\HCNetSDK.dll";
                    else if(osSelect.isLinux())
                        //Linux系统加载库路径
                        strDllPath =  System.getProperty("user.dir") + "/lib/libhcnetsdk.so";
                    hCNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class);
                }catch (Exception ex) {
                    System.out.println("loadLibrary: " + strDllPath + " Error: " + ex.getMessage());
                    return false;
                }
            }
        }
        return true;
    }
    /**
     * @param args
     * @throws UnsupportedEncodingException
     * @throws InterruptedException
     * @throws JSONException
     */
    public static void main(String[] args) throws UnsupportedEncodingException, InterruptedException, JSONException  {
        if(hCNetSDK == null)
        {
            if(!createSDKInstance())
            {
                System.out.println("Load SDK fail");
                return;
            }
        }
        //linux系统建议调用以下接口加载组件库
        if (osSelect.isLinux())
        {
            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());
        }
        hCNetSDK.NET_DVR_Init();
        //开启SDK日志打印
        boolean i= hCNetSDK.NET_DVR_SetLogToFile(3, "./sdklog", false);
        login_V40("10.16.36.13","admin","hik12345",(short) 8000);    //登陆设备
        /**
         * 人员管理模块
         */
//        UserManage.searchUserInfo(lUserID);        //查询所有人员
//        UserManage.deleteUserInfo(lUserID);
//        UserManage.addUserInfo(lUserID,"test20221122");    //添加人员
        /**
         * 人脸管理模块
         */
//        FaceManage.searchFaceInfo(lUserID,"tset123");
//        FaceManage.addFaceByBinary(lUserID,"test20221122");
//        FaceManage.addFaceByUrl(lUserID,"test111");
//        FaceManage.deleteFaceInfo(lUserID,"test111");
//        FaceManage.captureFaceInfo(lUserID);
        /**
         * 卡号管理模块
         */
//        CardManage.searchCardInfo(lUserID,"ceshi1");
//        CardManage.addCardInfo(lUserID,"12345");
//        CardManage.searchCardInfo(lUserID,"test111");
//        CardManage.searchAllCardInfo(lUserID);
//        CardManage.deleteCardInfo(lUserID,"111");
//        CardManage.deleteAllCardInfo(lUserID);
//        CardManage.getAllCardNumber(lUserID);
        /**
         * 指纹管理模块
         */
//        FingerManage.fingerCapture(lUserID);
//        FingerManage.fingerCpaureByisapi(lUserID);
//        FingerManage.fingerCpaureByisapi(lUserID);
//        FingerManage.SearchFingerInfo(lUserID,"2222");
        //指纹数据的BASE64编码
//        String fingerdata="";
//        FingerManage.setOneFinger(lUserID,"zhangsan",fingerdata);
//        FingerManage.deleteFinger(lUserID,"zhangsan");
        /**
         * 事件查询
         */
        EventSearch.searchAllEvent(lUserID);
        //多重认证
//        MutilCard.setGroupCfg(lUserID);
//        MutilCard.setMultiCardCfg(lUserID);
        //计划模板
//        UserManage.setCardTemplate(lUserID,2);
        /**
         * 增加sleep时间,保证程序一直运行,
         */
        Thread.sleep(20000);
        /**
         * 撤防,端口监听,注销设备
         */
        AcsMain.logout();
        //释放SDK,程序退出前调用
        hCNetSDK.NET_DVR_Cleanup();
    }
    /**
     * 设备登录
     * @param ipadress IP地址
     * @param user  用户名
     * @param psw  密码
     * @param port 端口,默认8000
     */
    public static void login_V40(String ipadress, String user, String psw, short port) {
        //注册
        HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();//设备登录信息
        String m_sDeviceIP = ipadress;//设备ip地址
        m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
        System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());
        String m_sUsername = user;//设备用户名
        m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
        System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());
        String m_sPassword = psw;//设备密码
        m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
        System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());
        m_strLoginInfo.wPort = port; //sdk端口
        m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是
        m_strLoginInfo.write();
        HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();//设备信息
        lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
        if (lUserID == -1) {
            System.out.println("登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError());
            return;
        } else {
            System.out.println("登录成功!");
            m_strDeviceInfo.read();
            iCharEncodeType = m_strDeviceInfo.byCharEncodeType;
            return;
        }
    }
    /**
     * 登出操作
     *
     */
    public static void logout(){
        /**登出和清理,释放SDK资源*/
        if (lUserID>=0)
        {
            if (!hCNetSDK.NET_DVR_Logout(lUserID))
            {
                System.out.println("设备注销失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
                return;
            }
            System.out.println("设备注销成功!!!");
        }
    }
    /**
     * 登录获取事件
     */
    public static List<PeopleCarmera> getCarCameraHis_people(Login login) throws UnsupportedEncodingException, InterruptedException {
        if(hCNetSDK == null)
        {
            if(!createSDKInstance())
            {
                System.out.println("Load SDK fail");
                return null;
            }
        }
        //linux系统建议调用以下接口加载组件库
        if (osSelect.isLinux())
        {
            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());
        }
        hCNetSDK.NET_DVR_Init();
        //开启SDK日志打印
        boolean i= hCNetSDK.NET_DVR_SetLogToFile(3, "./sdklog", false);
        //login_V40("10.16.36.13","admin","hik12345",(short) 8000);    //登陆设备
        login_V40(login.getIp(),login.getUserName(),login.getPassword(),(short)login.getPort());
        /**
         * 事件查询
         */
        List<PeopleCarmera> list=EventSearch.getCarCameraHis_people(lUserID);
        /**
         * 增加sleep时间,保证程序一直运行,
         */
        Thread.sleep(20000);
        /**
         * 撤防,端口监听,注销设备
         */
        AcsMain.logout();
        //释放SDK,程序退出前调用
        hCNetSDK.NET_DVR_Cleanup();
        return list;
    }
}//AcsMain  Class结束
src/main/java/com/whyc/peopleCamera/Acs/CardManage.java
New file
@@ -0,0 +1,219 @@
package com.whyc.peopleCamera.Acs;
import com.sun.jna.ptr.IntByReference;
import com.whyc.peopleCamera.NetSDKDemo.HCNetSDK;
import org.json.JSONException;
import org.json.JSONObject;
/**
 * 卡管理,以人为中心,要先下发工号,卡号要关联在人员工号上
 */
public final class CardManage {
    /**
     * 下发卡号,
     * @param userID  用户注册ID
     * @param cardNo 卡号
     * @throws JSONException
     */
    public static void addCardInfo(int userID,String cardNo) throws JSONException {
        HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024);    //数组
        String strInBuffer = "POST /ISAPI/AccessControl/CardInfo/Record?format=json";
        System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
        ptrByteArray.write();
        int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
        if (lHandler < 0)
        {
            System.out.println("AddCardInfo NET_DVR_StartRemoteConfig 失败,错误码为"+AcsMain.hCNetSDK.NET_DVR_GetLastError());
            return;
        }
        else{
            System.out.println("AddCardInfo NET_DVR_StartRemoteConfig 成功!");
            HCNetSDK.BYTE_ARRAY lpInput = new HCNetSDK.BYTE_ARRAY(1024);    //数组
            String strJsonData = "{\n" +
                    "    \"CardInfo\" : {\n" +
                    "        \"employeeNo\":\"ceshi1\", \n" +
                    "        \"cardNo\":\""+cardNo+"\", \n" +
                    "        \"cardType\":\"normalCard\"\n" +
                    "        } \n" +
                    "}";
            System.arraycopy(strJsonData.getBytes(), 0, lpInput.byValue, 0, strJsonData.length());//字符串拷贝到数组中
            lpInput.write();
            HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(1024);
            IntByReference pInt = new IntByReference(0);
            while(true){
                /*
                    如果需要批量下发,循环调用NET_DVR_SendWithRecvRemoteConfig接口进行下发不同的卡号,下发结束完成后关闭下发卡号长连接
                 */
                int dwState = AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, lpInput.getPointer(), lpInput.byValue.length ,ptrOutuff.getPointer(), 1024,  pInt);
                //读取返回的json并解析
                ptrOutuff.read();
                String strResult = new String(ptrOutuff.byValue).trim();
                System.out.println("dwState:" + dwState + ",strResult:" + strResult);
                JSONObject jsonResult = new JSONObject(strResult);
                int statusCode = jsonResult.getInt("statusCode");
                String statusString = jsonResult.getString("statusString");
                if(dwState == -1){
                    System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.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("下发卡号失败, json retun:" + jsonResult.toString());
                    break;
                }
                else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION)
                {
                    System.out.println("下发卡号异常, json retun:" + jsonResult.toString());
                    break;
                }
                else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS)
                {
                    if (statusCode != 1){
                        System.out.println("下发卡号成功,但是有异常情况:" + jsonResult.toString());
                    }
                    else{
                        System.out.println("下发卡号成功,  json retun:" + jsonResult.toString());
                    }
                    break;
                }
                else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
                    System.out.println("下发卡号完成");
                    break;
                }
            }
            if(!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)){
                System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
            }
            else{
                System.out.println("NET_DVR_StopRemoteConfig接口成功");
            }
        }
    }
    /**
     * 按照人员工号查询卡号
     * @param userID
     * @param employeeNo
     */
    public static void searchCardInfo(int userID, String employeeNo)
    {
        String searchCardInfoUrl="POST /ISAPI/AccessControl/CardInfo/Search?format=json";
        String searchCardInfojson="{\n" +
                "    \"CardInfoSearchCond\": {\n" +
                "        \"searchID\": \"20201014001\",\n" +
                "        \"searchResultPosition\": 0,\n" +
                "        \"maxResults\": 30,\n" +
                "        \"EmployeeNoList\" : [\n" +
                "            {\n" +
                "                \"employeeNo\": \""+employeeNo+"\"\n" +
                "            }\n" +
                "        ]\n" +
                "    }\n" +
                "}";
        String result= TransIsapi.put_isapi(userID,searchCardInfoUrl,searchCardInfojson);
        System.out.println(result);
    }
    /**
     * 查询所有卡号
     * @param userID
     */
    public static void searchAllCardInfo(int userID)
    {
        String searchCardInfoUrl="POST /ISAPI/AccessControl/CardInfo/Search?format=json";
        /*
        "searchID": "",    //必填,搜索记录唯一标识,用来确认上层客户端是否为同一个(倘若是同一个,设备记录内存,
                              下次搜索加快速度),string类型
        "searchResultPosition": 0,    //必填,查询结果在结果列表中的起始位置,integer32类型;当记录条数很多时,
                                一次查询不能获取所有的记录,下一次查询时指定位置可以查询后面的记录
        "maxResults": 30,    //必填,本次协议调用可获取的最大记录数,integer32类型(如maxResults值大于设备能力集返回的范围,
                              则设备按照能力集最大值返回,设备不进行报错
         */
        String searchCardInfojson="{\n" +
                "    \"CardInfoSearchCond\": {\n" +
                "        \"searchID\": \"20211129001\",\n" +
                "        \"searchResultPosition\": 0,\n" +
                "        \"maxResults\": 30\n" +
                "    }\n" +
                "}";
        String result= TransIsapi.put_isapi(userID,searchCardInfoUrl,searchCardInfojson);
        System.out.println(result);
    }
    /**
     * 根据工号删除卡号,
     * @param userID
     * @param employeeNo
     */
    public static void deleteCardInfo(int userID,String employeeNo )
    {
        String deleteCardInfoURL="PUT /ISAPI/AccessControl/CardInfo/Delete?format=json ";
        String deleteCardInfojson="{\n" +
                "    \"CardInfoDelCond\" : {\n" +
                "        \"EmployeeNoList\" : [    \n" +
                "            {\n" +
                "                \"employeeNo\": \""+employeeNo+"\"    \n" +
                "            }\n" +
                "        ]\n" +
                "    }\n" +
                "}\n";
        String result= TransIsapi.put_isapi(userID,deleteCardInfoURL,deleteCardInfojson);
        System.out.println(result);
    }
    /**
     * 删除全部卡号信息,
     * @param userID
     */
    public static void deleteAllCardInfo(int userID)
    {
         String deleteAllCardInfoURL="PUT /ISAPI/AccessControl/CardInfo/Delete?format=json";
         String deleteAllCardInfoJson="{\"CardInfoDelCond\" : {}}";
         /*
         如果涉及大批量卡号删除,设备需要一定的时间去处理,需要将超时时间设置成60s,put_isapi中的NET_DVR_XML_CONFIG_INPUT中dwRecvTimeOut
         参数设置成60000
          */
         String result= TransIsapi.put_isapi(userID,deleteAllCardInfoURL,deleteAllCardInfoJson);
         System.out.println(result);
    }
    /**
     * 获取所有卡数量
     * @param userID
     * @return
     * @throws JSONException
     */
    public static int getAllCardNumber(int userID) throws JSONException {
        String getAllCardNumberUrl="GET /ISAPI/AccessControl/CardInfo/Count?format=json";
        String result= TransIsapi.get_isapi(userID,getAllCardNumberUrl);
        System.out.println(result);
        JSONObject jsonObject=new JSONObject(result);
        int num=jsonObject.optJSONObject("CardInfoCount").getInt("cardNumber");
        return  num;
    }
}
src/main/java/com/whyc/peopleCamera/Acs/EventSearch.java
New file
@@ -0,0 +1,254 @@
package com.whyc.peopleCamera.Acs;
import com.sun.jna.Pointer;
import com.whyc.peopleCamera.NetSDKDemo.HCNetSDK;
import com.whyc.pojo.PeopleCarmera;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
/**
 * 事件查询模块
 */
public final class EventSearch {
    public static void searchAllEvent(int lUserID) throws UnsupportedEncodingException, InterruptedException {
        int i = 0; //事件条数
        HCNetSDK.NET_DVR_ACS_EVENT_COND struAcsEventCond = new HCNetSDK.NET_DVR_ACS_EVENT_COND();
        struAcsEventCond.read();
        struAcsEventCond.dwSize = struAcsEventCond.size();
        //查询全部主次类型的报警
        struAcsEventCond.dwMajor = 0; // 主次事件类型设为0,代表查询所有事件
        struAcsEventCond.dwMinor = 0; //
        //开始时间
        struAcsEventCond.struStartTime.dwYear = 2022;
        struAcsEventCond.struStartTime.dwMonth = 4;
        struAcsEventCond.struStartTime.dwDay = 27;
        struAcsEventCond.struStartTime.dwHour = 9;
        struAcsEventCond.struStartTime.dwMinute = 0;
        struAcsEventCond.struStartTime.dwSecond = 0;
        //结束时间
        struAcsEventCond.struEndTime.dwYear = 2022;
        struAcsEventCond.struEndTime.dwMonth = 4;
        struAcsEventCond.struEndTime.dwDay = 30;
        struAcsEventCond.struEndTime.dwHour = 16;
        struAcsEventCond.struEndTime.dwMinute = 0;
        struAcsEventCond.struEndTime.dwSecond = 0;
        struAcsEventCond.wInductiveEventType = 1;
        struAcsEventCond.byPicEnable = 1; //是否带图片,0-不带图片,1-带图片
        struAcsEventCond.write();
        Pointer ptrStruEventCond = struAcsEventCond.getPointer();
        int m_lSearchEventHandle = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_GET_ACS_EVENT, ptrStruEventCond, struAcsEventCond.size(), null, null);
        if (m_lSearchEventHandle<=-1)
        {
            System.out.println("NET_DVR_StartRemoteConfig调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
        }
        HCNetSDK.NET_DVR_ACS_EVENT_CFG struAcsEventCfg = new HCNetSDK.NET_DVR_ACS_EVENT_CFG();
        struAcsEventCfg.read();
        struAcsEventCfg.dwSize = struAcsEventCfg.size();
        struAcsEventCfg.write();
        Pointer ptrStruEventCfg = struAcsEventCfg.getPointer();
        while (true) {
            System.out.println("i=" + i);
            int dwEventSearch = AcsMain.hCNetSDK.NET_DVR_GetNextRemoteConfig(m_lSearchEventHandle, ptrStruEventCfg, struAcsEventCfg.size());
            if (dwEventSearch <= -1) {
                System.out.println("NET_DVR_GetNextRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
            }
            if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_NEED_WAIT) {
                System.out.println("配置等待....");
                Thread.sleep(10);
                continue;
            } else if (dwEventSearch == HCNetSDK.NET_SDK_NEXT_STATUS__FINISH) {
                System.out.println("获取事件完成");
                break;
            } else if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_FAILED) {
                System.out.println("获取事件出现异常");
                break;
            } else if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS) {
                struAcsEventCfg.read();
                //获取的事件信息通过struAcsEventCfg结构体进行解析,
                System.out.println(i + "获取事件成功, 报警主类型:" + Integer.toHexString(struAcsEventCfg.dwMajor) + "报警次类型:" + Integer.toHexString(struAcsEventCfg.dwMinor) + "卡号:" + new String(struAcsEventCfg.struAcsEventInfo.byCardNo).trim());
                /**
                 * 工号有两个字段,dwEmployeeNo表示工号,当值为0时,表示无效,解析byEmployeeNo参数
                 */
                System.out.println("工号1:"+struAcsEventCfg.struAcsEventInfo.dwEmployeeNo);
                System.out.println("工号2:"+new String(struAcsEventCfg.struAcsEventInfo.byEmployeeNo));
                //人脸温度数据,需要设备和支持测温功能
                System.out.println("人脸温度:" + struAcsEventCfg.struAcsEventInfo.fCurrTemperature + "是否异常:" + struAcsEventCfg.struAcsEventInfo.byIsAbnomalTemperature);
                //口罩功能,需要设备支持此功能 0-保留,1-未知,2-不戴口罩,3-戴口罩
                System.out.println("是否带口罩:"+struAcsEventCfg.struAcsEventInfo.byMask);
                //人脸图片保存
                if (struAcsEventCfg.dwPicDataLen>0 || struAcsEventCfg.pPicData != null )
                {
                    FileOutputStream fout;
                    try {
                        /**
                         * 人脸图片保存路径
                         */
                        String filename = "..\\pic\\"+i+"_event.jpg";
                        fout = new FileOutputStream(filename);
                        //将字节写入文件
                        long offset = 0;
                        ByteBuffer buffers = struAcsEventCfg.pPicData.getByteBuffer(offset, struAcsEventCfg.dwPicDataLen);
                        byte[] bytes = new byte[struAcsEventCfg.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();
                    }
                }
                i++;
                continue;
            }
        }
        i = 0;
        if (!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(m_lSearchEventHandle)) {
            System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
        } else {
            System.out.println("NET_DVR_StopRemoteConfig接口成功");
        }
        return;
    }
    //获取一年内(推一年)的事件
    public static List<PeopleCarmera> getCarCameraHis_people(int lUserID) throws UnsupportedEncodingException, InterruptedException {
        //1.获取当前系统时间
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH) + 1;
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);
        int i = 0; //事件条数
        HCNetSDK.NET_DVR_ACS_EVENT_COND struAcsEventCond = new HCNetSDK.NET_DVR_ACS_EVENT_COND();
        struAcsEventCond.read();
        struAcsEventCond.dwSize = struAcsEventCond.size();
        //查询全部主次类型的报警
        struAcsEventCond.dwMajor = 0; // 主次事件类型设为0,代表查询所有事件
        struAcsEventCond.dwMinor = 0; //
        //开始时间
        struAcsEventCond.struStartTime.dwYear = year-1;
        struAcsEventCond.struStartTime.dwMonth = month;
        struAcsEventCond.struStartTime.dwDay = day;
        struAcsEventCond.struStartTime.dwHour = 0;
        struAcsEventCond.struStartTime.dwMinute = 0;
        struAcsEventCond.struStartTime.dwSecond = 0;
        //结束时间
        struAcsEventCond.struEndTime.dwYear = year;
        struAcsEventCond.struEndTime.dwMonth = month;
        struAcsEventCond.struEndTime.dwDay = day;
        struAcsEventCond.struEndTime.dwHour = 23;
        struAcsEventCond.struEndTime.dwMinute = 59;
        struAcsEventCond.struEndTime.dwSecond = 59;
        struAcsEventCond.wInductiveEventType = 1;
        struAcsEventCond.byPicEnable = 0; //是否带图片,0-不带图片,1-带图片
        struAcsEventCond.write();
        Pointer ptrStruEventCond = struAcsEventCond.getPointer();
        int m_lSearchEventHandle = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_GET_ACS_EVENT, ptrStruEventCond, struAcsEventCond.size(), null, null);
        if (m_lSearchEventHandle<=-1)
        {
            System.out.println("NET_DVR_StartRemoteConfig调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
            return null;
        }
        HCNetSDK.NET_DVR_ACS_EVENT_CFG struAcsEventCfg = new HCNetSDK.NET_DVR_ACS_EVENT_CFG();
        struAcsEventCfg.read();
        struAcsEventCfg.dwSize = struAcsEventCfg.size();
        struAcsEventCfg.write();
        Pointer ptrStruEventCfg = struAcsEventCfg.getPointer();
        List<PeopleCarmera> list=new ArrayList<>();
        while (true) {
            System.out.println("i=" + i);
            int dwEventSearch = AcsMain.hCNetSDK.NET_DVR_GetNextRemoteConfig(m_lSearchEventHandle, ptrStruEventCfg, struAcsEventCfg.size());
            if (dwEventSearch <= -1) {
                System.out.println("NET_DVR_GetNextRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
                return null;
            }
            if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_NEED_WAIT) {
                System.out.println("配置等待....");
                Thread.sleep(10);
                continue;
            } else if (dwEventSearch == HCNetSDK.NET_SDK_NEXT_STATUS__FINISH) {
                System.out.println("获取事件完成");
                break;
            } else if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_FAILED) {
                System.out.println("获取事件出现异常");
                break;
            } else if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS) {
                struAcsEventCfg.read();
                //获取的事件信息通过struAcsEventCfg结构体进行解析,
                /*System.out.println(i + "获取事件成功, 报警主类型:" + Integer.toHexString(struAcsEventCfg.dwMajor) + "报警次类型:" + Integer.toHexString(struAcsEventCfg.dwMinor) + "卡号:" + new String(struAcsEventCfg.struAcsEventInfo.byCardNo).trim());
                *//**
                 * 工号有两个字段,dwEmployeeNo表示工号,当值为0时,表示无效,解析byEmployeeNo参数
                 *//*
                System.out.println("工号1:"+struAcsEventCfg.struAcsEventInfo.dwEmployeeNo);
                System.out.println("工号2:"+new String(struAcsEventCfg.struAcsEventInfo.byEmployeeNo));
                //人脸温度数据,需要设备和支持测温功能
                System.out.println("人脸温度:" + struAcsEventCfg.struAcsEventInfo.fCurrTemperature + "是否异常:" + struAcsEventCfg.struAcsEventInfo.byIsAbnomalTemperature);
                //口罩功能,需要设备支持此功能 0-保留,1-未知,2-不戴口罩,3-戴口罩
                System.out.println("是否带口罩:"+struAcsEventCfg.struAcsEventInfo.byMask);*/
                PeopleCarmera pc=new PeopleCarmera();
                pc.setCarId(new String(struAcsEventCfg.struAcsEventInfo.byCardNo).trim());
                pc.setEventType(struAcsEventCfg.dwMajor);
                if(struAcsEventCfg.struAcsEventInfo.dwEmployeeNo==0){
                    pc.setEmployeeNo(new String(struAcsEventCfg.struAcsEventInfo.byEmployeeNo));
                }else{
                    pc.setEmployeeNo(String.valueOf(struAcsEventCfg.struAcsEventInfo.dwEmployeeNo));
                }
                pc.setFCurrTemperature(struAcsEventCfg.struAcsEventInfo.fCurrTemperature);
                pc.setByIsAbnomalTemperature(struAcsEventCfg.struAcsEventInfo.byIsAbnomalTemperature);
                pc.setByMask(struAcsEventCfg.struAcsEventInfo.byMask);
                list.add(pc);
                //人脸图片保存
                if (struAcsEventCfg.dwPicDataLen>0 || struAcsEventCfg.pPicData != null )
                {
                    FileOutputStream fout;
                    try {
                        /**
                         * 人脸图片保存路径
                         */
                        String filename = "..\\pic\\"+i+"_event.jpg";
                        fout = new FileOutputStream(filename);
                        //将字节写入文件
                        long offset = 0;
                        ByteBuffer buffers = struAcsEventCfg.pPicData.getByteBuffer(offset, struAcsEventCfg.dwPicDataLen);
                        byte[] bytes = new byte[struAcsEventCfg.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();
                    }
                }
                i++;
                continue;
            }
        }
        i = 0;
        if (!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(m_lSearchEventHandle)) {
            System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
            return null;
        } else {
            System.out.println("NET_DVR_StopRemoteConfig接口成功");
        }
        return list;
    }
}
src/main/java/com/whyc/peopleCamera/Acs/FaceManage.java
New file
@@ -0,0 +1,494 @@
package com.whyc.peopleCamera.Acs;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.whyc.peopleCamera.NetSDKDemo.HCNetSDK;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.*;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * 功能模块:人员管理,下发、查询、删除人脸图片,注:下发人脸图片前,先下发人员工号。
 */
public final class FaceManage {
    /**
     * 功能:按照二进制方式下发人脸图片
     * @param userID  用户注册ID
     * @param employeeNo 人员工号
     * @throws JSONException
     * @throws InterruptedException
     */
    public static void addFaceByBinary(int userID,String employeeNo ) throws JSONException, InterruptedException{
        HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024);    //数组
        String strInBuffer = "PUT /ISAPI/Intelligent/FDLib/FDSetUp?format=json";
        System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
        ptrByteArray.write();
        int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_FACE_DATA_RECORD, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
        if (lHandler < 0)
        {
            System.out.println("Addface NET_DVR_StartRemoteConfig 失败,错误码为"+AcsMain.hCNetSDK.NET_DVR_GetLastError());
            return;
        }
        else{
            System.out.println("Addface NET_DVR_StartRemoteConfig 成功!");
            HCNetSDK.NET_DVR_JSON_DATA_CFG struAddFaceDataCfg = new HCNetSDK.NET_DVR_JSON_DATA_CFG();
            struAddFaceDataCfg.read();
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("faceLibType", "blackFD");
            jsonObject.put("FDID", "1");
            jsonObject.put("FPID", employeeNo);//人脸下发关联的工号
            String strJsonData = jsonObject.toString();
            System.arraycopy(strJsonData.getBytes(), 0, ptrByteArray.byValue, 0, strJsonData.length());//字符串拷贝到数组中
            ptrByteArray.write();
            struAddFaceDataCfg.dwSize = struAddFaceDataCfg.size();
            struAddFaceDataCfg.lpJsonData = ptrByteArray.getPointer();
            struAddFaceDataCfg.dwJsonDataSize = strJsonData.length();
            /*****************************************
             * 从本地文件里面读取JPEG图片二进制数据
             *****************************************/
            FileInputStream picfile = null;
            int picdataLength = 0;
            try{
                picfile = new FileInputStream(new File(".//pic//FDLib.jpg"));
            }
            catch(FileNotFoundException e)
            {
                e.printStackTrace();
            }
            try{
                picdataLength = picfile.available();
            }
            catch(IOException e1)
            {
                e1.printStackTrace();
            }
            if(picdataLength < 0)
            {
                System.out.println("input file dataSize < 0");
                return;
            }
            HCNetSDK.BYTE_ARRAY ptrpicByte = new HCNetSDK.BYTE_ARRAY(picdataLength);
            try {
                picfile.read(ptrpicByte.byValue);
            } catch (IOException e2) {
                e2.printStackTrace();
            }
            ptrpicByte.write();
            struAddFaceDataCfg.dwPicDataSize  = picdataLength;
            struAddFaceDataCfg.lpPicData  = ptrpicByte.getPointer();
            struAddFaceDataCfg.write();
            HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(1024);
            IntByReference pInt = new IntByReference(0);
            while(true){
                int dwState = AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, struAddFaceDataCfg.getPointer(), struAddFaceDataCfg.dwSize ,ptrOutuff.getPointer(), 1024,  pInt);
                if(dwState == -1){
                    System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
                    break;
                }
                //读取返回的json并解析
                ptrOutuff.read();
                String strResult = new String(ptrOutuff.byValue).trim();
                System.out.println("dwState:" + dwState + ",strResult:" + strResult);
                JSONObject jsonResult = new JSONObject(strResult);
                int statusCode = jsonResult.getInt("statusCode");
                String statusString = jsonResult.getString("statusString");
                 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("下发人脸失败, json retun:" + jsonResult.toString());
                    break;
                }
                else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION)
                {
                    System.out.println("下发人脸异常, json retun:" + jsonResult.toString());
                    break;
                }
                else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS)
                {//返回NET_SDK_CONFIG_STATUS_SUCCESS代表流程走通了,但并不代表下发成功,比如人脸图片不符合设备规范等原因,所以需要解析Json报文
                    if (statusCode != 1){
                        System.out.println("下发人脸成功,但是有异常情况:" + jsonResult.toString());
                    }
                    else{
                        System.out.println("下发人脸成功,  json retun:" + jsonResult.toString());
                    }
                    break;
                }
                else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
                    //下发人脸时:dwState其实不会走到这里,因为设备不知道我们会下发多少个人,所以长连接需要我们主动关闭
                    System.out.println("下发人脸完成");
                    break;
                }
            }
            if(!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)){
                System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
            }
            else{
                System.out.println("NET_DVR_StopRemoteConfig接口成功");
            }
        }
    }
    /**
     * 按URL方式下发人脸图片
     * @param userID 用户注销ID
     * @param employeeNo 人员工号
     * @throws JSONException
     */
    public static void addFaceByUrl(int userID,String employeeNo) throws JSONException {
        HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024);    //数组
        String strInBuffer = "PUT /ISAPI/Intelligent/FDLib/FDSetUp?format=json";
        System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
        ptrByteArray.write();
        int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_FACE_DATA_RECORD, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
        if (lHandler < 0)
        {
            System.out.println("Addface NET_DVR_StartRemoteConfig 失败,错误码为"+AcsMain.hCNetSDK.NET_DVR_GetLastError());
            return;
        }
        else{
            System.out.println("Addface NET_DVR_StartRemoteConfig 成功!");
            HCNetSDK.NET_DVR_JSON_DATA_CFG struAddFaceDataCfg = new HCNetSDK.NET_DVR_JSON_DATA_CFG();
            struAddFaceDataCfg.read();
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("faceURL","http://10.17.34.106:6011/pic?7DD9D70207A9D7F576F99AC197B2D6CAface.jpg"); //人脸图片URL
            jsonObject.put("faceLibType", "blackFD");
            jsonObject.put("FDID", "1");
            jsonObject.put("FPID", employeeNo);//人脸下发关联的工号
            String strJsonData = jsonObject.toString();
            System.arraycopy(strJsonData.getBytes(), 0, ptrByteArray.byValue, 0, strJsonData.length());//字符串拷贝到数组中
            ptrByteArray.write();
            struAddFaceDataCfg.dwSize = struAddFaceDataCfg.size();
            struAddFaceDataCfg.lpJsonData = ptrByteArray.getPointer();
            struAddFaceDataCfg.dwJsonDataSize = strJsonData.length();
            struAddFaceDataCfg.lpPicData = null;
            struAddFaceDataCfg.dwPicDataSize=0;
            struAddFaceDataCfg.write();
            HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(1024);
            IntByReference pInt = new IntByReference(0);
            while(true){
                int dwState = AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, struAddFaceDataCfg.getPointer(), struAddFaceDataCfg.dwSize ,ptrOutuff.getPointer(), 1024,  pInt);
                if(dwState == -1){
                    System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
                    break;
                }
                //读取返回的json并解析
                ptrOutuff.read();
                String strResult = new String(ptrOutuff.byValue).trim();
                System.out.println("dwState:" + dwState + ",strResult:" + strResult);
                JSONObject jsonResult = new JSONObject(strResult);
                int statusCode = jsonResult.getInt("statusCode");
                String statusString = jsonResult.getString("statusString");
                 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("下发人脸失败, json retun:" + jsonResult.toString());
                    break;
                }
                else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION)
                {
                    System.out.println("下发人脸异常, json retun:" + jsonResult.toString());
                    break;
                }
                else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS)
                {//返回NET_SDK_CONFIG_STATUS_SUCCESS代表流程走通了,但并不代表下发成功,比如人脸图片不符合设备规范等原因,所以需要解析Json报文
                    if (statusCode != 1){
                        System.out.println("下发人脸成功,但是有异常情况:" + jsonResult.toString());
                    }
                    else{
                        System.out.println("下发人脸成功,  json retun:" + jsonResult.toString());
                    }
                    break;
                }
                else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
                    //下发人脸时:dwState其实不会走到这里,因为设备不知道我们会下发多少个人,所以长连接需要我们主动关闭
                    System.out.println("下发人脸完成");
                    break;
                }
            }
            if(!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)){
                System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
            }
            else{
                System.out.println("NET_DVR_StopRemoteConfig接口成功");
            }
        }
    }
    /**
     * 查询人脸
     * @param userID
     * @param employeeNo
     * @throws JSONException
     */
    public static void searchFaceInfo(int userID,String  employeeNo) throws JSONException{
        HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024);    //数组
        String strInBuffer = "POST /ISAPI/Intelligent/FDLib/FDSearch?format=json";
        System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
        ptrByteArray.write();
        int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_FACE_DATA_SEARCH, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
        if (lHandler < 0)
        {
            System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig 失败,错误码为"+AcsMain.hCNetSDK.NET_DVR_GetLastError());
            return;
        }
        else{
            System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig成功!");
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("searchResultPosition", 0);
            jsonObject.put("maxResults", 1);
            jsonObject.put("faceLibType", "blackFD");
            jsonObject.put("FDID","1");
            jsonObject.put("FPID", employeeNo);//人脸关联的工号,同下发人员时的employeeNo字段
            String strInbuff = jsonObject.toString();
            System.out.println("查询的json报文:" + strInbuff);
            //把string传递到Byte数组中,后续用.getPointer()方法传入指针地址中。
            HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(strInbuff.length());
            System.arraycopy(strInbuff.getBytes(), 0, ptrInbuff.byValue, 0, strInbuff.length());
            ptrInbuff.write();
            HCNetSDK.NET_DVR_JSON_DATA_CFG m_struJsonData = new HCNetSDK.NET_DVR_JSON_DATA_CFG();
            m_struJsonData.write();
            IntByReference pInt = new IntByReference(0);
            while(true){
               int dwState =AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInbuff.getPointer(), strInbuff.length(), m_struJsonData.getPointer(), m_struJsonData.size(), pInt);
                m_struJsonData.read();
                System.out.println(dwState);
                if(dwState == -1){
                    System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.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("查询人脸失败");
                    break;
                }
                else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION)
                {
                    System.out.println("查询人脸异常");
                    break;
                }
                else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS)
                {
                    System.out.println("查询人脸成功");
                    //解析JSON字符串
                    HCNetSDK.BYTE_ARRAY pJsonData = new HCNetSDK.BYTE_ARRAY(m_struJsonData.dwJsonDataSize);
                    pJsonData.write();
                    Pointer pPlateInfo = pJsonData.getPointer();
                    pPlateInfo.write(0, m_struJsonData.lpJsonData.getByteArray(0, pJsonData.size()), 0, pJsonData.size());
                    pJsonData.read();
                    String strResult = new String(pJsonData.byValue).trim();
                    System.out.println("strResult:" + strResult);
                    JSONObject jsonResult = new JSONObject(strResult);
                    int numOfMatches = jsonResult.getInt("numOfMatches");
                    if(numOfMatches != 0){//确认有人脸
                        JSONArray MatchList = jsonResult.getJSONArray("MatchList");
                        JSONObject MatchList_1 = MatchList.optJSONObject(0);
                        String FPID = MatchList_1.getString("FPID"); //获取json中人脸关联的工号
                        FileOutputStream fout;
                        try {
                            fout = new FileOutputStream("..//AddFacePicture//["+ FPID +"]_FacePic.jpg");
                            //将字节写入文件
                            long offset = 0;
                            ByteBuffer buffers = m_struJsonData.lpPicData.getByteBuffer(offset, m_struJsonData.dwPicDataSize);
                            byte [] bytes = new byte[m_struJsonData.dwPicDataSize];
                            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;
                }
                else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
                    System.out.println("获取人脸完成");
                    break;
                }
            }
            if(!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)){
                System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
            }
            else{
                System.out.println("NET_DVR_StopRemoteConfig接口成功");
                lHandler = -1;
            }
        }
    }
    /**
     * 人脸删除,支持批量删除,json中添加多个工号
     * @param userID
     * @param employeeNo
     */
    public static void deleteFaceInfo(int userID,String employeeNo)
    {
        String deleteFaceUrl="PUT /ISAPI/Intelligent/FDLib/FDSearch/Delete?format=json&FDID=1&faceLibType=blackFD";
        String deleteFaceJson="{\n" +
                "    \"FPID\": [{\n" +
                "        \"value\": \""+employeeNo+"\"\n" +
                "    }]\n" +
                "}";
        String result= TransIsapi.put_isapi(userID,deleteFaceUrl,deleteFaceJson);
        System.out.println("删除人员结果:"+result);
    }
    /**
     * 人脸采集,下发人脸采集命令,从设备中采集人脸图片保存到本地
     * @param userID 用户注册ID
     */
    public static void captureFaceInfo(int userID)
    {
        HCNetSDK.NET_DVR_CAPTURE_FACE_COND struCapCond = new HCNetSDK.NET_DVR_CAPTURE_FACE_COND();
        struCapCond.read();
        struCapCond.dwSize = struCapCond.size();
        struCapCond.write();
        int lCaptureFaceHandle = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_CAPTURE_FACE_INFO, struCapCond.getPointer(), struCapCond.size(), null, null);
        if (lCaptureFaceHandle == -1) {
            System.out.println("建立采集人脸长连接失败,错误码为" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
            return;
        } else {
            System.out.println("建立采集人脸长连接成功!");
        }
        //采集的人脸信息
        HCNetSDK.NET_DVR_CAPTURE_FACE_CFG struFaceInfo = new HCNetSDK.NET_DVR_CAPTURE_FACE_CFG();
        struFaceInfo.read();
        while (true) {
            int dwState = AcsMain.hCNetSDK.NET_DVR_GetNextRemoteConfig(lCaptureFaceHandle, struFaceInfo.getPointer(), struFaceInfo.size());
            struFaceInfo.read();
            if (dwState == -1) {
                System.out.println("NET_DVR_GetNextRemoteConfig采集人脸失败,错误码:" + AcsMain.hCNetSDK.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("采集人脸失败");
                break;
            } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
                //超时时间5秒内设备本地人脸采集失败就会返回失败,连接会断开
                System.out.println("采集人脸异常, 网络异常导致连接断开 ");
                break;
            } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
                if ((struFaceInfo.dwFacePicSize > 0) && (struFaceInfo.pFacePicBuffer != null)) {
                    SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
                    String newName = sf.format(new Date());
                    FileOutputStream fout;
                    try {
                        String filename = "..\\pic\\" + newName + "_capFaceInfo.jpg";
                        fout = new FileOutputStream(filename);
                        //将字节写入文件
                        long offset = 0;
                        ByteBuffer buffers = struFaceInfo.pFacePicBuffer.getByteBuffer(offset, struFaceInfo.dwFacePicSize);
                        byte[] bytes = new byte[struFaceInfo.dwFacePicSize];
                        buffers.rewind();
                        buffers.get(bytes);
                        fout.write(bytes);
                        fout.close();
                        System.out.println("采集人脸成功, 图片保存路径: " + filename);
                    } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                break;
            } else {
                System.out.println("其他异常, dwState: " + dwState);
                break;
            }
        }
        //采集成功之后断开连接、释放资源
        if (!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lCaptureFaceHandle)) {
            System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
        } else {
            System.out.println("NET_DVR_StopRemoteConfig接口成功");
        }
    }
}
src/main/java/com/whyc/peopleCamera/Acs/FingerManage.java
New file
@@ -0,0 +1,380 @@
package com.whyc.peopleCamera.Acs;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.whyc.peopleCamera.NetSDKDemo.HCNetSDK;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.*;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * 指纹管理:指纹采集,指纹下发,指纹信息查询,指纹删除
 */
public final class FingerManage {
        /**
         * 采集指纹模块,采集指纹数据为二进制
         * @param userID
         */
        public static  void fingerCapture(int userID)
        {
                HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_COND strFingerCond = new HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_COND();
                strFingerCond.read();
                strFingerCond.dwSize = strFingerCond.size();
                strFingerCond.byFingerPrintPicType = 1;  //指纹读卡器
                strFingerCond.byFingerNo = 1;   //指纹编号
                strFingerCond.write();
                int lGetFingerHandle = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_INFO, strFingerCond.getPointer(), strFingerCond.dwSize, null, null);
                if (lGetFingerHandle == -1) {
                        System.out.println("建立采集指纹长连接失败,错误码为:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
                        return;
                } else {
                        System.out.println("建立采集指纹长连接成功!");
                }
                HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_CFG strFingerCfg = new HCNetSDK.NET_DVR_CAPTURE_FINGERPRINT_CFG();
                strFingerCfg.dwSize=strFingerCfg.size();
                strFingerCfg.write();
                while (true) {
                        int dwFingerState = AcsMain.hCNetSDK.NET_DVR_GetNextRemoteConfig(lGetFingerHandle, strFingerCfg.getPointer(), strFingerCfg.size());
                        if (dwFingerState == -1) {
                                System.out.println("NET_DVR_GetNextRemoteConfig采集指纹失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
                                break;
                        } else if (dwFingerState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_FAILED) {
                                System.out.println("采集指纹失败");
                                break;
                        } else if (dwFingerState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_NEED_WAIT) {
                                System.out.println("正在采集指纹中,请等待...");
                                try {
                                        Thread.sleep(10);
                                } catch (InterruptedException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                                continue;
                        } else if (dwFingerState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
                                //超时时间5秒内设备本地人脸采集失败就会返回失败,连接会断开
                                System.out.println("采集指纹异常, 网络异常导致连接断开 ");
                                break;
                        } else if (dwFingerState == HCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS) {
                                strFingerCfg.read();
                                SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
                                String newName = sf.format(new Date());
                                String fileName = newName + "_capFinger.data";
                                String filePath = "..\\pic\\" + fileName;
                                BufferedOutputStream bos = null;
                                FileOutputStream fos = null;
                                File file = null;
                                try {
                                        File dir = new File(filePath);
                                        if (!dir.exists() && dir.isDirectory()) {//判断文件目录是否存在
                                                dir.mkdirs();
                                        }
                                        file = new File(filePath);
                                        fos = new FileOutputStream(file);
                                        bos = new BufferedOutputStream(fos);
                                        bos.write(strFingerCfg.byFingerData);
                                        System.out.println("采集指纹成功!");
                                } catch (Exception e) {
                                        e.printStackTrace();
                                } finally {
                                        if (bos != null) {
                                                try {
                                                        bos.close();
                                                } catch (IOException e1) {
                                                        e1.printStackTrace();
                                                }
                                        }
                                        if (fos != null) {
                                                try {
                                                        fos.close();
                                                } catch (IOException e1) {
                                                        e1.printStackTrace();
                                                }
                                        }
                                }
                                if ((strFingerCfg.dwFingerPrintPicSize > 0) && (strFingerCfg.pFingerPrintPicBuffer != null)) {
                                        FileOutputStream fout;
                                        try {
                                                String filename = "..\\pic\\" + newName + "_FingerPrintPic.jpg";
                                                fout = new FileOutputStream(filename);
                                                //将字节写入文件
                                                long offset = 0;
                                                ByteBuffer buffers = strFingerCfg.pFingerPrintPicBuffer.getByteBuffer(offset, strFingerCfg.dwFingerPrintPicSize);
                                                byte[] bytes = new byte[strFingerCfg.dwFingerPrintPicSize];
                                                buffers.rewind();
                                                buffers.get(bytes);
                                                fout.write(bytes);
                                                fout.close();
                                                System.out.println("采集指纹成功, 图片保存路径: " + filename);
                                        } catch (FileNotFoundException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        } catch (IOException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                }
                                break;
                        } else {
                                System.out.println("其他异常, dwState: " + dwFingerState);
                                break;
                        }
                }
                //采集成功之后断开连接、释放资源
                if (!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lGetFingerHandle)) {
                        System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
                } else {
                        System.out.println("NET_DVR_StopRemoteConfig接口成功");
                }
        }
        /**
         * 采用透传ISAPI协议方式采集指纹,获取的指纹信息为BASE64编码,
         */
        public static void  fingerCpaureByisapi(int userID)
        {
                //采集指纹URL
              String fingerCapUrl="POST /ISAPI/AccessControl/CaptureFingerPrint";
              String XmlInput="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                      "<CaptureFingerPrintCond xmlns=\"http://www.isapi.org/ver20/XMLSchema\" version=\"2.0\">\n" +
                      "  <fingerNo>1</fingerNo>\n" +
                      "</CaptureFingerPrintCond>";
              String result= TransIsapi.put_isapi(userID,fingerCapUrl,XmlInput);
                System.out.println("采集指纹结果:"+result);
        }
        public static void setOneFinger(int userID, String employeeNo,String figerdata) throws JSONException {
                HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024);    //数组
                String strInBuffer = "POST /ISAPI/AccessControl/FingerPrint/SetUp?format=json";
                System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
                ptrByteArray.write();
                int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
                if (lHandler < 0)
                {
                        System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig 失败,错误码为"+AcsMain.hCNetSDK.NET_DVR_GetLastError());
                        return;
                }
                else{
                        System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig成功!");
                        JSONObject jsonObject = new JSONObject();
                        JSONObject j_FingerPrintCond=new JSONObject();
                        j_FingerPrintCond.put("employeeNo", employeeNo);
                        int[] CardReader = {1};
                        j_FingerPrintCond.put("enableCardReader",CardReader); //人员工号
                        j_FingerPrintCond.put("fingerPrintID", 1);
                        j_FingerPrintCond.put("fingerType", "normalFP");
                        j_FingerPrintCond.put("fingerData",figerdata);
                        jsonObject.put("FingerPrintCfg",j_FingerPrintCond);
                        String strInbuff = jsonObject.toString();
                        System.out.println("查询的json报文:" + strInbuff);
                        //把string传递到Byte数组中,后续用.getPointer()方法传入指针地址中。
                        HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(strInbuff.length());
                        System.arraycopy(strInbuff.getBytes(), 0, ptrInbuff.byValue, 0, strInbuff.length());
                        ptrInbuff.write();
                        HCNetSDK.NET_DVR_STRING_POINTER ptrOutbuff = new HCNetSDK.NET_DVR_STRING_POINTER(3*1024);
                        ptrOutbuff.write();
                        IntByReference pInt = new IntByReference(0);
                        while(true){
                                int dwState =AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInbuff.getPointer(), strInbuff.length(), ptrOutbuff.getPointer(), ptrOutbuff.size(), pInt);
                                ptrOutbuff.read();
                                System.out.println(dwState);
                                if(dwState == -1){
                                        System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.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("下发指纹失败");
                                        break;
                                }
                                else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION)
                                {
                                        System.out.println("下发指纹异常");
                                        break;
                                }
                                else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS)
                                {
                                        System.out.println("下发指纹成功");
                                        //解析JSON字符串
                                        ptrOutbuff.read();
                                        System.out.println("返回的报文:"+new String(ptrOutbuff.byString));
                                        break;
                                }
                                else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
                                        System.out.println("下发指纹完成");
                                        break;
                                }
                        }
                        if(!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)){
                                System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
                        }
                        else{
                                System.out.println("NET_DVR_StopRemoteConfig接口成功");
                                lHandler = -1;
                        }
                }
        }
        public static void SearchFingerInfo(int userID,String employeeNo) throws JSONException {
                HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024);    //数组
                String strInBuffer = "POST /ISAPI/AccessControl/FingerPrintUpload?format=json";
                System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
                ptrByteArray.write();
                int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
                if (lHandler < 0)
                {
                        System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig 失败,错误码为"+AcsMain.hCNetSDK.NET_DVR_GetLastError());
                        return;
                }
                else{
                        System.out.println("SearchFaceInfo NET_DVR_StartRemoteConfig成功!");
                        JSONObject jsonObject = new JSONObject();
                        JSONObject j_FingerPrintCond=new JSONObject();
                        j_FingerPrintCond.put("searchID", "20211223");
                        j_FingerPrintCond.put("employeeNo", employeeNo); //人员工号
                        j_FingerPrintCond.put("cardReaderNo", 1);
                        j_FingerPrintCond.put("fingerPrintID", 1);
                        jsonObject.put("FingerPrintCond",j_FingerPrintCond);
                        String strInbuff = jsonObject.toString();
                        System.out.println("查询的json报文:" + strInbuff);
                        //把string传递到Byte数组中,后续用.getPointer()方法传入指针地址中。
                        HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(strInbuff.length());
                        System.arraycopy(strInbuff.getBytes(), 0, ptrInbuff.byValue, 0, strInbuff.length());
                        ptrInbuff.write();
                        HCNetSDK.NET_DVR_STRING_POINTER ptrOutbuff = new HCNetSDK.NET_DVR_STRING_POINTER(3*1024);
                        ptrOutbuff.write();
                        IntByReference pInt = new IntByReference(0);
                        while(true){
                                int dwState =AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInbuff.getPointer(), strInbuff.length(), ptrOutbuff.getPointer(), ptrOutbuff.size(), pInt);
                                ptrOutbuff.read();
                                System.out.println(dwState);
                                if(dwState == -1){
                                        System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.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("查询指纹失败");
                                        break;
                                }
                                else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION)
                                {
                                        System.out.println("查询指纹异常");
                                        break;
                                }
                                else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS)
                                {
                                        System.out.println("查询指纹成功");
                                        //解析JSON字符串
                                        ptrOutbuff.read();
                                        System.out.println("查询的报文:"+new String(ptrOutbuff.byString));
                                        break;
                                }
                                else if(dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
                                        System.out.println("获取指纹完成");
                                        break;
                                }
                        }
                        if(!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)){
                                System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
                        }
                        else{
                                System.out.println("NET_DVR_StopRemoteConfig接口成功");
                                lHandler = -1;
                        }
                }
        }
        /**
         * 按工号和读卡器删除指纹,按工号是逐个删除,按读卡器是批量删除指定读卡器上所有的指纹数据
         * @param userID
         * @param employeeNo
         */
        public static void deleteFinger(int userID,String employeeNo )
        {
                int iErr = 0;
                HCNetSDK.NET_DVR_FINGER_PRINT_INFO_CTRL_V50 m_struFingerDelInfoParam = new HCNetSDK.NET_DVR_FINGER_PRINT_INFO_CTRL_V50();
                m_struFingerDelInfoParam.dwSize = m_struFingerDelInfoParam.size();
                m_struFingerDelInfoParam.byMode = 0;// 删除方式,0-按卡号(人员ID)方式删除,1-按读卡器删除
                m_struFingerDelInfoParam.struProcessMode.setType(HCNetSDK.NET_DVR_FINGER_PRINT_BYCARD_V50.class);
                for (int i = 0; i < employeeNo.length(); i++) {
                        m_struFingerDelInfoParam.struProcessMode.struByCard.byEmployeeNo[i] = employeeNo.getBytes()[i];
                }
                m_struFingerDelInfoParam.struProcessMode.struByCard.byEnableCardReader[0] = 1;//指纹的读卡器信息,按位表示
                m_struFingerDelInfoParam.struProcessMode.struByCard.byFingerPrintID[0] = 1;//需要删除的指纹编号,按数组下标,值表示0-不删除,1-删除该指纹 ,指纹编号1删除
                Pointer lpInBuffer1 = m_struFingerDelInfoParam.getPointer();
                m_struFingerDelInfoParam.write();
                int lHandle = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_DEL_FINGERPRINT, lpInBuffer1, m_struFingerDelInfoParam.size(), null, null);
                if (lHandle < 0) {
                        iErr = AcsMain.hCNetSDK.NET_DVR_GetLastError();
                        System.out.println("NET_DVR_DEL_FINGERPRINT_CFG_V50 建立长连接失败,错误号:" + iErr);
                        return;
                }
                while (true) {
                        HCNetSDK.NET_DVR_FINGER_PRINT_INFO_CTRL_V50 v50 = new HCNetSDK.NET_DVR_FINGER_PRINT_INFO_CTRL_V50();
                        v50.dwSize = v50.size();
                        v50.write();
                        int res = AcsMain.hCNetSDK.NET_DVR_GetNextRemoteConfig(lHandle, v50.getPointer(), v50.size());
                        if (res == 1002) {
                                AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandle);
                                System.out.println("删除指纹成功!!!");
                                break;
                        } else if (res == 1003) {
                                System.out.println("接口失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
                                AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandle);
                                break;
                        }
                }
        }
}
src/main/java/com/whyc/peopleCamera/Acs/MutilCard.java
New file
@@ -0,0 +1,76 @@
package com.whyc.peopleCamera.Acs;
import com.whyc.peopleCamera.NetSDKDemo.HCNetSDK;
/**
 * 多重卡认证功能,下发人员的输入json中参数belongGroup绑定人员群组
 */
public class MutilCard {
    //设置群组参数
    public static void setGroupCfg(int lUserID)
    {
        HCNetSDK.NET_DVR_GROUP_CFG struGroupCfg = new HCNetSDK.NET_DVR_GROUP_CFG();
        struGroupCfg.read();
        struGroupCfg.dwSize = struGroupCfg.size();
        struGroupCfg.byEnable = 1;
        struGroupCfg.byGroupName = "test".getBytes();  //
        struGroupCfg.struValidPeriodCfg.byEnable = 1;
        struGroupCfg.struValidPeriodCfg.struBeginTime.wYear = 2021;
        struGroupCfg.struValidPeriodCfg.struBeginTime.byMonth = 1;
        struGroupCfg.struValidPeriodCfg.struBeginTime.byDay = 1;
        struGroupCfg.struValidPeriodCfg.struBeginTime.byHour = 0;
        struGroupCfg.struValidPeriodCfg.struBeginTime.byMinute = 0;
        struGroupCfg.struValidPeriodCfg.struBeginTime.bySecond = 0;
        struGroupCfg.struValidPeriodCfg.struEndTime.wYear = 2037;
        struGroupCfg.struValidPeriodCfg.struEndTime.byMonth = 12;
        struGroupCfg.struValidPeriodCfg.struEndTime.byDay = 31;
        struGroupCfg.struValidPeriodCfg.struEndTime.byHour = 23;
        struGroupCfg.struValidPeriodCfg.struEndTime.byMinute = 59;
        struGroupCfg.struValidPeriodCfg.struEndTime.bySecond = 59;
        struGroupCfg.write();
        if(!AcsMain.hCNetSDK.NET_DVR_SetDVRConfig(lUserID,2113,1,struGroupCfg.getPointer(),struGroupCfg.size()))
        {
            System.out.println("NET_DVR_SetDVRConfig NET_DVR_SET_GROUP_CFG失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
        } else {
            System.out.println("NET_DVR_SetDVRConfig NET_DVR_SET_GROUP_CFG成功");
        }
    }
    //设置多重认证参数
    /**
     * 多重卡刷卡开门功能:
     * 有权限的任意n张卡刷卡之后才能开门,不限制先后次序,则只需要设置一个群组组合(卡号都配置关联该群组),byMemberNum设为n,bySequenceNo设为1。
     * 有权限的n张A类卡和m张B类卡刷卡之后才能开门,而且先刷A类卡再刷B类卡,则需要设置2个群组组合,2个群组组合的byMemberNum分别为n和m,
     * bySequenceNo分别为1、2;如果不需要限制刷卡先后次序,则bySequenceNo都设为0,0表示无序。
     * @param lUserID
     */
    public static void setMultiCardCfg(int lUserID)
    {
        HCNetSDK.NET_DVR_MULTI_CARD_CFG_V50 struMultiCardCfg = new HCNetSDK.NET_DVR_MULTI_CARD_CFG_V50();
        struMultiCardCfg.read();
        struMultiCardCfg.dwSize = struMultiCardCfg.size();
        struMultiCardCfg.byEnable = 1;
        struMultiCardCfg.bySwipeIntervalTimeout = 30;   //刷卡认证超时时间
        struMultiCardCfg.struGroupCfg[0].byEnable = 1;
        struMultiCardCfg.struGroupCfg[0].dwTemplateNo = 1;
        struMultiCardCfg.struGroupCfg[0].struGroupCombination[0].byEnable = 1;
        struMultiCardCfg.struGroupCfg[0].struGroupCombination[0].byMemberNum = 2; //刷卡成员数量,群组里面需要刷卡的卡个数
        struMultiCardCfg.struGroupCfg[0].struGroupCombination[0].bySequenceNo = 1; //群组刷卡次序号
        struMultiCardCfg.struGroupCfg[0].struGroupCombination[0].dwGroupNo = 1;    //群组编号         //刷卡认证组
        struMultiCardCfg.write();
        if(!AcsMain.hCNetSDK.NET_DVR_SetDVRConfig(lUserID, HCNetSDK.NET_DVR_SET_MULTI_CARD_CFG_V50,1,struMultiCardCfg.getPointer(),struMultiCardCfg.size()))
        {
            System.out.println("NET_DVR_SetDVRConfig NET_DVR_SET_MULTI_CARD_CFG_V50 失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
        } else {
            System.out.println("NET_DVR_SetDVRConfig NET_DVR_SET_MULTI_CARD_CFG_V50 成功");
        }
    }
}
src/main/java/com/whyc/peopleCamera/Acs/TransIsapi.java
New file
@@ -0,0 +1,100 @@
package com.whyc.peopleCamera.Acs;
import com.whyc.peopleCamera.NetSDKDemo.HCNetSDK;
/**
 * @create 2021-04-13-15:23
 * 功能:透传接口实现,透传ISAPI命令
 */
public final class TransIsapi {
    public static String get_isapi(int lUserID, String url) {
        HCNetSDK.NET_DVR_XML_CONFIG_INPUT struXMLInput = new HCNetSDK.NET_DVR_XML_CONFIG_INPUT();
        struXMLInput.read();
        HCNetSDK.BYTE_ARRAY stringRequest = new HCNetSDK.BYTE_ARRAY(1024);
        stringRequest.read();
        //输入ISAPI协议命令
        System.arraycopy(url.getBytes(), 0, stringRequest.byValue, 0, url.length());
        stringRequest.write();
        struXMLInput.dwSize = struXMLInput.size();
        struXMLInput.lpRequestUrl = stringRequest.getPointer();
        struXMLInput.dwRequestUrlLen = url.length();
        struXMLInput.lpInBuffer = null;
        struXMLInput.dwInBufferSize = 0;
        struXMLInput.write();
        HCNetSDK.BYTE_ARRAY stringXMLOut = new HCNetSDK.BYTE_ARRAY(8 * 1024);
        stringXMLOut.read();
        HCNetSDK.BYTE_ARRAY struXMLStatus = new HCNetSDK.BYTE_ARRAY(1024);
        struXMLStatus.read();
        HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT struXMLOutput = new HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT();
        struXMLOutput.read();
        struXMLOutput.dwSize = struXMLOutput.size();
        struXMLOutput.lpOutBuffer = stringXMLOut.getPointer();
        struXMLOutput.dwOutBufferSize = stringXMLOut.size();
        struXMLOutput.lpStatusBuffer = struXMLStatus.getPointer();
        struXMLOutput.dwStatusSize = struXMLStatus.size();
        struXMLOutput.write();
        if (!AcsMain.hCNetSDK.NET_DVR_STDXMLConfig(lUserID, struXMLInput, struXMLOutput)) {
            int iErr = AcsMain.hCNetSDK.NET_DVR_GetLastError();
            System.err.println("NET_DVR_STDXMLConfig失败,错误号" + iErr+"----URL:"+url);
            return null;
        } else {
            stringXMLOut.read();
            System.out.println("输出文本大小:" + struXMLOutput.dwReturnedXMLSize);
            //打印输出XML文本
            String strOutXML = new String(stringXMLOut.byValue).trim();
            System.out.println(strOutXML);
            struXMLStatus.read();
            String strStatus = new String(struXMLStatus.byValue).trim();
            System.out.println(strStatus);
            return strOutXML;
        }
    }
    public static String put_isapi(int lUserID, String url, String inputXml) {
        HCNetSDK.NET_DVR_XML_CONFIG_INPUT struXMLInput = new HCNetSDK.NET_DVR_XML_CONFIG_INPUT();
        struXMLInput.read();
        HCNetSDK.BYTE_ARRAY stringRequest = new HCNetSDK.BYTE_ARRAY(1024);
        stringRequest.read();
        //输入ISAPI协议命令
        System.arraycopy(url.getBytes(), 0, stringRequest.byValue, 0, url.length());
        stringRequest.write();
        struXMLInput.dwSize = struXMLInput.size();
        struXMLInput.lpRequestUrl = stringRequest.getPointer();
        struXMLInput.dwRequestUrlLen = url.length();
        HCNetSDK.BYTE_ARRAY ptrInBuffer = new HCNetSDK.BYTE_ARRAY(inputXml.length());
        ptrInBuffer.read();
        System.arraycopy(inputXml.getBytes(), 0, ptrInBuffer.byValue, 0, inputXml.length());
        ptrInBuffer.write();
        struXMLInput.lpInBuffer = ptrInBuffer.getPointer();
        struXMLInput.dwInBufferSize = inputXml.length();
        struXMLInput.write();
        HCNetSDK.BYTE_ARRAY stringXMLOut = new HCNetSDK.BYTE_ARRAY(8 * 1024);
        stringXMLOut.read();
        HCNetSDK.BYTE_ARRAY struXMLStatus = new HCNetSDK.BYTE_ARRAY(1024);
        struXMLStatus.read();
        HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT struXMLOutput = new HCNetSDK.NET_DVR_XML_CONFIG_OUTPUT();
        struXMLOutput.read();
        struXMLOutput.dwSize = struXMLOutput.size();
        struXMLOutput.lpOutBuffer = stringXMLOut.getPointer();
        struXMLOutput.dwOutBufferSize = stringXMLOut.size();
        struXMLOutput.lpStatusBuffer = struXMLStatus.getPointer();
        struXMLOutput.dwStatusSize = struXMLStatus.size();
        struXMLOutput.write();
        if (!AcsMain.hCNetSDK.NET_DVR_STDXMLConfig(lUserID, struXMLInput, struXMLOutput)){
            int iErr = AcsMain.hCNetSDK.NET_DVR_GetLastError();
            System.err.println("NET_DVR_STDXMLConfig失败,错误号" + iErr+"----URL:"+url);
            return null;
        } else {
            stringXMLOut.read();
            System.out.println("输出文本大小:" + struXMLOutput.dwReturnedXMLSize);
            //打印输出XML文本
            String strOutXML = new String(stringXMLOut.byValue).trim();
            struXMLStatus.read();
            String strStatus = new String(struXMLStatus.byValue).trim();
            return strOutXML;
        }
    }
}
src/main/java/com/whyc/peopleCamera/Acs/UserManage.java
New file
@@ -0,0 +1,364 @@
package com.whyc.peopleCamera.Acs;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.whyc.peopleCamera.NetSDKDemo.HCNetSDK;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.UnsupportedEncodingException;
/**
 * 功能:人脸下发、查询、删除、人员计划模板配置
 */
public class UserManage {
    /**
     * 添加人员
     *
     * @param lUserID    登录句柄
     * @param employeeNo 工号
     * @throws UnsupportedEncodingException
     * @throws InterruptedException
     * @throws JSONException
     */
    public static void addUserInfo(int lUserID, String employeeNo) throws UnsupportedEncodingException, InterruptedException, JSONException {
        HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024);    //数组
        //"POST /ISAPI/AccessControl/UserInfo/Record?format=json" 此URL也是下发人员
        String strInBuffer = "PUT /ISAPI/AccessControl/UserInfo/SetUp?format=json";
        System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
        ptrByteArray.write();
        int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
        if (lHandler < 0) {
            System.out.println("AddUserInfo NET_DVR_StartRemoteConfig 失败,错误码为" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
            return;
        } else {
            System.out.println("AddUserInfo NET_DVR_StartRemoteConfig 成功!");
            byte[] Name = "测试1".getBytes("utf-8"); //根据iCharEncodeType判断,如果iCharEncodeType返回6,则是UTF-8编码。
            //如果是0或者1或者2,则是GBK编码
            //将中文字符编码之后用数组拷贝的方式,避免因为编码导致的长度问题
            String strInBuffer1 = "{\n" +
                    "    \"UserInfo\":{\n" +
                    "        \"employeeNo\":\""+employeeNo+"\",\n" +
                    "        \"name\":\"";
            String strInBuffer2 = "\",\n" +
                    "        \"userType\":\"normal\",\n" +
                    "        \"Valid\":{\n" +
                    "            \"enable\":true,\n" +
                    "            \"beginTime\":\"2019-08-01T17:30:08\",\n" +
                    "            \"endTime\":\"2030-08-01T17:30:08\",\n" +
                    "            \"timeType\":\"local\"\n" +
                    "        },\n" +
                    "        \"belongGroup\":\"1\",\n" +
                    "        \"doorRight\":\"1\",\n" +
                    "        \"RightPlan\":[\n" +
                    "            {\n" +
                    "                \"doorNo\":1,\n" +
                    "                \"planTemplateNo\":\"1\"\n" +
                    "            }\n" +
                    "        ]\n" +
                    "    }\n" +
                    "}";
            int iStringSize = Name.length + strInBuffer1.length() + strInBuffer2.length();
            HCNetSDK.BYTE_ARRAY ptrByte = new HCNetSDK.BYTE_ARRAY(iStringSize);
            System.arraycopy(strInBuffer1.getBytes(), 0, ptrByte.byValue, 0, strInBuffer1.length());
            System.arraycopy(Name, 0, ptrByte.byValue, strInBuffer1.length(), Name.length);
            System.arraycopy(strInBuffer2.getBytes(), 0, ptrByte.byValue, strInBuffer1.length() + Name.length, strInBuffer2.length());
            ptrByte.write();
            System.out.println(new String(ptrByte.byValue));
            HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(1024);
            IntByReference pInt = new IntByReference(0);
            while (true) {
                int dwState = AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrByte.getPointer(), iStringSize, ptrOutuff.getPointer(), 1024, pInt);
                if (dwState == -1) {
                    System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
                    break;
                }
                //读取返回的json并解析
                ptrOutuff.read();
                String strResult = new String(ptrOutuff.byValue).trim();
                System.out.println("dwState:" + dwState + ",strResult:" + strResult);
                JSONObject jsonResult = new JSONObject(strResult);
                int statusCode = jsonResult.getInt("statusCode");
                String statusString = jsonResult.getString("statusString");
                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("下发人员失败, json retun:" + jsonResult.toString());
                    break;
                } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
                    System.out.println("下发人员异常, json retun:" + jsonResult.toString());
                    break;
                } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {//返回NET_SDK_CONFIG_STATUS_SUCCESS代表流程走通了,但并不代表下发成功,比如有些设备可能因为人员已存在等原因下发失败,所以需要解析Json报文
                    if (statusCode != 1) {
                        System.out.println("下发人员成功,但是有异常情况:" + jsonResult.toString());
                    } else {
                        System.out.println("下发人员成功: json retun:" + jsonResult.toString());
                    }
                    break;
                } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
                    //下发人员时:dwState其实不会走到这里,因为设备不知道我们会下发多少个人,所以长连接需要我们主动关闭
                    System.out.println("下发人员完成");
                    break;
                }
            }
            if (!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)) {
                System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
            } else {
                System.out.println("NET_DVR_StopRemoteConfig接口成功");
            }
        }
    }
    /**
     * 查询人员信息
     * @param userID
     * @throws JSONException
     */
    public static void searchUserInfo(int userID) throws JSONException {
        HCNetSDK.BYTE_ARRAY ptrByteArray = new HCNetSDK.BYTE_ARRAY(1024);    //数组
        String strInBuffer = "POST /ISAPI/AccessControl/UserInfo/Search?format=json";
        System.arraycopy(strInBuffer.getBytes(), 0, ptrByteArray.byValue, 0, strInBuffer.length());//字符串拷贝到数组中
        ptrByteArray.write();
        int lHandler = AcsMain.hCNetSDK.NET_DVR_StartRemoteConfig(userID, HCNetSDK.NET_DVR_JSON_CONFIG, ptrByteArray.getPointer(), strInBuffer.length(), null, null);
        if (lHandler < 0) {
            System.out.println("SearchUserInfo NET_DVR_StartRemoteConfig 失败,错误码为" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
            return;
        } else {
            //组装查询的JSON报文,这边查询的是所有的人员
            JSONObject jsonObject = new JSONObject();
            JSONObject jsonSearchCond = new JSONObject();
            //如果需要查询指定的工号人员信息,把下面注释的内容去除掉即可
    /*        JSONArray EmployeeNoList = new JSONArray();
            JSONObject employeeNo1 = new JSONObject();
            employeeNo1.put("employeeNo", "12346");
            JSONObject employeeNo2 = new JSONObject();
            employeeNo2.put("employeeNo", "1000");
            EmployeeNoList.put(employeeNo1);
            EmployeeNoList.put(employeeNo2);
            jsonSearchCond.put("EmployeeNoList", EmployeeNoList);*/
            jsonSearchCond.put("searchID", "20211126");
            jsonSearchCond.put("searchResultPosition", 0);
            jsonSearchCond.put("maxResults", 50);
            jsonObject.put("UserInfoSearchCond", jsonSearchCond);
            String strInbuff = jsonObject.toString();
            System.out.println("查询的json报文:" + strInbuff);
            //把string传递到Byte数组中,后续用.getPointer()方法传入指针地址中。
            HCNetSDK.BYTE_ARRAY ptrInbuff = new HCNetSDK.BYTE_ARRAY(strInbuff.length());
            System.arraycopy(strInbuff.getBytes(), 0, ptrInbuff.byValue, 0, strInbuff.length());
            ptrInbuff.write();
            //定义接收结果的结构体
            HCNetSDK.BYTE_ARRAY ptrOutuff = new HCNetSDK.BYTE_ARRAY(10 * 1024);
            IntByReference pInt = new IntByReference(0);
            while (true) {
                /*
                dwOutBuffSize是输出缓冲区大小,需要自定义指定大小,如果接口报错错误码43.说明接收设备数据的缓冲区或存放图片缓冲区不足,应扩大缓冲区大小
                 */
                int dwState = AcsMain.hCNetSDK.NET_DVR_SendWithRecvRemoteConfig(lHandler, ptrInbuff.getPointer(), strInbuff.length(), ptrOutuff.getPointer(), 20 * 1024, pInt);
                System.out.println(dwState);
                if (dwState == -1) {
                    System.out.println("NET_DVR_SendWithRecvRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.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("查询人员失败");
                    break;
                } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_EXCEPTION) {
                    System.out.println("查询人员异常");
                    break;
                } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_SUCCESS) {
                    ptrOutuff.read();
                    System.out.println("查询人员成功, json:" + new String(ptrOutuff.byValue).trim());
                    break;
                } else if (dwState == HCNetSDK.NET_SDK_CONFIG_STATUS_FINISH) {
                    System.out.println("获取人员完成");
                    break;
                }
            }
            if (!AcsMain.hCNetSDK.NET_DVR_StopRemoteConfig(lHandler)) {
                System.out.println("NET_DVR_StopRemoteConfig接口调用失败,错误码:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
            } else {
                System.out.println("NET_DVR_StopRemoteConfig接口成功");
                lHandler = -1;
            }
        }
    }
    public static void deleteUserInfo(int userID) throws JSONException {
        //删除单个人员
//            String deleteUserjson="{\n" +
//                    "\t\"UserInfoDetail\": {\t\n" +
//                    "\t\t\"mode\":  \"byEmployeeNo\",\t\n" +
//                    "\t\t\"EmployeeNoList\": [\t\n" +
//                    "\t\t\t{\n" +
//                    "\t\t\t\t\"employeeNo\":  \"test\"\t\n" +
//                    "\t\t\t}\n" +
//                    "\t\t]\n" +
//                    "\n" +
//                    "\t}\n" +
//                    "}";
        //删除所有人员
        String deleteUserjson = "{\n" +
                "\t\"UserInfoDetail\": {\t\n" +
                "\t\t\"mode\":  \"all\",\t\n" +
                "\t\t\"EmployeeNoList\": [\t\n" +
                "\t\t]\n" +
                "\n" +
                "\t}\n" +
                "}";
        String deleteUserUrl = "PUT /ISAPI/AccessControl/UserInfoDetail/Delete?format=json";
        String result = TransIsapi.put_isapi(userID, deleteUserUrl, deleteUserjson);
        System.out.println(result);
        //获取删除进度
        while (true) {
            String getDeleteProcessUrl = "GET /ISAPI/AccessControl/UserInfoDetail/DeleteProcess?format=json";
            String deleteResult = TransIsapi.get_isapi(userID, getDeleteProcessUrl);
            JSONObject jsonObject = new JSONObject(deleteResult);
            JSONObject jsonObject1 = jsonObject.getJSONObject("UserInfoDetailDeleteProcess");
            String process = jsonObject1.getString("status");
            System.out.println("process ="+process);
            if (process.equals("processing")) {
                System.out.println("正在删除");
                continue;
            } else if (process.equals("success")) {
                System.out.println("删除成功");
                break;
            }else if(process.equals("failed")){
                System.out.println("删除失败");
                break;
            }
        }
    }
    /**
     * 人员计划模板配置
     *
     * @param userID              用户登录句柄
     * @param iPlanTemplateNumber 计划模板编号,从1开始,最大值从门禁能力集获取
     */
    public static void setCardTemplate(int userID, 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) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        struPlanTemCfg.write();
        IntByReference pInt = new IntByReference(0);
        Pointer lpStatusList = pInt.getPointer();
        if (false == AcsMain.hCNetSDK.NET_DVR_SetDeviceConfig(userID, HCNetSDK.NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50, 1, struPlanCond.getPointer(), struPlanCond.size(), lpStatusList, struPlanTemCfg.getPointer(), struPlanTemCfg.size())) {
            System.out.println("NET_DVR_SET_CARD_RIGHT_PLAN_TEMPLATE_V50失败,错误号:" + AcsMain.hCNetSDK.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();
        if (false == AcsMain.hCNetSDK.NET_DVR_GetDeviceConfig(userID, HCNetSDK.NET_DVR_GET_CARD_RIGHT_WEEK_PLAN_V50, 1, lpCond, struWeekPlanCond.size(), lpStatusList, lpInbuferCfg, struWeekPlanCfg.size())) {
            System.out.println("NET_DVR_GET_CARD_RIGHT_WEEK_PLAN_V50失败,错误号:" + AcsMain.hCNetSDK.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 = 21;
            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 = 23;
            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();
        //设置卡权限周计划参数
        if (false == AcsMain.hCNetSDK.NET_DVR_SetDeviceConfig(userID, HCNetSDK.NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50, 1, lpCond, struWeekPlanCond.size(), lpStatusList, lpInbuferCfg, struWeekPlanCfg.size())) {
            System.out.println("NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50失败,错误号:" + AcsMain.hCNetSDK.NET_DVR_GetLastError());
        } else {
            System.out.println("NET_DVR_SET_CARD_RIGHT_WEEK_PLAN_V50成功!");
        }
    }
}
src/main/java/com/whyc/peopleCamera/Commom/osSelect.java
New file
@@ -0,0 +1,12 @@
package com.whyc.peopleCamera.Commom;
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");
    }
}
src/main/java/com/whyc/peopleCamera/NetSDKDemo/HCNetSDK.java
New file
Diff too large
src/main/java/com/whyc/pojo/PeopleCarmera.java
New file
@@ -0,0 +1,20 @@
package com.whyc.pojo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class PeopleCarmera {
    @ApiModelProperty(value = "卡号")
    private String carId;
    @ApiModelProperty(value = "事件类型")
    private int eventType;
    @ApiModelProperty(value = "员工编号")
    private String employeeNo;
    @ApiModelProperty(value = "人脸温度")
    private float fCurrTemperature;
    @ApiModelProperty(value = "温度是否异常")
    private int byIsAbnomalTemperature;
    @ApiModelProperty(value = "是否戴口罩( 0-保留,1-未知,2-不戴口罩,3-戴口罩)")
    private int byMask;
}
src/main/java/com/whyc/service/CarCameraHisService.java
@@ -1,15 +1,17 @@
package com.whyc.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.whyc.dto.Login;
import com.whyc.mapper.CarCameraHisMapper;
import com.whyc.pojo.CarCamera;
import com.whyc.peopleCamera.Acs.AcsMain;
import com.whyc.pojo.CarCameraHis;
import com.whyc.pojo.PeopleCarmera;
import com.whyc.pojo.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.UnsupportedEncodingException;
import java.util.List;
@Service
@@ -17,6 +19,12 @@
    @Autowired(required = false)
    private CarCameraHisMapper hisMapper;
    @Autowired(required = false)
    private AcsMain acsMain_p;
    @Autowired(required = false)
    private com.whyc.carCamera.Acs.AcsMain acsMain;
    //获取门禁历史数据
    public Response getCarCameraHis(int carCameraId,int pageCurr,int pageSize) {
        PageHelper.startPage(pageCurr,pageSize);
@@ -24,4 +32,18 @@
        PageInfo pageInfo=new PageInfo(list);
        return new Response().setII(1,list.size()>0,pageInfo,"获取门禁历史数据");
    }
    //从以人为中心获取事件
    public Response getCarCameraHis_people(Login login) throws UnsupportedEncodingException, InterruptedException {
        List<PeopleCarmera> list=acsMain_p.getCarCameraHis_people(login);
        if(list!=null){
            for (PeopleCarmera pc:list) {
                String carId=pc.getCarId();
                acsMain.getFaceCInfo(login,carId);
            }
            return new Response().setII(1,true,list,"获取门禁历史数据");
        }else{
            return new Response().set(1,false,"获取失败");
        }
    }
}
src/main/java/com/whyc/service/CarCameraService.java
@@ -6,7 +6,6 @@
import com.whyc.mapper.CarCameraMapper;
import com.whyc.pojo.CarCamera;
import com.whyc.dto.Login;
import com.whyc.pojo.CarCameraInf;
import com.whyc.pojo.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;