package com.netsdk.demo.intelligentTraffic.trafficRadarDemo; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.netsdk.lib.enumeration.EM_DETECT_SENSOR_TYPE; import com.netsdk.lib.enumeration.EM_TRAFFIC_FLOW_STATUS; import com.netsdk.lib.enumeration.EM_VEHICLEINOUT_CAR_TYPE; import com.netsdk.lib.enumeration.EM_VIRTUAL_COIL_OCCUPANCY_STATUS; import com.netsdk.lib.structure.ALARM_VEHICLE_INOUT_INFO; import com.netsdk.lib.structure.NET_VEHICLE_OBJECT; import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import java.io.UnsupportedEncodingException; /** * @author : 47040 * @since : Created in 2020/12/14 9:14 */ public class TrafficRadarMessageCB implements NetSDKLib.fMessCallBackEx1 { private static TrafficRadarMessageCB singleInstance; public static TrafficRadarMessageCB getSingleInstance() { if (singleInstance == null) { singleInstance = new TrafficRadarMessageCB(); } return singleInstance; } // 获取此平台的字符串编码 public static final String encode = TrafficRadarUtils.GetSystemEncode(); // bAlarmAckFlag : TRUE,该事件为可以进行确认的事件;FALSE,该事件无法进行确认 // nEventID 用于对 CLIENT_AlarmAck 接口的入参进行赋值,当 bAlarmAckFlag 为 TRUE 时,该数据有效 // pBuf内存由SDK内部申请释放 @Override public boolean invoke(int lCommand, // 事件枚举 配合 pStuEvent dwBufLen 可以获取事件信息 NetSDKLib.LLong lLoginID, // 登录句柄 Pointer pStuEvent, // 事件信息指针 int dwBufLen, // 事件信息长度 String strDeviceIP, // 设备IP NativeLong nDevicePort, // 设备TCP端口 int bAlarmAckFlag, NativeLong nEventID, Pointer dwUser) { try { switch (lCommand) { case NetSDKLib.NET_ALARM_VEHICLE_INOUT: { // 车辆出入事件 vehicleInOut ParsingVehicleInOut(pStuEvent); break; } default: System.out.printf("Get Other Event 0x%x\n", lCommand); break; } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return true; } // 车辆进出车道报警 vehicleInOut private void ParsingVehicleInOut(Pointer pStuEvent) throws UnsupportedEncodingException { System.out.println("\n\n [ ALARM VEHICLE INOUT 车辆出入事件 ]"); ////////////////////////////// <<-----获取事件信息----->> ////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////// ALARM_VEHICLE_INOUT_INFO stuAlarmInfo = new ALARM_VEHICLE_INOUT_INFO(); ToolKits.GetPointerDataToStruct(pStuEvent, 0, stuAlarmInfo); int nAction = stuAlarmInfo.nAction; // 事件动作,0表示脉冲事件 int nChannelID = stuAlarmInfo.nChannel; // 通道号 String szName = new String(stuAlarmInfo.szName, encode); // 事件名称 String UTC = stuAlarmInfo.UTC.toStringTime(); // 事件发生的时间 int nEventID = stuAlarmInfo.nEventID; int nObjectNum = stuAlarmInfo.nObjectNum; // 有效物体个数 NET_VEHICLE_OBJECT[] stObjects = new NET_VEHICLE_OBJECT[nObjectNum]; for (int i = 0; i < nObjectNum; i++) { stObjects[i] = new NET_VEHICLE_OBJECT(); } ToolKits.GetPointerDataToStructArr(stuAlarmInfo.pstObjets, stObjects); int nStatNum = stuAlarmInfo.nStatNum; // 统计有效个数 // 打印出来看一下 StringBuilder info = new StringBuilder() .append("nAction 事件状态 0->脉冲: ").append(nAction).append("\n") .append("nChannelID 通道号 : ").append(nChannelID).append("\n") .append("szName 事件名称: ").append(szName).append("\n") .append("UTC 发生时间: ").append(UTC).append("\n") .append("nEventID 事件ID: ").append(nEventID).append("\n"); info.append("////// 有效物体个数: ").append(nObjectNum).append("\n"); for (int i = 0; i < nObjectNum; i++) { info.append("// --> 物体序号: ").append(i).append("\n") .append(" nObjectID 物体ID:").append(stObjects[i].nObjectID).append("\n") .append(" nSpeed 车速,单位km/h:").append(stObjects[i].nSpeed).append("\n") .append(" szObjectType 物体类型:").append(new String(stObjects[i].szObjectType, encode)).append("\n") .append(" emSubObject 物体子类别(NetSDKLib.EM_CATEGORY_TYPE):").append(stObjects[i].emSubObject).append("\n") .append(" nLane 物理车道号:").append(stObjects[i].nLane).append("\n") .append(" nRoadwayNumber 自定义车道号:").append(stObjects[i].nRoadwayNumber).append("\n") .append(" emSensorType 传感器类型:").append(EM_DETECT_SENSOR_TYPE.getEnum(stObjects[i].emSensorType).getNote()).append("\n") .append(" nObjectRVID 物体雷达和视频融合ID:").append(stObjects[i].nObjectRVID).append("\n") .append(" nObjectRID 物体的雷达ID:").append(stObjects[i].nObjectRID).append("\n") .append(" szDrivingDirection[0] 行驶方向:").append(new String(stObjects[i].szDrivingDirection[0].info, encode)).append("\n") .append(" szDrivingDirection[1] 上行地点:").append(new String(stObjects[i].szDrivingDirection[1].info, encode)).append("\n") .append(" szDrivingDirection[2] 下行地点:").append(new String(stObjects[i].szDrivingDirection[2].info, encode)).append("\n") .append(" szPlateNumber 车牌号码:").append(new String(stObjects[i].szPlateNumber, encode)).append("\n") .append(" szPlateColor 车牌颜色:").append(new String(stObjects[i].szPlateColor, encode)).append("\n") .append(" dbLongitude 车辆经度:").append(stObjects[i].dbLongitude).append("\n") .append(" dbLatitude 车辆纬度:").append(stObjects[i].dbLatitude).append("\n") .append(" szCarColor 车身颜色:").append(new String(stObjects[i].szCarColor, encode)).append("\n") .append(" emCarType 车辆类型:").append(EM_VEHICLEINOUT_CAR_TYPE.getEnum(stObjects[i].emCarType).getNote()).append("\n") .append(" emVirtualCoilDirection 车辆驶入驶出状态(NetSDKLib.NET_FLOWSTAT_DIRECTION):").append(stObjects[i].emVirtualCoilDirection).append("\n") .append(" dbDistanceToStop 距离停车线距离:").append(stObjects[i].dbDistanceToStop).append("\n") .append(" dbCarX 车道的中心点 X轴方向:").append(stObjects[i].dbCarX).append("\n") .append(" dbCarY 车道的中心点 Y轴方向:").append(stObjects[i].dbCarY).append("\n") .append(" dbCarAngle 车道的中心点 角度:").append(stObjects[i].dbCarAngle).append("\n"); } info.append("////// 统计有效个数: ").append(nStatNum).append("\n"); for (int i = 0; i < nStatNum; i++) { info.append("// --> 统计序号: ").append(i).append("\n") .append(" nLane 物理车道号:").append(stuAlarmInfo.stuStats[i].nLane).append("\n") .append(" nRoadwayNumber 自定义车道号:").append(stuAlarmInfo.stuStats[i].nRoadwayNumber).append("\n") .append(" emStatus 流量状态:").append(EM_TRAFFIC_FLOW_STATUS.getEnum(stuAlarmInfo.stuStats[i].emStatus).getNote()).append("\n") .append(" emHeadCoil 车头虚拟线圈状态:").append(EM_VIRTUAL_COIL_OCCUPANCY_STATUS.getEnum(stuAlarmInfo.stuStats[i].emHeadCoil).getNote()).append("\n") .append(" emTailCoil 车尾虚拟线圈状态:").append(EM_VIRTUAL_COIL_OCCUPANCY_STATUS.getEnum(stuAlarmInfo.stuStats[i].emTailCoil).getNote()).append("\n") .append(" nSpeed 车道平均速度(单位:km/h):").append(stuAlarmInfo.stuStats[i].nSpeed).append("\n") .append(" nQueueLen 排队长度(单位:cm):").append(stuAlarmInfo.stuStats[i].nQueueLen).append("\n") .append(" nCarsInQueue 排队车辆数:").append(stuAlarmInfo.stuStats[i].nCarsInQueue).append("\n") .append(" emSensorType 传感器类型 :").append(EM_DETECT_SENSOR_TYPE.getEnum(stuAlarmInfo.stuStats[i].emSensorType).getNote()).append("\n"); } System.out.println(info.toString()); } }