package com.netsdk.demo.customize.JordanPSD; import com.netsdk.demo.customize.JordanPSD.module.LogonModule; import com.netsdk.demo.customize.JordanPSD.module.RecordModule; import com.netsdk.demo.customize.JordanPSD.module.SdkUtilModule; import com.netsdk.demo.util.CaseMenu; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.Utils; import com.netsdk.lib.enumeration.EM_MOBILE_ENFORCE_FILE_TYPE; import com.netsdk.lib.enumeration.EM_MOBILE_ENFORCE_FORMAT; import com.netsdk.lib.enumeration.EM_MOBILE_ENFORCE_UPLOAD_FLAG; import com.netsdk.lib.enumeration.ENUMERROR; import com.netsdk.lib.structure.*; import com.sun.jna.Memory; import com.sun.jna.Pointer; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.charset.Charset; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; import java.util.concurrent.TimeUnit; /** * @author 47040 * @since Created at 2021/5/28 19:25 */ public class Demo33C300 { static NetSDKLib NetSdk = NetSDKLib.NETSDK_INSTANCE; private final NetSDKLib.LLong m_hLoginHandle; // 登录句柄 private final NetSDKLib.NET_DEVICEINFO_Ex m_hDeviceInfo; // 设备信息 private final Charset encode = Charset.forName(Utils.getPlatformEncode()); // 跨平台编码 private NetSDKLib.LLong m_hFindFileHandle = new NetSDKLib.LLong(0); // 文件查询句柄 private NetSDKLib.LLong m_hDownLoadHandle = new NetSDKLib.LLong(0); // 下载句柄 // 存储临时查询数据 private ArrayList mediaRecords = new ArrayList<>(); private class NetOutMediaQueryFile { public int nChannelID; public NetSDKLib.NET_TIME stuStartTime; public NetSDKLib.NET_TIME stuEndTime; public byte byFileType; public byte byPartition; public byte byVideoStream; public int nCluster; public byte[] szFilePath; public int nDriveNo; public long nFileSizeEx; public int nTotalFrame; public int emFileState; } public Demo33C300(DeviceInfo deviceInfo) { this.m_hLoginHandle = deviceInfo.m_hLoginHandle; this.m_hDeviceInfo = deviceInfo.m_stDeviceInfo; } public Demo33C300(NetSDKLib.LLong loginHandle, NetSDKLib.NET_DEVICEINFO_Ex deviceinfo) { this.m_hLoginHandle = loginHandle; this.m_hDeviceInfo = deviceinfo; } /** * 查询采集站和手持终端文件信息 Demo里的查询条件: 2021-06-02 12:00:00 至 2021-06-02 12:30:00 文件类型:未上传 */ public void findFileExQueryMobileEnforce() { if (m_hLoginHandle.longValue() == 0) { System.err.println("Please Login First"); return; } ///////////////////////////// 开始查询 ///////////////////////////// /////////////////////////////////////////////////////////////////// final int queryType = NetSDKLib.EM_FILE_QUERY_TYPE.NET_FILE_QUERY_MOBILE_ENFORCE; MEDIAFILE_MOBILE_ENFORCE_PARAM condition = new MEDIAFILE_MOBILE_ENFORCE_PARAM(); condition.nChannelID = -1; // 采集站没有通道号概念 使用-1代表所有通道 condition.stuBeginTime = new NET_TIME(2021, 7, 1, 2, 0, 0); // 设置 开始时间 condition.stuEndTime = new NET_TIME(2021, 7, 2, 23, 30, 0); // 设置 结束时间 condition.emUploadFlag = EM_MOBILE_ENFORCE_UPLOAD_FLAG.EM_MOBILE_ENFORCE_UPLOAD_FLAG_NOTUPLOAD.getValue(); // 未上传 // 设置查询类型 获取查询句柄 m_hFindFileHandle = RecordModule.FindFileEx(m_hLoginHandle, queryType, condition, 3000); if (m_hFindFileHandle.longValue() == 0) { System.err.println("查询采集站和手持终端文件信息失败:" + ENUMERROR.getErrorMessage()); return; } System.out.println("查询采集站和手持终端文件信息成功"); ///////////////////////////// 文件总数 ///////////////////////////// /////////////////////////////////////////////////////////////////// // 获取违章总数 int totalCount = RecordModule.GetTotalFileCount(m_hFindFileHandle, 3000); if (totalCount == -1) { System.err.println("获取查询总数失败:" + ENUMERROR.getErrorMessage()); // 查询异常,直接退出查询 RecordModule.FindCloseEx(m_hFindFileHandle); return; } ///////////////////////////// 获取查询结果 ///////////////////////////// ////////////////////////////////////////////////////////////////////// int queryCount = Math.min(10, totalCount); // 每次获取的违章数量 MEDIAFILE_MOBILE_ENFORCE_INFO[] mediaFileInfos = new MEDIAFILE_MOBILE_ENFORCE_INFO[queryCount]; for (int i = 0; i < mediaFileInfos.length; ++i) { mediaFileInfos[i] = new MEDIAFILE_MOBILE_ENFORCE_INFO(); } final int memorySize = mediaFileInfos[0].size() * queryCount; Pointer mediaFileMemory = new Memory(memorySize); mediaFileMemory.clear(memorySize); // 循环查询 int nCurrIndex = 0; do { // 查询 int nRet = RecordModule.FindNextFileEx(m_hFindFileHandle, mediaFileInfos, mediaFileMemory, 3000); if (nRet < 0) { System.err.println("获取查询信息失败:" + ENUMERROR.getErrorMessage()); break; } // 打印一下获取到的信息内容 StringBuilder printInfo = new StringBuilder(); for (int j = 0; j < nRet; j++) { ++nCurrIndex; MEDIAFILE_MOBILE_ENFORCE_INFO info = mediaFileInfos[j]; printInfo .append("-------------------------") .append(nCurrIndex) .append("---------------------------\n") .append(" 开始时间: ") .append(info.stuStartTime.toString()) .append("\n") .append(" 结束时间: ") .append(info.stuEndTime.toString()) .append("\n") .append(" 文件路径: ") .append(new String(info.szFilePath, encode)) .append("\n") .append(" 文件名称: ") .append(new String(info.szFileName, encode)) .append("\n") .append(" 文件长度: ") .append(info.nLength) .append("\n") .append(" 文件标识: ") .append(new String(info.szUniqueID, encode)) .append("\n") .append(" 文件序列: ") .append(new String(info.szOriginalDeviceID, encode)) .append("\n") .append(" 文件类型: ") .append(EM_MOBILE_ENFORCE_FORMAT.getEnum(info.emFormat).getNote()) .append("\n") .append(" 文件后缀: ") .append(EM_MOBILE_ENFORCE_FILE_TYPE.getEnum(info.emFileType).getNote()) .append("\n"); } System.out.println(printInfo.toString()); } while ((totalCount -= queryCount) > 0); ///////////////////////////// 结束查询 ///////////////////////////// /////////////////////////////////////////////////////////////////// RecordModule.FindCloseEx(m_hFindFileHandle); } /** * 通用录像文件下载 按文件信息筛选 */ public void DownloadRecordByFile() { if (m_hLoginHandle.longValue() == 0) { System.err.println("请先登录"); return; } List files = QueryRecordFile(); if (files.isEmpty()) { System.err.println("查询不到录像文件"); return; } Scanner sc = new Scanner(System.in); System.out.println("请选择需要下载的文件序号"); int idx = sc.nextInt(); NetSDKLib.NET_RECORDFILE_INFO fileInfo = files.get(idx); // LPNET_RECORDFILE_INFO 和 NET_RECORDFILE_INFO 内部字段完全一样 可以互相替换 因此我加了个重载接口 // 这里直接使用 fileInfo 作查询条件 // 默认保存路径 String savePath = new File(".").getAbsoluteFile().getParent() + "\\" + System.currentTimeMillis() + ".MP4"; System.out.println("SavedFileName:" + savePath); NetSDKLib.fTimeDownLoadPosCallBack posCallBack = FileDownLoadPosCallBack.getInstance(); // 进度回调 NetSDKLib.fDataCallBack dataCallBack = FileDownloadDataCallBack.getInstance(); // 下载数据回调 m_hDownLoadHandle = RecordModule.DownloadRecordFileByFileEx(m_hLoginHandle, fileInfo, savePath, posCallBack, dataCallBack); if (m_hDownLoadHandle.longValue() == 0) { System.err.println("Start Download By File Failed :" + ENUMERROR.getErrorMessage()); } else { System.out.println("Start Download By File Succeed"); } } /** * 通用录像文件下载 FindFile 查询文件 */ public void DownloadRecordByFileAndFindFile() { if (m_hLoginHandle.longValue() == 0) { System.err.println("请先登录"); return; } findFileExMediaRecord(); if (mediaRecords.isEmpty()) { System.err.println("查询不到录像文件"); return; } Scanner sc = new Scanner(System.in); System.out.println("请选择需要下载的文件序号"); int idx = sc.nextInt(); NetOutMediaQueryFile record = mediaRecords.get(idx); // 设置查询条件 NetSDKLib.NET_RECORDFILE_INFO fileCondition = new NetSDKLib.NET_RECORDFILE_INFO(); fileCondition.ch = record.nChannelID; fileCondition.bRecType = record.byVideoStream; // 两个 byte[] 长度并不相同 必须使用 arraycopy System.arraycopy(record.szFilePath, 0, fileCondition.filename, 0, fileCondition.filename.length); System.out.println("filePath:" + new String(fileCondition.filename, encode)); fileCondition.size = (int) record.nFileSizeEx / 1024; fileCondition.framenum = record.nTotalFrame; fileCondition.driveno = record.nDriveNo; fileCondition.startcluster = record.nCluster; fileCondition.starttime = record.stuStartTime; fileCondition.endtime = record.stuEndTime; // 默认保存路径 String savePath = new File(".").getAbsoluteFile().getParent() + "\\" + System.currentTimeMillis() + ".MP4"; System.out.println("SavedFileName:" + savePath); NetSDKLib.fTimeDownLoadPosCallBack posCallBack = FileDownLoadPosCallBack.getInstance(); // 进度回调 NetSDKLib.fDataCallBack dataCallBack = FileDownloadDataCallBack.getInstance(); // 下载数据回调 m_hDownLoadHandle = RecordModule.DownloadRecordFileByFileEx(m_hLoginHandle, fileCondition, savePath, posCallBack, dataCallBack); if (m_hDownLoadHandle.longValue() == 0) { System.err.println("Start Download By File Failed :" + ENUMERROR.getErrorMessage()); } else { System.out.println("Start Download By File Succeed"); } } /** * 录像文件下载 CLIENT_DownloadByFileSelfAdapt自适应下载 + FindFile 查询文件 */ public void DownloadRecordWithSelfAdaptByFileAndFindFile() { FileDownLoadPosCallBack2.downloadPosQueue2.clear(); FileDownloadDataCallBack2.downloadDataQueue2.clear(); if (m_hLoginHandle.longValue() == 0) { System.err.println("请先登录"); return; } findFileExMediaRecord(); if (mediaRecords.isEmpty()) { System.err.println("查询不到录像文件"); return; } Scanner sc = new Scanner(System.in); System.out.println("请选择需要下载的文件序号"); int idx = sc.nextInt(); NetOutMediaQueryFile record = mediaRecords.get(idx); // 设置查询条件 NET_IN_DOWNLOAD_BYFILE_SELFADAPT stuParamIn = new NET_IN_DOWNLOAD_BYFILE_SELFADAPT(); stuParamIn.nChannelID = record.nChannelID; stuParamIn.emRecordType = 0; // 两个 byte[] 长度并不相同 必须使用 arraycopy System.arraycopy(record.szFilePath, 0, stuParamIn.szFileName, 0, Math.min(record.szFilePath.length, stuParamIn.szFileName.length)); stuParamIn.nFrameNum = record.nTotalFrame; stuParamIn.size = (int) record.nFileSizeEx / 1024; stuParamIn.stuStartTime = record.stuStartTime; stuParamIn.stuEndTime = record.stuEndTime; stuParamIn.nDriveno = record.nDriveNo; stuParamIn.nStartCluster = record.nCluster; stuParamIn.cbDownLoadPos = FileDownLoadPosCallBack2.getInstance(); // 进度回调 注意和 CLIENT_DownloadByRecordFileEx 的不一样 继承的接口不一样 stuParamIn.dwDataUser = null; stuParamIn.fDownLoadDataCallBack = FileDownloadDataCallBack2.getInstance(); // 下载数据回调 注意 这个下载接口不能保存本地文件 所以数据只能从回调取 stuParamIn.dwPosUser = null; NET_OUT_DOWNLOAD_BYFILE_SELFADAPT stuParamOut = new NET_OUT_DOWNLOAD_BYFILE_SELFADAPT(); m_hDownLoadHandle = RecordModule.DownloadRecordFileWithSelfAdapt(m_hLoginHandle, stuParamIn, stuParamOut, 5000); if (m_hDownLoadHandle.longValue() == 0) { System.err.println("Start Download By File Failed :" + ENUMERROR.getErrorMessage()); } else { System.out.println("Start Download By File Succeed"); } // 起一个线程获取数据 downloadTaskOpen = true; new Thread(this::downloadDataTask).start(); new Thread(this::downloadPosTask).start(); } /** * 33C300测试专用 用例 * { * "CollectTime": "2021-07-05 10:30:07", * "DeviceID": "3G05E10YAJ2FED0", * "EndTime": "2021-07-05 10:19:12", * "FileName": "20210705101910.dav", * "FilePath": "/recno/463.dav", * "FileRemark": { * "CaseAddress": "", * "CaseID": "", * "CaseRemark": "", * "CaseType": 2, * "PicTurn": 0, * "UpLoadState": 1 * }, * "Format": 1, * "Length": 2983163, * "StartTime": "2021-07-05 10:19:10", * "Type": 1 * } */ public void DownloadRecord33C300SelfAdaptByFileAndFindFile() { FileDownLoadPosCallBack2.downloadPosQueue2.clear(); FileDownloadDataCallBack2.downloadDataQueue2.clear(); if (m_hLoginHandle.longValue() == 0) { System.err.println("请先登录"); return; } // 设置查询条件 NET_IN_DOWNLOAD_BYFILE_SELFADAPT stuParamIn = new NET_IN_DOWNLOAD_BYFILE_SELFADAPT(); stuParamIn.emRecordType = 1; // 两个 byte[] 长度并不相同 必须使用 arraycopy System.arraycopy("/recno/463.dav".getBytes(), 0, stuParamIn.szFileName, 0, Math.min("/recno/463.dav".length(), stuParamIn.szFileName.length)); stuParamIn.size = (int) 2983163 / 1024; stuParamIn.stuStartTime = new NetSDKLib.NET_TIME(); stuParamIn.stuStartTime.setTime(2021,7,5,10,19,10); stuParamIn.stuEndTime = new NetSDKLib.NET_TIME(); stuParamIn.stuEndTime.setTime(2021,7,5,10,19,12); stuParamIn.cbDownLoadPos = FileDownLoadPosCallBack2.getInstance(); // 进度回调 注意和 CLIENT_DownloadByRecordFileEx 的不一样 继承的接口不一样 stuParamIn.dwDataUser = null; stuParamIn.fDownLoadDataCallBack = FileDownloadDataCallBack2.getInstance(); // 下载数据回调 注意 这个下载接口不能保存本地文件 所以数据只能从回调取 stuParamIn.dwPosUser = null; NET_OUT_DOWNLOAD_BYFILE_SELFADAPT stuParamOut = new NET_OUT_DOWNLOAD_BYFILE_SELFADAPT(); m_hDownLoadHandle = RecordModule.DownloadRecordFileWithSelfAdapt(m_hLoginHandle, stuParamIn, stuParamOut, 5000); if (m_hDownLoadHandle.longValue() == 0) { System.err.println("Start Download By File Failed :" + ENUMERROR.getErrorMessage()); } else { System.out.println("Start Download By File Succeed"); } // 起一个线程获取数据 downloadTaskOpen = true; new Thread(this::downloadDataTask).start(); new Thread(this::downloadPosTask).start(); } private boolean downloadTaskOpen = false; // 获取监听回调数据并放入缓存 public void downloadDataTask() { String savePath = new File(".").getAbsoluteFile().getParent() + "\\" + System.currentTimeMillis() + ".MP4"; RandomAccessFile file = null; try { file = new RandomAccessFile(new File(savePath), "rw"); } catch (FileNotFoundException e) { e.printStackTrace(); } int offset = 0; while (downloadTaskOpen || !FileDownloadDataCallBack2.downloadDataQueue2.isEmpty()) { try { // 阻塞获取数据 byte[] data = FileDownloadDataCallBack2.downloadDataQueue2.poll(50, TimeUnit.MILLISECONDS); if (file == null || data == null) continue; // 数据存入文件 file.seek(offset); file.write(data); offset += data.length; } catch (InterruptedException | IOException e) { e.printStackTrace(); try { if (file != null) file.close(); // 关闭文件 break; } catch (IOException ex) { ex.printStackTrace(); break; } } } try { if (file != null) file.close(); // 关闭文件 } catch (IOException e) { e.printStackTrace(); } } // 获取监听回调进度 public void downloadPosTask() { DecimalFormat df = new DecimalFormat("######0.00"); while (downloadTaskOpen || !FileDownLoadPosCallBack2.downloadPosQueue2.isEmpty()) { try { // 判断下载进度 DownloadPosInfo pos = FileDownLoadPosCallBack2.downloadPosQueue2.poll(50, TimeUnit.MILLISECONDS); if (pos != null) { if (pos.downloadSize == -1) { downloadTaskOpen = false; System.out.println(String.format("download pos: %d%% totalSize(kb): %d task completed", 100, pos.totalSize)); } else { System.out.println(String.format("download pos: %2s%% downloadSize(kb): %d totalSize(kb): %d", df.format(pos.downloadPos), pos.totalSize, pos.downloadSize)); } } } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 停止下载录像 */ public void StopDownLoadRecordFile() { RecordModule.StopDownLoadRecordFile(m_hDownLoadHandle); downloadTaskOpen = false; } /** * 查找录像 需要指定查询录像的最大个数 * 这个接口只是用于协助演示录像下载用的 比较简单 需要手动预填最大文件数量 实际开发请走 FindFile 接口 */ public List QueryRecordFile() { NetSDKLib.NET_TIME stTimeStart = new NetSDKLib.NET_TIME(); stTimeStart.setTime(2021, 6, 8, 0, 0, 0); NetSDKLib.NET_TIME stTimeEnd = new NetSDKLib.NET_TIME(); stTimeEnd.setTime(2021, 7, 2, 10, 15, 0); //////////// 按时间查找视频文件 ////////// //////////////////////////////////////// int maxFileCount = 50; // 查询的最大文件个数 NetSDKLib.NET_RECORDFILE_INFO[] fileInfos = new NetSDKLib.NET_RECORDFILE_INFO[maxFileCount]; for (int i = 0; i < maxFileCount; i++) { fileInfos[i] = new NetSDKLib.NET_RECORDFILE_INFO(); } int retCount = RecordModule.QueryRecordFileByTimeLimit(m_hLoginHandle, maxFileCount, fileInfos, stTimeStart, stTimeEnd); if (retCount == -1) { System.err.println("查询录像文件失败!" + ENUMERROR.getErrorMessage()); } System.out.println("查询录像文件成功 共查询到录像数: " + retCount); // 打印看一下 StringBuilder info = new StringBuilder() .append("QueryRecordFile Succeed! \n" + "查询到的视频个数:") .append(retCount).append("\n") .append("码流类型:").append(fileInfos[0].bRecType).append("\n"); for (int i = 0; i < retCount; i++) { info.append("【").append(i).append("】:").append("\n") .append("文件名:").append(new String(fileInfos[i].filename, encode)).append("\n") .append("文件长度:").append(fileInfos[i].size).append("\n") .append("开始时间:").append(fileInfos[i].starttime).append("\n") .append("结束时间:").append(fileInfos[i].endtime).append("\n") .append("通道号:").append(fileInfos[i].ch).append("\n"); } System.out.println(info.toString()); return new ArrayList<>(Arrays.asList(fileInfos).subList(0, retCount)); } /** * 查询 录像文件 */ public void findFileExMediaRecord() { if (m_hLoginHandle.longValue() == 0) { System.err.println("Please Login First"); return; } mediaRecords.clear(); ///////////////////////////// 开始查询 ///////////////////////////// /////////////////////////////////////////////////////////////////// NetSDKLib.NET_TIME stTimeStart = new NetSDKLib.NET_TIME(); stTimeStart.setTime(2021, 7, 1, 0, 0, 0); NetSDKLib.NET_TIME stTimeEnd = new NetSDKLib.NET_TIME(); stTimeEnd.setTime(2021, 7, 20, 23, 15, 0); int type = NetSDKLib.EM_FILE_QUERY_TYPE.NET_FILE_QUERY_FILE; // 查询条件 NetSDKLib.NET_IN_MEDIA_QUERY_FILE queryCondition = new NetSDKLib.NET_IN_MEDIA_QUERY_FILE(); // 工作目录列表,一次可查询多个目录,为空表示查询所有目录。 // 目录之间以分号分隔,如“/mnt/dvr/sda0;/mnt/dvr/sda1”,szDirs==null 或 "" 表示查询所有 queryCondition.szDirs = null; // 查询所有 queryCondition.nMediaType = 2; // 文件类型 1:查询jpg图片,2:查询dav queryCondition.nChannelID = -1; // 通道号从0开始,-1表示查询所有通道 queryCondition.stuStartTime = stTimeStart; // 开始时间 queryCondition.stuEndTime = stTimeEnd; // 结束时间 NetSDKLib.LLong m_lFindMediaHandle = RecordModule.FindFileEx(m_hLoginHandle, type, queryCondition, 5000); if (m_lFindMediaHandle.longValue() == 0) { System.err.println("FindFileEx Failed!" + ENUMERROR.getErrorMessage()); return; } ///////////////////////////// 文件总数 ///////////////////////////// /////////////////////////////////////////////////////////////////// // 获取违章总数 int totalCount = RecordModule.GetTotalFileCount(m_lFindMediaHandle, 3000); if (totalCount == -1) { System.err.println("获取查询总数失败:" + ENUMERROR.getErrorMessage()); // 查询异常,直接退出查询 RecordModule.FindCloseEx(m_lFindMediaHandle); return; } if (totalCount == 0) { System.out.println("没有查询到任何录像数据"); RecordModule.FindCloseEx(m_lFindMediaHandle); return; } ///////////////////////////// 获取查询结果 ///////////////////////////// ////////////////////////////////////////////////////////////////////// int queryCount = Math.min(10, totalCount); // 每次获取的违章数量 NetSDKLib.NET_OUT_MEDIA_QUERY_FILE[] mediaFileInfos = new NetSDKLib.NET_OUT_MEDIA_QUERY_FILE[queryCount]; for (int i = 0; i < mediaFileInfos.length; ++i) { mediaFileInfos[i] = new NetSDKLib.NET_OUT_MEDIA_QUERY_FILE(); } final int memorySize = mediaFileInfos[0].size() * queryCount; Pointer mediaFileMemory = new Memory(memorySize); mediaFileMemory.clear(memorySize); // 循环查询 int nCurrIndex = 0; do { // 查询 // int nRet = RecordModule.FindNextFileEx(m_lFindMediaHandle, mediaFileInfos, mediaFileMemory, 5000); int nRet = RecordModule.FindNextMediaFileEx(m_lFindMediaHandle, mediaFileInfos, mediaFileMemory, 5000); if (nRet < 0) { System.err.println("获取查询信息失败:" + ENUMERROR.getErrorMessage()); break; } // 打印一下获取到的信息内容 StringBuilder printInfo = new StringBuilder(); for (int j = 0; j < nRet; j++) { NetOutMediaQueryFile info = new NetOutMediaQueryFile(); // 注意:循环中 mediaFileInfos 一直是同一组对象 所以获取数据必须使用深拷贝 info.nChannelID = mediaFileInfos[j].nChannelID; info.stuStartTime = new NetSDKLib.NET_TIME(mediaFileInfos[j].stuStartTime); info.stuEndTime = new NetSDKLib.NET_TIME(mediaFileInfos[j].stuEndTime); info.byFileType = mediaFileInfos[j].byFileType; info.byPartition = mediaFileInfos[j].byPartition; info.byVideoStream = mediaFileInfos[j].byVideoStream; info.nCluster = mediaFileInfos[j].nCluster; info.szFilePath = new byte[mediaFileInfos[j].szFilePath.length]; System.arraycopy(mediaFileInfos[j].szFilePath, 0, info.szFilePath, 0, mediaFileInfos[j].szFilePath.length); info.nDriveNo = mediaFileInfos[j].nDriveNo; info.nFileSizeEx = mediaFileInfos[j].nFileSizeEx; info.nTotalFrame = mediaFileInfos[j].nTotalFrame; info.emFileState = mediaFileInfos[j].emFileState; mediaRecords.add(info); printInfo .append("-------------------------") .append(nCurrIndex) .append("---------------------------\n") .append(" 开始时间: ") .append(info.stuStartTime.toString()) .append("\n") .append(" 结束时间: ") .append(info.stuEndTime.toString()) .append("\n") .append(" 文件路径: ") .append(new String(info.szFilePath, encode)) .append("\n") .append(" 文件类型: ") .append(info.byFileType == 1 ? "jpg图片" : "dav文件") .append("\n") .append(" 文件长度Ex: ") .append(info.nFileSizeEx) .append("\n"); ++nCurrIndex; } System.out.println(printInfo.toString()); } while ((totalCount -= queryCount) > 0); ///////////////////////////// 结束查询 ///////////////////////////// /////////////////////////////////////////////////////////////////// RecordModule.FindCloseEx(m_lFindMediaHandle); } /////////////////////////////////////// 简易控制台 /////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////// /** * 初始化测试 */ public void InitTest() { SdkUtilModule.Init(); // 初始化SDK库 NetSDKLib.LLong loginHandle = LogonModule.TcpLoginWithHighSecurity(m_ipAddr, m_nPort, m_username, m_password, m_hDeviceInfo); // 高安全登录 if (loginHandle.intValue() == 0) { SdkUtilModule.cleanup(); } m_hLoginHandle.setValue(loginHandle.longValue()); } public void RunTest() { CaseMenu menu = new CaseMenu(); menu.addItem(new CaseMenu.Item(this, "查询采集站和手持终端文件信息", "findFileExQueryMobileEnforce")); menu.addItem(new CaseMenu.Item(this, "查询录像信息", "findFileExMediaRecord")); menu.addItem(new CaseMenu.Item(this, "下载录像", "DownloadRecordByFile")); menu.addItem(new CaseMenu.Item(this, "下载录像(FindFileEx)", "DownloadRecordByFileAndFindFile")); menu.addItem(new CaseMenu.Item(this, "下载录像sdk自适应(FindFileEx)", "DownloadRecordWithSelfAdaptByFileAndFindFile")); menu.addItem(new CaseMenu.Item(this, "下载录像33C300测试sdk自适应(FindFileEx)", "DownloadRecord33C300SelfAdaptByFileAndFindFile")); menu.addItem(new CaseMenu.Item(this, "停止下载录像", "StopDownLoadRecordFile")); menu.run(); System.out.println("子测试已退出"); } /** * 结束测试 */ public void EndTest() { System.out.println("End Test"); LogonModule.logout(m_hLoginHandle); // 登出 System.out.println("See You..."); SdkUtilModule.cleanup(); // 清理资源 System.exit(0); } /////////////// 配置登陆地址,端口,用户名,密码 //////////////////////// // private String m_ipAddr = "172.8.2.99"; // MPT private String m_ipAddr = "172.11.2.20"; // 33C300 private int m_nPort = 37777; private String m_username = "admin"; // private String m_password = "qqqqq1"; // MPT private String m_password = "admin123"; // 33C300 ////////////////////////////////////////////////////////////////////// public static void main(String[] args) { NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); NetSDKLib.LLong loginHandle = new NetSDKLib.LLong(0); Demo33C300 demo = new Demo33C300(loginHandle, deviceInfo); if (args.length == 4) { demo.m_ipAddr = args[0]; demo.m_nPort = Integer.parseInt(args[1]); demo.m_username = args[2]; demo.m_password = args[3]; } demo.InitTest(); demo.RunTest(); demo.EndTest(); } }