package com.netsdk.demo.customize; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import com.netsdk.demo.util.CaseMenu; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.netsdk.lib.NetSDKLib.*; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; /** * 人证比对 */ public class CitizenCompare { static NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE; static NetSDKLib configApi = NetSDKLib.CONFIG_INSTANCE; //////////////////////////////////////////////////////////////// // 登陆参数 private String m_strIp = "223.83.134.40"; private int m_nPort = 37777; private String m_strUser = "admin"; private String m_strPassword = "admin"; //////////////////////////////////////////////////////////////// private NetSDKLib.NET_DEVICEINFO_Ex deviceinfo = new NetSDKLib.NET_DEVICEINFO_Ex(); private static LLong loginHandle = new LLong(0); // 登陆句柄,属于实时的。登出后,句柄无效。下次登录,返回新的登录句柄。 private LLong m_hAttachHandle = new LLong(0); // 订阅句柄,类似登录句柄 // 设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数 public static class fDisConnectCB implements NetSDKLib.fDisConnect{ private fDisConnectCB() {} private static class fDisConnectCBHolder { private static final fDisConnectCB instance = new fDisConnectCB(); } public static fDisConnectCB getInstance() { return fDisConnectCBHolder.instance; } public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser){ System.out.printf("Device[%s] Port[%d] Disconnect!\n" , pchDVRIP , nDVRPort); } } // 网络连接恢复,设备重连成功回调 // 通过 CLIENT_SetAutoReconnect 设置该回调函数,当已断线的设备重连成功时,SDK会调用该函数 public static class HaveReConnect implements NetSDKLib.fHaveReConnect { private HaveReConnect() {} private static class HaveReConnectHolder { private static final HaveReConnect instance = new HaveReConnect(); } public static HaveReConnect getInstance() { return HaveReConnectHolder.instance; } public void invoke(LLong loginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort); } } public void EndTest() { System.out.println("End Test"); if( loginHandle.longValue() != 0) { netsdkApi.CLIENT_Logout(loginHandle); } System.out.println("See You..."); // 释放SDK资源,在关闭工程时调用。 netsdkApi.CLIENT_Cleanup(); System.exit(0); } public void InitTest() { // 初始化SDK库,当设备断线后,回调fDisConnectCB会收到信息 netsdkApi.CLIENT_Init(fDisConnectCB.getInstance(), null); // 设置断线重连回调接口,设置过断线重连成功回调函数后,当设备出现断线情况,SDK内部会自动进行重连操作 // 此操作为可选操作,但建议用户进行设置 netsdkApi.CLIENT_SetAutoReconnect(HaveReConnect.getInstance(), null); //设置登录超时时间和尝试次数,可选 int waitTime = 5000; //登录请求响应超时时间设置为5S int tryTimes = 3; //登录时尝试建立链接3次 netsdkApi.CLIENT_SetConnectTime(waitTime, tryTimes); // 设置更多网络参数,NET_PARAM的nWaittime,nConnectTryNum成员与CLIENT_SetConnectTime // 接口设置的登录设备超时时间和尝试次数意义相同,可选 NetSDKLib.NET_PARAM netParam = new NetSDKLib.NET_PARAM(); netParam.nConnectTime = 10000; //登录时尝试建立链接的超时时间 netsdkApi.CLIENT_SetNetworkParam(netParam); // 打开日志,可选 NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO(); File path = new File("/sdkLog"); String logPath = path.getAbsoluteFile().getParent() + File.separator + "sdklog"; File file = new File(logPath); if (!file.exists()) { file.mkdir(); } logPath = file + File.separator + "123456789.log"; System.out.println(logPath); setLog.bSetFilePath = 1; System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length); for (int i = 0; i < setLog.szLogFilePath.length; i++) { System.out.print((char)setLog.szLogFilePath[i] + " "); } System.out.println(); setLog.bSetPrintStrategy = 1; setLog.nPrintStrategy = 0; boolean bLogopen = netsdkApi.CLIENT_LogOpen(setLog); if (!bLogopen) { System.err.println("Failed to open NetSDK log !!!"); } // 向设备登入 int nSpecCap = 0; Pointer pCapParam = null; IntByReference nError = new IntByReference(0); loginHandle = netsdkApi.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser , m_strPassword ,nSpecCap,pCapParam, deviceinfo,nError); if(loginHandle.longValue() != 0) { System.out.printf("Login Device[%s] Port[%d]Success!\n" , m_strIp , m_nPort); } else { System.out.printf("Login Device[%s] Port[%d]Fail.Last Error[0x%x]\n" , m_strIp , m_nPort , netsdkApi.CLIENT_GetLastError()); // 关闭工程时,释放资源 EndTest(); } } /** * 获取接口错误码 * @return */ public static String getErrorCode() { return " { error code: ( 0x80000000|" + (netsdkApi.CLIENT_GetLastError() & 0x7fffffff) +" ). 参考 NetSDKLib.java }"; } ///////////////////////////////////////////////////////////////////////////////////////////////////////// /** * 订阅智能分析数据-图片 * 如果调用了重连接口 CLIENT_SetAutoReconnect,当设备断线后,会自动建立连接。当设备重连成功后,此业务会自动恢复。 */ public void realLoadPicture() { int bNeedPicture = 1; // 是否需要图片 int ChannelId = 0; // 通道 m_hAttachHandle = netsdkApi.CLIENT_RealLoadPictureEx(loginHandle, ChannelId, NetSDKLib.EVENT_IVS_ALL , bNeedPicture , fAnalyzerDataCB.getInstance() , null , null); if( m_hAttachHandle.longValue() != 0 ) { System.out.println("CLIENT_RealLoadPictureEx Success\n"); } else { System.err.printf("CLIENT_RealLoadPictureEx Failed!LastError = %x\n", netsdkApi.CLIENT_GetLastError() ); return; } } /** * 停止上传智能分析数据-图片 */ public void stopRealLoadPicture() { if (0 != m_hAttachHandle.longValue()) { netsdkApi.CLIENT_StopLoadPic(m_hAttachHandle); System.out.println("Stop detach IVS event"); m_hAttachHandle.setValue(0); } } /* 智能报警事件回调 */ public static class fAnalyzerDataCB implements NetSDKLib.fAnalyzerDataCallBack/*, StdCallCallback*/ { private BufferedImage snapBufferedImage = null; private BufferedImage idBufferedImage = null; private fAnalyzerDataCB() {} private static class fAnalyzerDataCBHolder { private static final fAnalyzerDataCB instance = new fAnalyzerDataCB(); } public static fAnalyzerDataCB getInstance() { return fAnalyzerDataCBHolder.instance; } @Override public int invoke(LLong lAnalyzerHandle, int dwAlarmType, Pointer pAlarmInfo, Pointer pBuffer, int dwBufSize, Pointer dwUser, int nSequence, Pointer reserved) { if(pAlarmInfo == null) { return 0; } File path = new File("./CitizenCompare/"); if (!path.exists()) { path.mkdir(); } switch(dwAlarmType) { case NetSDKLib.EVENT_IVS_CITIZEN_PICTURE_COMPARE: //人证比对事件 { DEV_EVENT_CITIZEN_PICTURE_COMPARE_INFO msg = new DEV_EVENT_CITIZEN_PICTURE_COMPARE_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); try { System.out.println("事件发生时间:" + msg.stuUTC.toString()); System.out.println("事件名称 :" + new String(msg.szName, "GBK").trim()); // 人证比对结果,相似度大于等于阈值认为比对成功, 1-表示成功, 0-表示失败 System.out.println("比对结果:" + msg.bCompareResult); System.out.println("两张图片的相似度:" + msg.nSimilarity); System.out.println("检测阈值:" + msg.nThreshold); if (msg.emSex == 1) { System.out.println("性别:男"); }else if (msg.emSex == 2){ System.out.println("性别:女"); }else { System.out.println("性别:未知"); } System.out.println("民族:" + msg.nECType); System.out.println("居民姓名:" + new String(msg.szCitizen, "GBK").trim()); System.out.println("住址:" + new String(msg.szAddress, "GBK").trim()); System.out.println("证件号:" + new String(msg.szNumber).trim()); System.out.println("签发机关:" + new String(msg.szAuthority, "GBK").trim()); System.out.println("出生日期:" + msg.stuBirth.toStringTimeEx()); System.out.println("有效起始日期:" + msg.stuValidityStart.toStringTimeEx()); if (msg.bLongTimeValidFlag == 1) { System.out.println("有效截止日期:永久"); }else{ System.out.println("有效截止日期:"+ msg.stuValidityEnd.toStringTimeEx()); } System.out.println("IC卡号:" + new String(msg.szCardNo, "GBK").trim()); } catch (Exception e) { e.printStackTrace(); } // 拍摄照片 String strFileName = path + "\\" + System.currentTimeMillis() + "citizen_snap.jpg"; byte[] snapBuffer = pBuffer.getByteArray(msg.stuImageInfo[0].dwOffSet, msg.stuImageInfo[0].dwFileLenth); ByteArrayInputStream snapArrayInputStream = new ByteArrayInputStream(snapBuffer); try { snapBufferedImage = ImageIO.read(snapArrayInputStream); if(snapBufferedImage == null) { return 0; } ImageIO.write(snapBufferedImage, "jpg", new File(strFileName)); } catch (IOException e) { e.printStackTrace(); } // 证件照片 strFileName = path + "\\" + System.currentTimeMillis() + "citizen_id.jpg"; byte[] idBuffer = pBuffer.getByteArray(msg.stuImageInfo[1].dwOffSet, msg.stuImageInfo[1].dwFileLenth); ByteArrayInputStream idArrayInputStream = new ByteArrayInputStream(idBuffer); try { idBufferedImage = ImageIO.read(idArrayInputStream); if(idBufferedImage == null) { return 0; } ImageIO.write(idBufferedImage, "jpg", new File(strFileName)); } catch (IOException e) { e.printStackTrace(); } break; } default: break; } return 0; } } public void RunTest() { System.out.println("Run Test"); CaseMenu menu = new CaseMenu(); menu.addItem(new CaseMenu.Item(this , "智能订阅" , "realLoadPicture")); menu.addItem(new CaseMenu.Item(this , "停止订阅" , "stopRealLoadPicture")); menu.run(); } public static void main(String[]args) { CitizenCompare demo = new CitizenCompare(); demo.InitTest(); demo.RunTest(); demo.EndTest(); } }