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.structure.DEV_EVENT_PARKINGSPACE_MANUALSNAP_INFO; import com.netsdk.lib.utils.Initialization; import com.sun.jna.Pointer; import java.io.File; import java.io.UnsupportedEncodingException; /** * @author 291189 * @version 1.0 * @description GIP220224028 秒图主动推送SDK协议 * @date 2022/3/17 14:33 */ public class ParkingSnapTimerDemo extends Initialization { private static String ipAddr = "172.27.1.55"; private static int port = 37777; private static String user = "admin"; private static String password = "admin123"; int channel=0; NetSDKLib.LLong attachHandle=new NetSDKLib.LLong(0); public NetSDKLib.LLong AttachEventRealLoadPic() { // 先退订,设备不会对重复订阅作校验,重复订阅后会有重复的事件返回 if (attachHandle.longValue() != 0) { this.DetachEventRealLoadPic(); } // 需要图片 int bNeedPicture = 1; attachHandle = netSdk.CLIENT_RealLoadPictureEx(loginHandle, channel, NetSDKLib.EVENT_IVS_TRAFFIC_PARKINGSPACE_MANUALSNAP, bNeedPicture, AnalyzerDataCB.getInstance(), null, null); if (attachHandle.longValue() != 0) { System.out.printf("Chn[%d] CLIENT_RealLoadPictureEx Success\n", channel); } else { System.out.printf("Chn[%d] CLIENT_RealLoadPictureEx Failed!LastError = %s\n", channel, ToolKits.getErrorCode()); } return attachHandle; } /** * 报警事件(智能)回调 */ private static class AnalyzerDataCB implements NetSDKLib.fAnalyzerDataCallBack { private final File picturePath; private static AnalyzerDataCB instance; private AnalyzerDataCB() { picturePath = new File("./AnalyzerPicture/"); if (!picturePath.exists()) { picturePath.mkdirs(); } } public static AnalyzerDataCB getInstance() { if (instance == null) { synchronized (AnalyzerDataCB.class) { if (instance == null) { instance = new AnalyzerDataCB(); } } } return instance; } @Override public int invoke(NetSDKLib.LLong lAnalyzerHandle, int dwAlarmType, Pointer pAlarmInfo, Pointer pBuffer, int dwBufSize, Pointer dwUser, int nSequence, Pointer reserved) { if (lAnalyzerHandle == null || lAnalyzerHandle.longValue() == 0) { return -1; } switch (dwAlarmType) { case NetSDKLib.EVENT_IVS_TRAFFIC_PARKINGSPACE_MANUALSNAP : {// 路侧停车位手动抓图 (对应 DEV_EVENT_PARKINGSPACE_MANUALSNAP_INFO ) ParsingTrafficParkingSpaceManualSnap(pAlarmInfo, pBuffer, dwBufSize); break; } default: System.out.println("其他事件:"+dwAlarmType); break; } return 0; } private void ParsingTrafficParkingSpaceManualSnap(Pointer pAlarmInfo, Pointer pBuffer, int dwBufSize) { System.out.println("<<------路侧停车位手动抓图------>>"); DEV_EVENT_PARKINGSPACE_MANUALSNAP_INFO stuManualSnap = new DEV_EVENT_PARKINGSPACE_MANUALSNAP_INFO(); ToolKits.GetPointerDataToStruct(pAlarmInfo, 0, stuManualSnap); try { ////// 主要数据提取 String eventName = new String(stuManualSnap.szName, encode).trim(); // "Name" 事件名称 int channel = stuManualSnap.nChannel; // "Channel" 通道号 double PTS = stuManualSnap.PTS; // "PTS" 相对事件时间戳 (单位毫秒) String UTC = stuManualSnap.UTC.toString(); // "UTC" 事件发生的时间 (单位秒) int eventID = stuManualSnap.nEventID; // "EventID" 事件ID号 用来唯一标志一个事件 int groupID = stuManualSnap.stuFileInfo.nGroupId; // "GroupID" 事件组ID,同一辆车抓拍过程内 GroupID 相同 byte countInGroup = stuManualSnap.stuFileInfo.bCount; // "CountInGroup" 一个事件组内应有的抓拍张数 byte index = stuManualSnap.stuFileInfo.bIndex; // "IndexInGroup" 一个事件组内的抓拍序号,从1开始 String serialNo = new String(stuManualSnap.szSerialNo, encode).trim(); // "SerialNo" 客户端请求的抓图序列号对应 // 主要数据打印 String mainInfo = "///——————事件主要信息——————" + "\n" + "Name 事件名称: " + eventName + "\n" + "Channel 通道号: " + channel + "\n" + "PTS 相对事件时间戳: " + PTS + "\n" + "UTC 事件发生的时间: " + UTC + "\n" + "EventID 事件ID号: " + eventID + "\n" + "GroupID 事件组ID: " + groupID + "\n" + "CountInGroup 应有张数: " + countInGroup + "\n" + "Index 抓拍序号: " + index + "\n" + "SerialNo 客户端抓图序列号: " + serialNo; System.out.println(mainInfo); ////// 提取并打印停车位信息 StringBuilder parkingInfo = new StringBuilder().append("///——————车位信息——————").append("\n"); int parkingNum = stuManualSnap.nParkingNum; parkingInfo.append("车位总数: ").append(parkingNum).append("\n"); for (int i = 0; i < parkingNum; i++) { int nStatus = stuManualSnap.stuParkingInfo[i].nStatus; String parkingStatus = (nStatus == 0) ? "未知" : (nStatus == 1) ? "有车" : "无车"; // "Status" 是否有车 String plateNumber = new String(stuManualSnap.stuParkingInfo[i].szPlateNumber, encode).trim(); // "PlateNumber" 车牌号 String parkingNo = new String(stuManualSnap.stuParkingInfo[i].szParkingNo, encode).trim(); // "ParkingNo" 车位号 parkingInfo.append(String.format("//——>第[%2d]个车位", i)).append("\n") .append("Status 是否有车: ").append(parkingStatus).append("\n") .append("PlateNumber 车牌号: ").append(plateNumber).append("\n") .append("ParkingNo 车位号: ").append(parkingNo).append("\n"); } System.out.println(parkingInfo.toString()); //////////////// <<-----保存图片 没有子图 直接保存整个 pBuffer 即可 ----->> //////////////// String picture = picturePath + "/" + System.currentTimeMillis() + "ParkingSpaceManualSnap.jpg"; ToolKits.savePicture(pBuffer, 0, dwBufSize, picture); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } /** * 停止侦听智能事件 */ public void DetachEventRealLoadPic() { if (this.attachHandle.longValue() != 0) { netSdk.CLIENT_StopLoadPic(this.attachHandle); } } public void RunTest() { System.out.println("Run Test"); CaseMenu menu = new CaseMenu(); menu.addItem((new CaseMenu.Item(this , "AttachEventRealLoadPic" , "AttachEventRealLoadPic"))); menu.addItem((new CaseMenu.Item(this , "DetachEventRealLoadPic" , "DetachEventRealLoadPic"))); menu.run(); } public static void main(String[] args){ InitTest(ipAddr, port, user, password); ParkingSnapTimerDemo scd=new ParkingSnapTimerDemo(); scd.RunTest(); LoginOut(); } }