package com.netsdk.demo.intelligentTraffic; import com.netsdk.demo.util.CaseMenu; import com.netsdk.demo.util.Testable; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.NetSDKLib.*; import com.netsdk.lib.ToolKits; import com.netsdk.lib.enumeration.EM_DOWNLOAD_FILE_TYPE; import com.netsdk.lib.structure.NET_DOWNLOADFILE_INFO; import com.netsdk.lib.structure.NET_IN_DOWNLOAD_MULTI_FILE; import com.netsdk.lib.structure.NET_OUT_DOWNLOAD_MULTI_FILE; import com.sun.jna.Memory; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import java.io.File; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import static com.netsdk.lib.NetSDKLib.*; /** * 智能交通设备 * 查询并下载抓拍图片 * * @author 47040 */ public class TrafficMediaFileNew { static NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE; /** * 登录句柄 */ private LLong loginHandle = new LLong(0); /** * 设备信息 */ private NET_DEVICEINFO_Ex deviceInfo = new NET_DEVICEINFO_Ex(); public static void printMessage(String msg) { System.out.println("[ INFO ] >> " + msg); } /** * 获取文件数量 * * @param findHandle 查询句柄 * @return 失败返回 -1 成功返回 实际数量 */ public int getTotalFiles(LLong findHandle) { IntByReference nCount = new IntByReference(0); boolean bRet = netsdkApi.CLIENT_GetTotalFileCount(findHandle, nCount, null, 3000); if (!bRet) { System.err.println("GetTotalFileCount failed! " + ToolKits.getErrorCode()); return -1; } System.out.println("The Total File: " + nCount.getValue()); return nCount.getValue(); } /** * 下载进度 */ public static class Download implements fMultiFileDownLoadPosCB { private static final Download _instance = new Download(); private static final String _lock = "DownLoadPos"; public static Download getInstance() { return _instance; } private Download() { } @Override public void invoke(LLong lDownLoadHandle, int dwID, int dwFileTotalSize, int dwDownLoadSize, int nError, Pointer dwUser, Pointer pReserved) { System.out.println(String.format("lDownLoadHandle-dwID:%d-%d Total:%d, downloaded:%d nErrorCode:%d", lDownLoadHandle.longValue(), dwID, dwFileTotalSize, dwDownLoadSize, nError)); if (dwDownLoadSize == -1) { System.out.println(String.format("lDownLoadHandle-dwID:%d-%d download completed.", lDownLoadHandle.longValue(), dwID)); } } } /** * 批量下载交通图片 */ public boolean downloadImage(LLong hLogin, List fetchPaths, List savePaths) { // 入参 NET_IN_DOWNLOAD_MULTI_FILE stuMultiIn = new NET_IN_DOWNLOAD_MULTI_FILE(); stuMultiIn.emDownloadType = EM_DOWNLOAD_FILE_TYPE.EM_DOWNLOAD_BY_FILENAME.getValue(); stuMultiIn.nFileCount = fetchPaths.size(); NET_DOWNLOADFILE_INFO[] downloadInfos = new NET_DOWNLOADFILE_INFO[stuMultiIn.nFileCount]; for (int i = 0; i < stuMultiIn.nFileCount; i++) { downloadInfos[i] = new NET_DOWNLOADFILE_INFO(); downloadInfos[i].dwFileID = i + 1; // 和回调函数里的ID一一对应 byte[] bFetchPath = fetchPaths.get(i).getBytes(); byte[] bSavePath = savePaths.get(i).getBytes(); System.arraycopy(bFetchPath, 0, downloadInfos[i].szSourceFilePath, 0, bFetchPath.length); System.arraycopy(bSavePath, 0, downloadInfos[i].szSavedFileName, 0, bSavePath.length); } Pointer pFileInfos = new Memory(downloadInfos[0].size() * stuMultiIn.nFileCount); ToolKits.SetStructArrToPointerData(downloadInfos, pFileInfos); stuMultiIn.pFileInfos = pFileInfos; stuMultiIn.cbPosCallBack = Download.getInstance(); // 出参 NET_OUT_DOWNLOAD_MULTI_FILE stuMultiOut = new NET_OUT_DOWNLOAD_MULTI_FILE(); stuMultiIn.write(); stuMultiOut.write(); boolean ret = netsdkApi.CLIENT_DownLoadMultiFile(hLogin, stuMultiIn.getPointer(), stuMultiOut.getPointer(), 5000); if (!ret) { System.err.println("下载接口调用失败: " + ToolKits.getErrorCode()); return false; } stuMultiOut.read(); LLong hDownload = stuMultiOut.lDownLoadHandle; // 和回调函数里的 lDownLoadHandle 一一对应 System.out.println("下载句柄: " + hDownload.longValue()); return true; } public void findMediaFile() { if (loginHandle.longValue() == 0) { System.err.println("Please Login First"); return; } final int queryType = EM_FILE_QUERY_TYPE.NET_FILE_QUERY_TRAFFICCAR; MEDIA_QUERY_TRAFFICCAR_PARAM condition = new MEDIA_QUERY_TRAFFICCAR_PARAM(); condition.nChannelID = -1; // 通道号 -1代表所有通道 condition.nMediaType = 1; // 文件类型 0:任意类型, 1:jpg图片, 2:dav文件 condition.byFileFlag = 0; // 设置 文件标志, 0xFF-使用nFileFlagEx, 0-表示所有录像, 1-定时文件, 2-手动文件, 3-事件文件, 4-重要文件, 5-合成文件 condition.byRandomAccess = 1; // 设置 是否需要在查询过程中随意跳转,0-不需要,1-需要 condition.byLane = -1; // 查询相应车道信息 -1代表所有车道 condition.nDirection = -1; // 查询车开往的方向 -1代表所有方向 condition.StartTime.setTime(2020, 12, 23, 20, 30, 0); // 设置 开始时间 condition.EndTime.setTime(2020, 12, 23, 20, 39, 59); // 设置 结束时间 condition.nEventTypeNum = 1; // 设置需要查询的违章事件类型个数 IntByReference nEventType = new IntByReference(EVENT_IVS_ALL); // 全部 condition.pEventTypes = nEventType.getPointer(); // 设置查询类型 获取查询句柄 condition.write(); LLong findHandle = netsdkApi.CLIENT_FindFileEx(loginHandle, queryType, condition.getPointer(), null, 3000); condition.read(); if (findHandle.longValue() == 0) { System.err.println("Failed to Find File! " + ToolKits.getErrorCode()); return; } // 获取违章总数 int totalCount = getTotalFiles(findHandle); int queryCount = Math.min(10, totalCount); //每次获取的违章数量 MEDIAFILE_TRAFFICCAR_INFO[] mediaFileInfos = new MEDIAFILE_TRAFFICCAR_INFO[queryCount]; for (int i = 0; i < mediaFileInfos.length; ++i) { mediaFileInfos[i] = new MEDIAFILE_TRAFFICCAR_INFO(); } final int memorySize = mediaFileInfos[0].size() * queryCount; Pointer mediaFileMemory = new Memory(memorySize); mediaFileMemory.clear(memorySize); //循环查询 int nCurCount = 0; do { // 查询 ToolKits.SetStructArrToPointerData(mediaFileInfos, mediaFileMemory); int nRet = netsdkApi.CLIENT_FindNextFileEx(findHandle, queryCount, mediaFileMemory, memorySize, null, 3000); ToolKits.GetPointerDataToStructArr(mediaFileMemory, mediaFileInfos); if (nRet < 0) { System.err.println("FindNextFileEx failed! " + ToolKits.getErrorCode()); break; } //更多信息输出,可以查看结构体MEDIAFILE_TRAFFICCAR_INFO_EX中的MEDIAFILE_TRAFFICCAR_INFO // 地址列表 List fetchPaths = new ArrayList<>(); List savePaths = new ArrayList<>(); for (int j = 0; j < nRet; j++) { ++nCurCount; MEDIAFILE_TRAFFICCAR_INFO info = mediaFileInfos[j]; printMessage("-------------------------" + nCurCount + "---------------------------"); printMessage("通道号: " + info.ch); printMessage("违章类型: " + info.nEvents[0]); printMessage("车道号: " + info.byLane); String plateNumber = ""; try { plateNumber = new String(info.szPlateNumber, "GBK").trim(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } plateNumber = plateNumber.isEmpty() ? "无牌车" : plateNumber; printMessage("车牌号码: " + plateNumber); printMessage("车牌颜色: " + new String(info.szPlateColor).trim()); printMessage("车牌类型: " + new String(info.szPlateType).trim()); printMessage("车身颜色: " + new String(info.szVehicleColor).trim()); printMessage("抓拍时间: " + info.stSnapTime.toStringTime()); printMessage("事件组ID: " + info.nGroupID); printMessage("该组ID抓怕张数: " + info.byCountInGroup); printMessage("该组ID抓怕索引: " + info.byIndexInGroup); printMessage("图片地址: " + new String(info.szFilePath)); printMessage("包含事件数: " + info.nEventsNum); printMessage("事件枚举: " + String.format("0x%08x", info.nEvents[0])); // 下载当前图片 fetchPaths.add(new String(info.szFilePath)); savePaths.add(String.format("Image_Channel_%d_%s_%d.jpg", info.ch, info.stSnapTime.toString(), info.nGroupID)); } if (!downloadImage(loginHandle, fetchPaths, savePaths)) { System.err.println("download filed! " + ToolKits.getErrorCode()); break; } } while ((totalCount -= queryCount) > 0); netsdkApi.CLIENT_FindCloseEx(findHandle); } public void initTest() { // 初始化SDK netsdkApi.CLIENT_Init(null, null); //打开日志,可选 LOG_SET_PRINT_INFO logInfo = new LOG_SET_PRINT_INFO(); File path = new File("."); String logPath = path.getAbsoluteFile().getParent() + TrafficMediaFileNew.class.getName().toLowerCase() + ".log"; logInfo.bSetFilePath = 1; System.arraycopy(logPath.getBytes(), 0, logInfo.szLogFilePath, 0, logPath.getBytes().length); logInfo.bSetPrintStrategy = 1; logInfo.nPrintStrategy = 0; boolean bLogopen = netsdkApi.CLIENT_LogOpen(logInfo); if (!bLogopen) { System.err.println("Failed to open NetSDK log"); } int nSpecCap = EM_LOGIN_SPAC_CAP_TYPE.EM_LOGIN_SPEC_CAP_TCP; // TCP 方式登录 final IntByReference error = new IntByReference(); loginHandle = netsdkApi.CLIENT_LoginEx2(address, (short) port, username, password, nSpecCap, null, deviceInfo, error); if (loginHandle.longValue() == 0) { System.err.printf("Login Device [%s:%d] Failed ! Last Error[%x]\n", address, port, netsdkApi.CLIENT_GetLastError()); return; } System.out.printf("Login Device [%s:%d] Success. \n", address, port); } // 加载测试内容 public void RunTest() { CaseMenu menu = new CaseMenu(); menu.addItem(new CaseMenu.Item(this, "findMediaFile", "findMediaFile")); menu.run(); } public void endTest() { if (loginHandle.longValue() != 0) { netsdkApi.CLIENT_Logout(loginHandle); System.out.println("Logout Device " + address); } netsdkApi.CLIENT_Cleanup(); } private final String username = "admin"; private final String password = "2020"; private final String address = "10.80.9.45"; private final int port = 37777; public static void main(String[] args) { TrafficMediaFileNew demo = new TrafficMediaFileNew(); demo.initTest(); demo.RunTest(); demo.endTest(); } }