Exemple #1
0
        private void ProcessCommAlarm_ITSPlate(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            int dvrloginid = pAlarmer.lUserID;

            var dvs = devicelists.Where(x => x.DVRLoginID == dvrloginid);

            if (dvs.Count() == 0)
            {
                if (OnShowInfoData != null)
                {
                    OnShowInfoData(InfoType.抓拍信息, null, "没有找到对应的注册设备,回调注册号:" + dvrloginid);
                }
                return;
            }
            DeviceInfo di = (DeviceInfo)dvs.ToArray()[0];

            if (di.beginTime != DateTime.MinValue)
            {
                if (DateTime.Now < di.beginTime || DateTime.Now > di.endTime)
                {
                    return;
                }
            }

            CHCNetSDK.NET_ITS_PLATE_RESULT struITSPlateResult = new CHCNetSDK.NET_ITS_PLATE_RESULT();



            uint dwSize = (uint)Marshal.SizeOf(struITSPlateResult);

            string imgBase64 = "";

            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].byType == 1)
                {
                    if (struITSPlateResult.struPicInfo[i].dwDataLen != 0)
                    {
                        int    iLen = (int)struITSPlateResult.struPicInfo[i].dwDataLen;
                        byte[] by   = new byte[iLen];
                        Marshal.Copy(struITSPlateResult.struPicInfo[i].pBuffer, by, 0, iLen);
                        imgBase64 = Convert.ToBase64String(by);

                        if (IsSaveImage)
                        {
                            SaveImage(by, di.DeviceName + "_" + struITSPlateResult.struPicInfo[i].byType.ToString());
                        }
                    }
                }
            }

            //log4net.ILog log = log4net.LogManager.GetLogger("abc");
            //log.Debug(Newtonsoft.Json.JsonConvert.SerializeObject(struITSPlateResult));

            //抓拍时间:年月日时分秒
            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);

            di.LastTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

            // 对上传的车牌含颜色,对其做处理
            string carNo = struITSPlateResult.struPlateInfo.sLicense;

            if (carNo.Length > 7)
            {
                carNo = carNo.Substring(carNo.Length - 7, 7);
            }



            //struITSPlateResult.struPlateInfo.sLicense 车牌号码

            //struITSPlateResult.byVehicleType
            //车型识别:0- 未知,1- 客车(大型),2- 货车(大型),3- 轿车(小型),4- 面包车,
            //5- 小货车,6- 行人,7- 二轮车,8- 三轮车,9- SUV/MPV,10- 中型客车

            //设置车辆类型
            string CarType = "Z";

            switch (struITSPlateResult.byVehicleType)
            {
            case 1:
            case 10:
                CarType = "K";
                break;

            case 2:
                CarType = "H";
                break;

            case 3:
            case 4:
            case 5:
            case 9:
                CarType = "X";
                break;
            }

            //设置车牌颜色
            string CarNocolor = "4";

            switch ((CHCNetSDK.VCA_PLATE_COLOR)struITSPlateResult.struPlateInfo.byColor)
            {
            case CHCNetSDK.VCA_PLATE_COLOR.VCA_BLUE_PLATE:    //蓝色车牌
                CarNocolor = "2";
                break;

            case CHCNetSDK.VCA_PLATE_COLOR.VCA_YELLOW_PLATE:    //黄色车牌
                CarNocolor = "1";
                break;

            case CHCNetSDK.VCA_PLATE_COLOR.VCA_WHITE_PLATE:    //白色车牌
                CarNocolor = "0";
                break;

            case CHCNetSDK.VCA_PLATE_COLOR.VCA_BLACK_PLATE:    //黑色车牌
                CarNocolor = "3";
                break;

            case CHCNetSDK.VCA_PLATE_COLOR.VCA_GREEN_PLATE:     //绿色车牌
                CarNocolor = "5";
                break;

            default:
                break;
            }

            //设置车辆方向
            //string CarDirection = struITSPlateResult.byDir == 1 ? "19" : "20";

            //使用触发的车道号来判断方向
            string CarDirection = struITSPlateResult.byDriveChan == 1 ? "19" : "20";

            //上传结果
            string stringAlarm = "[" + di.UnitName + "-" + di.DeviceAddress + "]抓拍上传," + "车牌:" + carNo + ",方向:" + (CarDirection == "19" ? "进入" : "离开");

            carservice.SaveCarInfo(di.DeviceName,
                                   carNo,
                                   strTimeYear,
                                   CarNocolor,
                                   CarType,
                                   CarDirection,
                                   imgBase64);

            if (OnShowInfoData != null)
            {
                OnShowInfoData(InfoType.抓拍信息, di, stringAlarm);
            }
        }
Exemple #2
0
 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);
 }
Exemple #3
0
 //海康回调函数
 public bool MsgCallbackHik(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer,
                            IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
 {
     return(true);
 }
            /// <summary>
            /// AI识别报警布放
            /// </summary>
            /// <param name="pAlarmer"></param>
            /// <param name="pAlarmInfo"></param>
            /// <param name="dwBufLen"></param>
            /// <param name="pUser"></param>
            private void ProcessCommAIOP_VIDEO(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
            {
                CHCNetSDK.NET_AIOP_VIDEO_HEAD struAiopVideoHead = new CHCNetSDK.NET_AIOP_VIDEO_HEAD();
                object temp = Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_AIOP_VIDEO_HEAD));

                struAiopVideoHead = (CHCNetSDK.NET_AIOP_VIDEO_HEAD)temp;
                // 报警信息
                string stringAI = "";
                uint   dwSize   = (uint)Marshal.SizeOf(struAiopVideoHead);
                //报警设备IP地址
                string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0').TrimEnd('\0');
                //报警时间:年月日时分秒
                string strTimeYear   = struAiopVideoHead.struTime.wYear.ToString();
                string strTimeMonth  = struAiopVideoHead.struTime.wMonth.ToString("d2");
                string strTimeDay    = struAiopVideoHead.struTime.wDay.ToString("d2");
                string strTimeHour   = struAiopVideoHead.struTime.wHour.ToString("d2");
                string strTimeMinute = struAiopVideoHead.struTime.wMinute.ToString("d2");
                string strTimeSecond = struAiopVideoHead.struTime.wSecond.ToString("d2");
                string strTime       = strTimeYear + "-" + strTimeMonth + "-" + strTimeDay + " " + strTimeHour + ":" + strTimeMinute + ":" + strTimeSecond;
                string szTaskID      = System.Text.Encoding.UTF8.GetString(struAiopVideoHead.szTaskID).TrimEnd('\0');
                string szMPID        = System.Text.Encoding.UTF8.GetString(struAiopVideoHead.szMPID).TrimEnd('\0');

                //var picSize = Marshal.PtrToStringAnsi(struAiopVideoHead.pBufferPictureSize);
                stringAI = "AI识别,报警触发时间:" + strTime + ",szTaskID:" + szTaskID + ",szMPID:" + szMPID;
                string fPath    = tmpFilePath + "picture\\";
                string filename = fPath + "UserID_" + pAlarmer.lUserID + "_AI开放平台检测报警_" + iFileNumber + ".jpg";

                //报警图片保存-对应分析图片数据
                if (struAiopVideoHead.dwPictureSize > 0)
                {
                    MkDir(fPath);
                    FileStream fs   = new FileStream(filename, FileMode.Create);
                    int        iLen = (int)struAiopVideoHead.dwPictureSize;
                    byte[]     by   = new byte[iLen];
                    Marshal.Copy(struAiopVideoHead.pBufferPictureSize, by, 0, iLen);
                    fs.Write(by, 0, iLen);
                    fs.Close();
                    iFileNumber++;
                    // 超过10个文件就清除文件夹
                }
                //AIOPData数据
                if (struAiopVideoHead.dwAIOPDataSize > 0)
                {
                    string AIOPData = Marshal.PtrToStringAnsi(struAiopVideoHead.pBufferAIOPData).TrimEnd('\0').TrimEnd('\0');
                    var    tIndex   = AIOPData.LastIndexOf("??");
                    string jsonStr  = AIOPData.Substring(0, tIndex);
                    if (!string.IsNullOrEmpty(jsonStr))
                    {
                        //var aiopJson = JsonHelper.DeserializeJsonToObject<object>(jsonStr);
                        //trainModelId: 8274
                        var    aiopJson = Newtonsoft.Json.Linq.JObject.Parse(jsonStr);
                        string url      = ConfigurationManager.AppSettings.Get("API_HIK_ALARM").ToString();
                        var    obj      = new
                        {
                            url  = url,
                            data = jsonStr
                        };
                        var postData = new Dictionary <string, string>()
                        {
                            { "time", strTime },
                            { "szTaskID", szTaskID },
                            { "szMPID", szMPID },
                            { "aiopJson", jsonStr },
                        };
                        var now = DateTime.Now;
                        if (isInit)
                        {
                            isInit = false;
                            AddAgManage(url, filename, postData);
                        }
                        else
                        {
                            TimeSpan ts1      = new TimeSpan(now.Ticks);
                            TimeSpan ts2      = new TimeSpan(dtExec.Ticks);
                            TimeSpan ts       = ts1.Subtract(ts2).Duration();
                            var      dateDiff = ts.Minutes;
                            //如果当前时间与采集时间的差值超过30分钟就采集
                            if (dateDiff >= AlarmIntervalTime)
                            {
                                AddAgManage(url, filename, postData);
                            }
                        }
                        //if (now.Hour >= DtStar.Hour && now.Hour <= DtEnd.Hour && now.Date == DtStar.Date)//开始时间和结束时间之间,并且是今天
                        //{
                        //    if (isInit)
                        //    {
                        //        isInit = false;
                        //        AddAgManage(url, filename, postData);
                        //    }
                        //    else
                        //    {

                        //        TimeSpan ts1 = new TimeSpan(now.Ticks);
                        //        TimeSpan ts2 = new TimeSpan(dtExec.Ticks);
                        //        TimeSpan ts = ts1.Subtract(ts2).Duration();
                        //        var dateDiff = ts.Minutes;
                        //        //如果当前时间与采集时间的差值超过30分钟就采集
                        //        if (dateDiff >= AlarmIntervalTime)
                        //        {
                        //            AddAgManage(url, filename, postData);
                        //        }
                        //    }
                        //}
                        if (iFileNumber > 10)
                        {
                            FileHelper.DeleteFolderFiles(fPath, "");
                            iFileNumber = 0;
                            //listViewAlarmInfo.Items.Clear();
                        }
                    }
                }
                WriteMsg(stringAI, "ok");
            }
Exemple #5
0
        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++;
            //}

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

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

            //车牌信息
            string stringPlateLicense = System.Text.Encoding.GetEncoding("GBK").GetString(struPlateResultInfo.struPlateInfo.sLicense).TrimEnd('\0').Replace("无车牌", "");

            if (!string.IsNullOrEmpty(stringPlateLicense))
            {
                if (stringPlateLicense.Length > 7)
                {
                    stringPlateLicense = stringPlateLicense.Substring(stringPlateLicense.Length - 7, 7);
                }
                if (OnReceived != null)
                {
                    OnReceived(stringPlateLicense, strIP);
                }
            }
        }
Exemple #6
0
        private void ProcessCommAlarm_Plate(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser, string commType)
        {
            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 strFilePath = "";

            //报警设备IP地址
            string strIP = pAlarmer.sDeviceIP;

            if (!Directory.Exists(m_OutputDir + strIP + "\\"))
            {
                Directory.CreateDirectory(m_OutputDir + strIP + "\\");
            }

            if (struPlateResultInfo.byResultType == 1 && struPlateResultInfo.dwPicLen != 0)
            {
                strFilePath = m_OutputDir + strIP + "\\" + pAlarmer.lUserID + "_近景图.jpg";
                FileStream fs   = new FileStream(strFilePath, 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();
            }
            if (struPlateResultInfo.dwPicPlateLen != 0)
            {
                strFilePath = m_OutputDir + strIP + "\\" + pAlarmer.lUserID + "_车牌图.jpg";
                FileStream fs   = new FileStream(strFilePath, 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();
            }
            if (struPlateResultInfo.dwFarCarPicLen != 0)
            {
                strFilePath = m_OutputDir + strIP + "\\" + pAlarmer.lUserID + "_远景图.jpg";
                FileStream fs   = new FileStream(strFilePath, 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();
            }

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

            //上传结果
            string stringAlarm = "抓拍上传," + "车牌:" + struPlateResultInfo.struPlateInfo.sLicense + ",车辆序号:" + struPlateResultInfo.struVehicleInfo.dwIndex;

            if (NoticeAlarmEvent != null)
            {
                string ccommType    = ObjectCopier.Clone <string>(commType);
                string cstrIP       = ObjectCopier.Clone <string>(strIP);
                string cstringAlarm = ObjectCopier.Clone <string>(stringAlarm);

                NoticeAlarmEvent(ccommType, DateTime.Now.ToString(), cstrIP, cstringAlarm);
            }
        }
Exemple #7
0
        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       = pAlarmer.sDeviceIP;
            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;
            }

            MessageBox.Show("ProcessCommAlarm:" + stringAlarm);
        }
        /// <summary>
        /// 越界侦测用的报警
        /// </summary>
        /// <param name="pAlarmer"></param>
        /// <param name="pAlarmInfo"></param>
        /// <param name="dwBufLen"></param>
        /// <param name="pUser"></param>
        private void ProcessCommAlarm_RULE(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            string strNvrIp = pAlarmer.sDeviceIP;//报警nvrIp地址

            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));
            byte channel = struRuleAlarmInfo.struDevInfo.byChannel;
            //报警设备IP地址
            string strIP = struRuleAlarmInfo.struDevInfo.struDevIP.sIpV4;
            //报警信息
            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);
                CHCNetSDK.NET_VCA_TRAVERSE_PLANE 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);
                CHCNetSDK.NET_VCA_AREA 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);
                CHCNetSDK.NET_VCA_INTRUSION m_struIntrusion = (CHCNetSDK.NET_VCA_INTRUSION)Marshal.PtrToStructure(ptrIntrusionInfo, typeof(CHCNetSDK.NET_VCA_INTRUSION));
                stringAlarm = "周界入侵,目标ID:" + struRuleAlarmInfo.struTargetInfo.dwID;
                //m_struIntrusion.struRegion 多边形区域坐标
                break;

            default:
                stringAlarm = "其他行为分析报警,目标ID:" + struRuleAlarmInfo.struTargetInfo.dwID;
                break;
            }


            //报警图片保存
            if (struRuleAlarmInfo.dwPicDataLen > 0)
            {
                FileStream fs   = new FileStream("行为分析报警抓图.jpg", 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();
            }

            //报警时间:年月日时分秒
            string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

            string theone   = "0";
            string name     = "";
            string position = "";

            try
            {
                //根据数据库找到theone、摄像头名称等内容
                //找到了目前这个函数通道所在的NVR,
                //然后根据通道号跟NVRip地址,找到摄像头
                string    srtSql = "IP地址 ='" + strIP + "'";
                DataRow[] dr     = StaticData.g_dtCamera.Select(srtSql);
                if (dr.Length > 0)
                {
                    theone   = dr[0]["theone"].ToString();
                    name     = dr[0]["摄像头名称"].ToString();
                    position = dr[0]["坐标"].ToString();
                }
                else
                {
                    // 处理获取非指定camaras错误回调后所产生的数据为空的异常情况
                    // 异常eg:  发现了非列表中的未知nvrip = “10.1.12.51”的设备
                    return;
                }
            }
            catch (Exception)
            {
                StaticUtils.ShowEventMsg("HikvisionAlarmCallBackFun.class-ProcessCommAlarm_RULE : 报警回调函数出现异常!\n");
                //throw;
            }

            //读取事件数据库,判断数据库是否存在该事件,且时间是否2分钟以上差别,存在且是的话插入新事件
            //不是的话更新endtime字段为当前时间
            //不存在的话直接插入数据,还需要插入个摄像头的位置,名称
            string[] paras = new string[2]
            {
                time, strNvrIp
            };
            string str_channel = Convert.ToString(channel);

            CheckEvent(name, theone, stringAlarm, DateTime.Now.ToString().Replace('/', '-'), position, name, paras, str_channel);
        }
        private void MsgCallback(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_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_ALARM_ACS://门禁主机报警上传
            //    ProcessCommAlarm_AcsAlarm(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
            //    break;
            //case CHCNetSDK.COMM_ID_INFO_ALARM://身份证刷卡信息上传
            //    ProcessCommAlarm_IDInfoAlarm(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
            //    break;
            default:
            {
                //报警设备IP地址
                string strIP = pAlarmer.sDeviceIP;

                //报警信息类型
                string stringAlarm = "报警上传,信息类型:" + lCommand;

                if (true)
                {
                    string[] paras = new string[3];
                    paras[0] = DateTime.Now.ToString();         //当前PC系统时间
                    paras[1] = strIP;
                    paras[2] = stringAlarm;
                    //            Console.WriteLine (paras[0] + " " + paras[1] + " " + paras[2]);
                }
                else
                {
                    //创建该控件的主线程直接更新信息列表
                    //UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
                }
            }
            break;
            }
        }
        private 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       = pAlarmer.sDeviceIP;
            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 (true)
            {
                string[] paras = new string[3];
                paras[0] = DateTime.Now.ToString(); //当前PC系统时间
                paras[1] = strIP;
                paras[2] = stringAlarm;
                //            Console.WriteLine(paras[0] + " " + paras[1] + " " + paras[2]);
            }
            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       = pAlarmer.sDeviceIP;
            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 - 32) + ",";
                    }
                }
                break;

            case 1:
                stringAlarm = "硬盘满,";
                for (i = 0; i < CHCNetSDK.MAX_DISKNUM_V30; i++)
                {
                    if (struAlarmInfoV30.byDiskNumber[i] == 1)
                    {
                        stringAlarm += (i + 1 - 32) + ",";
                    }
                }
                break;

            case 2:
                stringAlarm = "信号丢失,";
                for (i = 0; i < CHCNetSDK.MAX_CHANNUM_V30; i++)
                {
                    if (struAlarmInfoV30.byChannel[i] == 1)
                    {
                        stringAlarm += (i + 1 - 32) + ",";
                    }
                }
                break;

            case 3:
                stringAlarm = "移动侦测,";
                for (i = 0; i < CHCNetSDK.MAX_CHANNUM_V30; i++)       //MAX_CHANNUM_V30
                {
                    if (struAlarmInfoV30.byChannel[i] == 1)
                    {
                        stringAlarm += (i + 1 - 32) + ",";
                    }
                }
                break;

            case 4:
                stringAlarm = "硬盘未格式化,";
                for (i = 0; i < CHCNetSDK.MAX_DISKNUM_V30; i++)
                {
                    if (struAlarmInfoV30.byDiskNumber[i] == 1)
                    {
                        stringAlarm += (i + 1 - 32) + ",";
                    }
                }
                break;

            case 5:
                stringAlarm = "读写硬盘出错,";
                for (i = 0; i < CHCNetSDK.MAX_DISKNUM_V30; i++)
                {
                    if (struAlarmInfoV30.byDiskNumber[i] == 1)
                    {
                        stringAlarm += (i + 1 - 32) + ",";
                    }
                }
                break;

            case 6:
                stringAlarm = "遮挡报警,";
                for (i = 0; i < CHCNetSDK.MAX_CHANNUM_V30; i++)
                {
                    if (struAlarmInfoV30.byChannel[i] == 1)
                    {
                        stringAlarm += (i + 1 - 32) + ",";
                    }
                }
                break;

            case 7:
                stringAlarm = "制式不匹配,";
                for (i = 0; i < CHCNetSDK.MAX_CHANNUM_V30; i++)
                {
                    if (struAlarmInfoV30.byChannel[i] == 1)
                    {
                        stringAlarm += (i + 1 - 32) + ",";
                    }
                }
                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 - 32) + ",";
                    }
                }
                break;

            case 10:
                stringAlarm = "录像/抓图异常,";
                for (i = 0; i < CHCNetSDK.MAX_CHANNUM_V30; i++)
                {
                    if (struAlarmInfoV30.byChannel[i] == 1)
                    {
                        stringAlarm += (i + 1 - 32) + ",";
                    }
                }
                break;

            case 11:
                stringAlarm = "智能场景变化,";
                for (i = 0; i < CHCNetSDK.MAX_CHANNUM_V30; i++)
                {
                    if (struAlarmInfoV30.byChannel[i] == 1)
                    {
                        stringAlarm += (i + 1 - 32) + ",";
                    }
                }
                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 - 32) + ",";
                    }
                }
                break;

            case 15:
                stringAlarm = "智能侦测,";
                for (i = 0; i < CHCNetSDK.MAX_CHANNUM_V30; i++)
                {
                    if (struAlarmInfoV30.byChannel[i] == 1)
                    {
                        stringAlarm += (i + 1 - 32) + ",";
                    }
                }
                break;

            default:
                stringAlarm = "其他未知报警信息,";
                break;
            }
            //在这里为报警信息
            if (true)
            {
                string[] paras = new string[3];
                paras[0] = DateTime.Now.ToString();      //当前PC系统时间
                paras[1] = strIP;                        //nvrip地址
                paras[2] = stringAlarm;
                string[] alarmMsg = paras[2].Split(','); //报警类型和通道号
                //            Console.WriteLine(paras[0] + "," + paras[1] + "," + paras[2] + "\n");
                //根据数据库找到theone、摄像头名称等内容
                string theone   = "0";
                string name     = "";
                string position = "";
                try
                {
                    //根据数据库找到theone、摄像头名称等内容
                    //找到了目前这个函数通道所在的NVR,
                    //然后根据通道号跟NVRip地址,找到摄像头
                    string    srtSql = "NVRIP地址= '" + paras[1] + "'" + " and  通道号 ='" + alarmMsg[1] + "'";
                    DataRow[] dr     = StaticData.g_dtCamera.Select(srtSql);
                    if (dr.Length > 0)
                    {
                        theone   = dr[0]["theone"].ToString();
                        name     = dr[0]["摄像头名称"].ToString();
                        position = dr[0]["坐标"].ToString();
                    }
                    else
                    {
                        // 处理获取非指定camaras错误回调后所产生的数据为空的异常情况
                        // 异常eg:  发现了非列表中的未知nvrip = “10.1.12.51”的设备
                        return;
                    }
                }
                catch (Exception)
                {
                    StaticUtils.ShowEventMsg("HikvisionAlarmCallBackFun.class-ProcessCommAlarm_V30 : 报警回调函数出现异常!\n");
                    //throw;
                }

                //读取事件数据库,判断数据库是否存在该事件,且时间是否2分钟以上差别,存在且是的话插入新事件
                //不是的话更新endtime字段为当前时间
                //不存在的话直接插入数据,还需要插入个摄像头的位置,名称

                CheckEvent(name, theone, alarmMsg[0], DateTime.Now.ToString().Replace('/', '-'), position, name, paras, alarmMsg[1]);
            }
            else
            {
                //创建该控件的主线程直接更新信息列表
                //  UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);
            }
        }
        /// <summary>
        /// 回调函数
        /// </summary>
        /// <param name="lCommand">报警信息类型</param>
        /// <param name="pAlarmer"></param>
        /// <param name="pAlarmInfo"></param>
        /// <param name="dwBufLen"></param>
        /// <param name="pUser"></param>
        /// <returns></returns>
        private bool MSgCallback_V31(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            switch (lCommand)                     //不同的lCommand对应不同的pAlarmInfo内容
            {
            case CHCNetSDK.COMM_ITS_PLATE_RESULT: //交通抓拍结果上传(新类型)



            {
                #region 车头相片  第一部相机
                CHCNetSDK.NET_ITS_PLATE_RESULT struITSPlateResult2 = new CHCNetSDK.NET_ITS_PLATE_RESULT();
                uint dwSize2 = (uint)Marshal.SizeOf(struITSPlateResult2);
                struITSPlateResult2 = (CHCNetSDK.NET_ITS_PLATE_RESULT)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_ITS_PLATE_RESULT));
                int lChannel2 = 1;         //通道号 Channel number
                CHCNetSDK.NET_DVR_MakeKeyFrame(m_lUserID, lChannel2);

                //保存车头相片
                byte[] Carno  = struITSPlateResult2.struPlateInfo.sLicense; //车牌号码
                byte   roudNo = struITSPlateResult2.byDriveChan;            //车道号


                byte secondCam = struITSPlateResult2.bySecondCam;

                string carNumber    = System.Text.Encoding.Default.GetString(Carno);
                string nocar        = roudNo.ToString();
                string strSecondCam = secondCam.ToString();
                string chepaihao    = System.Text.Encoding.GetEncoding("GBK").GetString(struITSPlateResult2.struPlateInfo.sLicense).TrimEnd('\0');
                string headpath     = "F:\\VideoCapture\\picture\\NoCar.jpg";
                //保存抓拍图片
                for (int i = 0; i < struITSPlateResult2.dwPicNum; i++)
                {
                    if (struITSPlateResult2.struPicInfo[i].dwDataLen != 0)
                    {
                        // label7.Text = nocar;

                        //iFileNumber



                        string path = "F:\\VideoCapture\\picture";


                        if (System.IO.Directory.Exists(path) == false)
                        {
                            System.IO.Directory.CreateDirectory(path);
                        }

                        headpath = "\\" + "G" + chepaihao + "G2" + secondCam + ".jpg";
                        if (struITSPlateResult2.struPicInfo[i].byType == 1)
                        {
                            FileStream fs   = new FileStream(headpath, FileMode.Create);
                            int        iLen = (int)struITSPlateResult2.struPicInfo[i].dwDataLen;
                            byte[]     by   = new byte[iLen];
                            Marshal.Copy(struITSPlateResult2.struPicInfo[i].pBuffer, by, 0, iLen);
                            fs.Write(by, 0, iLen);
                            fs.Close();
                        }
                        iFileNumber++;
                    }
                }


                #endregion



                #region 保存视频 黑烟相机  第二部相机


                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));

                //获取黄色车牌才抓拍以及录视频



                //车牌颜色
                byte plateColor = struITSPlateResult.struPlateInfo.byColor;         //1黄色

                //录像保存路径和文件名 the path and file name to save
                string sVideoFileName;
                string path2 = "F:\\VideoCapture";
                if (System.IO.Directory.Exists(path2) == false)
                {
                    System.IO.Directory.CreateDirectory(path2);
                }
                sVideoFileName = "\\" + DateTime.Now.ToString("hhmmss") + ".mp4";



                //强制I帧 Make a I frame
                //  int lChannel = Int16.Parse(textBoxChannel.Text); //通道号 Channel number
                int lChannel = 2;         //通道号 Channel number
                CHCNetSDK.NET_DVR_MakeKeyFrame(m_lUserID2, lChannel);

                //开始录像 Start recording
                CHCNetSDK.NET_DVR_SaveRealData(m_lUserID2, sVideoFileName);
                Thread.Sleep(5000);
                //停止录像
                CHCNetSDK.NET_DVR_StopSaveRealData(m_lUserID2);
                #endregion


                #region  调用黑烟检测函数     如果满足要求将 先关信息存入到数据库

                string ss = HttpGet("http://192.168.200.8:5000/parse/");



                JsonReader reader = new JsonTextReader(new StringReader(ss));

                while (reader.Read())
                {
                    ss = reader.Value.ToString();
                }
                Console.WriteLine("处理后:" + ss);


                JArray jArray = (JArray)JsonConvert.DeserializeObject(ss);


                string vLicenceNo    = jArray[0]["vLicenceNo"].ToString();
                float  vLicenceNoCer = (float)Convert.ToDouble(jArray[0]["vLicenceNoCer"]);
                int    vRingelLevel  = Convert.ToInt32(jArray[0]["vRingelLevel"]);    //jArray[0]["vRingelLevel"].ToString();

                float  vRingelLevelCer = (float)Convert.ToDouble(jArray[0]["vRingelLevelCer"]);
                string vType           = jArray[0]["vType"].ToString();
                string vLicenceColor   = jArray[0]["vLicenceColor"].ToString();
                string vLicenceType    = jArray[0]["vLicenceType"].ToString();
                string vimage11        = jArray[0]["vImage1"].ToString();
                string vimage21        = jArray[0]["vImage2"].ToString();

                #endregion

                #region 保存数据



                DateTime vchecktime = System.DateTime.Now; //检测的时间
                string   vstation   = "文曲路";               //站点
                string   vno        = vLicenceNo;          //车牌号
                float    vnocer     = vLicenceNoCer;
                string   vcolor     = vLicenceColor;       //车牌颜色
                string   vtype      = vType;
                int      vroadno    = roudNo;
                string   vboadtype  = vLicenceType;
                float    vboardcer  = vLicenceNoCer; //车牌置信度
                int      vrigel     = vRingelLevel;  //林格曼黑度

                float  vrigelcer = vRingelLevelCer;  //置信度
                string vimage1   = vimage11;         //车尾照片1
                string vimage2   = vimage21;         //车尾照片2
                string vimage    = headpath;
                string vvideo    = sVideoFileName;


                Vehicle v = new Vehicle();
                v.vcheckdate      = vchecktime;
                v.vstationname    = vstation;
                v.vno             = vno;
                v.vboardcredi     = (float)vnocer;
                v.vcolor          = vcolor;
                v.vroadno         = vroadno;
                v.vboardtype      = vboadtype;
                v.vringelman      = vrigel;
                v.vringelmancredi = (float)vrigelcer;

                v.vimage1    = vimage1;
                v.vheadimage = vimage;
                v.vimage2    = vimage2;

                v.vvideo = vvideo;

                IVehicleBAL vehicleBAL = new ImVehicleBAL();
                if (vehicleBAL.AddVehicle(v) < 0)
                {
                    MessageBox.Show("添加失败");
                }



                #endregion
            }
            break;
            }

            return(true);
        }
Exemple #13
0
        private void ProcessCommAlarmACS(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            CHCNetSDK.NET_DVR_ACS_ALARM_INFO struAcsAlarmInfo = new CHCNetSDK.NET_DVR_ACS_ALARM_INFO();
            struAcsAlarmInfo = (CHCNetSDK.NET_DVR_ACS_ALARM_INFO)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_ACS_ALARM_INFO));
            CHCNetSDK.NET_DVR_LOG_V30 struFileInfo = new CHCNetSDK.NET_DVR_LOG_V30();
            struFileInfo.dwMajorType = struAcsAlarmInfo.dwMajor;
            struFileInfo.dwMinorType = struAcsAlarmInfo.dwMinor;
            char[] csTmp = new char[256];

            if (CHCNetSDK.MAJOR_ALARM == struFileInfo.dwMajorType)
            {
                TypeMap.AlarmMinorTypeMap(struFileInfo, csTmp);
            }
            else if (CHCNetSDK.MAJOR_OPERATION == struFileInfo.dwMajorType)
            {
                TypeMap.OperationMinorTypeMap(struFileInfo, csTmp);
            }
            else if (CHCNetSDK.MAJOR_EXCEPTION == struFileInfo.dwMajorType)
            {
                TypeMap.ExceptionMinorTypeMap(struFileInfo, csTmp);
            }
            else if (CHCNetSDK.MAJOR_EVENT == struFileInfo.dwMajorType)
            {
                TypeMap.EventMinorTypeMap(struFileInfo, csTmp);
            }

            String szInfo    = new String(csTmp).TrimEnd('\0');
            String szInfoBuf = null;

            szInfoBuf = szInfo;
            /**************************************************/
            String name = System.Text.Encoding.UTF8.GetString(struAcsAlarmInfo.sNetUser).TrimEnd('\0');

            for (int i = 0; i < struAcsAlarmInfo.sNetUser.Length; i++)
            {
                if (struAcsAlarmInfo.sNetUser[i] == 0)
                {
                    name = name.Substring(0, i);
                    break;
                }
            }
            /**************************************************/

            szInfoBuf = string.Format("{0} time:{1,4}-{2:D2}-{3} {4:D2}:{5:D2}:{6:D2}, [{7}]({8})", szInfo, struAcsAlarmInfo.struTime.dwYear, struAcsAlarmInfo.struTime.dwMonth,
                                      struAcsAlarmInfo.struTime.dwDay, struAcsAlarmInfo.struTime.dwHour, struAcsAlarmInfo.struTime.dwMinute, struAcsAlarmInfo.struTime.dwSecond,
                                      struAcsAlarmInfo.struRemoteHostAddr.sIpV4, name);

            if (struAcsAlarmInfo.struAcsEventInfo.byCardNo[0] != 0)
            {
                szInfoBuf = szInfoBuf + "+Card Number:" + System.Text.Encoding.UTF8.GetString(struAcsAlarmInfo.struAcsEventInfo.byCardNo).TrimEnd('\0');
            }
            String[] szCardType = { "normal card", "disabled card", "blacklist card", "night watch card", "stress card", "super card", "guest card" };
            byte     byCardType = struAcsAlarmInfo.struAcsEventInfo.byCardType;

            if (byCardType != 0 && byCardType <= szCardType.Length)
            {
                szInfoBuf = szInfoBuf + "+Card Type:" + szCardType[byCardType - 1];
            }

            if (struAcsAlarmInfo.struAcsEventInfo.dwCardReaderNo != 0)
            {
                szInfoBuf = szInfoBuf + "+Card Reader Number:" + struAcsAlarmInfo.struAcsEventInfo.dwCardReaderNo;
            }
            if (struAcsAlarmInfo.struAcsEventInfo.dwDoorNo != 0)
            {
                szInfoBuf = szInfoBuf + "+Door Number:" + struAcsAlarmInfo.struAcsEventInfo.dwDoorNo;
            }
            if (struAcsAlarmInfo.struAcsEventInfo.dwVerifyNo != 0)
            {
                szInfoBuf = szInfoBuf + "+Multiple Card Authentication Serial Number:" + struAcsAlarmInfo.struAcsEventInfo.dwVerifyNo;
            }
            if (struAcsAlarmInfo.struAcsEventInfo.dwAlarmInNo != 0)
            {
                szInfoBuf = szInfoBuf + "+Alarm Input Number:" + struAcsAlarmInfo.struAcsEventInfo.dwAlarmInNo;
            }
            if (struAcsAlarmInfo.struAcsEventInfo.dwAlarmOutNo != 0)
            {
                szInfoBuf = szInfoBuf + "+Alarm Output Number:" + struAcsAlarmInfo.struAcsEventInfo.dwAlarmOutNo;
            }
            if (struAcsAlarmInfo.struAcsEventInfo.dwCaseSensorNo != 0)
            {
                szInfoBuf = szInfoBuf + "+Event Trigger Number:" + struAcsAlarmInfo.struAcsEventInfo.dwCaseSensorNo;
            }
            if (struAcsAlarmInfo.struAcsEventInfo.dwRs485No != 0)
            {
                szInfoBuf = szInfoBuf + "+RS485 Channel Number:" + struAcsAlarmInfo.struAcsEventInfo.dwRs485No;
            }
            if (struAcsAlarmInfo.struAcsEventInfo.dwMultiCardGroupNo != 0)
            {
                szInfoBuf = szInfoBuf + "+Multi Recombinant Authentication ID:" + struAcsAlarmInfo.struAcsEventInfo.dwMultiCardGroupNo;
            }
            if (struAcsAlarmInfo.struAcsEventInfo.byCardReaderKind != 0)
            {
                szInfoBuf = szInfoBuf + "+CardReaderKind:" + struAcsAlarmInfo.struAcsEventInfo.byCardReaderKind.ToString();
            }
            if (struAcsAlarmInfo.struAcsEventInfo.wAccessChannel >= 0)
            {
                szInfoBuf = szInfoBuf + "+wAccessChannel:" + struAcsAlarmInfo.struAcsEventInfo.wAccessChannel;
            }
            if (struAcsAlarmInfo.struAcsEventInfo.dwEmployeeNo != 0)
            {
                szInfoBuf = szInfoBuf + "+EmployeeNo:" + struAcsAlarmInfo.struAcsEventInfo.dwEmployeeNo;
            }
            if (struAcsAlarmInfo.struAcsEventInfo.byDeviceNo != 0)
            {
                szInfoBuf = szInfoBuf + "+byDeviceNo:" + struAcsAlarmInfo.struAcsEventInfo.byDeviceNo.ToString();
            }
            if (struAcsAlarmInfo.struAcsEventInfo.wLocalControllerID >= 0)
            {
                szInfoBuf = szInfoBuf + "+wLocalControllerID:" + struAcsAlarmInfo.struAcsEventInfo.wLocalControllerID;
            }
            if (struAcsAlarmInfo.struAcsEventInfo.byInternetAccess >= 0)
            {
                szInfoBuf = szInfoBuf + "+byInternetAccess:" + struAcsAlarmInfo.struAcsEventInfo.byInternetAccess.ToString();
            }
            if (struAcsAlarmInfo.struAcsEventInfo.byType >= 0)
            {
                szInfoBuf = szInfoBuf + "+byType:" + struAcsAlarmInfo.struAcsEventInfo.byType.ToString();
            }
            if (struAcsAlarmInfo.struAcsEventInfo.bySwipeCardType != 0)
            {
                szInfoBuf = szInfoBuf + "+bySwipeCardType:" + struAcsAlarmInfo.struAcsEventInfo.bySwipeCardType.ToString();
            }
            //其它消息先不罗列了......

            if (struAcsAlarmInfo.dwPicDataLen > 0)
            {
                path = null;
                Random rand = new Random(unchecked ((int)DateTime.Now.Ticks));
                path = string.Format(@"C:/Picture/ACS_LocalTime{0}_{1}.bmp", szInfo, rand.Next());
                using (FileStream fs = new FileStream(path, FileMode.Create))
                {
                    int    iLen = (int)struAcsAlarmInfo.dwPicDataLen;
                    byte[] by   = new byte[iLen];
                    Marshal.Copy(struAcsAlarmInfo.pPicData, by, 0, iLen);
                    fs.Write(by, 0, iLen);
                    fs.Close();
                }
                szInfoBuf = szInfoBuf + "SavePath:" + path;
            }

            this.listViewAlarmInfo.BeginInvoke(new Action(() =>
            {
                ListViewItem Item = new ListViewItem();
                Item.Text         = (++m_lLogNum).ToString();
                Item.SubItems.Add(DateTime.Now.ToString());
                Item.SubItems.Add(szInfoBuf);
                this.listViewAlarmInfo.Items.Add(Item);
            }));
        }
Exemple #14
0
        private void ProcessCommAlarm_V30(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            MyDebugInfo AlarmInfo = new MyDebugInfo(DebugInfo);

            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 str;

            switch (struAlarmInfoV30.dwAlarmType)
            {
            case 0:
                this.BeginInvoke(AlarmInfo, "sensor alarm");
                break;

            case 1:
                this.BeginInvoke(AlarmInfo, "hard disk full");
                break;

            case 2:
                this.BeginInvoke(AlarmInfo, "video lost");
                break;

            case 3:
                str  = "";
                str += pAlarmer.sDeviceIP;
                str += " motion detection";
                this.BeginInvoke(AlarmInfo, str);
                break;

            case 4:
                this.BeginInvoke(AlarmInfo, "hard disk unformatted");
                break;

            case 5:
                this.BeginInvoke(AlarmInfo, "hard disk error");
                break;

            case 6:
                this.BeginInvoke(AlarmInfo, "tampering detection");
                break;

            case 7:
                this.BeginInvoke(AlarmInfo, "unmatched video output standard");
                break;

            case 8:
                this.BeginInvoke(AlarmInfo, "illegal operation");
                break;

            case 9:
                this.BeginInvoke(AlarmInfo, "videl Signal abnormal");
                break;

            case 10:
                this.BeginInvoke(AlarmInfo, "record abnormal");
                break;

            default:
                this.BeginInvoke(AlarmInfo, "Unknow alarm");
                break;
            }
        }
Exemple #15
0
        public void ProcessCommAlarm(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser, string commType)
        {
            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       = pAlarmer.sDeviceIP;
            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 (NoticeAlarmEvent != null)
            {
                string ccommType    = ObjectCopier.Clone <string>(commType);
                string cstrIP       = ObjectCopier.Clone <string>(strIP);
                string cstringAlarm = ObjectCopier.Clone <string>(stringAlarm);

                NoticeAlarmEvent(ccommType, DateTime.Now.ToString(), cstrIP, cstringAlarm);
            }
        }
Exemple #16
0
 private bool MsgCallback_V31(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
 {
     AlarmMessageHandle(lCommand, ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
     return(true);
 }
Exemple #17
0
        private void ProcessCommAlarm_RULE(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser, string commType)
        {
            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)
            {
                FileStream fs   = new FileStream(m_OutputDir + "行为分析报警抓图.jpg", 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();
            }

            //报警时间:年月日时分秒
            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 = struRuleAlarmInfo.struDevInfo.struDevIP.sIpV4;

            //将报警信息添加进列表
            if (NoticeAlarmEvent != null)
            {
                string ccommType    = ObjectCopier.Clone <string>(commType);
                string cstrIP       = ObjectCopier.Clone <string>(strIP);
                string cstrTime     = ObjectCopier.Clone <string>(strTime);
                string cstringAlarm = ObjectCopier.Clone <string>(stringAlarm);

                NoticeAlarmEvent(ccommType, cstrTime, cstrIP, cstringAlarm);
            }
        }
        private void UpdateXmlFile(CHCNetSDK.NET_DVR_ALARMER pAlarmer, CHCNetSDK.NET_VCA_FACESNAP_MATCH_ALARM struFaceMatchAlarm, string filePath,
                                   string fileName, Dictionary <string, string> imagePath)
        {
            try
            {
                Dictionary <string, string> keyValue = new Dictionary <string, string>();
                string nodeType   = string.Empty;
                string sex        = string.Empty;
                string telephone  = string.Empty;
                string personName = string.Empty;

                //抓拍时间:年月日时分秒
                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       = string.Format("{0}-{1}-{2} {3}:{4}:{5}", strTimeYear, strTimeMonth, strTimeDay, strTimeHour, strTimeMinute, strTimeSecond);

                //比对成功
                if ((struFaceMatchAlarm.struBlackListInfo.dwBlackListPicLen != 0) && (struFaceMatchAlarm.struBlackListInfo.pBuffer1 != IntPtr.Zero))
                {
                    nodeType = "compareSuccess";
                    string[] strArray = Encoding.Default.GetString(struFaceMatchAlarm.struBlackListInfo.struBlackListInfo.struAttribute.byName).Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries);

                    if (strArray != null && strArray.Length > 2)
                    {
                        personName = strArray[0].Split('\0')[0];
                        sex        = strArray[1].Split('\0')[0];
                        telephone  = strArray[2].Split('\0')[0];
                    }
                    else
                    {
                        personName = Encoding.Default.GetString(struFaceMatchAlarm.struBlackListInfo.struBlackListInfo.struAttribute.byName).Split(new char[] { '\0' }, StringSplitOptions.RemoveEmptyEntries)[0];
                    }
                }
                else
                {
                    nodeType = "compareFail";
                }

                if (nodeType == "compareSuccess") //比对成功要去重
                {
                    if (faceCompareInfoList != null && faceCompareInfoList.Count > 0)
                    {
                        List <FaceCompareInfo> selectList = faceCompareInfoList.FindAll(x => x.PersonName == personName);
                        if (selectList != null && selectList.Count > 0)
                        {
                            return;
                        }
                    }
                }

                keyValue.Add("caputerDeviceIp", struFaceMatchAlarm.struSnapInfo.struDevInfo.struDevIP.sIpV4);                                                    //抓拍设备
                keyValue.Add("channel", struFaceMatchAlarm.struSnapInfo.struDevInfo.byChannel.ToString());                                                       //通道号
                keyValue.Add("captureTime", strTime);                                                                                                            //抓拍时间
                keyValue.Add("similarityDegree", Convert.ToString(struFaceMatchAlarm.fSimilarity));                                                              //相似度
                keyValue.Add("personName", personName);                                                                                                          //姓名
                keyValue.Add("alarmTime", DateTime.Now.ToString());                                                                                              //报警时间
                keyValue.Add("alarmDeviceIp", pAlarmer.sDeviceIP);                                                                                               //报警设备
                keyValue.Add("sex", sex);                                                                                                                        //性别
                keyValue.Add("glasses", struFaceMatchAlarm.struSnapInfo.byGlasses == 1 ? "是" : (struFaceMatchAlarm.struSnapInfo.byGlasses == 2 ? "否" : "无法确认")); //眼镜
                keyValue.Add("faceScore", struFaceMatchAlarm.struSnapInfo.byFaceScore.ToString());                                                               //人脸清晰
                keyValue.Add("bigImage", imagePath["bigImage"]);                                                                                                 //抓拍大图
                keyValue.Add("faceImage", imagePath["faceImage"]);                                                                                               //抓拍头像
                keyValue.Add("compareImage", imagePath["compareImage"]);                                                                                         //人脸比对照片
                keyValue.Add("telePhone", telephone);                                                                                                            //电话

                bool isSuccess = ToolHelper.SaveXmlFile(filePath, fileName, keyValue, nodeType);

                if (isSuccess)
                {
                    if (nodeType == "compareSuccess")
                    {
                        FaceCompareInfo faceCompareInfoItem = new FaceCompareInfo();
                        faceCompareInfoItem.CaputerDeviceIp  = struFaceMatchAlarm.struSnapInfo.struDevInfo.struDevIP.sIpV4;
                        faceCompareInfoItem.Channel          = struFaceMatchAlarm.struSnapInfo.struDevInfo.byChannel.ToString();
                        faceCompareInfoItem.CaptureTime      = strTime;
                        faceCompareInfoItem.SimilarityDegree = Convert.ToString(struFaceMatchAlarm.fSimilarity);
                        faceCompareInfoItem.PersonName       = personName;
                        faceCompareInfoItem.AlarmTime        = DateTime.Now.ToString();
                        faceCompareInfoItem.AlarmDeviceIp    = pAlarmer.sDeviceIP;
                        faceCompareInfoItem.Sex          = sex;
                        faceCompareInfoItem.Glasses      = struFaceMatchAlarm.struSnapInfo.byGlasses == 1 ? "是" : (struFaceMatchAlarm.struSnapInfo.byGlasses == 2 ? "否" : "无法确认");
                        faceCompareInfoItem.FaceScore    = struFaceMatchAlarm.struSnapInfo.byFaceScore.ToString();
                        faceCompareInfoItem.BigImage     = imagePath["bigImage"];
                        faceCompareInfoItem.FaceImage    = imagePath["faceImage"];
                        faceCompareInfoItem.CompareImage = imagePath["compareImage"];
                        faceCompareInfoItem.TelePhone    = telephone;

                        faceCompareInfoList.Add(faceCompareInfoItem);

                        if (!timer1.Enabled)
                        {
                            timerCallBackAction(new object(), null);
                            timer1.Enabled = true;
                        }
                    }

                    if (!ToolHelper.SaveXmlFile(filePath, fileName, nodeType))
                    {
                        ToolHelper.RecordSystemErrorLog(this.GetType().ToString(), MethodBase.GetCurrentMethod().Name, "更新汇总XML文件失败", nodeType);
                    }
                }
                else
                {
                    ToolHelper.RecordSystemErrorLog(this.GetType().ToString(), MethodBase.GetCurrentMethod().Name, "更新XML文件失败", JsonConvert.SerializeObject(keyValue));
                }
            }
            catch (Exception ex)
            {
                ToolHelper.RecordSystemErrorLog(this.GetType().ToString(), MethodBase.GetCurrentMethod().Name, ex.Message, ex.StackTrace);
            }
        }
Exemple #19
0
        private void ProcessCommFace(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            uint  faceId  = 0;
            Image faceImg = null;

            try
            {
                CHCNetSDK.NET_VCA_FACESNAP_RESULT jpFacedetectAlarm = new CHCNetSDK.NET_VCA_FACESNAP_RESULT();
                uint dwSize = (uint)Marshal.SizeOf(jpFacedetectAlarm);
                jpFacedetectAlarm = (CHCNetSDK.NET_VCA_FACESNAP_RESULT)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_VCA_FACESNAP_RESULT));

                if (jpFacedetectAlarm.dwFacePicLen > 0)
                {
                    faceId = jpFacedetectAlarm.dwFacePicID;
                    int    iLen = (int)jpFacedetectAlarm.dwFacePicLen;
                    byte[] by   = new byte[iLen];
                    Marshal.Copy(jpFacedetectAlarm.pBuffer1, by, 0, iLen);

                    MemoryStream ms        = new MemoryStream(by);
                    Image        imgStream = Image.FromStream(ms);
                    faceImg = imgStream;

//                    Bitmap imgClone= (Bitmap) imgStream;
//                    faceImg = imgClone.Clone(new Rectangle(0,0, imgStream.Width, imgStream.Height), imgStream.PixelFormat);

//                    imgStream.Dispose();
//                    ms.Close();
                }
            }
            catch (Exception ex)
            {
                ShowMsgEvent("ProcessCommFace Get Image From CHC Error:", ex);
            }

            if (null != faceImg)
            {
                Monitor.Enter(catchFaceImageMap);

                if (catchFaceImageMap.ContainsKey(faceId))
                {
                    CatchFaceInfo catchInfo = catchFaceImageMap[faceId];

                    if (catchInfo.faceImgSet.Count < detectImgCount)
                    {
                        catchInfo.faceImgSet.Add(faceImg);
                    }
                }
                else
                {
                    CatchFaceInfo catchInfo = new CatchFaceInfo();
                    catchInfo.faceImgSet = new List <Image>();
                    catchInfo.faceImgSet.Add(faceImg);
                    catchInfo.catchTime = DateTime.Now;
                    //放入队列
                    catchFaceImageMap.Add(faceId, catchInfo);

//                    countCHC++;
//                    ShowCountEvent(2, countCHC);

                    ShowCountEvent(4, catchFaceImageMap.Count);
                }

                Monitor.Exit(catchFaceImageMap);
            }
        }
Exemple #20
0
        public uint ProcessCommAlarm_ITSPlate(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
            DateTime dtS = DateTime.Now;

            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));
            TimeSpan ts = DateTime.Now - dtS;

            Log.WritePlateLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + " 摄像机抓拍完成时间1:" + ts.TotalMilliseconds + "\r\n");
            MF.CameraCanpost.WaitOne(1000);
            MF.AddOperLogCacheStr("进入报警布防回调函数,图片" + struITSPlateResult.dwPicNum.ToString() + "张..");
            string res  = "成功";
            int    iLen = (int)struITSPlateResult.struPicInfo[0].dwDataLen;

            byte[] by = new byte[iLen];
            if (iLen > 0)
            {
                res = "成功";
            }
            else
            {
                res = "失败";
            }
            MF.AddOperLogCacheStr("取图返回:" + res);
            if (struITSPlateResult.struPlateInfo.sLicense.Equals("无车牌"))
            {
                GetPlateNo = "未检测";
            }
            else
            {
                string temp = "";
                switch (struITSPlateResult.struPlateInfo.byColor)
                {
                case 0:
                    temp = "蓝";
                    break;

                case 1:
                    temp = "黄";
                    break;

                case 2:
                    temp = "白";
                    break;

                case 3:
                    temp = "黑";
                    break;

                case 4:
                    temp = "绿";
                    break;

                default:
                    break;
                }
                GetPlateNo = struITSPlateResult.struPlateInfo.sLicense;
            }
            if (GetPlateNo.Equals(""))
            {
                GetPlateNo = "无牌车";
            }
            MF.AddOperLogCacheStr("车牌: " + GetPlateNo);
            GetVehicleLogoRecog = "";
            GetVehicleLogoRecog = CHCNetSDK.VLR_VEHICLE_CLASS[struITSPlateResult.struVehicleInfo.byVehicleLogoRecog];
            FlieClass fc          = new FlieClass();
            string    dirpath     = GlobalMember.SavePicPath + "\\";
            DateTime  forcetimedt = DateTime.Now;
            string    forcetime   = forcetimedt.ToString("yyyyMMddHHmmss");
            string    imagename   = forcetime + GetPlateNo + ".bmp";

            dirpath  += DateTime.Now.Year.ToString();
            dirpath  += "年\\";
            dirpath  += DateTime.Now.Month.ToString();
            dirpath  += "月\\";
            dirpath  += DateTime.Now.Day.ToString();
            dirpath  += "日\\";
            imagepath = dirpath + imagename;
            //暂时放这里
            ts = DateTime.Now - dtS;
            Log.WritePlateLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + " 摄像机抓拍完成时间2:" + ts.TotalMilliseconds + "\r\n");

            Marshal.Copy(struITSPlateResult.struPicInfo[0].pBuffer, by, 0, iLen);
            try
            {
                if (true == fc.WriteFileImage(dirpath, imagename, by, 0, iLen))
                {
                    //MF.CameraCanpost.WaitOne(300);
                    MF.CameraPicture.Set();
                    ts = DateTime.Now - dtS;
                    Log.WritePlateLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff") + " 摄像机抓拍完成时间3:" + ts.TotalMilliseconds + "\r\n");
                }
                else
                {
                    MF.AddOperLogCacheStr("保存车牌图片失败!");
                    return(1);
                }
            }
            catch (Exception)
            {
                MF.AddOperLogCacheStr("保存车牌图片失败!");
                return(1);
            }
            //MF.CameraCanpost.Reset();
            return(0);
        }
Exemple #21
0
        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       = pAlarmer.sDeviceIP;
            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;
            }

            MessageBox.Show("ProcessCommAlarm_V30:" + stringAlarm);
        }
Exemple #22
0
        private 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 = pAlarmer.sDeviceIP;
            // string stringAlarm = "";
            int i = 0;

            switch (struAlarmInfo.dwAlarmType)
            {
            case 0:
                log.Info(string.Format("端口{0}输出报警。", struAlarmInfo.dwAlarmInputNumber));
                foreach (Device di in _curIOconfig.InDeviceList)
                {
                    if (struAlarmInfo.dwAlarmInputNumber.ToString() == di.Port)
                    {
                        lock (di)
                        {
                            //System.Diagnostics.Debug.WriteLine(string.Format("报警端口:{0}。时间:{1}",di.Port, di.ReceiveSignalTime));
                            di.ReceiveSignalTime = DateTime.Now;
                        }
                        //if (di.Port == "0")
                        //{
                        //    System.Diagnostics.Debug.WriteLine(string.Format("报警时间:{0}", di.ReceiveSignalTime));
                        //}
                        break;
                    }
                }
                //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;
            }
        }