package com.netsdk.demo.customize; import java.io.File; import java.io.UnsupportedEncodingException; import com.netsdk.demo.customize.configuration.Recording; import com.netsdk.demo.util.CaseMenu; import com.netsdk.lib.NativeString; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.netsdk.lib.structure.NET_IN_DOWNLOAD_PIECE_FILE; import com.netsdk.lib.structure.NET_OUT_DOWNLOAD_PIECE_FILE; import com.netsdk.lib.NetSDKLib.LLong; import com.netsdk.lib.NetSDKLib.NET_DEVICEINFO_Ex; import com.netsdk.lib.NetSDKLib.NET_IN_DOWNLOAD_REMOTE_FILE; import com.netsdk.lib.NetSDKLib.NET_IN_STARTFIND_FACERECONGNITION; import com.netsdk.lib.NetSDKLib.NET_OUT_DOWNLOAD_REMOTE_FILE; import com.netsdk.lib.NetSDKLib.NET_OUT_STARTFIND_FACERECONGNITION; import com.netsdk.lib.NetSDKLib.SdkStructure; import com.sun.jna.Memory; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; public class findByPasser { public static final NetSDKLib netSdk = NetSDKLib.NETSDK_INSTANCE; // 登陆句柄 private static LLong loginHandle = new LLong(0); // 设备信息扩展 private NET_DEVICEINFO_Ex deviceInfo = new NET_DEVICEINFO_Ex(); public class picUrl extends SdkStructure{ public String URL ; } public void InitTest(){ // 初始化SDK库 netSdk.CLIENT_Init(DisConnectCallBack.getInstance(), null); // 设置断线重连成功回调函数 netSdk.CLIENT_SetAutoReconnect(HaveReConnectCallBack.getInstance(), null); //打开日志,可选 NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO(); String logPath = new File(".").getAbsoluteFile().getParent() + File.separator + "sdk_log" + File.separator + "sdk.log"; setLog.bSetFilePath = 1; System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length); setLog.bSetPrintStrategy = 1; setLog.nPrintStrategy = 0; if (!netSdk.CLIENT_LogOpen(setLog)){ System.err.println("Open SDK Log Failed!!!"); } Login(); } public void Login(){ // 登陆设备 int nSpecCap = NetSDKLib.EM_LOGIN_SPAC_CAP_TYPE.EM_LOGIN_SPEC_CAP_TCP; // TCP登入 IntByReference nError = new IntByReference(0); loginHandle = netSdk.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser, m_strPassword ,nSpecCap, null, deviceInfo, nError); if (loginHandle.longValue() != 0) { System.out.printf("Login Device[%s] Success!\n", m_strIp); } else { System.err.printf("Login Device[%s] Fail.Error[%s]\n", m_strIp, ToolKits.getErrorCode()); LoginOut(); } } public void LoginOut(){ System.out.println("End Test"); if( loginHandle.longValue() != 0) { netSdk.CLIENT_Logout(loginHandle); } System.out.println("See You..."); netSdk.CLIENT_Cleanup(); System.exit(0); } //////////////////////////////////////////////////////////////// private String m_strIp = "172.23.12.138"; private int m_nPort = 37777; private String m_strUser = "admin"; private String m_strPassword = "admin123"; //////////////////////////////////////////////////////////////// String[] faceSexStr = {"未知", "男", "女"}; String[] idStr = {"未知", "证件", "护照",}; public void findFaceRecognitionDB() throws UnsupportedEncodingException { // IVVS设备,查询条件只有 stInStartFind.stPerson 里的参数有效 NET_IN_STARTFIND_FACERECONGNITION stInStartFind = new NET_IN_STARTFIND_FACERECONGNITION(); // 人员信息查询条件是否有效, 并使用扩展结构体 stInStartFind.bPersonExEnable = 0; System.arraycopy("1".getBytes(), 0, stInStartFind.stPersonInfoEx.szGroupID, 0, "1".getBytes().length); // 人员组ID //设置过滤条件 stInStartFind.stFilterInfo.nGroupIdNum = 1; // 人员组数 System.arraycopy("1".getBytes(), 0, stInStartFind.stFilterInfo.szGroupIdArr[0].szGroupId, 0, "1".getBytes().length); // 人员组ID stInStartFind.stFilterInfo.nRangeNum = 1; stInStartFind.stFilterInfo.szRange[0] = NetSDKLib.EM_FACE_DB_TYPE.NET_FACE_DB_TYPE_PASSERBY; stInStartFind.stFilterInfo.emFaceType = NetSDKLib.EM_FACERECOGNITION_FACE_TYPE.EM_FACERECOGNITION_FACE_TYPE_UNKOWN; stInStartFind.nChannelID = -1; //让设备根据查询条件整理结果集 NET_OUT_STARTFIND_FACERECONGNITION stOutParam = new NET_OUT_STARTFIND_FACERECONGNITION(); stInStartFind.write(); stOutParam.write(); if(netSdk.CLIENT_StartFindFaceRecognition(loginHandle, stInStartFind, stOutParam, 2000)) { System.out.printf("Handle Token = %d\n" , stOutParam.nToken); int doNextCount = 0; // 查询次数 int count = 10; // 每次查询的个数 //分页查找数据 NetSDKLib.NET_IN_DOFIND_FACERECONGNITION stFindIn = new NetSDKLib.NET_IN_DOFIND_FACERECONGNITION(); stFindIn.lFindHandle = stOutParam.lFindHandle; stFindIn.nCount = count; // 当前想查询的记录条数 stFindIn.nBeginNum = 0; //每次递增 NetSDKLib.NET_OUT_DOFIND_FACERECONGNITION stFindOut = new NetSDKLib.NET_OUT_DOFIND_FACERECONGNITION();; stFindOut.bUseCandidatesEx = 1; // 使用候选对象扩展结构体 for(int m = 0 ; m< count; m++) { stFindOut.stuCandidatesEx[m].stPersonInfo.szFacePicInfo[0].nFilePathLen = 1024; stFindOut.stuCandidatesEx[m].stPersonInfo.szFacePicInfo[0].pszFilePath = new Memory(1024); } do { stFindIn.write(); stFindOut.write(); if(netSdk.CLIENT_DoFindFaceRecognition(stFindIn, stFindOut, 1000)) { System.out.printf("Record Number [%d]\n" , stFindOut.nCadidateExNum); for(int i = 0; i < stFindOut.nCadidateExNum; i++) { int index = i + doNextCount * count; // 查询的总个数 - 1, 从0开始 try { System.out.println("人员所属组名" + new String(stFindOut.stuCandidatesEx[i].stPersonInfo.szGroupName, "GBK").trim() +"人员唯一标识符" + new String(stFindOut.stuCandidatesEx[i].stPersonInfo.szUID).trim() +"人员名称" + new String(stFindOut.stuCandidatesEx[i].stPersonInfo.szPersonName, "GBK").trim() +"性别" + new String(faceSexStr[stFindOut.stuCandidatesEx[i].stPersonInfo.bySex]).trim() +"证件类型" + new String(idStr[stFindOut.stuCandidatesEx[i].stPersonInfo.byIDType]).trim() +"证件编码" + new String(stFindOut.stuCandidatesEx[i].stPersonInfo.szID).trim() +"生日" + String.valueOf(stFindOut.stuCandidatesEx[i].stPersonInfo.wYear) + "-" + String.valueOf(0xff & stFindOut.stuCandidatesEx[i].stPersonInfo.byMonth) + "-" + String.valueOf(0xff & stFindOut.stuCandidatesEx[i].stPersonInfo.byDay) +"省份" + new String(stFindOut.stuCandidatesEx[i].stPersonInfo.szProvince, "GBK").trim() +"城市" + new String(stFindOut.stuCandidatesEx[i].stPersonInfo.szCity, "GBK").trim()); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 图片地址 for (int j = 0; j < stFindOut.stuCandidatesEx[i].stPersonInfo.wFacePicNum; j++) { picUrl pic= new picUrl(); ToolKits.GetPointerData(stFindOut.stuCandidatesEx[i].stPersonInfo.szFacePicInfo[j].pszFilePath, pic); System.out.println(pic.URL); System.out.println(GetPointerDataToString(stFindOut.stuCandidatesEx[i].stPersonInfo.szFacePicInfo[j].pszFilePath)); downloadRemoteFile(stFindOut.stuCandidatesEx[i].stPersonInfo.szFacePicInfo[j].pszFilePath); } } } else { System.out.printf("CLIENT_DoFindFaceRecognition Failed!LastError = %x\n" , netSdk.CLIENT_GetLastError()); break; } if( stFindOut.nCadidateNum < stFindIn.nCount) { System.out.printf("No More Record, Find End!\n"); break; } else { stFindIn.nBeginNum += count; doNextCount++; } }while (true); netSdk.CLIENT_StopFindFaceRecognition(stOutParam.lFindHandle); } else { System.out.println("CLIENT_StartFindFaceRecognition Failed, Error:" + ToolKits.getErrorCode()); } } /** * 下载图片 * @param szFileName 需要下载的文件名 */ public boolean downloadRemoteFile(Pointer szFileName) { // 入参 NET_IN_DOWNLOAD_REMOTE_FILE stIn = new NET_IN_DOWNLOAD_REMOTE_FILE(); stIn.pszFileName = szFileName/*new NativeString(szFileName).getPointer()*/; stIn.pszFileDst = new NativeString("./face"+System.currentTimeMillis()+".jpg").getPointer(); // 存放路径 // 出参 NET_OUT_DOWNLOAD_REMOTE_FILE stOut = new NET_OUT_DOWNLOAD_REMOTE_FILE(); stIn.write(); stOut.write(); if(netSdk.CLIENT_DownloadRemoteFile(loginHandle, stIn, stOut, 3000)) { System.out.println("下载图片成功!"); } else { System.err.println("下载图片失败!" + ToolKits.getErrorCode()); return false; } return true; } public String GetPointerDataToString(Pointer pointer) { String str = ""; if(pointer == null) { return str; } int length = 0; while (length < 2048) { if (pointer.getByte(length) == '\0') { break; } ++length; } byte[] buffer = pointer.getByteArray(0, length); try { str = new String(buffer, "GBK").trim(); } catch (UnsupportedEncodingException e) { return str; } return str; } /** * 设备断线回调 */ private static class DisConnectCallBack implements NetSDKLib.fDisConnect { private DisConnectCallBack() { } private static class CallBackHolder { private static DisConnectCallBack instance = new DisConnectCallBack(); } public static DisConnectCallBack getInstance() { return CallBackHolder.instance; } public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("Device[%s] Port[%d] DisConnect!\n", pchDVRIP, nDVRPort); } } /** * 设备重连回调 */ private static class HaveReConnectCallBack implements NetSDKLib.fHaveReConnect { private HaveReConnectCallBack() { } private static class CallBackHolder { private static HaveReConnectCallBack instance = new HaveReConnectCallBack(); } public static HaveReConnectCallBack getInstance() { return CallBackHolder.instance; } public void invoke(NetSDKLib.LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort); } } public void RunTest() { System.out.println("Run Test"); CaseMenu menu = new CaseMenu(); menu.addItem(new CaseMenu.Item(this , "findFaceRecognitionDB" , "findFaceRecognitionDB")); menu.run(); } public static void main(String[]args) { findByPasser demo = new findByPasser(); demo.InitTest(); demo.RunTest(); demo.LoginOut(); } }