在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → C#海康威视相机抓拍实例

C#海康威视相机抓拍实例

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:41.30M
  • 下载次数:88
  • 浏览次数:3063
  • 发布时间:2021-04-09
  • 实例类别:C#语言基础
  • 发 布 人:candyliwei
  • 文件格式:.rar
  • 所需积分:10
 相关标签: 海康威视 抓拍 海康 相机 C#

实例介绍

【实例简介】

【实例截图】

【核心代码】

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.IO;

namespace AlarmCSharpDemo
{
    public partial class AlarmDemo : Form
    {
        private Int32 m_lUserID = -1;
        private Int32[] m_lAlarmHandle = new Int32[200];
        private Int32 iListenHandle = -1; 
        private int iDeviceNumber = 0; //添加设备个数
        private int iFileNumber = 0; //保存的文件个数
        private uint iLastErr = 0;
        private string strErr;

        public CHCNetSDK.LOGINRESULTCALLBACK LoginCallBack = null;
        private CHCNetSDK.EXCEPYIONCALLBACK m_fExceptionCB = null;
        private CHCNetSDK.MSGCallBack_V31 m_falarmData_V31 = null;
        private CHCNetSDK.MSGCallBack m_falarmData = null;

        public delegate void UpdateTextStatusCallback(string strLogStatus, IntPtr lpDeviceInfo);
        public delegate void UpdateListBoxCallback(string strAlarmTime, string strDevIP, string strAlarmMsg);
        public delegate void UpdateListBoxCallbackException(string strAlarmTime, int lUserID, string strAlarmMsg);

        CHCNetSDK.NET_VCA_TRAVERSE_PLANE m_struTraversePlane = new CHCNetSDK.NET_VCA_TRAVERSE_PLANE();
        CHCNetSDK.NET_VCA_AREA m_struVcaArea = new CHCNetSDK.NET_VCA_AREA();
        CHCNetSDK.NET_VCA_INTRUSION m_struIntrusion = new CHCNetSDK.NET_VCA_INTRUSION();
        CHCNetSDK.UNION_STATFRAME m_struStatFrame = new CHCNetSDK.UNION_STATFRAME();
        CHCNetSDK.UNION_STATTIME m_struStatTime = new CHCNetSDK.UNION_STATTIME();
        public AlarmDemo()
        {
            InitializeComponent();
            bool m_bInitSDK = CHCNetSDK.NET_DVR_Init();
            if (m_bInitSDK == false)
            {
                MessageBox.Show("NET_DVR_Init error!");
                return;
            }
            else
            {
                byte[] strIP = new byte[16 * 16];
                uint dwValidNum=0;
                Boolean bEnableBind=false;

                //获取本地PC网卡IP信息
                if (CHCNetSDK.NET_DVR_GetLocalIP(strIP, ref dwValidNum, ref bEnableBind))
                {
                    if (dwValidNum > 0)
                    {
                        //取第一张网卡的IP地址为默认监听端口
                        textBoxListenIP.Text = System.Text.Encoding.UTF8.GetString(strIP, 0, 16);
                        //CHCNetSDK.NET_DVR_SetValidIP(0,true); //绑定第一张网卡
                    }
                
                }

                //保存SDK日志 To save the SDK log
                CHCNetSDK.NET_DVR_SetLogToFile(3, "C:\\SdkLog\\", true);

                //设置透传报警信息类型
                CHCNetSDK.NET_DVR_LOCAL_GENERAL_CFG struLocalCfg = new CHCNetSDK.NET_DVR_LOCAL_GENERAL_CFG();
                struLocalCfg.byAlarmJsonPictureSeparate = 1;//控制JSON透传报警数据和图片是否分离,0-不分离(COMM_VCA_ALARM返回),1-分离(分离后走COMM_ISAPI_ALARM回调返回)

                Int32 nSize = Marshal.SizeOf(struLocalCfg);
                IntPtr ptrLocalCfg = Marshal.AllocHGlobal(nSize);
                Marshal.StructureToPtr(struLocalCfg, ptrLocalCfg, false);

                if (!CHCNetSDK.NET_DVR_SetSDKLocalCfg(17, ptrLocalCfg))  //NET_DVR_LOCAL_CFG_TYPE_GENERAL
                {
                    iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                    strErr = "NET_DVR_SetSDKLocalCfg failed, error code= " iLastErr;
                    MessageBox.Show(strErr);
                }
                Marshal.FreeHGlobal(ptrLocalCfg);

                for (int i = 0; i < 200; i )
                {
                    m_lAlarmHandle[i] = -1;
                }

                //设置异常消息回调函数
                if (m_fExceptionCB == null)
                {
                    m_fExceptionCB = new CHCNetSDK.EXCEPYIONCALLBACK(cbExceptionCB);
                }
                CHCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, IntPtr.Zero, m_fExceptionCB, IntPtr.Zero);


                //设置报警回调函数
                if (m_falarmData_V31 == null)
                {
                    m_falarmData_V31 = new CHCNetSDK.MSGCallBack_V31(MsgCallback_V31);
                }
                CHCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(m_falarmData_V31, IntPtr.Zero);
            }
        }

        public void UpdateClientListException(string strAlarmTime, int lUserID, string strAlarmMsg)
        {
            //异常设备信息
            string strDevIP = "";
            for (int i = 0; i < iDeviceNumber; i )
            {
                m_lUserID = Int32.Parse(listViewDevice.Items[i].SubItems[0].Text);
                if (m_lUserID == lUserID)
                {
                    strDevIP = listViewDevice.Items[i].SubItems[1].Text.TrimEnd('\0');
                }
            }

            //列表新增报警信息
            listViewAlarmInfo.Items.Add(new ListViewItem(new string[] { strAlarmTime, strDevIP, strAlarmMsg }));

        }

        public void cbExceptionCB(uint dwType, int lUserID, int lHandle, IntPtr pUser)
        { 
            //异常消息信息类型
            string stringAlarm = "异常消息回调,信息类型:0x" Convert.ToString(dwType, 16) ", lUserID:" lUserID ", lHandle:" lHandle;

            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = DateTime.Now.ToString(); //当前PC系统时间
                paras[1] = lUserID;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallbackException(UpdateClientListException), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientListException(DateTime.Now.ToString(), lUserID, stringAlarm);
            }
        }

        public bool MsgCallback_V31(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            //通过lCommand来判断接收到的报警信息类型,不同的lCommand对应不同的pAlarmInfo内容
            AlarmMessageHandle(lCommand, ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
            
            return true; //回调函数需要有返回,表示正常接收到数据
        }

        public void MsgCallback(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            //通过lCommand来判断接收到的报警信息类型,不同的lCommand对应不同的pAlarmInfo内容
            AlarmMessageHandle(lCommand, ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
        }

        public void AlarmMessageHandle(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            //通过lCommand来判断接收到的报警信息类型,不同的lCommand对应不同的pAlarmInfo内容
            switch (lCommand)
            {
                case CHCNetSDK.COMM_ALARM: //(DS-8000老设备)移动侦测、视频丢失、遮挡、IO信号量等报警信息
                    ProcessCommAlarm(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_ALARM_V30://移动侦测、视频丢失、遮挡、IO信号量等报警信息
                    ProcessCommAlarm_V30(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_ALARM_RULE://进出区域、入侵、徘徊、人员聚集等行为分析报警信息
                    ProcessCommAlarm_RULE(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_UPLOAD_PLATE_RESULT://交通抓拍结果上传(老报警信息类型)
                    ProcessCommAlarm_Plate(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_ITS_PLATE_RESULT://交通抓拍结果上传(新报警信息类型)
                    ProcessCommAlarm_ITSPlate(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_ALARM_TPS_REAL_TIME://交通抓拍结果上传(新报警信息类型)
                    ProcessCommAlarm_TPSRealInfo(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_ALARM_TPS_STATISTICS://交通抓拍结果上传(新报警信息类型)
                    ProcessCommAlarm_TPSStatInfo(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_ALARM_PDC://客流量统计报警信息
                    ProcessCommAlarm_PDC(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_ITS_PARK_VEHICLE://客流量统计报警信息
                    ProcessCommAlarm_PARK(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_DIAGNOSIS_UPLOAD://VQD报警信息
                    ProcessCommAlarm_VQD(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_UPLOAD_FACESNAP_RESULT://人脸抓拍结果信息
                    ProcessCommAlarm_FaceSnap(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_SNAP_MATCH_ALARM://人脸比对结果信息
                    ProcessCommAlarm_FaceMatch(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_ALARM_FACE_DETECTION://人脸侦测报警信息
                    ProcessCommAlarm_FaceDetect(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_ALARMHOST_CID_ALARM://报警主机CID报警上传
                    ProcessCommAlarm_CIDAlarm(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_UPLOAD_VIDEO_INTERCOM_EVENT://可视对讲事件记录信息
                    ProcessCommAlarm_InterComEvent(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_ALARM_ACS://门禁主机报警上传
                    ProcessCommAlarm_AcsAlarm(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_ID_INFO_ALARM://身份证刷卡信息上传
                    ProcessCommAlarm_IDInfoAlarm(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_UPLOAD_AIOP_VIDEO://设备支持AI开放平台接入,上传视频检测数据
                    ProcessCommAlarm_AIOPVideo(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_UPLOAD_AIOP_PICTURE://设备支持AI开放平台接入,上传图片检测数据
                    ProcessCommAlarm_AIOPPicture(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_ISAPI_ALARM://ISAPI报警信息上传
                    ProcessCommAlarm_ISAPIAlarm(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                case CHCNetSDK.COMM_THERMOMETRY_ALARM://温度报警信息
                    ProcessCommAlarm_ThermAlarm(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
                    break;
                default:
                    {
                        //报警设备IP地址
                        string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');

                        //报警信息类型
                        string stringAlarm = "报警上传,信息类型:0x" Convert.ToString(lCommand, 16);

                        if (InvokeRequired)
                        {
                            object[] paras = new object[3];
                            paras[0] = DateTime.Now.ToString(); //当前PC系统时间
                            paras[1] = strIP;
                            paras[2] = stringAlarm;
                            listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
                        }
                        else
                        {
                            //创建该控件的主线程直接更新信息列表 
                            UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
                        }
                    }
                    break;
            }
        }

        public void ProcessCommAlarm(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_DVR_ALARMINFO struAlarmInfo = new CHCNetSDK.NET_DVR_ALARMINFO();

            struAlarmInfo = (CHCNetSDK.NET_DVR_ALARMINFO)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_ALARMINFO));

            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');
            string stringAlarm = "";
            int i = 0;

            switch (struAlarmInfo.dwAlarmType)
            {
                case 0:
                    stringAlarm = "信号量报警,报警报警输入口:" struAlarmInfo.dwAlarmInputNumber ",触发录像通道:";
                    for (i = 0; i < CHCNetSDK.MAX_CHANNUM; i )
                    {
                        if (struAlarmInfo.dwAlarmRelateChannel[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                case 1:
                    stringAlarm = "硬盘满,报警硬盘号:";
                    for (i = 0; i < CHCNetSDK.MAX_DISKNUM; i )
                    {
                        if (struAlarmInfo.dwDiskNumber[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                case 2:
                    stringAlarm = "信号丢失,报警通道:";
                    for (i = 0; i < CHCNetSDK.MAX_CHANNUM; i )
                    {
                        if (struAlarmInfo.dwChannel[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                case 3:
                    stringAlarm = "移动侦测,报警通道:";
                    for (i = 0; i < CHCNetSDK.MAX_CHANNUM; i )
                    {
                        if (struAlarmInfo.dwChannel[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                case 4:
                    stringAlarm = "硬盘未格式化,报警硬盘号:";
                    for (i = 0; i < CHCNetSDK.MAX_DISKNUM; i )
                    {
                        if (struAlarmInfo.dwDiskNumber[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                case 5:
                    stringAlarm = "读写硬盘出错,报警硬盘号:";
                    for (i = 0; i < CHCNetSDK.MAX_DISKNUM; i )
                    {
                        if (struAlarmInfo.dwDiskNumber[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                case 6:
                    stringAlarm = "遮挡报警,报警通道:";
                    for (i = 0; i < CHCNetSDK.MAX_CHANNUM; i )
                    {
                        if (struAlarmInfo.dwChannel[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                case 7:
                    stringAlarm = "制式不匹配,报警通道";
                    for (i = 0; i < CHCNetSDK.MAX_CHANNUM; i )
                    {
                        if (struAlarmInfo.dwChannel[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                case 8:
                    stringAlarm = "非法访问";
                    break;
                default:
                    stringAlarm = "其他未知报警信息";
                    break;
            }

            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = DateTime.Now.ToString();
                paras[1] = strIP;
                paras[2] = stringAlarm;                
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(),strIP, stringAlarm);
            }
        }

        private void ProcessCommAlarm_V30(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {

            CHCNetSDK.NET_DVR_ALARMINFO_V30 struAlarmInfoV30 = new CHCNetSDK.NET_DVR_ALARMINFO_V30();

            struAlarmInfoV30 = (CHCNetSDK.NET_DVR_ALARMINFO_V30)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_ALARMINFO_V30));

            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');
            string stringAlarm = "";
            int i;

            switch (struAlarmInfoV30.dwAlarmType)
            {
                case 0:
                    stringAlarm = "信号量报警,报警报警输入口:" struAlarmInfoV30.dwAlarmInputNumber ",触发录像通道:";
                    for (i = 0; i < CHCNetSDK.MAX_CHANNUM_V30; i )
                    {
                        if (struAlarmInfoV30.byAlarmRelateChannel[i] == 1)
                        {
                            stringAlarm = (i 1) "\\";
                        }
                    }
                    break;
                case 1:
                    stringAlarm = "硬盘满,报警硬盘号:";
                    for (i = 0; i < CHCNetSDK.MAX_DISKNUM_V30; i )
                    {
                        if (struAlarmInfoV30.byDiskNumber[i] == 1)
                        {
                            stringAlarm = (i 1) " ";
                        }
                    }
                    break;
                case 2:
                    stringAlarm = "信号丢失,报警通道:";
                    for (i = 0; i < CHCNetSDK.MAX_CHANNUM_V30; i )
                    {
                        if (struAlarmInfoV30.byChannel[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                case 3:
                    stringAlarm = "移动侦测,报警通道:";
                    for (i = 0; i < CHCNetSDK.MAX_CHANNUM_V30; i )
                    {
                        if (struAlarmInfoV30.byChannel[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                case 4:
                    stringAlarm = "硬盘未格式化,报警硬盘号:";
                    for (i = 0; i < CHCNetSDK.MAX_DISKNUM_V30; i )
                    {
                        if (struAlarmInfoV30.byDiskNumber[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                case 5:
                    stringAlarm = "读写硬盘出错,报警硬盘号:";
                    for (i = 0; i < CHCNetSDK.MAX_DISKNUM_V30; i )
                    {
                        if (struAlarmInfoV30.byDiskNumber[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                case 6:
                    stringAlarm = "遮挡报警,报警通道:";
                    for (i = 0; i < CHCNetSDK.MAX_CHANNUM_V30; i )
                    {
                        if (struAlarmInfoV30.byChannel[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                case 7:
                    stringAlarm = "制式不匹配,报警通道";
                    for (i = 0; i < CHCNetSDK.MAX_CHANNUM_V30; i )
                    {
                        if (struAlarmInfoV30.byChannel[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                case 8:
                    stringAlarm = "非法访问";
                    break;
                case 9:
                    stringAlarm = "视频信号异常,报警通道";
                    for (i = 0; i < CHCNetSDK.MAX_CHANNUM_V30; i )
                    {
                        if (struAlarmInfoV30.byChannel[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                case 10:
                    stringAlarm = "录像/抓图异常,报警通道";
                    for (i = 0; i < CHCNetSDK.MAX_CHANNUM_V30; i )
                    {
                        if (struAlarmInfoV30.byChannel[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                case 11:
                    stringAlarm = "智能场景变化,报警通道";
                    for (i = 0; i < CHCNetSDK.MAX_CHANNUM_V30; i )
                    {
                        if (struAlarmInfoV30.byChannel[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                case 12:
                    stringAlarm = "阵列异常";
                    break;
                case 13:
                    stringAlarm = "前端/录像分辨率不匹配,报警通道";
                    for (i = 0; i < CHCNetSDK.MAX_CHANNUM_V30; i )
                    {
                        if (struAlarmInfoV30.byChannel[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                case 15:
                    stringAlarm = "智能侦测,报警通道";
                    for (i = 0; i < CHCNetSDK.MAX_CHANNUM_V30; i )
                    {
                        if (struAlarmInfoV30.byChannel[i] == 1)
                        {
                            stringAlarm = (i 1) " \\ ";
                        }
                    }
                    break;
                default:
                    stringAlarm = "其他未知报警信息";
                    break;
            }

            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = DateTime.Now.ToString();
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }

        }

        private void ProcessCommAlarm_RULE(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_VCA_RULE_ALARM struRuleAlarmInfo = new CHCNetSDK.NET_VCA_RULE_ALARM();
            struRuleAlarmInfo = (CHCNetSDK.NET_VCA_RULE_ALARM)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_VCA_RULE_ALARM));

            //报警信息
            string stringAlarm = "";
            uint dwSize = (uint)Marshal.SizeOf(struRuleAlarmInfo.struRuleInfo.uEventParam);

            switch (struRuleAlarmInfo.struRuleInfo.wEventTypeEx)
            {
                case (ushort)CHCNetSDK.VCA_RULE_EVENT_TYPE_EX.ENUM_VCA_EVENT_TRAVERSE_PLANE:
                    IntPtr ptrTraverseInfo = Marshal.AllocHGlobal((Int32)dwSize);
                    Marshal.StructureToPtr(struRuleAlarmInfo.struRuleInfo.uEventParam, ptrTraverseInfo, false);
                    m_struTraversePlane = (CHCNetSDK.NET_VCA_TRAVERSE_PLANE)Marshal.PtrToStructure(ptrTraverseInfo, typeof(CHCNetSDK.NET_VCA_TRAVERSE_PLANE));
                    stringAlarm = "穿越警戒面,目标ID:" struRuleAlarmInfo.struTargetInfo.dwID;
                    //警戒面边线起点坐标: (m_struTraversePlane.struPlaneBottom.struStart.fX, m_struTraversePlane.struPlaneBottom.struStart.fY)
                    //警戒面边线终点坐标: (m_struTraversePlane.struPlaneBottom.struEnd.fX, m_struTraversePlane.struPlaneBottom.struEnd.fY)
                    break;
                case (ushort)CHCNetSDK.VCA_RULE_EVENT_TYPE_EX.ENUM_VCA_EVENT_ENTER_AREA:
                    IntPtr ptrEnterInfo = Marshal.AllocHGlobal((Int32)dwSize);
                    Marshal.StructureToPtr(struRuleAlarmInfo.struRuleInfo.uEventParam, ptrEnterInfo, false);
                    m_struVcaArea = (CHCNetSDK.NET_VCA_AREA)Marshal.PtrToStructure(ptrEnterInfo, typeof(CHCNetSDK.NET_VCA_AREA));
                    stringAlarm = "目标进入区域,目标ID:" struRuleAlarmInfo.struTargetInfo.dwID;
                    //m_struVcaArea.struRegion 多边形区域坐标
                    break;
                case (ushort)CHCNetSDK.VCA_RULE_EVENT_TYPE_EX.ENUM_VCA_EVENT_EXIT_AREA:               
                    IntPtr ptrExitInfo = Marshal.AllocHGlobal((Int32)dwSize);
                    Marshal.StructureToPtr(struRuleAlarmInfo.struRuleInfo.uEventParam, ptrExitInfo, false);
                    m_struVcaArea = (CHCNetSDK.NET_VCA_AREA)Marshal.PtrToStructure(ptrExitInfo, typeof(CHCNetSDK.NET_VCA_AREA));
                    stringAlarm = "目标离开区域,目标ID:" struRuleAlarmInfo.struTargetInfo.dwID;
                    //m_struVcaArea.struRegion 多边形区域坐标
                    break;
                case (ushort)CHCNetSDK.VCA_RULE_EVENT_TYPE_EX.ENUM_VCA_EVENT_INTRUSION:
                    IntPtr ptrIntrusionInfo = Marshal.AllocHGlobal((Int32)dwSize);
                    Marshal.StructureToPtr(struRuleAlarmInfo.struRuleInfo.uEventParam, ptrIntrusionInfo, false);
                    m_struIntrusion = (CHCNetSDK.NET_VCA_INTRUSION)Marshal.PtrToStructure(ptrIntrusionInfo, typeof(CHCNetSDK.NET_VCA_INTRUSION));

                    int i = 0;
                    string strRegion = "";
                    for (i = 0; i < m_struIntrusion.struRegion.dwPointNum; i )
                    {
                        strRegion = strRegion "(" m_struIntrusion.struRegion.struPos[i].fX "," m_struIntrusion.struRegion.struPos[i].fY ")";
                    }
                    stringAlarm = "周界入侵,目标ID:" struRuleAlarmInfo.struTargetInfo.dwID ",区域范围:" strRegion;
                    //m_struIntrusion.struRegion 多边形区域坐标
                    break;
                default:
                    stringAlarm = "其他行为分析报警,目标ID:" struRuleAlarmInfo.struTargetInfo.dwID;
                    break;            
            }


            //报警图片保存
            if (struRuleAlarmInfo.dwPicDataLen > 0)
            {
                string str = ".\\picture\\UserID_" pAlarmer.lUserID "_行为分析_" iFileNumber ".jpg";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struRuleAlarmInfo.dwPicDataLen;
                byte[] by = new byte[iLen];
                Marshal.Copy(struRuleAlarmInfo.pImage, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }

            //报警时间:年月日时分秒
            string strTimeYear = ((struRuleAlarmInfo.dwAbsTime >> 26) 2000).ToString();
            string strTimeMonth = ((struRuleAlarmInfo.dwAbsTime >> 22) & 15).ToString("d2");
            string strTimeDay = ((struRuleAlarmInfo.dwAbsTime >> 17) & 31).ToString("d2");
            string strTimeHour = ((struRuleAlarmInfo.dwAbsTime >> 12) & 31).ToString("d2");
            string strTimeMinute = ((struRuleAlarmInfo.dwAbsTime >> 6) & 63).ToString("d2");
            string strTimeSecond = ((struRuleAlarmInfo.dwAbsTime >> 0) & 63).ToString("d2");
            string strTime = strTimeYear "-" strTimeMonth "-" strTimeDay " " strTimeHour ":" strTimeMinute ":" strTimeSecond;
           
            //报警设备IP地址
            string strIP = System.Text.Encoding.UTF8.GetString(struRuleAlarmInfo.struDevInfo.struDevIP.sIpV4).TrimEnd('\0');

            //将报警信息添加进列表
            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = strTime;
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(strTime, strIP, stringAlarm);
            }
        }

        private void ProcessCommAlarm_Plate(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_DVR_PLATE_RESULT struPlateResultInfo = new CHCNetSDK.NET_DVR_PLATE_RESULT();
            uint dwSize = (uint)Marshal.SizeOf(struPlateResultInfo);

            struPlateResultInfo = (CHCNetSDK.NET_DVR_PLATE_RESULT)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_PLATE_RESULT));

            //保存抓拍图片
            string str = "";
            if (struPlateResultInfo.byResultType == 1 && struPlateResultInfo.dwPicLen != 0)
            {
                str = ".\\picture\\Plate_UserID_" pAlarmer.lUserID "_近景图_" iFileNumber ".jpg";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struPlateResultInfo.dwPicLen;
                byte[] by = new byte[iLen];
                Marshal.Copy(struPlateResultInfo.pBuffer1, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }
            if (struPlateResultInfo.dwPicPlateLen != 0)
            {
                str = ".\\picture\\Plate_UserID_" pAlarmer.lUserID "_车牌图_" iFileNumber ".jpg";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struPlateResultInfo.dwPicPlateLen;
                byte[] by = new byte[iLen];
                Marshal.Copy(struPlateResultInfo.pBuffer2, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }
            if (struPlateResultInfo.dwFarCarPicLen != 0)
            {
                str = ".\\picture\\Plate_UserID_" pAlarmer.lUserID "_远景图_" iFileNumber ".jpg";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struPlateResultInfo.dwFarCarPicLen;
                byte[] by = new byte[iLen];
                Marshal.Copy(struPlateResultInfo.pBuffer5, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }

            //报警设备IP地址
            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');

            //抓拍时间:年月日时分秒
            string strTimeYear = System.Text.Encoding.UTF8.GetString(struPlateResultInfo.byAbsTime).TrimEnd('\0');

            //上传结果
            string stringPlateLicense = System.Text.Encoding.GetEncoding("GBK").GetString(struPlateResultInfo.struPlateInfo.sLicense).TrimEnd('\0');
            string stringAlarm = "抓拍上传," "车牌:" stringPlateLicense ",车辆序号:" struPlateResultInfo.struVehicleInfo.dwIndex; 

            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = strTimeYear; //当前PC系统时间为DateTime.Now.ToString();
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }
        }

        private void ProcessCommAlarm_ITSPlate(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_ITS_PLATE_RESULT struITSPlateResult = new CHCNetSDK.NET_ITS_PLATE_RESULT();
            uint dwSize = (uint)Marshal.SizeOf(struITSPlateResult);

            struITSPlateResult = (CHCNetSDK.NET_ITS_PLATE_RESULT)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_ITS_PLATE_RESULT));

            //保存抓拍图片
            for (int i = 0; i < struITSPlateResult.dwPicNum; i )
            {
                if (struITSPlateResult.struPicInfo[i].dwDataLen != 0)
                {
                    string str = ".\\picture\\ITS_UserID_[" pAlarmer.lUserID "]_Pictype_" struITSPlateResult.struPicInfo[i].byType
                        "_PicNum[" (i 1) "]_" iFileNumber ".jpg";
                    FileStream fs = new FileStream(str, FileMode.Create);
                    int iLen = (int)struITSPlateResult.struPicInfo[i].dwDataLen;
                    byte[] by = new byte[iLen];
                    Marshal.Copy(struITSPlateResult.struPicInfo[i].pBuffer, by, 0, iLen);
                    fs.Write(by, 0, iLen);
                    fs.Close();
                    iFileNumber ;
                }
            }
            //报警设备IP地址
            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');

            //抓拍时间:年月日时分秒
            string strTimeYear = string.Format("{0:D4}", struITSPlateResult.struSnapFirstPicTime.wYear)  
                string.Format("{0:D2}", struITSPlateResult.struSnapFirstPicTime.byMonth)  
                string.Format("{0:D2}", struITSPlateResult.struSnapFirstPicTime.byDay) " " 
                string.Format("{0:D2}", struITSPlateResult.struSnapFirstPicTime.byHour) ":" 
                string.Format("{0:D2}", struITSPlateResult.struSnapFirstPicTime.byMinute) ":" 
                string.Format("{0:D2}", struITSPlateResult.struSnapFirstPicTime.bySecond) ":" 
                string.Format("{0:D3}", struITSPlateResult.struSnapFirstPicTime.wMilliSec);

            //上传结果
            string stringPlateLicense = System.Text.Encoding.GetEncoding("GBK").GetString(struITSPlateResult.struPlateInfo.sLicense).TrimEnd('\0');
            string stringAlarm = "抓拍上传," "车牌:" stringPlateLicense ",车辆序号:" struITSPlateResult.struVehicleInfo.dwIndex ",检测方向:" struITSPlateResult.byDir;

            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = strTimeYear;//当前系统时间为:DateTime.Now.ToString();
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }
        }
        private void ProcessCommAlarm_TPSRealInfo(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_DVR_TPS_REAL_TIME_INFO struTPSInfo = new CHCNetSDK.NET_DVR_TPS_REAL_TIME_INFO();
            uint dwSize = (uint)Marshal.SizeOf(struTPSInfo);

            struTPSInfo = (CHCNetSDK.NET_DVR_TPS_REAL_TIME_INFO)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_TPS_REAL_TIME_INFO));
           
            //报警设备IP地址
            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');

            //抓拍时间:年月日时分秒
            string strTimeYear = string.Format("{0:D4}", struTPSInfo.struTime.wYear)
                string.Format("{0:D2}", struTPSInfo.struTime.byMonth)
                string.Format("{0:D2}", struTPSInfo.struTime.byDay) " "
                string.Format("{0:D2}", struTPSInfo.struTime.byHour) ":"
                string.Format("{0:D2}", struTPSInfo.struTime.byMinute) ":"
                string.Format("{0:D2}", struTPSInfo.struTime.bySecond) ":"
                string.Format("{0:D3}", struTPSInfo.struTime.wMilliSec);

            //上传结果
            string stringAlarm = "TPS实时过车数据," "通道号:" struTPSInfo.dwChan
                ",设备ID:" struTPSInfo.struTPSRealTimeInfo.wDeviceID
                ",开始码:" struTPSInfo.struTPSRealTimeInfo.byStart
                ",命令号:" struTPSInfo.struTPSRealTimeInfo.byCMD
                ",对应车道:" struTPSInfo.struTPSRealTimeInfo.byLane
                ",对应车速:" struTPSInfo.struTPSRealTimeInfo.bySpeed
                ",byLaneState:" struTPSInfo.struTPSRealTimeInfo.byLaneState
                ",byQueueLen:" struTPSInfo.struTPSRealTimeInfo.byQueueLen
                ",wLoopState:" struTPSInfo.struTPSRealTimeInfo.wLoopState
                ",wStateMask:" struTPSInfo.struTPSRealTimeInfo.wStateMask
                ",dwDownwardFlow:" struTPSInfo.struTPSRealTimeInfo.dwDownwardFlow
                ",dwUpwardFlow:" struTPSInfo.struTPSRealTimeInfo.dwUpwardFlow
                ",byJamLevel:" struTPSInfo.struTPSRealTimeInfo.byJamLevel;

            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = strTimeYear;//当前系统时间为:DateTime.Now.ToString();
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }
        }

        private void ProcessCommAlarm_TPSStatInfo(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_DVR_TPS_STATISTICS_INFO struTPSStatInfo = new CHCNetSDK.NET_DVR_TPS_STATISTICS_INFO();
            uint dwSize = (uint)Marshal.SizeOf(struTPSStatInfo);

            struTPSStatInfo = (CHCNetSDK.NET_DVR_TPS_STATISTICS_INFO)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_TPS_STATISTICS_INFO));

            //报警设备IP地址
            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');

            //抓拍时间:年月日时分秒
            string strTimeYear = string.Format("{0:D4}", struTPSStatInfo.struTPSStatisticsInfo.struStartTime.wYear)
                string.Format("{0:D2}", struTPSStatInfo.struTPSStatisticsInfo.struStartTime.byMonth)
                string.Format("{0:D2}", struTPSStatInfo.struTPSStatisticsInfo.struStartTime.byDay) " "
                string.Format("{0:D2}", struTPSStatInfo.struTPSStatisticsInfo.struStartTime.byHour) ":"
                string.Format("{0:D2}", struTPSStatInfo.struTPSStatisticsInfo.struStartTime.byMinute) ":"
                string.Format("{0:D2}", struTPSStatInfo.struTPSStatisticsInfo.struStartTime.bySecond) ":"
                string.Format("{0:D3}", struTPSStatInfo.struTPSStatisticsInfo.struStartTime.wMilliSec);

            //上传结果
            string stringAlarm = "TPS统计过车数据," "通道号:" struTPSStatInfo.dwChan
                ",开始码:" struTPSStatInfo.struTPSStatisticsInfo.byStart
                ",命令号:" struTPSStatInfo.struTPSStatisticsInfo.byCMD
                ",统计开始时间:" strTimeYear
                ",统计时间(秒):" struTPSStatInfo.struTPSStatisticsInfo.dwSamplePeriod;


            for (int i = 0; i < CHCNetSDK.MAX_TPS_RULE; i )
            {
                stringAlarm = stringAlarm "车道号: " struTPSStatInfo.struTPSStatisticsInfo.struLaneParam[i].byLane
                    ",车道过车平均速度:" struTPSStatInfo.struTPSStatisticsInfo.struLaneParam[i].bySpeed
                    ",小型车数量:" struTPSStatInfo.struTPSStatisticsInfo.struLaneParam[i].dwLightVehicle
                    ",中型车数量:" struTPSStatInfo.struTPSStatisticsInfo.struLaneParam[i].dwMidVehicle
                    ",重型车数量:" struTPSStatInfo.struTPSStatisticsInfo.struLaneParam[i].dwHeavyVehicle
                    ",车头时距:" struTPSStatInfo.struTPSStatisticsInfo.struLaneParam[i].dwTimeHeadway
                    ",车头间距:" struTPSStatInfo.struTPSStatisticsInfo.struLaneParam[i].dwSpaceHeadway
                    ",空间占有率:" struTPSStatInfo.struTPSStatisticsInfo.struLaneParam[i].fSpaceOccupyRation
                    ",时间占有率:" struTPSStatInfo.struTPSStatisticsInfo.struLaneParam[i].fTimeOccupyRation; 
            }

            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = DateTime.Now.ToString();//当前系统时间
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }
        }

        private void ProcessCommAlarm_PDC(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_DVR_PDC_ALRAM_INFO struPDCInfo = new CHCNetSDK.NET_DVR_PDC_ALRAM_INFO();
            uint dwSize = (uint)Marshal.SizeOf(struPDCInfo);
            struPDCInfo = (CHCNetSDK.NET_DVR_PDC_ALRAM_INFO)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_PDC_ALRAM_INFO));

            string stringAlarm = "客流量统计,进入人数:" struPDCInfo.dwEnterNum ",离开人数:" struPDCInfo.dwLeaveNum;

            uint dwUnionSize = (uint)Marshal.SizeOf(struPDCInfo.uStatModeParam);
            IntPtr ptrPDCUnion = Marshal.AllocHGlobal((Int32)dwUnionSize);
            Marshal.StructureToPtr(struPDCInfo.uStatModeParam, ptrPDCUnion, false);

            if (struPDCInfo.byMode == 0) //单帧统计结果,此处为UTC时间
            {              
                m_struStatFrame = (CHCNetSDK.UNION_STATFRAME)Marshal.PtrToStructure(ptrPDCUnion, typeof(CHCNetSDK.UNION_STATFRAME));       
                stringAlarm = stringAlarm ",单帧统计,相对时标:" m_struStatFrame.dwRelativeTime ",绝对时标:" m_struStatFrame.dwAbsTime;
            }
            if (struPDCInfo.byMode == 1) //最小时间段统计结果
            {
                m_struStatTime = (CHCNetSDK.UNION_STATTIME)Marshal.PtrToStructure(ptrPDCUnion, typeof(CHCNetSDK.UNION_STATTIME));

                //开始时间
                string strStartTime = string.Format("{0:D4}", m_struStatTime.tmStart.dwYear)
                string.Format("{0:D2}", m_struStatTime.tmStart.dwMonth)
                string.Format("{0:D2}", m_struStatTime.tmStart.dwDay) " "
                string.Format("{0:D2}", m_struStatTime.tmStart.dwHour) ":"
                string.Format("{0:D2}", m_struStatTime.tmStart.dwMinute) ":"
                string.Format("{0:D2}", m_struStatTime.tmStart.dwSecond);

                //结束时间
                string strEndTime = string.Format("{0:D4}", m_struStatTime.tmEnd.dwYear)
                string.Format("{0:D2}", m_struStatTime.tmEnd.dwMonth)
                string.Format("{0:D2}", m_struStatTime.tmEnd.dwDay) " "
                string.Format("{0:D2}", m_struStatTime.tmEnd.dwHour) ":"
                string.Format("{0:D2}", m_struStatTime.tmEnd.dwMinute) ":"
                string.Format("{0:D2}", m_struStatTime.tmEnd.dwSecond);

                stringAlarm = stringAlarm ",最小时间段统计,开始时间:" strStartTime ",结束时间:" strEndTime;
            }
            Marshal.FreeHGlobal(ptrPDCUnion);

            //报警设备IP地址
            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');


            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = DateTime.Now.ToString(); //当前PC系统时间
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }
        }


        private void ProcessCommAlarm_PARK(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_ITS_PARK_VEHICLE struParkInfo = new CHCNetSDK.NET_ITS_PARK_VEHICLE();
            uint dwSize = (uint)Marshal.SizeOf(struParkInfo);
            struParkInfo = (CHCNetSDK.NET_ITS_PARK_VEHICLE)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_ITS_PARK_VEHICLE));

            //报警设备IP地址
            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');

            //保存抓拍图片
            for (int i = 0; i < struParkInfo.dwPicNum; i )
            {
                if ((struParkInfo.struPicInfo[i].dwDataLen != 0) && (struParkInfo.struPicInfo[i].pBuffer != IntPtr.Zero))
                {
                    string str = ".\\picture\\Device_Park_[" strIP "]_lUerID_[" pAlarmer.lUserID "]_Pictype_" struParkInfo.struPicInfo[i].byType
                        "_PicNum[" (i 1) "]_" iFileNumber ".jpg";
                    FileStream fs = new FileStream(str, FileMode.Create);
                    int iLen = (int)struParkInfo.struPicInfo[i].dwDataLen;
                    byte[] by = new byte[iLen];
                    Marshal.Copy(struParkInfo.struPicInfo[i].pBuffer, by, 0, iLen);
                    fs.Write(by, 0, iLen);
                    fs.Close();
                    iFileNumber ;
                }
            }

            string stringAlarm = "停车场数据上传,异常状态:" struParkInfo.byParkError ",车位编号:" struParkInfo.byParkingNo
                ", 车辆状态:" struParkInfo.byLocationStatus ",车牌号码:"
                System.Text.Encoding.GetEncoding("GBK").GetString(struParkInfo.struPlateInfo.sLicense).TrimEnd('\0');         

            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = DateTime.Now.ToString(); //当前PC系统时间
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }
        }

        private void ProcessCommAlarm_VQD(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_DVR_DIAGNOSIS_UPLOAD struVQDInfo = new CHCNetSDK.NET_DVR_DIAGNOSIS_UPLOAD();
            uint dwSize = (uint)Marshal.SizeOf(struVQDInfo);
            struVQDInfo = (CHCNetSDK.NET_DVR_DIAGNOSIS_UPLOAD)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_DIAGNOSIS_UPLOAD));

            //报警设备IP地址
            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');

            //开始时间
            string strCheckTime = string.Format("{0:D4}", struVQDInfo.struCheckTime.dwYear)
            string.Format("{0:D2}", struVQDInfo.struCheckTime.dwMonth)
            string.Format("{0:D2}", struVQDInfo.struCheckTime.dwDay) " "
            string.Format("{0:D2}", struVQDInfo.struCheckTime.dwHour) ":"
            string.Format("{0:D2}", struVQDInfo.struCheckTime.dwMinute) ":"
            string.Format("{0:D2}", struVQDInfo.struCheckTime.dwSecond);

            string stringAlarm = "视频质量诊断结果,流ID:" struVQDInfo.sStreamID ",监测点IP:" struVQDInfo.sMonitorIP ",监控点通道号:" struVQDInfo.dwChanIndex
                ",检测时间:" strCheckTime ",byResult:" struVQDInfo.byResult ",bySignalResult:" struVQDInfo.bySignalResult ",byBlurResult:" struVQDInfo.byBlurResult;

            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = DateTime.Now.ToString(); //当前PC系统时间
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }
        }

        private void ProcessCommAlarm_FaceSnap(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_VCA_FACESNAP_RESULT struFaceSnapInfo = new CHCNetSDK.NET_VCA_FACESNAP_RESULT();
            uint dwSize = (uint)Marshal.SizeOf(struFaceSnapInfo);
            struFaceSnapInfo = (CHCNetSDK.NET_VCA_FACESNAP_RESULT)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_VCA_FACESNAP_RESULT));

            //报警设备IP地址
            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');

            //保存抓拍图片数据
            if ((struFaceSnapInfo.dwBackgroundPicLen != 0) && (struFaceSnapInfo.pBuffer2 != IntPtr.Zero))
            {
                string str = ".\\picture\\FaceSnap_CapPic_[" strIP "]_lUerID_[" pAlarmer.lUserID "]_" iFileNumber ".jpg";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struFaceSnapInfo.dwBackgroundPicLen;
                byte[] by = new byte[iLen];
                Marshal.Copy(struFaceSnapInfo.pBuffer2, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }

            //保存人脸图片数据
            if ((struFaceSnapInfo.dwFacePicLen != 0) && (struFaceSnapInfo.pBuffer1 != IntPtr.Zero))
            {
                string str = ".\\picture\\FaceSnap_CapFacePic_[" strIP "]_lUerID_[" pAlarmer.lUserID "]_" iFileNumber ".jpg";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struFaceSnapInfo.dwFacePicLen;
                byte[] by = new byte[iLen];
                Marshal.Copy(struFaceSnapInfo.pBuffer1, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }

            //报警时间:年月日时分秒
            string strTimeYear = ((struFaceSnapInfo.dwAbsTime >> 26) 2000).ToString();
            string strTimeMonth = ((struFaceSnapInfo.dwAbsTime >> 22) & 15).ToString("d2");
            string strTimeDay = ((struFaceSnapInfo.dwAbsTime >> 17) & 31).ToString("d2");
            string strTimeHour = ((struFaceSnapInfo.dwAbsTime >> 12) & 31).ToString("d2");
            string strTimeMinute = ((struFaceSnapInfo.dwAbsTime >> 6) & 63).ToString("d2");
            string strTimeSecond = ((struFaceSnapInfo.dwAbsTime >> 0) & 63).ToString("d2");
            string strTime = strTimeYear "-" strTimeMonth "-" strTimeDay " " strTimeHour ":" strTimeMinute ":" strTimeSecond;

            string stringAlarm = "人脸抓拍结果,前端设备:" System.Text.Encoding.UTF8.GetString(struFaceSnapInfo.struDevInfo.struDevIP.sIpV4).TrimEnd('\0')
                ",通道号:" struFaceSnapInfo.struDevInfo.byIvmsChannel ",报警时间:" strTime
                ",是否戴口罩:" struFaceSnapInfo.struFeature.byMask;

            if (struFaceSnapInfo.byAddInfo == 1)
            {
                CHCNetSDK.NET_VCA_FACESNAP_ADDINFO struAddInfo = new CHCNetSDK.NET_VCA_FACESNAP_ADDINFO();
                struAddInfo = (CHCNetSDK.NET_VCA_FACESNAP_ADDINFO)Marshal.PtrToStructure(struFaceSnapInfo.pAddInfoBuffer, typeof(CHCNetSDK.NET_VCA_FACESNAP_ADDINFO));
                stringAlarm = stringAlarm ",是否温度异常:" struAddInfo.byIsAbnomalTemperature
                    ",人脸温度:" struAddInfo.fFaceTemperature;
            }

            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = DateTime.Now.ToString(); //当前PC系统时间
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }
        }

        private void ProcessCommAlarm_FaceMatch(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_VCA_FACESNAP_MATCH_ALARM struFaceMatchAlarm = new CHCNetSDK.NET_VCA_FACESNAP_MATCH_ALARM();
            uint dwSize = (uint)Marshal.SizeOf(struFaceMatchAlarm);
            struFaceMatchAlarm = (CHCNetSDK.NET_VCA_FACESNAP_MATCH_ALARM)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_VCA_FACESNAP_MATCH_ALARM));

            //报警设备IP地址
            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');

            //保存抓拍人脸子图图片数据
            if ((struFaceMatchAlarm.struSnapInfo.dwSnapFacePicLen != 0) && (struFaceMatchAlarm.struSnapInfo.pBuffer1 != IntPtr.Zero))
            {
                string str = ".\\picture\\FaceMatch_FacePic_[" strIP "]_lUerID_[" pAlarmer.lUserID "]_" iFileNumber ".jpg";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struFaceMatchAlarm.struSnapInfo.dwSnapFacePicLen;
                byte[] by = new byte[iLen];
                Marshal.Copy(struFaceMatchAlarm.struSnapInfo.pBuffer1, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }

            //保存比对结果人脸库人脸图片数据
            if ((struFaceMatchAlarm.struBlackListInfo.dwBlackListPicLen != 0) && (struFaceMatchAlarm.struBlackListInfo.pBuffer1 != IntPtr.Zero))
            {
                string str = ".\\picture\\FaceMatch_BlackListPic_[" strIP "]_lUerID_[" pAlarmer.lUserID "]"
                    "_fSimilarity[" struFaceMatchAlarm.fSimilarity "]_" iFileNumber ".jpg";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struFaceMatchAlarm.struBlackListInfo.dwBlackListPicLen;
                byte[] by = new byte[iLen];
                Marshal.Copy(struFaceMatchAlarm.struBlackListInfo.pBuffer1, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }

            //保存人脸库描述信息
            if ((struFaceMatchAlarm.struBlackListInfo.struBlackListInfo.dwFDDescriptionLen != 0) && (struFaceMatchAlarm.struBlackListInfo.struBlackListInfo.pFDDescriptionBuffer != IntPtr.Zero))
            {
                string str = ".\\picture\\FaceMatch_FDDescription_[" strIP "]_lUerID_[" pAlarmer.lUserID "]_" iFileNumber ".txt";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struFaceMatchAlarm.struBlackListInfo.struBlackListInfo.dwFDDescriptionLen;
                byte[] by = new byte[iLen];
                Marshal.Copy(struFaceMatchAlarm.struBlackListInfo.struBlackListInfo.pFDDescriptionBuffer, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }

            //保存抓拍库附加信息,测温信息在附加信息里面
            if ((struFaceMatchAlarm.struBlackListInfo.struBlackListInfo.dwFCAdditionInfoLen != 0) && (struFaceMatchAlarm.struBlackListInfo.struBlackListInfo.pFCAdditionInfoBuffer != IntPtr.Zero))
            {
                string str = ".\\picture\\FaceMatch_FCAdditionInfo_[" strIP "]_lUerID_[" pAlarmer.lUserID "]_" iFileNumber ".txt";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struFaceMatchAlarm.struBlackListInfo.struBlackListInfo.dwFCAdditionInfoLen;
                byte[] by = new byte[iLen];
                Marshal.Copy(struFaceMatchAlarm.struBlackListInfo.struBlackListInfo.pFCAdditionInfoBuffer, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }

            //抓拍时间:年月日时分秒
            string strTimeYear = ((struFaceMatchAlarm.struSnapInfo.dwAbsTime >> 26) 2000).ToString();
            string strTimeMonth = ((struFaceMatchAlarm.struSnapInfo.dwAbsTime >> 22) & 15).ToString("d2");
            string strTimeDay = ((struFaceMatchAlarm.struSnapInfo.dwAbsTime >> 17) & 31).ToString("d2");
            string strTimeHour = ((struFaceMatchAlarm.struSnapInfo.dwAbsTime >> 12) & 31).ToString("d2");
            string strTimeMinute = ((struFaceMatchAlarm.struSnapInfo.dwAbsTime >> 6) & 63).ToString("d2");
            string strTimeSecond = ((struFaceMatchAlarm.struSnapInfo.dwAbsTime >> 0) & 63).ToString("d2");
            string strTime = strTimeYear "-" strTimeMonth "-" strTimeDay " " strTimeHour ":" strTimeMinute ":" strTimeSecond;

            string stringAlarm = "人脸比对报警,抓拍设备:" System.Text.Encoding.UTF8.GetString(struFaceMatchAlarm.struSnapInfo.struDevInfo.struDevIP.sIpV4).TrimEnd('\0') ",抓拍时间:"
                strTime ",相似度:" struFaceMatchAlarm.fSimilarity;

            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = DateTime.Now.ToString(); //当前PC系统时间
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }
        }

        private void ProcessCommAlarm_FaceDetect(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_DVR_FACE_DETECTION struFaceDetectInfo = new CHCNetSDK.NET_DVR_FACE_DETECTION();
            uint dwSize = (uint)Marshal.SizeOf(struFaceDetectInfo);
            struFaceDetectInfo = (CHCNetSDK.NET_DVR_FACE_DETECTION)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_FACE_DETECTION));

            //报警设备IP地址
            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0').TrimEnd('\0');

            //报警时间:年月日时分秒
            string strTimeYear = ((struFaceDetectInfo.dwAbsTime >> 26) 2000).ToString();
            string strTimeMonth = ((struFaceDetectInfo.dwAbsTime >> 22) & 15).ToString("d2");
            string strTimeDay = ((struFaceDetectInfo.dwAbsTime >> 17) & 31).ToString("d2");
            string strTimeHour = ((struFaceDetectInfo.dwAbsTime >> 12) & 31).ToString("d2");
            string strTimeMinute = ((struFaceDetectInfo.dwAbsTime >> 6) & 63).ToString("d2");
            string strTimeSecond = ((struFaceDetectInfo.dwAbsTime >> 0) & 63).ToString("d2");
            string strTime = strTimeYear "-" strTimeMonth "-" strTimeDay " " strTimeHour ":" strTimeMinute ":" strTimeSecond;

            string stringAlarm = "人脸抓拍结果结果,前端设备:" System.Text.Encoding.UTF8.GetString(struFaceDetectInfo.struDevInfo.struDevIP.sIpV4) ",报警时间:" strTime;

            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = DateTime.Now.ToString(); //当前PC系统时间
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }
        }

        private void ProcessCommAlarm_CIDAlarm(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_DVR_CID_ALARM struCIDAlarm = new CHCNetSDK.NET_DVR_CID_ALARM();
            uint dwSize = (uint)Marshal.SizeOf(struCIDAlarm);
            struCIDAlarm = (CHCNetSDK.NET_DVR_CID_ALARM)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_CID_ALARM));

            //报警设备IP地址
            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');

            //报警时间:年月日时分秒
            string strTimeYear = (struCIDAlarm.struTriggerTime.wYear).ToString();
            string strTimeMonth = (struCIDAlarm.struTriggerTime.byMonth).ToString("d2");
            string strTimeDay = (struCIDAlarm.struTriggerTime.byDay).ToString("d2");
            string strTimeHour = (struCIDAlarm.struTriggerTime.byHour).ToString("d2");
            string strTimeMinute = (struCIDAlarm.struTriggerTime.byMinute).ToString("d2");
            string strTimeSecond = (struCIDAlarm.struTriggerTime.bySecond).ToString("d2");
            string strTime = strTimeYear "-" strTimeMonth "-" strTimeDay " " strTimeHour ":" strTimeMinute ":" strTimeSecond;

            string stringAlarm = "报警主机CID报告,sCIDCode:" System.Text.Encoding.UTF8.GetString(struCIDAlarm.sCIDCode).TrimEnd('\0')
                ",sCIDDescribe:" System.Text.Encoding.UTF8.GetString(struCIDAlarm.sCIDDescribe).TrimEnd('\0')
                ",报告类型:" struCIDAlarm.byReportType ",防区号:" struCIDAlarm.wDefenceNo ",报警触发时间:" strTime;

            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = DateTime.Now.ToString(); //当前PC系统时间
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }
        }

        private void ProcessCommAlarm_InterComEvent(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_DVR_VIDEO_INTERCOM_EVENT struInterComEvent = new CHCNetSDK.NET_DVR_VIDEO_INTERCOM_EVENT();
            uint dwSize = (uint)Marshal.SizeOf(struInterComEvent);
            struInterComEvent = (CHCNetSDK.NET_DVR_VIDEO_INTERCOM_EVENT)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_VIDEO_INTERCOM_EVENT));

            //报警设备IP地址
            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');

            if (struInterComEvent.byEventType == 3)
            {
                CHCNetSDK.NET_DVR_AUTH_INFO struAuthInfo = new CHCNetSDK.NET_DVR_AUTH_INFO();
                int dwUnionSize = Marshal.SizeOf(struInterComEvent.uEventInfo);
                IntPtr ptrAuthInfo = Marshal.AllocHGlobal(dwUnionSize);
                Marshal.StructureToPtr(struInterComEvent.uEventInfo, ptrAuthInfo, false);
                struAuthInfo = (CHCNetSDK.NET_DVR_AUTH_INFO)Marshal.PtrToStructure(ptrAuthInfo, typeof(CHCNetSDK.NET_DVR_AUTH_INFO));
                Marshal.FreeHGlobal(ptrAuthInfo);

                //保存抓拍图片
                if ((struAuthInfo.dwPicDataLen != 0) && (struAuthInfo.pImage != IntPtr.Zero))
                {
                    string str = ".\\picture\\Device_InterCom_CapturePic_[" strIP "]_lUerID_[" pAlarmer.lUserID "]_" iFileNumber ".jpg";
                    FileStream fs = new FileStream(str, FileMode.Create);
                    int iLen = (int)struAuthInfo.dwPicDataLen;
                    byte[] by = new byte[iLen];
                    Marshal.Copy(struAuthInfo.pImage, by, 0, iLen);
                    fs.Write(by, 0, iLen);
                    fs.Close();
                    iFileNumber ;
                }
            }            

            //报警时间:年月日时分秒
            string strTimeYear = (struInterComEvent.struTime.wYear).ToString();
            string strTimeMonth = (struInterComEvent.struTime.byMonth).ToString("d2");
            string strTimeDay = (struInterComEvent.struTime.byDay).ToString("d2");
            string strTimeHour = (struInterComEvent.struTime.byHour).ToString("d2");
            string strTimeMinute = (struInterComEvent.struTime.byMinute).ToString("d2");
            string strTimeSecond = (struInterComEvent.struTime.bySecond).ToString("d2");
            string strTime = strTimeYear "-" strTimeMonth "-" strTimeDay " " strTimeHour ":" strTimeMinute ":" strTimeSecond;

            string stringAlarm = "可视对讲事件,byEventType:" struInterComEvent.byEventType ",设备编号:"
                System.Text.Encoding.UTF8.GetString(struInterComEvent.byDevNumber).TrimEnd('\0') ",报警触发时间:" strTime;

            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = DateTime.Now.ToString(); //当前PC系统时间
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }

        }

        private void ACS_remoteCheck(uint dwSerialNo)
        {
            CHCNetSDK.NET_DVR_XML_CONFIG_INPUT pInputXml = new CHCNetSDK.NET_DVR_XML_CONFIG_INPUT();
            Int32 nInSize = Marshal.SizeOf(pInputXml);
            pInputXml.dwSize = (uint)nInSize;

            string strRequestUrl = "PUT /ISAPI/AccessControl/remoteCheck?format=json";
            uint dwRequestUrlLen = (uint)strRequestUrl.Length;
            pInputXml.lpRequestUrl = Marshal.StringToHGlobalAnsi(strRequestUrl);
            pInputXml.dwRequestUrlLen = dwRequestUrlLen;

            string strInputParam = "{\"RemoteCheck\":{\"serialNo\":" dwSerialNo ",\"checkResult\":\"success\",\"info\":\"\"}}";

            pInputXml.lpInBuffer = Marshal.StringToHGlobalAnsi(strInputParam);
            pInputXml.dwInBufferSize = (uint)strInputParam.Length;

            CHCNetSDK.NET_DVR_XML_CONFIG_OUTPUT pOutputXml = new CHCNetSDK.NET_DVR_XML_CONFIG_OUTPUT();
            pOutputXml.dwSize = (uint)Marshal.SizeOf(pInputXml);
            pOutputXml.lpOutBuffer = Marshal.AllocHGlobal(3 * 1024 * 1024);
            pOutputXml.dwOutBufferSize = 3 * 1024 * 1024;
            pOutputXml.lpStatusBuffer = Marshal.AllocHGlobal(4096 * 4);
            pOutputXml.dwStatusSize = 4096 * 4;

            if (!CHCNetSDK.NET_DVR_STDXMLConfig(m_lUserID, ref pInputXml, ref pOutputXml))
            {
                iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                strErr = "NET_DVR_STDXMLConfig failed, error code= " iLastErr;
                //XML透传失败,输出错误号 Failed to send XML data and output the error code
                MessageBox.Show(strErr);
            }
            else 
            {
                //核验成功
            }

            Marshal.FreeHGlobal(pInputXml.lpRequestUrl);
            Marshal.FreeHGlobal(pOutputXml.lpOutBuffer);
            Marshal.FreeHGlobal(pOutputXml.lpStatusBuffer);
        }

        private void ProcessCommAlarm_AcsAlarm(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_DVR_ACS_ALARM_INFO struAcsAlarm = new CHCNetSDK.NET_DVR_ACS_ALARM_INFO();
            uint dwSize = (uint)Marshal.SizeOf(struAcsAlarm);
            struAcsAlarm = (CHCNetSDK.NET_DVR_ACS_ALARM_INFO)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_ACS_ALARM_INFO));

            //报警设备IP地址
            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');

            //保存抓拍图片
            if ((struAcsAlarm.dwPicDataLen != 0) && (struAcsAlarm.pPicData != IntPtr.Zero))
            {
                string str = ".\\picture\\Device_Acs_CapturePic_[" strIP "]_lUerID_[" pAlarmer.lUserID "]_" iFileNumber ".jpg";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struAcsAlarm.dwPicDataLen;
                byte[] by = new byte[iLen];
                Marshal.Copy(struAcsAlarm.pPicData, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }

            //报警时间:年月日时分秒
            string strTimeYear = (struAcsAlarm.struTime.dwYear).ToString();
            string strTimeMonth = (struAcsAlarm.struTime.dwMonth).ToString("d2");
            string strTimeDay = (struAcsAlarm.struTime.dwDay).ToString("d2");
            string strTimeHour = (struAcsAlarm.struTime.dwHour).ToString("d2");
            string strTimeMinute = (struAcsAlarm.struTime.dwMinute).ToString("d2");
            string strTimeSecond = (struAcsAlarm.struTime.dwSecond).ToString("d2");
            string strTime = strTimeYear "-" strTimeMonth "-" strTimeDay " " strTimeHour ":" strTimeMinute ":" strTimeSecond;

            string stringAlarm = "门禁主机报警信息,dwMajor:0x" Convert.ToString(struAcsAlarm.dwMajor, 16) ",dwMinor:0x"
                Convert.ToString(struAcsAlarm.dwMinor, 16) ",卡号:" System.Text.Encoding.UTF8.GetString(struAcsAlarm.struAcsEventInfo.byCardNo).TrimEnd('\0')
                ",读卡器编号:" struAcsAlarm.struAcsEventInfo.dwCardReaderNo ",报警触发时间:" strTime  
                ",事件流水号:" struAcsAlarm.struAcsEventInfo.dwSerialNo;

            if (struAcsAlarm.byAcsEventInfoExtendV20 == 1)
            {
                CHCNetSDK.NET_DVR_ACS_EVENT_INFO_EXTEND_V20 struInfoExtendV20 = new CHCNetSDK.NET_DVR_ACS_EVENT_INFO_EXTEND_V20();
                uint dwSizeEx = (uint)Marshal.SizeOf(struInfoExtendV20);
                struInfoExtendV20 = (CHCNetSDK.NET_DVR_ACS_EVENT_INFO_EXTEND_V20)Marshal.PtrToStructure(struAcsAlarm.pAcsEventInfoExtendV20, typeof(CHCNetSDK.NET_DVR_ACS_EVENT_INFO_EXTEND_V20));
                stringAlarm = stringAlarm ", 温度:" struInfoExtendV20.fCurrTemperature ", 是否异常温度:" struInfoExtendV20.byIsAbnomalTemperature
                    ", 是否需要核验:" struInfoExtendV20.byRemoteCheck;

                if (struInfoExtendV20.byRemoteCheck == 2)
                {
                    //ACS_remoteCheck(struAcsAlarm.struAcsEventInfo.dwSerialNo);
                    //下发核验结果命令,实际可以使用消息事件的方式在回调函数外面处理,避免这样直接处理阻塞回调
                }

                //保存热成像图片
                if ((struInfoExtendV20.dwThermalDataLen != 0) && (struInfoExtendV20.pThermalData != IntPtr.Zero))
                {
                    string str = ".\\picture\\Device_Acs_ThermalData_[" strIP "]_lUerID_[" pAlarmer.lUserID "]_" iFileNumber ".jpg";
                    FileStream fs = new FileStream(str, FileMode.Create);
                    int iLen = (int)struInfoExtendV20.dwThermalDataLen;
                    byte[] by = new byte[iLen];
                    Marshal.Copy(struInfoExtendV20.pThermalData, by, 0, iLen);
                    fs.Write(by, 0, iLen);
                    fs.Close();
                    iFileNumber ;
                }            
            }

            if (struAcsAlarm.byAcsEventInfoExtend == 1)
            {
                CHCNetSDK.NET_DVR_ACS_EVENT_INFO_EXTEND struInfoExtend = new CHCNetSDK.NET_DVR_ACS_EVENT_INFO_EXTEND();
                uint dwSizeEx = (uint)Marshal.SizeOf(struInfoExtend);
                struInfoExtend = (CHCNetSDK.NET_DVR_ACS_EVENT_INFO_EXTEND)Marshal.PtrToStructure(struAcsAlarm.pAcsEventInfoExtend, typeof(CHCNetSDK.NET_DVR_ACS_EVENT_INFO_EXTEND));
                stringAlarm = stringAlarm ", 人员类型:" struInfoExtend.byUserType;               
            }

            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = DateTime.Now.ToString(); //当前PC系统时间
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }

        }

        private void ProcessCommAlarm_IDInfoAlarm(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_DVR_ID_CARD_INFO_ALARM struIDInfoAlarm = new CHCNetSDK.NET_DVR_ID_CARD_INFO_ALARM();
            uint dwSize = (uint)Marshal.SizeOf(struIDInfoAlarm);
            struIDInfoAlarm = (CHCNetSDK.NET_DVR_ID_CARD_INFO_ALARM)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_ID_CARD_INFO_ALARM));

            //报警设备IP地址
            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');

            //保存抓拍图片
            if ((struIDInfoAlarm.dwCapturePicDataLen != 0) && (struIDInfoAlarm.pCapturePicData != IntPtr.Zero))
            {
                string str = ".\\picture\\Device_IDINFO_CapturePic_[" strIP "]_lUerID_[" pAlarmer.lUserID "]_" iFileNumber ".jpg";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struIDInfoAlarm.dwCapturePicDataLen;
                byte[] by = new byte[iLen];
                Marshal.Copy(struIDInfoAlarm.pCapturePicData, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }

            //保存身份证图片数据
            if ((struIDInfoAlarm.dwPicDataLen != 0) && (struIDInfoAlarm.pPicData != IntPtr.Zero))
            {
                string str = ".\\picture\\Device_IDINFO_IDPic_[" strIP "]_lUerID_[" pAlarmer.lUserID "]_" iFileNumber ".jpg";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struIDInfoAlarm.dwPicDataLen;
                byte[] by = new byte[iLen];
                Marshal.Copy(struIDInfoAlarm.pPicData, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }

            //保存指纹数据
            if ((struIDInfoAlarm.dwFingerPrintDataLen != 0) && (struIDInfoAlarm.pFingerPrintData != IntPtr.Zero))
            {
                string str = ".\\picture\\Device_IDINFO_FingerPrint_[" strIP "]_lUerID_[" pAlarmer.lUserID "]_" iFileNumber ".data";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struIDInfoAlarm.dwFingerPrintDataLen;
                byte[] by = new byte[iLen];
                Marshal.Copy(struIDInfoAlarm.pFingerPrintData, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }

            //报警时间:年月日时分秒
            string strTimeYear = (struIDInfoAlarm.struSwipeTime.wYear).ToString();
            string strTimeMonth = (struIDInfoAlarm.struSwipeTime.byMonth).ToString("d2");
            string strTimeDay = (struIDInfoAlarm.struSwipeTime.byDay).ToString("d2");
            string strTimeHour = (struIDInfoAlarm.struSwipeTime.byHour).ToString("d2");
            string strTimeMinute = (struIDInfoAlarm.struSwipeTime.byMinute).ToString("d2");
            string strTimeSecond = (struIDInfoAlarm.struSwipeTime.bySecond).ToString("d2");
            string strTime = strTimeYear "-" strTimeMonth "-" strTimeDay " " strTimeHour ":" strTimeMinute ":" strTimeSecond;

            string stringAlarm = "身份证刷卡信息,dwMajor:0x" Convert.ToString(struIDInfoAlarm.dwMajor, 16) ",dwMinor:0x" Convert.ToString(struIDInfoAlarm.dwMinor) 
                ",身份证号:" System.Text.Encoding.UTF8.GetString(struIDInfoAlarm.struIDCardCfg.byIDNum).TrimEnd('\0')
                ",姓名:" System.Text.Encoding.UTF8.GetString(struIDInfoAlarm.struIDCardCfg.byName).TrimEnd('\0')  
                ",刷卡时间:" strTime;


            if (struIDInfoAlarm.byIDCardInfoExtend == 1)
            {
                CHCNetSDK.NET_DVR_ID_CARD_INFO_EXTEND struCardInfoExtend = new CHCNetSDK.NET_DVR_ID_CARD_INFO_EXTEND();
                uint dwSizeEx = (uint)Marshal.SizeOf(struCardInfoExtend);
                struCardInfoExtend = (CHCNetSDK.NET_DVR_ID_CARD_INFO_EXTEND)Marshal.PtrToStructure(struIDInfoAlarm.pIDCardInfoExtend, typeof(CHCNetSDK.NET_DVR_ID_CARD_INFO_EXTEND));
                stringAlarm = stringAlarm ", 温度:" struCardInfoExtend.fCurrTemperature ", 是否异常温度:" struCardInfoExtend.byIsAbnomalTemperature;

                //保存热成像图片
                if ((struCardInfoExtend.dwThermalDataLen != 0) && (struCardInfoExtend.pThermalData != IntPtr.Zero))
                {
                    string str = ".\\picture\\Device_IDINFO_ThermalData_[" strIP "]_lUerID_[" pAlarmer.lUserID "]_" iFileNumber ".jpg";
                    FileStream fs = new FileStream(str, FileMode.Create);
                    int iLen = (int)struCardInfoExtend.dwThermalDataLen;
                    byte[] by = new byte[iLen];
                    Marshal.Copy(struCardInfoExtend.pThermalData, by, 0, iLen);
                    fs.Write(by, 0, iLen);
                    fs.Close();
                    iFileNumber ;
                }
            }

            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = DateTime.Now.ToString(); //当前PC系统时间
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }
        }

        private void ProcessCommAlarm_ThermAlarm(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_DVR_THERMOMETRY_ALARM struThermAlarm = new CHCNetSDK.NET_DVR_THERMOMETRY_ALARM();
            uint dwSize = (uint)Marshal.SizeOf(struThermAlarm);
            struThermAlarm = (CHCNetSDK.NET_DVR_THERMOMETRY_ALARM)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_THERMOMETRY_ALARM));

            //报警设备IP地址
            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');

            //保存可见光图片
            if ((struThermAlarm.dwPicLen != 0) && (struThermAlarm.pPicBuff != IntPtr.Zero))
            {
                string str = ".\\picture\\Device_CapturePic_[" strIP "]_lUerID_[" pAlarmer.lUserID "]_" iFileNumber ".jpg";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struThermAlarm.dwPicLen;
                byte[] by = new byte[iLen];
                Marshal.Copy(struThermAlarm.pPicBuff, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }

            //保存热成像图片数据
            if ((struThermAlarm.dwThermalPicLen != 0) && (struThermAlarm.pThermalPicBuff != IntPtr.Zero))
            {
                string str = ".\\picture\\Device_ThermalPicBuff_[" strIP "]_lUerID_[" pAlarmer.lUserID "]_" iFileNumber ".jpg";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struThermAlarm.dwThermalPicLen;
                byte[] by = new byte[iLen];
                Marshal.Copy(struThermAlarm.pThermalPicBuff, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }

            string strRegion = ",测温区域:";
            if(struThermAlarm.byRuleCalibType == 1)
            {
                for(int i =0;i<struThermAlarm.struRegion.dwPointNum;i )
                    strRegion = strRegion "[" struThermAlarm.struRegion.struPos[i].fX "," struThermAlarm.struRegion.struPos[i].fY "]-";
            }
            

            string stringAlarm = "温度报警信息,测温单位:" struThermAlarm.byThermometryUnit ",报警类型:" struThermAlarm.byAlarmType
                ",规则类型:" struThermAlarm.byRuleCalibType ",当前温度:" struThermAlarm.fCurrTemperature strRegion;

            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = DateTime.Now.ToString(); //当前PC系统时间
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }
        }

        private void ProcessCommAlarm_AIOPVideo(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_AIOP_VIDEO_HEAD struAIOPVideo = new CHCNetSDK.NET_AIOP_VIDEO_HEAD();
            uint dwSize = (uint)Marshal.SizeOf(struAIOPVideo);
            struAIOPVideo = (CHCNetSDK.NET_AIOP_VIDEO_HEAD)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_AIOP_VIDEO_HEAD));

            //报警设备struAIOPPic地址
            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');

            //报警时间:年月日时分秒
            string strTimeYear = (struAIOPVideo.struTime.wYear).ToString();
            string strTimeMonth = (struAIOPVideo.struTime.wMonth).ToString("d2");
            string strTimeDay = (struAIOPVideo.struTime.wDay).ToString("d2");
            string strTimeHour = (struAIOPVideo.struTime.wHour).ToString("d2");
            string strTimeMinute = (struAIOPVideo.struTime.wMinute).ToString("d2");
            string strTimeSecond = (struAIOPVideo.struTime.wSecond).ToString("d2");
            string strTime = strTimeYear "-" strTimeMonth "-" strTimeDay " " strTimeHour ":" strTimeMinute ":" strTimeSecond;

            string stringAlarm = "AI开放平台视频检测报警上传,szTaskID:" System.Text.Encoding.UTF8.GetString(struAIOPVideo.szTaskID).TrimEnd('\0')
                ",报警触发时间:" strTime;

            //保存AIOPData数据  
            if ((struAIOPVideo.dwAIOPDataSize != 0) && (struAIOPVideo.pBufferAIOPData != IntPtr.Zero))
            {
                string str = ".\\picture\\AiopData[" strIP "]_lUerID_[" pAlarmer.lUserID "]"
                     iFileNumber ".txt";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struAIOPVideo.dwAIOPDataSize;
                byte[] by = new byte[iLen];
                Marshal.Copy(struAIOPVideo.pBufferAIOPData, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }
            //保存图片数据
            if ((struAIOPVideo.dwPictureSize != 0) && (struAIOPVideo.pBufferPicture != IntPtr.Zero))
            {
                string strPic = ".\\picture\\AiopPicture[" strIP "]_lUerID_[" pAlarmer.lUserID "]"
                     iFileNumber ".jpg";
                FileStream fsPic = new FileStream(strPic, FileMode.Create);
                int iPicLen = (int)struAIOPVideo.dwPictureSize;
                byte[] byPic = new byte[iPicLen];
                Marshal.Copy(struAIOPVideo.pBufferPicture, byPic, 0, iPicLen);
                fsPic.Write(byPic, 0, iPicLen);
                fsPic.Close();
                iFileNumber ;
            }
            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = DateTime.Now.ToString(); //当前PC系统时间
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }
        }
        private void ProcessCommAlarm_AIOPPicture(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_AIOP_PICTURE_HEAD struAIOPPic = new CHCNetSDK.NET_AIOP_PICTURE_HEAD();
            uint dwSize = (uint)Marshal.SizeOf(struAIOPPic);
            struAIOPPic = (CHCNetSDK.NET_AIOP_PICTURE_HEAD)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_AIOP_PICTURE_HEAD));

            //报警设备struAIOPPic地址
            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');

            //报警时间:年月日时分秒
            string strTimeYear = (struAIOPPic.struTime.wYear).ToString();
            string strTimeMonth = (struAIOPPic.struTime.wMonth).ToString("d2");
            string strTimeDay = (struAIOPPic.struTime.wDay).ToString("d2");
            string strTimeHour = (struAIOPPic.struTime.wHour).ToString("d2");
            string strTimeMinute = (struAIOPPic.struTime.wMinute).ToString("d2");
            string strTimeSecond = (struAIOPPic.struTime.wSecond).ToString("d2");
            string strTime = strTimeYear "-" strTimeMonth "-" strTimeDay " " strTimeHour ":" strTimeMinute ":" strTimeSecond;

            string stringAlarm = "AI开放平台图片检测报警上传,szPID:" System.Text.Encoding.UTF8.GetString(struAIOPPic.szPID).TrimEnd('\0')
                ",报警触发时间:" strTime;

            //保存AIOPData数据  
            if ((struAIOPPic.dwAIOPDataSize != 0) && (struAIOPPic.pBufferAIOPData != IntPtr.Zero))
            {
                string str = ".\\picture\\AiopData[" strIP "]_lUerID_[" pAlarmer.lUserID "]"
                     iFileNumber ".txt";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struAIOPPic.dwAIOPDataSize;
                byte[] by = new byte[iLen];
                Marshal.Copy(struAIOPPic.pBufferAIOPData, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }
            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = DateTime.Now.ToString(); //当前PC系统时间
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }
        }
        private void ProcessCommAlarm_ISAPIAlarm(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_DVR_ALARM_ISAPI_INFO struISAPIAlarm = new CHCNetSDK.NET_DVR_ALARM_ISAPI_INFO();
            uint dwSize = (uint)Marshal.SizeOf(struISAPIAlarm);
            struISAPIAlarm = (CHCNetSDK.NET_DVR_ALARM_ISAPI_INFO)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_ALARM_ISAPI_INFO));

            //报警设备IP地址
            string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');

            //保存XML或者Json数据
            string str = "";
            if ((struISAPIAlarm.dwAlarmDataLen != 0) && (struISAPIAlarm.pAlarmData != IntPtr.Zero))
            {  
                if (struISAPIAlarm.byDataType == 1) // 0-invalid,1-xml,2-json
                {
                    str = ".\\picture\\ISAPI_Alarm_XmlData_[" strIP "]_lUerID_[" pAlarmer.lUserID "]_" iFileNumber ".xml";
                }
                if (struISAPIAlarm.byDataType == 2) // 0-invalid,1-xml,2-json
                {
                    str = ".\\picture\\ISAPI_Alarm_JsonData_[" strIP "]_lUerID_[" pAlarmer.lUserID "]_" iFileNumber ".json";
                }

                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struISAPIAlarm.dwAlarmDataLen;
                byte[] by = new byte[iLen];
                Marshal.Copy(struISAPIAlarm.pAlarmData, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                iFileNumber ;
            }

            

            for (int i = 0; i < struISAPIAlarm.byPicturesNumber; i )
            {
                CHCNetSDK.NET_DVR_ALARM_ISAPI_PICDATA struPicData = new CHCNetSDK.NET_DVR_ALARM_ISAPI_PICDATA();
                struPicData.szFilename = new byte[256];
                Int32 nSize = Marshal.SizeOf(struPicData);
                struPicData = (CHCNetSDK.NET_DVR_ALARM_ISAPI_PICDATA)Marshal.PtrToStructure((IntPtr)((Int32)(struISAPIAlarm.pPicPackData) i * nSize), typeof(CHCNetSDK.NET_DVR_ALARM_ISAPI_PICDATA));

                //保存图片数据
                if ((struPicData.dwPicLen != 0) && (struPicData.pPicData != IntPtr.Zero))
                {                 
                    str = ".\\picture\\ISAPI_Alarm_Pic_[" strIP "]_lUerID_[" pAlarmer.lUserID "]_"
                          "_" iFileNumber ".jpg";

                    FileStream fs = new FileStream(str, FileMode.Create);
                    int iLen = (int)struPicData.dwPicLen;
                    byte[] by = new byte[iLen];
                    Marshal.Copy(struPicData.pPicData, by, 0, iLen);
                    fs.Write(by, 0, iLen);
                    fs.Close();
                    iFileNumber ;
                }
            }

            string stringAlarm = "ISAPI报警信息,byDataType:" struISAPIAlarm.byDataType ",图片张数:" struISAPIAlarm.byPicturesNumber;

            if (InvokeRequired)
            {
                object[] paras = new object[3];
                paras[0] = DateTime.Now.ToString(); //当前PC系统时间
                paras[1] = strIP;
                paras[2] = stringAlarm;
                listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }
        }

        public void UpdateClientList(string strAlarmTime, string strDevIP, string strAlarmMsg)
        {
            //列表新增报警信息
            listViewAlarmInfo.Items.Add(new ListViewItem(new string[] { strAlarmTime, strDevIP, strAlarmMsg }));
        }

        public void UpdateClientList(string strLogStatus, IntPtr lpDeviceInfo)
        {
            //列表新增报警信息
            labelLogin.Text = "登录状态(异步):" strLogStatus;
        }

        public void cbLoginCallBack(int lUserID, int dwResult, IntPtr lpDeviceInfo, IntPtr pUser)
        {
            string strLoginCallBack = "登录设备,lUserID:" lUserID ",dwResult:" dwResult;

            if (dwResult == 0)
            {
                uint iErrCode = CHCNetSDK.NET_DVR_GetLastError();
                strLoginCallBack = strLoginCallBack ",错误号:" iErrCode;
            }

            //下面代码注释掉也会崩溃
            if (InvokeRequired)
            {
                object[] paras = new object[2];
                paras[0] = strLoginCallBack;
                paras[1] = lpDeviceInfo;
                labelLogin.BeginInvoke(new UpdateTextStatusCallback(UpdateClientList), paras);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表 
                UpdateClientList(strLoginCallBack, lpDeviceInfo);
            }
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            if (textBoxIP.Text == "" || textBoxPort.Text == "" ||
                textBoxUserName.Text == "" || textBoxPassword.Text == "")
            {
                MessageBox.Show("Please input IP, Port, User name and Password!");
                return;
            }

            if (iDeviceNumber >= 20)
            {
                MessageBox.Show("本程序限制最多添加20台设备!");
                return;
            }

            CHCNetSDK.NET_DVR_USER_LOGIN_INFO struLogInfo = new CHCNetSDK.NET_DVR_USER_LOGIN_INFO();

            //设备IP地址或者域名
            byte[] byIP = System.Text.Encoding.Default.GetBytes(textBoxIP.Text);
            struLogInfo.sDeviceAddress = new byte[129];
            byIP.CopyTo(struLogInfo.sDeviceAddress, 0);

            //设备用户名
            byte[] byUserName = System.Text.Encoding.Default.GetBytes(textBoxUserName.Text);
            struLogInfo.sUserName = new byte[64];
            byUserName.CopyTo(struLogInfo.sUserName, 0);

            //设备密码
            byte[] byPassword = System.Text.Encoding.Default.GetBytes(textBoxPassword.Text);
            struLogInfo.sPassword = new byte[64];
            byPassword.CopyTo(struLogInfo.sPassword, 0);

            struLogInfo.wPort = ushort.Parse(textBoxPort.Text);//设备服务端口号
            
            struLogInfo.cbLoginResult = LoginCallBack;
            struLogInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是 

            if ((struLogInfo.bUseAsynLogin == true) && (LoginCallBack == null))
            {
                LoginCallBack = new CHCNetSDK.LOGINRESULTCALLBACK(cbLoginCallBack);//注册回调函数                    
            }

            struLogInfo.byLoginMode = 0; //0-Private, 1-ISAPI, 2-自适应
            struLogInfo.byHttps = 0; //0-不适用tls,1-使用tls 2-自适应

            CHCNetSDK.NET_DVR_DEVICEINFO_V40 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V40();

            //登录设备 Login the device
            m_lUserID = CHCNetSDK.NET_DVR_Login_V40(ref struLogInfo, ref DeviceInfo);
            if (m_lUserID < 0)
            {
                iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                strErr = "NET_DVR_Login_V30 failed, error code= " iLastErr; //登录失败,输出错误号 Failed to login and output the error code
                MessageBox.Show(strErr);
            }
            else
            {
                //登录成功
                iDeviceNumber ;
                string str1 = "" m_lUserID;
                listViewDevice.Items.Add(new ListViewItem(new string[] { str1, textBoxIP.Text, "未布防" }));//将已注册设备添加进列表
            }    
        }

        private void btn_SetAlarm_Click(object sender, EventArgs e)
        {
             CHCNetSDK.NET_DVR_SETUPALARM_PARAM struAlarmParam = new CHCNetSDK.NET_DVR_SETUPALARM_PARAM();
             struAlarmParam.dwSize = (uint)Marshal.SizeOf(struAlarmParam);
             struAlarmParam.byLevel = 1; //0- 一级布防,1- 二级布防
             struAlarmParam.byAlarmInfoType = 1;//智能交通设备有效,新报警信息类型
             struAlarmParam.byDeployType = 0;
             struAlarmParam.byFaceAlarmDetection = 1;//1-人脸侦测

             for (int i = 0; i < iDeviceNumber; i )
             {
                 m_lUserID = Int32.Parse(listViewDevice.Items[i].SubItems[0].Text);
                 m_lAlarmHandle[m_lUserID] = CHCNetSDK.NET_DVR_SetupAlarmChan_V41(m_lUserID, ref struAlarmParam);
                 if (m_lAlarmHandle[m_lUserID] < 0)
                 {
                     iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                     strErr = "布防失败,错误号:" iLastErr; //布防失败,输出错误号
                     listViewDevice.Items[i].SubItems[2].Text = strErr;              
                 }
                 else
                 {
                     listViewDevice.Items[i].SubItems[2].Text = "布防成功";                     
                 }
                 btn_SetAlarm.Enabled = false;
             }
         }

         private void btnCloseAlarm_Click(object sender, EventArgs e)
         {
             for (int i = 0; i < iDeviceNumber; i )
             {
                 m_lUserID = Int32.Parse(listViewDevice.Items[i].SubItems[0].Text);
                 if (m_lAlarmHandle[m_lUserID] >= 0)
                 {
                     if (!CHCNetSDK.NET_DVR_CloseAlarmChan_V30(m_lAlarmHandle[m_lUserID]))
                     {
                         iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                         strErr = "撤防失败,错误号:" iLastErr; //撤防失败,输出错误号
                         listViewDevice.Items[i].SubItems[2].Text = strErr;
                     }
                     else
                     {
                         listViewDevice.Items[i].SubItems[2].Text = "未布防";
                         m_lAlarmHandle[i] = -1;
                     }
                 }
                 else 
                 {
                     listViewDevice.Items[i].SubItems[2].Text = "未布防";                 
                 }
             }
             btn_SetAlarm.Enabled = true;
         }

         private void btnExit_Click(object sender, EventArgs e)
         {
             //撤防
             btnCloseAlarm_Click(sender,e);

             //停止监听
             if (iListenHandle >= 0)
             {
                 CHCNetSDK.NET_DVR_StopListen_V30(iListenHandle);
             }

             //注销登录
             for (int i = 0; i < iDeviceNumber; i )
             {
                 m_lUserID = Int32.Parse(listViewDevice.Items[i].SubItems[0].Text);
                 CHCNetSDK.NET_DVR_Logout(m_lUserID);                 
             }

             //释放SDK资源,在程序结束之前调用
             CHCNetSDK.NET_DVR_Cleanup();

             Application.Exit();
         }

         private void listViewDevice_MouseClick(object sender, MouseEventArgs e)
         {
             if (e.Button == MouseButtons.Right)
             {
                 if (listViewDevice.SelectedItems.Count > 0)
                 {
                     if (DialogResult.OK == MessageBox.Show("请确认是否删除所选择的设备!","删除提示",MessageBoxButtons.OKCancel))
                     {
                         foreach (ListViewItem item in this.listViewDevice.SelectedItems)
                         {
                             if (item.Selected)
                             {
                                 m_lUserID = Int32.Parse(item.SubItems[0].Text);
                                 CHCNetSDK.NET_DVR_CloseAlarmChan_V30(m_lAlarmHandle[m_lUserID]);
                                 CHCNetSDK.NET_DVR_Logout(m_lUserID);
                                 item.Remove();
                                 iDeviceNumber--;
                             }
                         }
                         this.listViewDevice.Refresh();
                     }                      
                 }
                 else
                 {
                     
                 }
             }
         }

         private void btnStartListen_Click(object sender, EventArgs e)
         {
             string sLocalIP = textBoxListenIP.Text;
             ushort wLocalPort = ushort.Parse(textBoxListenPort.Text);

             if (m_falarmData==null)
             {
                 m_falarmData = new CHCNetSDK.MSGCallBack(MsgCallback);
             }

             iListenHandle = CHCNetSDK.NET_DVR_StartListen_V30(sLocalIP, wLocalPort, m_falarmData, IntPtr.Zero);
             if (iListenHandle < 0)
             {
                 iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                 strErr = "启动监听失败,错误号:" iLastErr; //撤防失败,输出错误号
                 MessageBox.Show(strErr);
             }
             else
             {
                 MessageBox.Show("成功启动监听!");
                 btnStopListen.Enabled = true;
                 btnStartListen.Enabled = false;
             }
         }

         private void btnStopListen_Click(object sender, EventArgs e)
         {
             if (!CHCNetSDK.NET_DVR_StopListen_V30(iListenHandle))
             {
                 iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                 strErr = "停止监听失败,错误号:" iLastErr; //撤防失败,输出错误号
                 MessageBox.Show(strErr);
             }
             else
             {
                 MessageBox.Show("停止监听!");
                 btnStopListen.Enabled = false;
                 btnStartListen.Enabled = true;
             }
         }
        
    }
}


实例下载地址

C#海康威视相机抓拍实例

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警