package com.netsdk.demo.customize; import com.netsdk.demo.util.CaseMenu; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.netsdk.lib.enumeration.ENUMERROR; import com.netsdk.lib.structure.*; import com.netsdk.lib.utils.Initialization; import com.sun.jna.Memory; import com.sun.jna.Native; import com.sun.jna.Pointer; import java.io.File; import java.io.UnsupportedEncodingException; import java.util.Arrays; import java.util.Date; /** * @author 291189 * @version 1.0 * @description ERR221129117 * @date 2022/11/30 20:33 */ public class XRayMultiLevelDemo extends Initialization { NET_XRAY_MULTILEVEL_DETECT_CFG_INFO stuInfo = new NET_XRAY_MULTILEVEL_DETECT_CFG_INFO(); public void getXRayMultiLevelDetectCFG() { NET_IN_GET_XRAY_MULTILEVEL_DETECT_INFO input = new NET_IN_GET_XRAY_MULTILEVEL_DETECT_INFO(); Pointer pointerInput = new Memory(input.size()); pointerInput.clear(input.size()); ToolKits.SetStructDataToPointer(input, pointerInput, 0); NET_OUT_GET_XRAY_MULTILEVEL_DETECT_INFO outPut = new NET_OUT_GET_XRAY_MULTILEVEL_DETECT_INFO(); outPut.stuInfo = stuInfo; stuInfo.nMultiLevelConfigMax = 10; NET_MULTI_LEVEL_INFO info = new NET_MULTI_LEVEL_INFO(); /** * 等级配置 此部分内存需要用户申请,申请大小为(nMultiLevelConfigMax*sizeof(NET_MULTI_LEVEL_INFO))。 */ outPut.stuInfo.pstuMultiLevelConfig = new Memory(info.size() * outPut.stuInfo.nMultiLevelConfigMax); outPut.stuInfo.pstuMultiLevelConfig.clear(info.size() * outPut.stuInfo.nMultiLevelConfigMax); Pointer pointerOutPut = new Memory(outPut.size()); pointerOutPut.clear(outPut.size()); ToolKits.SetStructDataToPointer(outPut, pointerOutPut, 0); NetSDKLib.LLong lLong = netSdk.CLIENT_GetXRayMultiLevelDetectCFG(loginHandle, pointerInput, pointerOutPut, 3000); if (lLong.longValue() != 0) { ToolKits.GetPointerData(pointerOutPut, outPut); Native.free(Pointer.nativeValue(pointerInput)); // 清理内存 Pointer.nativeValue(pointerInput, 0); // 防止gc重复回收 Native.free(Pointer.nativeValue(pointerOutPut)); Pointer.nativeValue(pointerOutPut, 0); System.out.println("CLIENT_GetFinancialCabinInfo success"); stuInfo = outPut.stuInfo; /** * 当前配置等级 {@link com.netsdk.lib.enumeration.EM_XRAY_OBJECT_DETECT_CONFIG_LEVEL} */ System.out.println("emCurrentLevel:" + stuInfo.emCurrentLevel); System.out.println("nMultiLevelConfigMax:" + stuInfo.nMultiLevelConfigMax); int nMultiLevelConfigCnt = stuInfo.nMultiLevelConfigCnt; System.out.println("nMultiLevelConfigCnt:" + nMultiLevelConfigCnt); NET_MULTI_LEVEL_INFO[] infos = new NET_MULTI_LEVEL_INFO[nMultiLevelConfigCnt]; for (int i = 0; i < infos.length; i++) { infos[i] = new NET_MULTI_LEVEL_INFO(); } ToolKits.GetPointerDataToStructArr(stuInfo.pstuMultiLevelConfig, infos); for (int i = 0; i < infos.length; i++) { NET_MULTI_LEVEL_INFO info1 = infos[i]; /** * 配置等级 {@link com.netsdk.lib.enumeration.EM_XRAY_OBJECT_DETECT_CONFIG_LEVEL} */ System.out.println("emLevel:" + info1.emLevel); /** * 默认参考等级,该等级的默认配置与参考等级的默认配置一样 * {@link com.netsdk.lib.enumeration.EM_XRAY_OBJECT_DETECT_CONFIG_LEVEL} */ System.out.println("emDefaultReferenceLevel:" + info1.emDefaultReferenceLevel); /** * 等级名字 */ try { System.out.println("szName:" + new String(info1.szName, encode)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } /** * 物品分组数组个数 */ int nObjectGroupsNum = info1.nObjectGroupsNum; NET_XRAY_OBJECT_GROUP[] stuObjectGroups = info1.stuObjectGroups; for (int j = 0; j < nObjectGroupsNum; j++) { NET_XRAY_OBJECT_GROUP stuObjectGroup = stuObjectGroups[j]; /** * 分组检测使能 */ System.out.println("bGroupEnable:" + stuObjectGroup.bGroupEnable); /** * 分组类型 {@link com.netsdk.lib.enumeration.EM_INSIDE_OBJECT_TYPE} */ System.out.println("emGroupType:" + stuObjectGroup.emGroupType); /** * 分组安全等级 {@link com.netsdk.lib.enumeration.EM_GROUP_GRADE_TYPE} */ System.out.println("emGroupGrade:" + stuObjectGroup.emGroupGrade); /** * 分组物品颜色 {@link com.netsdk.lib.enumeration.EM_GROUP_COLOR_TYPE} */ System.out.println("emGroupColor:" + stuObjectGroup.emGroupColor); } } } else { System.out.printf("CLIENT_GetFinancialCabinInfo Failed!LastError = %s\n", ToolKits.getErrorCode()); } } public void setXRayMultiLevelDetectCFG() { NET_IN_SET_XRAY_MULTILEVEL_DETECT_INFO input = new NET_IN_SET_XRAY_MULTILEVEL_DETECT_INFO(); input.stuInfo = stuInfo; /** * 当前配置等级 {@link com.netsdk.lib.enumeration.EM_XRAY_OBJECT_DETECT_CONFIG_LEVEL} */ input.stuInfo.emCurrentLevel = 1; Pointer pointerInput = new Memory(input.size()); pointerInput.clear(input.size()); ToolKits.SetStructDataToPointer(input, pointerInput, 0); NET_OUT_SET_XRAY_MULTILEVEL_DETECT_INFO outPut = new NET_OUT_SET_XRAY_MULTILEVEL_DETECT_INFO(); Pointer pointerOutput = new Memory(outPut.size()); pointerOutput.clear(outPut.size()); ToolKits.SetStructDataToPointer(outPut, pointerOutput, 0); NetSDKLib.LLong lLong = netSdk.CLIENT_SetXRayMultiLevelDetectCFG(loginHandle, pointerInput, pointerOutput, 3000); if (lLong.longValue() != 0) { System.out.println("CLIENT_GetFinancialCabinInfo success"); Native.free(Pointer.nativeValue(pointerInput)); // 清理内存 Pointer.nativeValue(pointerInput, 0); // 防止gc重复回收 Native.free(Pointer.nativeValue(pointerOutput)); Pointer.nativeValue(pointerOutput, 0); } else { Native.free(Pointer.nativeValue(pointerInput)); // 清理内存 Pointer.nativeValue(pointerInput, 0); // 防止gc重复回收 Native.free(Pointer.nativeValue(pointerOutput)); Pointer.nativeValue(pointerOutput, 0); System.out.printf("CLIENT_GetFinancialCabinInfo Failed!LastError = %s\n", ToolKits.getErrorCode()); } } /** * 智能分析结果 句柄 */ private NetSDKLib.LLong AttachHandle = new NetSDKLib.LLong(0); public void AttachAnalyseTaskResult() { // 入参 NetSDKLib.NET_IN_ATTACH_ANALYSE_RESULT pInParam = new NetSDKLib.NET_IN_ATTACH_ANALYSE_RESULT(); pInParam.cbAnalyseTaskResult = CbfAnalyseTaskResultCallBack.getInstance(); pInParam.nTaskIdNum = 1; pInParam.nTaskIDs[0] = myTaskID; pInParam.stuFilter.nEventNum = 1; // 只获取 EVENT_IVS_FEATURE_ABSTRACT 特征提取事件 pInParam.stuFilter.dwAlarmTypes[0] = NetSDKLib.EVENI_IVS_XRAY_DETECTION; AttachHandle = netSdk.CLIENT_AttachAnalyseTaskResult(loginHandle, pInParam, 5000); if (AttachHandle.longValue() != 0) { System.out.println("AttachAnalyseTaskResult Succeed!" + AttachHandle.longValue()); } else { System.err.printf("AttachAnalyseTaskResult Failed!Last Error[0x%x]\n", netSdk.CLIENT_GetLastError()); return; } } /** * 智能分析退订 * * @return 是否成功退订 */ public void detachAnalyseTaskResult() { System.out.println("detachAnalyseTaskResult:" + AttachHandle.longValue()); boolean result = netSdk.CLIENT_DetachAnalyseTaskResult(AttachHandle); if (!result) { System.out.println("detach analyseTask result failed. error is " + ENUMERROR.getErrorMessage()); } else { System.out.println("detachAnalyseTaskResult Succeed"); } } int myTaskID = 0; /** * 查询智能分析任务 */ public void findAnalyseTask() { // 入参 NetSDKLib.NET_IN_FIND_ANALYSE_TASK stuInParam = new NetSDKLib.NET_IN_FIND_ANALYSE_TASK(); // 出参 NetSDKLib.NET_OUT_FIND_ANALYSE_TASK stuOutParam = new NetSDKLib.NET_OUT_FIND_ANALYSE_TASK(); if (netSdk.CLIENT_FindAnalyseTask(loginHandle, stuInParam, stuOutParam, 5000)) { System.out.println("FindAnalyseTask Succeed!" + "智能分析任务个数" + stuOutParam.nTaskNum); // ID和状态 可以从 stuTaskInfos 中获取 for (int i = 0; i < stuOutParam.nTaskNum; i++) { // 状态值参考 EM_ANALYSE_STATE myTaskID = stuOutParam.stuTaskInfos[i].nTaskID; System.out.printf("任务%d: %d, 状态:%d\n", (i + 1), stuOutParam.stuTaskInfos[i].nTaskID, stuOutParam.stuTaskInfos[i].emAnalyseState); } } else { System.err.printf("FindAnalyseTask Failed!Last Error:%s\n", ToolKits.getErrorCode()); } } // 测试用的图片 private final String testPicPath1 = "D:/A1.jpg"; private final String testPicPath2 = "D:/A2.jpg"; /** * 主动推送图片 */ public void PushAnalysePictureFile() { // 入参 NetSDKLib.NET_IN_PUSH_ANALYSE_PICTURE_FILE stuInParam = new NetSDKLib.NET_IN_PUSH_ANALYSE_PICTURE_FILE(); stuInParam.nTaskID = myTaskID; stuInParam.nPicNum = 1; // 以两张图为例 // ftp://用户名:密码@hostname:端口号/文件路径 // byte[] fileUrl = "ftp://username:password@hostname:port/filepath".getBytes(); // System.arraycopy(fileUrl, 0, stuInParam.stuPushPicInfos[0].szUrl, 0, // fileUrl.length); // 加载本地图片到缓冲区, 这里以两张图为例 int totalLen = 0; // 这是总的图片缓冲区长度 byte[] testFileBuffer1 = ToolKits.readPictureToByteArray(testPicPath1); byte[] testFileBuffer2 = ToolKits.readPictureToByteArray(testPicPath2); // 文件id byte[] fileId1 = "file001".getBytes(); // 这个ID是图片的标识符,设备分析完毕返回的数据也以这个ID区分 System.arraycopy(fileId1, 0, stuInParam.stuPushPicInfos[0].szFileID, 0, fileId1.length); if (testFileBuffer1 != null) { stuInParam.stuPushPicInfos[0].nLength = testFileBuffer1.length; stuInParam.stuPushPicInfos[0].nOffset = totalLen; // 偏移量,有多张图时这里要特别注意 totalLen = totalLen + stuInParam.stuPushPicInfos[0].nLength; // 总的长度是各个图的累加 } byte[] fileId2 = "file002".getBytes(); // 这个ID是图片的标识符,设备分析完毕返回的数据也以这个ID区分 System.arraycopy(fileId2, 0, stuInParam.stuPushPicInfos[1].szFileID, 0, fileId2.length); if (testFileBuffer2 != null) { stuInParam.stuPushPicInfos[1].nLength = testFileBuffer2.length; stuInParam.stuPushPicInfos[1].nOffset = totalLen; // 偏移量,有多张图时这里要特别注意 totalLen = totalLen + stuInParam.stuPushPicInfos[1].nLength; // 总的长度是各个图的累加 } stuInParam.nBinBufLen = totalLen; stuInParam.pBinBuf = new Memory(totalLen); // 分配内存 stuInParam.pBinBuf.clear(totalLen); // 清理内存 if (testFileBuffer1 != null) // 第一张图写入缓存 stuInParam.pBinBuf.write(stuInParam.stuPushPicInfos[0].nOffset, testFileBuffer1, 0, stuInParam.stuPushPicInfos[0].nLength); if (testFileBuffer2 != null) // 第二张图写入缓存 stuInParam.pBinBuf.write(stuInParam.stuPushPicInfos[1].nOffset, testFileBuffer2, 0, stuInParam.stuPushPicInfos[1].nLength); // 出参 NetSDKLib.NET_OUT_PUSH_ANALYSE_PICTURE_FILE stuOutParam = new NetSDKLib.NET_OUT_PUSH_ANALYSE_PICTURE_FILE(); if (netSdk.CLIENT_PushAnalysePictureFile(loginHandle, stuInParam, stuOutParam, 5000)) { System.out.println("PushAnalysePictureFile Succeed!"); } else { System.err.printf("PushAnalysePictureFile Failed!Last Error: %s\n", ToolKits.getErrorCode()); } } /** * 智能分析结果订阅函数原型 */ private static class CbfAnalyseTaskResultCallBack implements NetSDKLib.fAnalyseTaskResultCallBack { private final File picturePath; private CbfAnalyseTaskResultCallBack() { picturePath = new File("./AnalyzerPicture/result/"); if (!picturePath.exists()) { picturePath.mkdirs(); } } private static class CallBackHolder { private static CbfAnalyseTaskResultCallBack instance = new CbfAnalyseTaskResultCallBack(); } public static CbfAnalyseTaskResultCallBack getInstance() { return CbfAnalyseTaskResultCallBack.CallBackHolder.instance; } @Override public int invoke(NetSDKLib.LLong lAttachHandle, Pointer pstAnalyseTaskResult, Pointer pBuf, int dwBufSize, Pointer dwUser) { NetSDKLib.NET_CB_ANALYSE_TASK_RESULT_INFO task = new NetSDKLib.NET_CB_ANALYSE_TASK_RESULT_INFO(); ToolKits.GetPointerData(pstAnalyseTaskResult, task); System.out.println("进入回调-----------------------------------"); System.out.println("task.nTaskResultNum:" + task.nTaskResultNum); for (int i = 0; i < task.nTaskResultNum; i++) { for (int j = 0; j < task.stuTaskResultInfos[0].nEventCount; j++) { int emEventType = task.stuTaskResultInfos[i].stuEventInfos[i].emEventType; switch (emEventType) { case NetSDKLib.EM_ANALYSE_EVENT_TYPE.EM_ANALYSE_EVENT_DIALRECOGNITION: { System.out.println(" 仪表检测事件"); DEV_EVENT_DIALRECOGNITION_INFO msg = new DEV_EVENT_DIALRECOGNITION_INFO(); ToolKits.GetPointerData(task.stuTaskResultInfos[0].stuEventInfos[j].pstEventInfo, msg); int emType = msg.emType; System.out.println("emType:" + emType); byte[] szTaskID = msg.szTaskID; System.out.println("szTaskID:" + new String(szTaskID)); System.out.println("nPresetID:" + msg.nPresetID); System.out.println("nChannelID:" + msg.nChannelID); System.out.println("nRetImageInfoNum:" + msg.nRetImageInfoNum); NET_IMAGE_INFO[] stuImgaeInfo = msg.stuImgaeInfo; for (int m = 0; m < msg.nRetImageInfoNum; m++) { NET_IMAGE_INFO net_image_info = stuImgaeInfo[m]; /** * 图片类型 {@link com.netsdk.lib.enumeration.EM_PIC_TYPE} */ System.out.println("emPicType:" + net_image_info.emPicType); System.out.println("net_image_info.length:" + net_image_info.nLength); System.out.println("net_image_info.szFilePath:" + new String(net_image_info.szFilePath)); // 图片 if (net_image_info != null && net_image_info.nLength > 0) { String picture = picturePath + "/" + System.currentTimeMillis() + "_stuImgaeInfo.jpg"; ToolKits.savePicture(pBuf, net_image_info.nOffset, net_image_info.nLength, picture); } } System.out.println("szDialResult:" + new String(msg.szDialResult)); // 原始图片 if (msg.nOriginalImageLength > 0) { String picture = picturePath + "/" + System.currentTimeMillis() + "_OriginalImage.jpg"; ToolKits.savePicture(pBuf, msg.nOriginalImageOffset, msg.nOriginalImageLength, picture); } /** * 告警类型:0-该字段无效;1-数值异常;2-定时上报 */ System.out.println("nAlarmType:" + msg.nAlarmType); /** * EM_ANALYSE_EVENT_DIALRECOGNITION 仪表检测事件 DEV_EVENT_DIALRECOGNITION_INFO * EM_ANALYSE_EVENT_ELECTRICFAULT_DETECT 仪表类缺陷检测事件 * DEV_EVENT_ELECTRICFAULTDETECT_INFO * */ break; } case NetSDKLib.EM_ANALYSE_EVENT_TYPE.EM_ANALYSE_EVENT_ELECTRICFAULT_DETECT: { // System.out.println(" 仪表类缺陷检测事件"); DEV_EVENT_ELECTRICFAULTDETECT_INFO msg = new DEV_EVENT_ELECTRICFAULTDETECT_INFO(); ToolKits.GetPointerData(task.stuTaskResultInfos[0].stuEventInfos[j].pstEventInfo, msg); /** * 智能事件所属大类 {@link com.netsdk.lib.enumeration.EM_CLASS_TYPE} */ System.out.println("emClassType:" + msg.emClassType); System.out.println("szName:" + new String(msg.szName)); NetSDKLib.SCENE_IMAGE_INFO stuSceneImageInfo = msg.stuSceneImageInfo; // 大图 if (stuSceneImageInfo != null && stuSceneImageInfo.nLength > 0) { String picture = picturePath + "/" + System.currentTimeMillis() + "_stuSceneImageInfo.jpg"; ToolKits.savePicture(pBuf, stuSceneImageInfo.nOffSet, stuSceneImageInfo.nLength, picture); } int nDialDetectNum = msg.nDialDetectNum; System.out.println("表盘检测结果个数: " + nDialDetectNum); NET_DIAL_DETECT[] stuDialDetectInfo = msg.stuDialDetectInfo; for (int m = 0; m < nDialDetectNum; m++) { NET_DIAL_DETECT detect = stuDialDetectInfo[m]; /** * 表盘状态 {@link com.netsdk.lib.enumeration.EM_DIAL_STATE} */ int emDialState = detect.emDialState; System.out.println("表盘状态:" + emDialState); NET_RECT stuBoundingBox = detect.stuBoundingBox; System.out.println("stuBoundingBox: " + stuBoundingBox); } break; } case NetSDKLib.EM_ANALYSE_EVENT_TYPE.EM_ANALYSE_EVENT_XRAY_DETECTION: { // // X光机检测事件, 对应结构体 DEV_EVENT_XRAY_DETECTION_INFO System.out.println("X光机检测事件 "); DEV_EVENT_XRAY_DETECTION_INFO msg = new DEV_EVENT_XRAY_DETECTION_INFO(); ToolKits.GetPointerData(task.stuTaskResultInfos[0].stuEventInfos[j].pstEventInfo, msg); // 通道号 int nChannelID = msg.nChannelID; System.out.println("nChannelID:" + nChannelID); // 事件名称 byte[] szName = msg.szName; System.out.println("szName:" + new String(szName)); // 相对事件时间戳(单位是毫秒) double pts = msg.PTS; System.out.println("pts:" + new Date((long) pts)); // UTC时间 NET_TIME_EX UTC = msg.UTC; System.out.println("UTC:" + UTC.toStringTime()); // 所属大类 int emClassType = msg.emClassType; System.out.println("emClassType:" + emClassType); // 事件id int nEventID = msg.nEventID; System.out.println("nEventID:" + nEventID); // 危险等级 int emDangerGrade = msg.stuPacketInfo.emDangerGrade; System.out.println("stuPacketInfo.emDangerGrade:" + emDangerGrade); // 主视角包裹内物品个数 int nObjectNum = msg.nObjectNum; System.out.println("nObjectNum:" + nObjectNum); // 主视角包裹内物品信息 for (int n = 0; n < nObjectNum; n++) { NET_INSIDE_OBJECT stuInsideObj = msg.stuInsideObj[n]; System.out.println("stuInsideObj[" + n + "]:" + stuInsideObj.toString()); } // 从视角包裹内物品个数 int nSlaveViewObjectNum = msg.nSlaveViewObjectNum; System.out.println("nSlaveViewObjectNum:" + nSlaveViewObjectNum); // 从视角包裹内物品信息 for (int n = 0; n < nSlaveViewObjectNum; n++) { NET_INSIDE_OBJECT stuSlaveViewInsideObj = msg.stuSlaveViewInsideObj[n]; System.out.println("stuSlaveViewInsideObj[" + n + "]:" + stuSlaveViewInsideObj.toString()); } // 图片数量 int nImageCount = msg.nImageCount; System.out.println("nImageCount:" + nImageCount); int picSizes = 0; // 图片信息 for (int n = 0; n < nImageCount; n++) { NET_XRAY_IMAGE_INFO stuImageInfo = msg.stuImageInfo[n]; System.out.println("stuImageInfo[" + n + "]:" + stuImageInfo.toString()); // 图片 if (stuImageInfo != null && stuImageInfo.nLength > 0) { picSizes += stuImageInfo.nLength; String picture = picturePath + "\\" + System.currentTimeMillis() + "related.jpg"; ToolKits.savePicture(pBuf, stuImageInfo.nOffset, stuImageInfo.nLength, picture); } } // 客户自定义信息个数 int nViewCustomInfoNum = msg.nViewCustomInfoNum; System.out.println("nViewCustomInfoNum:" + nViewCustomInfoNum); // 客户自定义信息, X光机专用 for (int n = 0; n < nViewCustomInfoNum; n++) { NetSDKLib.NET_XRAY_CUSTOM_INFO stuViewCustomInfo = msg.stuViewCustomInfo[n]; System.out.println("stuViewCustomInfo[" + n + "]:" + stuViewCustomInfo.toString()); } // 包裹标识 String szPackageTag = Arrays.toString(msg.szPackageTag); System.out.println("szPackageTag:" + szPackageTag); // 包裹产生方式 int emPackageMode = msg.emPackageMode; System.out.println("emPackageMode:" + emPackageMode); // 关联图片数量 int nRelatedImageNum = msg.nRelatedImageNum; System.out.println("nRelatedImageNum:" + nRelatedImageNum); // 客户自定义信息, X光机专用 for (int n = 0; n < nRelatedImageNum; n++) { NET_XRAY_RELATED_IMAGE_INFO stuRelatedImageInfo = msg.stuRelatedImageInfo[n]; System.out.println("stuRelatedImageInfo[" + n + "]:" + stuRelatedImageInfo.toString()); // 图片 stuRelatedImageInfo if (stuRelatedImageInfo != null && stuRelatedImageInfo.nLength > 0) { picSizes += stuRelatedImageInfo.nLength; String picture = picturePath + "\\" + System.currentTimeMillis() + "related2.jpg"; ToolKits.savePicture(pBuf, stuRelatedImageInfo.nOffset, stuRelatedImageInfo.nLength, picture); } } break; } default: System.out.println(" emEventType:" + emEventType); break; } } } return 0; } } public void RunTest() { CaseMenu menu = new CaseMenu(); menu.addItem(new CaseMenu.Item(this, "getXRayMultiLevelDetectCFG", "getXRayMultiLevelDetectCFG")); menu.addItem(new CaseMenu.Item(this, "setXRayMultiLevelDetectCFG", "setXRayMultiLevelDetectCFG")); menu.addItem(new CaseMenu.Item(this, "findAnalyseTask", "findAnalyseTask")); menu.addItem(new CaseMenu.Item(this, "AttachAnalyseTaskResult", "AttachAnalyseTaskResult")); menu.addItem(new CaseMenu.Item(this, "detachAnalyseTaskResult", "detachAnalyseTaskResult")); menu.addItem(new CaseMenu.Item(this, "PushAnalysePictureFile", "PushAnalysePictureFile")); menu.run(); } public static void main(String[] args) { InitTest("10.35.35.50", 37777, "admin", "admin123"); byte[] sSerialNumber = m_stDeviceInfo.sSerialNumber; System.out.println("序列号:" + new String(sSerialNumber)); new XRayMultiLevelDemo().RunTest(); LoginOut(); } }