package com.netsdk.demo.example; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.Image; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.UnsupportedEncodingException; import java.util.UUID; import java.util.Vector; import javax.imageio.ImageIO; import javax.swing.BorderFactory; import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import com.netsdk.lib.NetSDKLib.*; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; class ITSEventMsg{ static NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE; static NetSDKLib configApi = NetSDKLib.CONFIG_INSTANCE; public void test(){ DEV_EVENT_TRAFFICJUNCTION_INFO msg=new DEV_EVENT_TRAFFICJUNCTION_INFO(); //结构体大小 System.out.println(msg.size()); System.out.println(msg.stuObject.szText.hashCode()); System.out.println(msg.stTrafficCar.szPlateNumber.toString()); } private SDKEnvironment sdkEnv; // 登录参数 private String address = "172.11.1.147"; private Integer port = new Integer("37777"); private String username = "admin"; private String password = "admin123"; // 设备信息 private NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); private LLong loginHandle = new LLong(0); // 登录句柄 private LLong playHandle = new LLong(0); // 预览句柄 private LLong attachHandle = new LLong(0); // 智能事件订阅句柄 private fAnalyzerDataCB m_AnalyzerDataCB = new fAnalyzerDataCB(); // 智能事件回调 private boolean bTriggerBtnClick = false; private boolean bAttachFlag = false; private boolean bRealplayFlags = false; // 通道 private Vector chnlist = new Vector(); public ITSEventMsg() { sdkEnv = new SDKEnvironment(); sdkEnv.init(); SwingUtilities.invokeLater(new Runnable() { public void run() { mainFrame = new JFrame("交通事件处理Demo"); mainFrame.setSize(897, 721); mainFrame.setLayout(new BorderLayout()); mainFrame.setLocationRelativeTo(null); mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); mainFrame.setVisible(true); loginJPanel = new LoginPanel(); // 登录面板 messagePanel = new MessagePanel(); // 事件信息提示 realPlayPanel = new RealPlayPanel(); // 实时预览 eventInfoPanel = new EventInfoPanel(); // 事件及图片 mainFrame.add(loginJPanel, BorderLayout.NORTH); mainFrame.add(realPlayPanel, BorderLayout.EAST); mainFrame.add(eventInfoPanel, BorderLayout.CENTER); mainFrame.add(messagePanel, BorderLayout.SOUTH); WindowAdapter closeWindowAdapter = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.out.println("Window Closing"); logoutBtnPerformed(null); // 登出 sdkEnv.cleanup(); mainFrame.dispose(); } }; mainFrame.addWindowListener(closeWindowAdapter); } }); } /** * NetSDK 库初始化 */ private class SDKEnvironment { private boolean bInit = false; private boolean bLogopen = false; private DisConnect disConnect = new DisConnect(); // 设备断线通知回调 private HaveReConnect haveReConnect = new HaveReConnect(); // 网络连接恢复 // 初始化 public boolean init() { // SDK 库初始化, 并设置断线回调 bInit = netsdkApi.CLIENT_Init(disConnect, null); if (!bInit) { System.err.println("Initialize SDK failed"); return false; } // 打开日志,可选 NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO(); File path = new File("."); String logPath = path.getAbsoluteFile().getParent() + "\\sdk_log\\ITSEventMsg_" + System.currentTimeMillis() + ".log"; setLog.bSetFilePath = 1; System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length); setLog.bSetPrintStrategy = 1; setLog.nPrintStrategy = 0; bLogopen = netsdkApi.CLIENT_LogOpen(setLog); if (!bLogopen) { System.err.println("Failed to open NetSDK log !!!"); } // 获取版本, 可选操作 System.out.printf("NetSDK Version [%d]\n", netsdkApi.CLIENT_GetSDKVersion()); // 设置断线重连回调接口,设置过断线重连成功回调函数后,当设备出现断线情况,SDK内部会自动进行重连操作 // 此操作为可选操作,但建议用户进行设置 netsdkApi.CLIENT_SetAutoReconnect(haveReConnect, null); // 设置登录超时时间和尝试次数 , 此操作为可选操作 int waitTime = 5000; // 登录请求响应超时时间设置为 5s int tryTimes = 3; // 登录时尝试建立链接3次 netsdkApi.CLIENT_SetConnectTime(waitTime, tryTimes); // 设置更多网络参数,NET_PARAM的nWaittime,nConnectTryNum成员与CLIENT_SetConnectTime // 接口设置的登录设备超时时间和尝试次数意义相同 // 此操作为可选操作 NetSDKLib.NET_PARAM netParam = new NetSDKLib.NET_PARAM(); netParam.nConnectTime = 10000; // 登录时尝试建立链接的超时时间 netParam.nPicBufSize = 8 * 1024 * 1024; netsdkApi.CLIENT_SetNetworkParam(netParam); return true; } // 清除环境 public void cleanup() { if (bLogopen) { netsdkApi.CLIENT_LogClose(); } if (bInit) { netsdkApi.CLIENT_Cleanup(); } } // 设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数 public class DisConnect implements NetSDKLib.fDisConnect { public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("Device[%s] Port[%d] Disconnect!\n" , pchDVRIP , nDVRPort); // 取消订阅 detachIVSEvent(); } } // 网络连接恢复,设备重连成功回调 // 通过 CLIENT_SetAutoReconnect 设置该回调函数,当已断线的设备重连成功时,SDK会调用该函数 public class HaveReConnect implements NetSDKLib.fHaveReConnect { public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort); // 重新订阅 attachIVSEvent(); } } } ///////////////// 事件动作相关接口 /////////////////////////// /** * 登录按钮 */ private void loginBtnPerformed(ActionEvent e) { address = ipTextArea.getText(); port = Integer.parseInt(portTextArea.getText()); username = nameTextArea.getText(); password = new String(passwordTextArea.getPassword()); System.out.println("设备地址:" + address + "\n端口号:" + port + "\n用户名:" + username + "\n密码:" + password); // 登录设备 IntByReference nError = new IntByReference(0); loginHandle = netsdkApi.CLIENT_LoginEx2(address, port.intValue(), username , password , 0, null, deviceInfo, nError); if(loginHandle.longValue() == 0) { System.err.printf("Login Device[%s] Port[%d]Failed. Last Error[%x]\n" , address , port , netsdkApi.CLIENT_GetLastError()); JOptionPane.showMessageDialog(mainFrame, "登录失败"); } else { System.out.println("Login Success [ " + address +" ]"); JOptionPane.showMessageDialog(mainFrame, "登录成功"); loginJPanel.enableCompents(true); for(int i = 0; i < deviceInfo.byChanNum; i++) { chnlist.add("通道 " + i); } if(deviceInfo.byChanNum > 0) { chnComboBox.setSelectedIndex(0); } } } /** * 登出按钮 */ private void logoutBtnPerformed(ActionEvent e) { if (loginHandle.longValue() != 0) { System.out.println("LogOut Button Action"); // 确保关闭预览 stopRealPlay(); realplayButton.setText("预览"); bRealplayFlags = false; // 停止订阅事件 detachIVSEvent(); attachButton.setText("订阅"); bAttachFlag = false; if (netsdkApi.CLIENT_Logout(loginHandle)) { System.out.println("Logout Success [ " + address +" ]"); loginHandle.setValue(0); loginJPanel.enableCompents(true); loginJPanel.setTriggerBtnText("开闸"); plateImagePanel.setOpaque(true); plateImagePanel.repaint(); SnapImagePanel.setOpaque(true); SnapImagePanel.repaint(); bTriggerBtnClick = false; chnlist.clear(); chnComboBox.setModel(new DefaultComboBoxModel(chnlist)); } } } /** * 老版本开闸按钮 */ private void Old_TriggerButtonPerformed(ActionEvent e) { if (loginHandle.longValue() != 0) { System.out.println("Trigger Button Action"); NetSDKLib.ALARMCTRL_PARAM param = new NetSDKLib.ALARMCTRL_PARAM(); param.nAction = bTriggerBtnClick ? 1 : 0; // 1:触发报警;0:停止报警. 按钮按下 if (netsdkApi.CLIENT_ControlDeviceEx(loginHandle, NetSDKLib.CtrlType.CTRLTYPE_TRIGGER_ALARM_OUT, param.getPointer(), null, 3000)) { System.out.println("控制成功"); bTriggerBtnClick = !bTriggerBtnClick; loginJPanel.setTriggerBtnText(bTriggerBtnClick ? "触发外部报警":"关闭外部报警"); }else { System.out.printf("Failed to Open 0x%x", netsdkApi.CLIENT_GetLastError()); } } } /** * 新版本开闸按钮 */ private void New_TriggerButtonPerformed(ActionEvent e) { if (loginHandle.longValue() != 0) { System.out.println("New Trigger Button Action"); if (!bTriggerBtnClick) { // 开闸 NetSDKLib.NET_CTRL_OPEN_STROBE openStrobe = new NetSDKLib.NET_CTRL_OPEN_STROBE(); openStrobe.nChannelId = 0; String plate = "浙A888888"; System.arraycopy(plate.getBytes(), 0, openStrobe.szPlateNumber, 0, plate.getBytes().length); openStrobe.write(); if (netsdkApi.CLIENT_ControlDeviceEx(loginHandle, NetSDKLib.CtrlType.CTRLTYPE_CTRL_OPEN_STROBE, openStrobe.getPointer(), null, 3000)) { System.out.println("Open Success!"); bTriggerBtnClick = true; loginJPanel.setTriggerBtnText("关闸"); } else { System.out.printf("Failed to Open 0x%x\n", netsdkApi.CLIENT_GetLastError()); } openStrobe.read(); } else { // 关闸 NetSDKLib.NET_CTRL_CLOSE_STROBE closeStrobe = new NetSDKLib.NET_CTRL_CLOSE_STROBE(); closeStrobe.nChannelId = 0; closeStrobe.write(); if (netsdkApi.CLIENT_ControlDeviceEx(loginHandle, NetSDKLib.CtrlType.CTRLTYPE_CTRL_CLOSE_STROBE, closeStrobe.getPointer(), null, 3000)) { System.out.println("Close Success!"); bTriggerBtnClick = false; loginJPanel.setTriggerBtnText("开闸"); }else { System.out.printf("Failed to Close 0x%x\n", netsdkApi.CLIENT_GetLastError()); } closeStrobe.read(); } } } /** * 开始实时预览按钮事件 */ private void startRealPlay() { if (loginHandle.longValue() == 0) { System.err.println("Please login first"); JOptionPane.showMessageDialog(mainFrame, "请先登录"); return; } int channel = chnComboBox.getSelectedIndex(); // 预览通道号 int playType = NetSDKLib.NET_RealPlayType.NET_RType_Realplay; // 实时预览 playHandle = netsdkApi.CLIENT_RealPlayEx(loginHandle, channel, Native.getComponentPointer(realplayWindow), playType); if (playHandle.longValue() == 0) { int error = netsdkApi.CLIENT_GetLastError(); JOptionPane.showMessageDialog(mainFrame, "开始实时预览失败,错误码:" + String.format("[0x%x]", error)); } else { System.out.println("[通道" + channel + "] 拉流成功!"); } } /** * 结束实时预览按钮事件 */ private void stopRealPlay() { if (playHandle.longValue() == 0) { System.out.println("Make sure the realplay Handle is valid"); return; } if (netsdkApi.CLIENT_StopRealPlayEx(playHandle)) { System.out.println("Success to stop realplay"); playHandle.setValue(0); realplayWindow.repaint(); } } // 订阅实时上传智能分析数据 private void attachIVSEvent() { /** * 说明: * 通道数可以在有登录是返回的信息 m_stDeviceInfo.byChanNum 获取 * 下列仅订阅了0通道的智能事件. */ int bNeedPicture = 1; // 是否需要图片 int ChannelId = chnComboBox.getSelectedIndex(); // 通道 attachHandle = netsdkApi.CLIENT_RealLoadPictureEx(loginHandle, ChannelId, NetSDKLib.EVENT_IVS_ALL , bNeedPicture , m_AnalyzerDataCB , null , null); if( attachHandle.longValue() != 0 ) { System.out.println("[通道" + ChannelId + "] 订阅成功!"); } else { System.out.printf("CLIENT_RealLoadPictureEx Failed!LastError = %x\n", netsdkApi.CLIENT_GetLastError() ); return; } } // 停止上传智能分析数据-图片 private void detachIVSEvent() { if (0 != attachHandle.longValue()) { netsdkApi.CLIENT_StopLoadPic(attachHandle); System.out.println("Stop detach IVS event"); attachHandle.setValue(0); } } /* 智能报警事件回调 */ public class fAnalyzerDataCB implements NetSDKLib.fAnalyzerDataCallBack/*, StdCallCallback*/ { private String m_imagePath; NetSDKLib.NET_MSG_OBJECT plateObject; // 车牌信息 NetSDKLib.NET_MSG_OBJECT vehicleObject; // 车辆信息 NetSDKLib.NET_TIME_EX utc; // 事件时间 int lane = 0; // 车道号 String EventMsg; // 事件信息 int nConfide = 0; // 置信度, 只有特定设备才支持,一般设备默认都是0不填充 String bigPicture; // 大图 String smallPicture; // 小图 public fAnalyzerDataCB() { m_imagePath = "./PlateNumber/"; File path = new File(m_imagePath); if (!path.exists()) { path.mkdir(); } } // 回调 public int invoke(LLong lAnalyzerHandle, int dwAlarmType, Pointer pAlarmInfo, Pointer pBuffer, int dwBufSize, Pointer dwUser, int nSequence, Pointer reserved) { if (lAnalyzerHandle.longValue() == 0) { return -1; } System.out.println("--------dwAlarmType-------------" + dwAlarmType); // 获取事件信息 plateObject = new NetSDKLib.NET_MSG_OBJECT(); // 车牌信息 vehicleObject = new NetSDKLib.NET_MSG_OBJECT(); // 车辆信息 utc = new NetSDKLib.NET_TIME_EX(); // 事件时间 lane = -1; // 车道号 EventMsg = ""; // 事件信息 nConfide = 0; // 置信度, 只有特定设备才支持,一般设备默认都是0不填充 GetStuObject(dwAlarmType, pAlarmInfo); // 保存大图片 SavePlatePic(plateObject, pBuffer, dwBufSize); // 更新界面 messageTextArea.append(EventMsg); // 显示车牌、车牌颜色、车身颜色、时间、车道号 try { // plateLicenseTextField.setText(new String(plateObject.szText, "UTF-8").trim()); // Linux 平台下使用UTF-8格式 plateLicenseTextField.setText(new String(plateObject.szText, "GBK").trim()); // Windows 平台下使用GBK格式 } catch (UnsupportedEncodingException e) { e.printStackTrace(); } if (1 == plateObject.bColor) { plateColorTextField.setText(GetColorString(plateObject.rgbaMainColor)); } else { plateColorTextField.setText("未填充颜色"); } if (1 == vehicleObject.bColor) { vehicleColorTextField.setText(GetColorString(vehicleObject.rgbaMainColor)); } else { vehicleColorTextField.setText("未填充颜色"); } laneNumberTextField.setText(String.format("%d", lane)); snapTimeTextField.setText(String.format("%02d:%02d:%02d", utc.dwHour, utc.dwMinute, utc.dwSecond)); return 0; } // 获取识别对象 车身对象 事件发生时间 车道号等信息 private boolean GetStuObject(int dwAlarmType, Pointer pAlarmInfo) { if(pAlarmInfo == null) { return false; } NetSDKLib.NET_EVENT_FILE_INFO fileInfo = new NetSDKLib.NET_EVENT_FILE_INFO(); boolean isAlarmTypeParsed = true; switch(dwAlarmType) { case NetSDKLib.EVENT_IVS_SNAPMANUAL: ///< 手动抓图事件(SnapManual事件) { DEV_EVENT_SNAPMANUAL msg = new DEV_EVENT_SNAPMANUAL(); ToolKits.GetPointerData(pAlarmInfo, msg); // 以下为事件的信息,具体的图片保存是根据回调里的 Pointer pBuffer, int dwBufSize 来生成。 EventMsg = "[ "+ msg.UTC.toString() + " ] " + "SnapManual事件" + "通道号 : " + msg.nChannelID + "图片的序号(同一时间内(精确到秒)可能有多张图片, 从0开始):" + msg.byImageIndex; JOptionPane.showMessageDialog(null, "手动抓图成功!"); break; } case NetSDKLib.EVENT_IVS_VEHICLE_RECOGNITION: ///< 车牌对比事件 { NetSDKLib.DEV_EVENT_VEHICLE_RECOGNITION_INFO msg = new NetSDKLib.DEV_EVENT_VEHICLE_RECOGNITION_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; vehicleObject = msg.stuVehicle; utc = msg.UTC; System.out.println("channel : " + msg.nChannel); // 对比信息在 msg.stuCarCandidate数组里 EventMsg = "[ "+ "车辆动作:" + msg.nVehicleAction + ";" + utc.toStringTime() + " ] " + "车牌对比事件"; break; } case NetSDKLib.EVENT_IVS_TRAFFIC_FLOWSTATE: ///< 交通流量统计事件 { NetSDKLib.DEV_EVENT_TRAFFIC_FLOW_STATE msg = new NetSDKLib.DEV_EVENT_TRAFFIC_FLOW_STATE(); ToolKits.GetPointerData(pAlarmInfo, msg); utc = msg.UTC; EventMsg = "[ "+ utc.toStringTime() + " ] " + "交通流量统计事件" + "flowNum :" + msg.nStateNum; break; } case NetSDKLib.EVENT_IVS_TRAFFIC_TURNLEFT: //<违章左转 { NetSDKLib.DEV_EVENT_TRAFFIC_TURNLEFT_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFIC_TURNLEFT_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; vehicleObject = msg.stuVehicle; utc = msg.UTC; lane = msg.nLane; nConfide = msg.stuObject.nConfidence; fileInfo = msg.stuFileInfo; EventMsg = "[ "+ utc.toStringTime() + " ] " + "违章左转事件"; break; } case NetSDKLib.EVENT_IVS_TRAFFIC_TURNRIGHT: ///<违章右转 { NetSDKLib.DEV_EVENT_TRAFFIC_TURNRIGHT_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFIC_TURNRIGHT_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; vehicleObject = msg.stuVehicle; utc = msg.UTC; lane = msg.nLane; nConfide = msg.stuObject.nConfidence; fileInfo = msg.stuFileInfo; EventMsg = "[ "+ utc.toStringTime() + " ] " + "违章右转事件"; break; } case NetSDKLib.EVENT_IVS_TRAFFIC_UTURN: ///<违章掉头 { NetSDKLib.DEV_EVENT_TRAFFIC_UTURN_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFIC_UTURN_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; vehicleObject = msg.stuVehicle; utc = msg.UTC; lane = msg.nLane; nConfide = msg.stuObject.nConfidence; fileInfo = msg.stuFileInfo; EventMsg = "[ "+ utc.toStringTime() + " ] " + "违章掉头事件"; break; } case NetSDKLib.EVENT_IVS_TRAFFIC_RUNYELLOWLIGHT: ///<闯黄灯 { NetSDKLib.DEV_EVENT_TRAFFIC_RUNYELLOWLIGHT_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFIC_RUNYELLOWLIGHT_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; vehicleObject = msg.stuVehicle; utc = msg.UTC; lane = msg.nLane; nConfide = msg.stuObject.nConfidence; fileInfo = msg.stuFileInfo; EventMsg = "[ "+ utc.toStringTime() + " ] " + "闯黄灯事件"; break; } case NetSDKLib.EVENT_IVS_TRAFFICJUNCTION: ///< 路口事件 { NetSDKLib.DEV_EVENT_TRAFFICJUNCTION_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFICJUNCTION_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; vehicleObject = msg.stuVehicle; utc = msg.UTC; lane = msg.nLane; nConfide = msg.stuObject.nConfidence; fileInfo = msg.stuFileInfo; // EventMsg = "[ "+ utc.toStringTime() + " ] " + "路口事件" + "[" + "速度"+ "]:" + msg.stuNonMotor.fSpeed; break; } case NetSDKLib.EVENT_IVS_TRAFFIC_RUNREDLIGHT: ///< 交通违章-闯红灯事件 { NetSDKLib.DEV_EVENT_TRAFFIC_RUNREDLIGHT_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFIC_RUNREDLIGHT_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; vehicleObject = msg.stuVehicle; utc = msg.UTC; lane = msg.nLane; nConfide = msg.stuObject.nConfidence; fileInfo = msg.stuFileInfo; EventMsg = "[ "+ utc.toStringTime() + " ] " + "闯红灯交通违章-闯红灯事件"; break; } case NetSDKLib.EVENT_IVS_TRAFFIC_OVERLINE: ///< 交通违章-压车道线事件 { NetSDKLib.DEV_EVENT_TRAFFIC_OVERLINE_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFIC_OVERLINE_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; vehicleObject = msg.stuVehicle; utc = msg.UTC; lane = msg.nLane; nConfide = msg.stuObject.nConfidence; fileInfo = msg.stuFileInfo; EventMsg = "[ "+ utc.toStringTime() + " ] " + "压车道线事件"; break; } case NetSDKLib.EVENT_IVS_TRAFFIC_OVERYELLOWLINE: ///< 交通违章-压黄线事件 { NetSDKLib.DEV_EVENT_TRAFFIC_OVERYELLOWLINE_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFIC_OVERYELLOWLINE_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; vehicleObject = msg.stuVehicle; utc = msg.UTC; lane = msg.nLane; nConfide = msg.stuObject.nConfidence; fileInfo = msg.stuFileInfo; EventMsg = "[ "+ utc.toStringTime() + " ] " + "压黄线事件"; break; } case NetSDKLib.EVENT_IVS_TRAFFIC_OVERSPEED: ///< 交通违章-超速 { NetSDKLib.DEV_EVENT_TRAFFIC_OVERSPEED_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFIC_OVERSPEED_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; vehicleObject = msg.stuVehicle; utc = msg.UTC; lane = msg.nLane; nConfide = msg.stuObject.nConfidence; fileInfo = msg.stuFileInfo; EventMsg = "[ "+ utc.toStringTime() + " ] " + "超速事件"; break; } case NetSDKLib.EVENT_IVS_TRAFFIC_PARKING: ///< 交通违章-违章停车 { NetSDKLib.DEV_EVENT_TRAFFIC_PARKING_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFIC_PARKING_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; vehicleObject = msg.stuVehicle; utc = msg.UTC; lane = msg.nLane; nConfide = msg.stuObject.nConfidence; fileInfo = msg.stuFileInfo; EventMsg = "[ "+ utc.toStringTime() + " ] " + "违章停车"; System.out.println("szSN = " + new String(msg.szSN).trim()); break; } case NetSDKLib.EVENT_IVS_TRAFFIC_WRONGROUTE: ///< 交通违章-不按车道行驶 { NetSDKLib.DEV_EVENT_TRAFFIC_WRONGROUTE_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFIC_WRONGROUTE_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; vehicleObject = msg.stuVehicle; utc = msg.UTC; lane = msg.nLane; nConfide = msg.stuObject.nConfidence; fileInfo = msg.stuFileInfo; EventMsg = "[ "+ utc.toStringTime() + " ] " + "不按车道行驶"; break; } case NetSDKLib.EVENT_IVS_TRAFFIC_YELLOWPLATEINLANE: ///< 交通违章-黄牌车占道事件 { NetSDKLib.DEV_EVENT_TRAFFIC_YELLOWPLATEINLANE_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFIC_YELLOWPLATEINLANE_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; vehicleObject = msg.stuVehicle; utc = msg.UTC; lane = msg.nLane; nConfide = msg.stuObject.nConfidence; fileInfo = msg.stuFileInfo; EventMsg = "[ "+ utc.toStringTime() + " ] " + "黄牌车占道事件"; break; } case NetSDKLib.EVENT_IVS_TRAFFIC_VEHICLEINROUTE: ///< 有车占道事件 { NetSDKLib.DEV_EVENT_TRAFFIC_VEHICLEINROUTE_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFIC_VEHICLEINROUTE_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; vehicleObject = msg.stuVehicle; utc = msg.UTC; lane = msg.nLane; nConfide = msg.stuObject.nConfidence; fileInfo = msg.stuFileInfo; EventMsg = "[ "+ utc.toStringTime() + " ] " + "有车占道事件"; break; } case NetSDKLib.EVENT_IVS_TRAFFIC_MANUALSNAP: /// 手动抓拍事件 { NetSDKLib.DEV_EVENT_TRAFFIC_MANUALSNAP_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFIC_MANUALSNAP_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; vehicleObject = msg.stuVehicle; utc = msg.UTC; lane = msg.nLane; nConfide = msg.stuObject.nConfidence; fileInfo = msg.stuFileInfo; EventMsg = "[ "+ utc.toStringTime() + " ] " + "手动抓拍事件"; JOptionPane.showMessageDialog(null, "手动抓拍成功!"); break; } case NetSDKLib.EVENT_IVS_TRAFFIC_THROW: /// 抛洒物 { NetSDKLib.DEV_EVENT_TRAFFIC_THROW_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFIC_THROW_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; utc = msg.UTC; lane = msg.nLane; nConfide = msg.stuObject.nConfidence; fileInfo = msg.stuFileInfo; EventMsg = "[ "+ utc.toStringTime() + " ] " + "抛洒物"; break; } case NetSDKLib.EVENT_IVS_TRAFFIC_PEDESTRAIN: /// 交通行人 { NetSDKLib.DEV_EVENT_TRAFFIC_PEDESTRAIN_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFIC_PEDESTRAIN_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; utc = msg.UTC; lane = msg.nLane; nConfide = msg.stuObject.nConfidence; fileInfo = msg.stuFileInfo; EventMsg = "[ "+ utc.toStringTime() + " ] " + "交通行人"; break; } case NetSDKLib.EVENT_IVS_TRAFFICJAM: /// 交通拥堵 { NetSDKLib.DEV_EVENT_TRAFFICJAM_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFICJAM_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); utc = msg.UTC; lane = msg.nLane; fileInfo = msg.stuFileInfo; EventMsg = "[ "+ utc.toStringTime() + " ] " + "交通拥堵"; break; } case NetSDKLib.EVENT_IVS_TRAFFIC_PARKINGSPACEPARKING: /// 车位有车事件 { NetSDKLib.DEV_EVENT_TRAFFIC_PARKINGSPACEPARKING_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFIC_PARKINGSPACEPARKING_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; vehicleObject = msg.stuVehicle; utc = msg.UTC; lane = msg.nLane; fileInfo = msg.stuFileInfo; EventMsg = "[ "+ utc.toStringTime() + " ] " + "车位有车事件"; // NetSDKLib.DEV_EVENT_TRAFFIC_TRAFFICCAR_INFO trafficCar = msg.stTrafficCar; // System.out.println("停车场车位号:" + new String(trafficCar.szCustomParkNo).trim() // +"\n行驶方向 " + trafficCar.byDirection // +"\nVehicleSize "+ trafficCar.nVehicleSize // +"\nszPlateColor "+ new String(trafficCar.szPlateColor).trim() // +"\nszVehicleColor "+ new String(trafficCar.szVehicleColor).trim() // ); break; } case NetSDKLib.EVENT_IVS_TRAFFIC_PARKINGSPACENOPARKING: /// 车位无车事件 { NetSDKLib.DEV_EVENT_TRAFFIC_PARKINGSPACENOPARKING_INFO msg = new NetSDKLib.DEV_EVENT_TRAFFIC_PARKINGSPACENOPARKING_INFO(); ToolKits.GetPointerData(pAlarmInfo, msg); plateObject = msg.stuObject; vehicleObject = msg.stuVehicle; utc = msg.UTC; lane = msg.nLane; fileInfo = msg.stuFileInfo; EventMsg = "[ "+ utc.toStringTime() + " ] " + "车位无车事件"; break; } default: isAlarmTypeParsed = false; System.out.printf("Get Event 0x%x\n", dwAlarmType); EventMsg = "未处理事件 dwAlarmType = " + String.format("0x%x", dwAlarmType); break; } if (isAlarmTypeParsed) { EventMsg = EventMsg + ";组编号 GroupID = " + fileInfo.nGroupId + ";图片组总数 bount = " + fileInfo.bCount + ";当前图片序号 bIndex = " + fileInfo.bIndex + ";置信度 = " + nConfide; // 车牌 String PlateNumber = null; try { PlateNumber = new String(plateObject.szText, "GBK").trim(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } if (PlateNumber.length() > 0) { EventMsg += ";车牌号 = " + PlateNumber; } // 车牌类型 String plateType = new String(plateObject.szObjectSubType).trim(); if (plateType.length() > 0) { EventMsg += ";车牌类型 = " + plateType; } // 车标 String vehicleType = new String(vehicleObject.szText).trim(); if (vehicleType.length() > 0) { EventMsg += ";车标 = " + vehicleType; } // 车辆类型 String vehicleSubType = new String(vehicleObject.szObjectSubType).trim(); if (vehicleSubType.length() > 0) { EventMsg += ";车辆类型 = " + vehicleSubType; } EventMsg += "\n"; return true; } else { return false; } } // 颜色对照表 private String GetColorString(int RGBColor) { String strColor = "未定义颜色"; int Color = (RGBColor >> 8) & 0x00ffffff; switch(Color) { case 0x000000: strColor = "黑色"; break; case 0xFFFFFF: strColor = "白色"; break; case 0xFF0000: strColor = "红色"; break; case 0x0000FF: strColor = "蓝色"; break; case 0x00FF00: strColor = "绿色"; break; case 0xFFFF00: strColor = "黄色"; break; case 0x808080: strColor = "灰色"; break; case 0xFFA500: strColor = "橙色"; break; } return strColor; } // 显示车牌小图:DH早期交通抓拍机,设备不传单独的车牌小图文件,只传车牌在大图中的坐标;由应用来自行裁剪。 // 2014年后,陆续有设备版本,支持单独传车牌小图,小图附录在pBuffer后面。 private void SavePlatePic(NetSDKLib.NET_MSG_OBJECT plateObject, Pointer pBuffer, int dwBufSize) { // 清空 SnapImagePanel.setOpaque(true); SnapImagePanel.repaint(); plateImagePanel.setOpaque(true); plateImagePanel.repaint(); BufferedImage snapImage = null; if (pBuffer != null && dwBufSize > 0) { bigPicture = m_imagePath + "Big_" + UUID.randomUUID().toString() + ".jpg"; ToolKits.savePicture(pBuffer, 0, dwBufSize, bigPicture); try { File bigFile = new File(bigPicture); snapImage = ImageIO.read(bigFile); //System.out.println("weigh/heigh " + snapImage.getHeight(null) + " " + snapImage.getWidth(null)); SnapImagePanel.setOpaque(false); SnapImagePanel.setImage(snapImage); SnapImagePanel.repaint(); } catch (Exception e) { e.printStackTrace(); } } if (plateObject.bPicEnble == 1) { //根据pBuffer中数据偏移保存小图图片文件 int picLength = plateObject.stPicInfo.dwFileLenth; if (picLength > 0) { smallPicture = m_imagePath + "small_" + UUID.randomUUID().toString() + ".jpg"; ToolKits.savePicture(pBuffer, plateObject.stPicInfo.dwOffSet, picLength, smallPicture); } if(smallPicture == null) { return; } try { File smallFile = new File(smallPicture); if(smallFile != null) { Image plateImage = ImageIO.read(smallFile); plateImagePanel.setOpaque(false); plateImagePanel.setImage(plateImage); plateImagePanel.repaint(); } } catch (Exception e) { e.printStackTrace(); } } else { if(plateObject.BoundingBox == null) { return; } //根据大图中的坐标偏移计算显示车牌小图 if (plateObject.BoundingBox.bottom.longValue() == 0 && plateObject.BoundingBox.top.longValue() == 0) { return ; } NetSDKLib.DH_RECT dhRect = plateObject.BoundingBox; //1.BoundingBox的值是在8192*8192坐标系下的值,必须转化为图片中的坐标 //2.OSD在图片中占了64行,如果没有OSD,下面的关于OSD的处理需要去掉(把OSD_HEIGHT置为0) final int OSD_HEIGHT = 0; long nWidth = snapImage.getWidth(null); long nHeight = snapImage.getHeight(null); nHeight = nHeight - OSD_HEIGHT; if ((nWidth <= 0) || (nHeight <= 0)) { return ; } NetSDKLib.DH_RECT dstRect = new NetSDKLib.DH_RECT(); dstRect.left.setValue((long)((nWidth * dhRect.left.longValue()) / 8192.0)); dstRect.right.setValue((long)((nWidth * dhRect.right.longValue()) / 8192.0)); dstRect.bottom.setValue((long)((nHeight * dhRect.bottom.longValue()) / 8192.0)); dstRect.top.setValue((long)((nHeight * dhRect.top.longValue()) / 8192.0)); int x = dstRect.left.intValue(); int y = dstRect.top.intValue() + OSD_HEIGHT; int w = dstRect.right.intValue() - dstRect.left.intValue(); int h = dstRect.bottom.intValue() - dstRect.top.intValue(); //System.out.println(" x =" + x + ", y =" + y + "; w = "+ w +"; h = "+ h); try { BufferedImage plateImage = snapImage.getSubimage(x, y, w, h); smallPicture = m_imagePath + "small_" + UUID.randomUUID().toString() + ".jpg"; ImageIO.write(plateImage, "jpg", new File(smallPicture)); plateImagePanel.setOpaque(false); plateImagePanel.setImage(plateImage); plateImagePanel.repaint(); } catch (Exception e) { e.printStackTrace(); } } } } /** * 手动抓拍按钮事件 */ private void snapPic(int chn) { if (loginHandle.longValue() == 0) { System.err.println("Plese Login First"); JOptionPane.showMessageDialog(mainFrame, "请先登录"); return; } NetSDKLib.MANUAL_SNAP_PARAMETER snapParam = new NetSDKLib.MANUAL_SNAP_PARAMETER(); snapParam.nChannel = chn; snapParam.write(); boolean bRet = netsdkApi.CLIENT_ControlDeviceEx(loginHandle, NetSDKLib.CtrlType.CTRLTYPE_MANUAL_SNAP, snapParam.getPointer(), null, 5000); if (!bRet) { System.err.println("Failed to manual snap, last error " + String.format("[0x%x]", netsdkApi.CLIENT_GetLastError())); } else { System.out.println("Seccessed to manual snap"); } snapParam.read(); } /** * 即时抓图(又名手动抓图) */ public void snapShot(int chn) { if (loginHandle.longValue() == 0) { System.err.println("Plese Login First"); JOptionPane.showMessageDialog(mainFrame, "请先登录"); return; } // 入参 NET_IN_SNAP_MNG_SHOT stIn = new NET_IN_SNAP_MNG_SHOT(); stIn.nChannel = chn; // 通道号 stIn.nTime = 1;; // 连拍次数, 0表示停止抓拍,正数表示连续抓拍的张数 // 出参 NET_OUT_SNAP_MNG_SHOT stOut = new NET_OUT_SNAP_MNG_SHOT(); stIn.write(); stOut.write(); boolean bRet = netsdkApi.CLIENT_ControlDeviceEx(loginHandle, NetSDKLib.CtrlType.CTRLTYPE_CTRL_SNAP_MNG_SNAP_SHOT, stIn.getPointer(), stOut.getPointer(), 5000); if (!bRet) { System.err.println("Failed to snap shot, last error " + String.format("[0x%x]", netsdkApi.CLIENT_GetLastError())); } else { System.out.println("Seccessed to snap shot."); } stIn.read(); stOut.read(); } /////////////////////界面组件////////////////////////// ///////////////// 界面组件相关成员变量 ////////////////// /** * 带背景的面板组件 */ private class PaintPanel extends JPanel { /** * */ private static final long serialVersionUID = 1L; /** * 背景图片 */ private Image image; /** * 构造方法 */ public PaintPanel() { super(); setOpaque(true); // 非透明 setLayout(null); setBackground(new Color(153, 240, 255)); setForeground(new Color(0, 0, 0)); } /** * 设置图片的方法 */ public void setImage(Image image) { this.image = image; } @Override protected void paintComponent(Graphics g) {// 重写绘制组件外观 if (image != null) { g.drawImage(image, 0, 0, getWidth(), getHeight(), this);// 绘制图片与组件大小相同 } super.paintComponent(g);// 执行超类方法 } } /** * 设置边框 */ private void setBorderEx(JComponent object, String title, int width) { Border innerBorder = BorderFactory.createTitledBorder(title); Border outerBorder = BorderFactory.createEmptyBorder(width, width, width, width); object.setBorder(BorderFactory.createCompoundBorder(outerBorder, innerBorder)); } /** * 登录面板 */ private class LoginPanel extends JPanel { private static final long serialVersionUID = 1L; public LoginPanel() { loginBtn = new JButton("登入"); logoutBtn = new JButton("登出"); triggerBtn = new JButton("开闸"); nameLabel = new JLabel("用户名"); passwordLabel = new JLabel("密码"); nameTextArea = new JTextField(username, 8); passwordTextArea = new JPasswordField(password, 8); ipLabel = new JLabel("设备地址"); portLabel = new JLabel("端口号"); ipTextArea = new JTextField(address, 15); portTextArea = new JTextField("37777", 6); setLayout(new FlowLayout()); setBorderEx(this, "登录", 2); add(ipLabel); add(ipTextArea); add(portLabel); add(portTextArea); add(nameLabel); add(nameTextArea); add(passwordLabel); add(passwordTextArea); add(loginBtn); add(logoutBtn); add(triggerBtn); enableCompents(false); // 登录按钮. 监听事件 loginBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { loginBtnPerformed(e); } }); // 登出按钮. 监听事件 logoutBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { logoutBtnPerformed(e); enableCompents(false); } }); // 开闸. 监听事件 triggerBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // Old_TriggerButtonPerformed(e); // 老版本 New_TriggerButtonPerformed(e); // 新版本 } }); } public void enableCompents(boolean enable) { loginBtn.setEnabled(!enable); logoutBtn.setEnabled(enable); triggerBtn.setEnabled(enable); } public void setTriggerBtnText(final String text) { triggerBtn.setText(text); } private JButton loginBtn; private JButton logoutBtn; private JButton triggerBtn; private JLabel nameLabel; private JLabel passwordLabel; private JLabel ipLabel; private JLabel portLabel; } /** * 事件信息显示面板 */ private class MessagePanel extends JPanel { private static final long serialVersionUID = 1L; public MessagePanel() { setBorderEx(this, "事件信息提示", 2); Dimension dim = getPreferredSize(); dim.height = 226; setPreferredSize(dim); setLayout(new BorderLayout()); messageTextArea = new JTextArea(); add(new JScrollPane(messageTextArea), BorderLayout.CENTER); } } /** * 预览面板 */ private class RealPlayPanel extends JPanel { private static final long serialVersionUID = 1L; public RealPlayPanel() { setBorderEx(this, "实时预览", 2); setLayout(new BorderLayout()); Dimension dim = getPreferredSize(); dim.height = 367; dim.width = 374; setPreferredSize(dim); realplayWindow = new Panel(); chnComboBox = new JComboBox(chnlist); attachButton = new JButton("订阅"); realplayButton = new JButton("预览"); realplayWindow.setBackground(new java.awt.Color(153, 240, 255)); realplayWindow.setForeground(new java.awt.Color(0, 0, 0)); realplayWindow.setBounds(5, 5, 350, 290); realplayWindow.setSize(358, 294); JPanel btnPanel = new JPanel(); btnPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); btnPanel.setLayout(new GridLayout(1, 3, 5, 5)); btnPanel.add(chnComboBox); btnPanel.add(attachButton); btnPanel.add(realplayButton); add(realplayWindow, BorderLayout.CENTER); add(btnPanel, BorderLayout.SOUTH); // 订阅按钮动作监听 attachButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(!bAttachFlag) { attachIVSEvent(); attachButton.setText("停止订阅"); bAttachFlag = true; } else { detachIVSEvent(); attachButton.setText("订阅"); bAttachFlag = false; } } }); // 预览按钮监听 realplayButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(!bRealplayFlags) { startRealPlay(); realplayButton.setText("停止预览"); bRealplayFlags = true; } else { stopRealPlay(); realplayButton.setText("预览"); bRealplayFlags = false; } } }); } } /** * 事件及图片面板 */ private class EventInfoPanel extends JPanel { private static final long serialVersionUID = 1L; public EventInfoPanel() { Dimension dimension = new Dimension(-1, -1); setBorderEx(this, "事件及图片", 2); setLayout(new BorderLayout()); SnapImagePanel = new PaintPanel(); // 事件大图 snapIamgeLabel = new JLabel("事件大图"); plateImagePanel = new PaintPanel(); // 车牌小图 plateImageLabel = new JLabel("车牌小图"); plateLicenseLabel = new JLabel("车牌号码"); plateColorLabel = new JLabel("车牌颜色"); vehicleColorLabel = new JLabel("车身颜色"); snapTimeLabel = new JLabel("抓拍时间"); laneNumberLabel = new JLabel("车道号"); plateLicenseTextField = new JTextField("", 2); plateColorTextField = new JTextField("", 2); vehicleColorTextField = new JTextField("", 2); snapTimeTextField = new JTextField("", 2); laneNumberTextField = new JTextField("", 2); snapPicButton = new JButton("手动抓拍"); snapShotButton = new JButton("手动抓图"); //////// 车牌及抓图时间面板 JPanel paramPanel = new JPanel(); JPanel textPanel = new JPanel(); JPanel platePanel = new JPanel(); dimension.width = 145; dimension.height = 49; plateImagePanel.setPreferredSize(dimension); platePanel.setLayout(new BorderLayout()); platePanel.add(plateImagePanel, BorderLayout.SOUTH); platePanel.add(plateImageLabel, BorderLayout.CENTER); SnapImagePanel.setBackground(new Color(153, 240, 255)); SnapImagePanel.setForeground(new Color(0, 0, 0)); SnapImagePanel.setBounds(5, 5, 290, 270); SnapImagePanel.setSize(291, 277); dimension.width = 150; dimension.height = 50; paramPanel.setPreferredSize(dimension); paramPanel.setLayout(new BorderLayout()); paramPanel.setBorder(new EmptyBorder(5,5,5,5)); textPanel.setLayout(new GridLayout(9, 2)); textPanel.add(plateLicenseLabel); textPanel.add(plateLicenseTextField); textPanel.add(plateColorLabel); textPanel.add(plateColorTextField); textPanel.add(vehicleColorLabel); textPanel.add(vehicleColorTextField); textPanel.add(laneNumberLabel); textPanel.add(laneNumberTextField); textPanel.add(snapTimeLabel); textPanel.add(snapTimeTextField); paramPanel.add(platePanel, BorderLayout.NORTH); paramPanel.add(textPanel, BorderLayout.CENTER); JPanel snapPanel = new JPanel(); paramPanel.add(snapPanel, BorderLayout.SOUTH); snapPanel.setLayout(new GridLayout(2, 1)); snapPanel.add(snapPicButton); snapPanel.add(snapShotButton); ///////// 事件大图面板 //////////////////////////// JPanel snapJPanel = new JPanel(); snapJPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); snapJPanel.setLayout(new BorderLayout()); snapJPanel.add(snapIamgeLabel, BorderLayout.NORTH); snapJPanel.add(SnapImagePanel, BorderLayout.CENTER); add(snapJPanel, BorderLayout.CENTER); add(paramPanel, BorderLayout.EAST); // 手动抓拍 snapPicButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { snapPic(chnComboBox.getSelectedIndex()); } }); // 手动抓图 snapShotButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { snapShot(chnComboBox.getSelectedIndex()); } }); } } /** * 主界面组件 */ private JFrame mainFrame; /** * 登录条组件 */ private JTextField nameTextArea; private JPasswordField passwordTextArea; private JTextField ipTextArea; private JTextField portTextArea; private LoginPanel loginJPanel; /** * 事件信息显示组件 */ private MessagePanel messagePanel; private JTextArea messageTextArea; /** * 实时预览组件 */ private RealPlayPanel realPlayPanel; private java.awt.Panel realplayWindow; private JButton attachButton; private JButton realplayButton; private JComboBox chnComboBox; /** * 事件及图片组件 */ private EventInfoPanel eventInfoPanel; private PaintPanel SnapImagePanel; private PaintPanel plateImagePanel; private JLabel snapIamgeLabel; private JLabel plateImageLabel; private JLabel plateLicenseLabel; private JLabel plateColorLabel; private JLabel vehicleColorLabel; private JLabel snapTimeLabel; private JLabel laneNumberLabel; private JTextField plateLicenseTextField; private JTextField plateColorTextField; private JTextField vehicleColorTextField; private JTextField snapTimeTextField; private JTextField laneNumberTextField; private JButton snapPicButton; private JButton snapShotButton; } public class TrafficEvent { public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { ITSEventMsg demo = new ITSEventMsg(); /*NetSDKLib.DEV_EVENT_TRAFFICJUNCTION_INFO msg=new NetSDKLib.DEV_EVENT_TRAFFICJUNCTION_INFO(); Field f=Unsafe.class.getDeclaredField("theunsafe"); Unsafe unsafe=(Unsafe) f.get(null); long sztext=unsafe.objectFieldOffset(NetSDKLib.DEV_EVENT_TRAFFICJUNCTION_INFO.class.getDeclaredField("szText"));*/ } }