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.EM_DATA_SOURCE_TYPE; 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.Pointer; import java.io.File; import static com.netsdk.lib.NetSDKLib.EM_SCENE_CLASS_TYPE.EM_SCENE_CLASS_NORMAL; import static com.netsdk.lib.NetSDKLib.EM_STREAM_PROTOCOL_TYPE.EM_STREAM_PROTOCOL_RTSP; import static com.netsdk.lib.NetSDKLib.EVENT_IVS_DIALRECOGNITION; import static com.netsdk.lib.NetSDKLib.EVENT_IVS_ELECTRICFAULT_DETECT; /** * @author 291189 * @version 1.0 * @description * @date 2022/6/28 15:20 */ public class AnalyseTaskDemo extends Initialization { /** * 添加智能分析任务测试 */ int myTaskID=0; public void AddAnalyseTaskLEFTDETECTION() { /** 主动推送图片文件,添加任务时无规则和图片信息,通过推送图片接口,每张图片中带有不同的规则信息(目前能源场景中使用), 对应 NET_PUSH_PICFILE_BYRULE_INFO */ int emDataSourceType = EM_DATA_SOURCE_TYPE.EM_DATA_SOURCE_PUSH_PICFILE_BYRULE.getType(); // 入参结构体 NET_PUSH_PICFILE_BYRULE_INFO msg = new NET_PUSH_PICFILE_BYRULE_INFO(); msg.write(); /** * EM_ANALYSE_TASK_START_RULE {@link com.netsdk.lib.enumeration.EM_ANALYSE_TASK_START_RULE} */ msg.emStartRule=1; NetSDKLib.NET_OUT_ADD_ANALYSE_TASK pOutParam = new NetSDKLib.NET_OUT_ADD_ANALYSE_TASK(); if (netSdk.CLIENT_AddAnalyseTask(loginHandle, emDataSourceType, msg.getPointer(), pOutParam, 5000)) { myTaskID = pOutParam.nTaskID; System.out.println("AddAnalyseTask Succeed! " + "任务ID:" + myTaskID + "任务对应的虚拟通道号" + pOutParam.nVirtualChannel); } else { System.err.printf("AddAnalyseTask Failed!Last Error[0x%x]\n", netSdk.CLIENT_GetLastError()); return; } } /** * 远程实时流数据 */ public void AddAnalyseTaskREMOTE_REALTIME_STREAM() { /** * 远程实时流 */ int emDataSourceType = EM_DATA_SOURCE_TYPE. EM_DATA_SOURCE_REMOTE_REALTIME_STREAM.getType(); NetSDKLib.NET_REMOTE_REALTIME_STREAM_INFO msg=new NetSDKLib.NET_REMOTE_REALTIME_STREAM_INFO(); /** * EM_ANALYSE_TASK_START_RULE {@link com.netsdk.lib.enumeration.EM_ANALYSE_TASK_START_RULE} */ msg.emStartRule=1; NetSDKLib.NET_ANALYSE_RULE stuRuleInfo = msg.stuRuleInfo; stuRuleInfo.nRuleCount=1; NetSDKLib.NET_ANALYSE_RULE_INFO stuRuleInfo1 = stuRuleInfo.stuRuleInfos[0]; /** * {@link com.netsdk.lib.NetSDKLib.EM_SCENE_CLASS_TYPE} */ stuRuleInfo1.emClassType=EM_SCENE_CLASS_NORMAL; // "Normal" 普通场景 // stuRuleInfo1.dwRuleType=EVENT_IVS_DIALRECOGNITION; stuRuleInfo1.dwRuleType= EVENT_IVS_DIALRECOGNITION; NET_IVS_DIALRECOGNITION_RULE_INFO info=new NET_IVS_DIALRECOGNITION_RULE_INFO(); /** 仪表类型 {@link com.netsdk.lib.enumeration.EM_DIALDETECT_TYPE} */ info.emType=5; info.nDetectRegionNum = 4; info.stuDetectRegion[0].nX = 0; info.stuDetectRegion[0].nY = 0; info.stuDetectRegion[1].nX = 8192; info.stuDetectRegion[1].nY = 0; info.stuDetectRegion[2].nX = 8192; info.stuDetectRegion[2].nY = 8192; info.stuDetectRegion[3].nX = 0; info.stuDetectRegion[3].nY = 8192; info.bSizeFileter = 1; info.stuSizeFileter.bFilterMinSizeEnable = 1; info.stuSizeFileter.stuFilterMinSize.nWide = 0; info.stuSizeFileter.stuFilterMinSize.nHeight = 0; info.stuSizeFileter.bFilterMaxSizeEnable = 1; info.stuSizeFileter.stuFilterMaxSize.nWide = 8191; info.stuSizeFileter.stuFilterMaxSize.nHeight = 8191; info.stuSizeFileter.bFilterTypeEnable = 1; info.stuSizeFileter.bFilterType = 0; stuRuleInfo1.pReserved= new Memory(info.size()); stuRuleInfo1.pReserved.clear(info.size()); ToolKits.SetStructDataToPointer(info, stuRuleInfo1.pReserved,0); //参考EM_STREAM_PROTOCOL_TYPE /** * {@link com.netsdk.lib.NetSDKLib.EM_STREAM_PROTOCOL_TYPE} */ msg.emStreamProtocolType=EM_STREAM_PROTOCOL_RTSP; // 视频流地址 ToolKits.StringToByteArr("rtsp://admin:admin123@172.12.8.156:554/cam/realmonitor?channel=1&subtype=0",msg.szPath); ToolKits.StringToByteArr("172.12.8.156", msg.szIp); msg.wPort=554; ToolKits.StringToByteArr("admin",msg.szUser); ToolKits.StringToByteArr("admin123",msg.szPwd); msg.nChannelID=1; msg.nStreamType=0; msg.write(); NetSDKLib.NET_OUT_ADD_ANALYSE_TASK pOutParam = new NetSDKLib.NET_OUT_ADD_ANALYSE_TASK(); if (netSdk.CLIENT_AddAnalyseTask(loginHandle, emDataSourceType, msg.getPointer(), pOutParam, 5000)) { myTaskID = pOutParam.nTaskID; System.out.println("AddAnalyseTask Succeed! " + "任务ID:" + myTaskID + "任务对应的虚拟通道号" + pOutParam.nVirtualChannel); } else { System.err.printf("AddAnalyseTask Failed!Last Error[0x%x]\n", netSdk.CLIENT_GetLastError()); return; } } /** * 查询智能分析任务 */ 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()); } } /** * 删除智能分析任务 */ public void RemoveAnalyseTask() { // 入参 NetSDKLib.NET_IN_REMOVE_ANALYSE_TASK pInParam = new NetSDKLib.NET_IN_REMOVE_ANALYSE_TASK(); pInParam.nTaskID = this.myTaskID; // demo里删除的是刚刚创建的任务,正常应该是查询后获取任务列表再选择需要删除的ID // 出参 NetSDKLib.NET_OUT_REMOVE_ANALYSE_TASK pOutParam = new NetSDKLib.NET_OUT_REMOVE_ANALYSE_TASK(); if (netSdk.CLIENT_RemoveAnalyseTask(loginHandle, pInParam, pOutParam, 5000)) { System.out.println("RemoveAnalyseTask Succeed! "); } else { System.err.printf("RemoveAnalyseTask Failed!Last Error: %s\n", ToolKits.getErrorCode()); } // 删除后再查询一下看看是否删除 } /** * 推送智能分析图片文件和规则信息 */ public void PushAnalysePictureFileByRule(){ //4、推送智能分析图片文件和规则信息 CLIENT_PushAnalysePictureFileByRule // EVENT_IVS_DIALRECOGNITION 仪表检测 NET_IVS_DIALRECOGNITION_RULE_INFO // EVENT_IVS_ELECTRICFAULT_DETECT // 仪表类缺陷检测 NET_IVS_ELECTRICFAULT_DETECT_RULE_INFO NET_IN_PUSH_ANALYSE_PICTURE_FILE_BYRULE input=new NET_IN_PUSH_ANALYSE_PICTURE_FILE_BYRULE(); input.nTaskID=myTaskID; System.out.println("myTaskID:"+myTaskID); input.nPicNum=1; String path="D:\\ERR\\ERR230419062\\pic\\微信图片_20230308095246.jpg"; byte[] bytes = ToolKits.readPictureToByteArray(path); System.out.println("bytes:"+bytes.length); input.nBinBufLen=bytes.length; input.pBinBuf=new Memory(bytes.length); input.pBinBuf.clear(bytes.length); input.pBinBuf.write(0,bytes , 0, bytes.length); NET_PUSH_PICTURE_BYRULE_INFO[] info=new NET_PUSH_PICTURE_BYRULE_INFO[input.nPicNum]; for(int i=0;i 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