Exemplo n.º 1
0
        public void Query_CameraStatus_Info(Action <string> sendCameraStatus)
        {
            //Stopwatch sp = new Stopwatch();
            //sp.Start();
            if (!isLoaddeviceInfo)
            {
                return;
            }
            StationList station = deviceInfo.StationList.Find(_ => _.PStationID == null);

            if (station == null)
            {
                return;
            }
            cameraStatusList.Clear();

            //LogServerManager.AddRunLog(OperationType.System, "查询本级摄像机状态");
            Dictionary <string, HikSdkManager.UserID_m_lAlarmHandle> userIDDic = hikSdkManager.GetUserIDDic();
            List <Task> taskList = new List <Task>();

            foreach (var streamMedia in deviceInfo.StreamMediaList.Where(_ => _.StationID == station.StationID))
            {
                taskList.Add(Task.Run(() =>
                {
                    bool isGetDVRConfig    = false;
                    bool isGetDVRWorkstate = false;
                    if (!userIDDic.ContainsKey(streamMedia.VideoIP))//设备未登陆成功
                    {
                        foreach (var camera in deviceInfo.CameraList.FindAll(_ => _.StreamMedia_DeviceID == streamMedia.DeviceID))
                        {
                            CameraStatusList newCameraStatus = new CameraStatusList();
                            newCameraStatus.DeviceID         = camera.DeviceID;
                            newCameraStatus.Name             = camera.VideoName;
                            newCameraStatus.IsOnline         = false;
                            newCameraStatus.Time             = DateTime.Now;
                            cameraStatusList.Add(newCameraStatus);
                        }
                        //continue;
                    }
                    else
                    {
                        HikSdkManager.UserID_m_lAlarmHandle userInfo = userIDDic[streamMedia.VideoIP];
                        uint dwDChanTotalNum = (uint)userInfo.deviceInfo.byIPChanNum + 256 * (uint)userInfo.deviceInfo.byHighDChanNum;
                        #region 旧的设备状态需求
                        //uint dwSize = (uint)Marshal.SizeOf(m_struIpParaCfgV40);
                        //IntPtr ptrIpParaCfgV40 = Marshal.AllocHGlobal((Int32)dwSize);
                        //Marshal.StructureToPtr(m_struIpParaCfgV40, ptrIpParaCfgV40, false);
                        //uint dwReturn = 0;
                        //int iGroupNo = 0;  //该Demo仅获取第一组64个通道,如果设备IP通道大于64路,需要按组号0~i多次调用NET_DVR_GET_IPPARACFG_V40获取
                        //if (!CHCNetSDK.NET_DVR_GetDVRConfig(userInfo.UserID, CHCNetSDK.NET_DVR_GET_IPPARACFG_V40, iGroupNo, ptrIpParaCfgV40, dwSize, ref dwReturn))
                        //{
                        //    uint iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                        //    string errContent = "NET_DVR_GET_IPPARACFG_V40 failed, error code= " + iLastErr;
                        //    //获取IP资源配置信息失败,输出错误号 Failed to get configuration of IP channels and output the error code
                        //    LogServerManager.AddErrLog(ErrLogType.InterfaceErr, null, this.GetType().ToString(), "Query_CameraStatus_Info", errContent);
                        //}
                        //else
                        //{
                        //    m_struIpParaCfgV40 = (CHCNetSDK.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(CHCNetSDK.NET_DVR_IPPARACFG_V40));
                        //    uint dwAChanTotalNum = (uint)userInfo.deviceInfo.byChanNum;
                        //    uint dwDChanTotalNum = (uint)userInfo.deviceInfo.byIPChanNum + 256 * (uint)userInfo.deviceInfo.byHighDChanNum;
                        //    if (dwDChanTotalNum > 0)
                        //    {
                        //        byte byStreamType = 0;
                        //        foreach (var camera in deviceInfo.CameraList.FindAll(_ => _.StreamMedia_DeviceID == streamMedia.DeviceID))
                        //        {
                        //            int videoChannel = camera.VideoChannel - 33;//实际通道号
                        //            byStreamType = m_struIpParaCfgV40.struStreamMode[videoChannel].byGetStreamType;
                        //            dwSize = (uint)Marshal.SizeOf(m_struIpParaCfgV40.struStreamMode[videoChannel].uGetStream);
                        //            CameraStatusList newCameraStatus = new CameraStatusList();
                        //            switch (byStreamType)
                        //            {
                        //                //目前NVR仅支持直接从设备取流 NVR supports only the mode: get stream from device directly
                        //                case 0:
                        //                    IntPtr ptrChanInfo = Marshal.AllocHGlobal((Int32)dwSize);
                        //                    Marshal.StructureToPtr(m_struIpParaCfgV40.struStreamMode[videoChannel].uGetStream, ptrChanInfo, false);
                        //                    m_struChanInfo = (CHCNetSDK.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK.NET_DVR_IPCHANINFO));

                        //                    dwSize = (uint)Marshal.SizeOf(m_struCompressionCfgV30);
                        //                    IntPtr ptrCompressionCfgV30 = Marshal.AllocHGlobal((Int32)dwSize);
                        //                    Marshal.StructureToPtr(m_struCompressionCfgV30, ptrCompressionCfgV30, false);
                        //                    CHCNetSDK.NET_DVR_COMPRESSION_INFO_V30 m_struCompressionInfoV30 = new CHCNetSDK.NET_DVR_COMPRESSION_INFO_V30();
                        //                    if (!CHCNetSDK.NET_DVR_GetDVRConfig(userInfo.UserID, CHCNetSDK.NET_DVR_GET_COMPRESSCFG_V30, camera.VideoChannel, ptrCompressionCfgV30, dwSize, ref dwReturn))
                        //                    {
                        //                        uint iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                        //                        string errContent = "NET_DVR_GET_COMPRESSCFG_V30 failed, error code= " + iLastErr;
                        //                        //获取IP资源配置信息失败,输出错误号 Failed to get configuration of IP channels and output the error code
                        //                        LogServerManager.AddErrLog(ErrLogType.InterfaceErr, null, this.GetType().ToString(), "Query_CameraStatus_Info", errContent);
                        //                    }
                        //                    else
                        //                    {
                        //                        m_struCompressionCfgV30 = (CHCNetSDK.NET_DVR_COMPRESSIONCFG_V30)Marshal.PtrToStructure(ptrCompressionCfgV30, typeof(CHCNetSDK.NET_DVR_COMPRESSIONCFG_V30));
                        //                        m_struCompressionInfoV30 = m_struCompressionCfgV30.struNormHighRecordPara;
                        //                    }
                        //                    newCameraStatus.DeviceID = camera.DeviceID;
                        //                    newCameraStatus.Name = camera.VideoName;
                        //                    //newCameraStatus.IsOnline = BitConverter.ToBoolean(new byte[] { m_struChanInfo.byEnable }, 0);
                        //                    //newCameraStatus.NetStatus = newCameraStatus.IsOnline;
                        //                    //newCameraStatus.ImgStatus = newCameraStatus.IsOnline ? 2 : 0;
                        //                    //newCameraStatus.ImgQuality = m_struCompressionInfoV30.byPicQuality;
                        //                    //newCameraStatus.BitStream = bitStreamDic[m_struCompressionInfoV30.dwVideoBitrate];
                        //                    newCameraStatus.Time = DateTime.Now;
                        //                    cameraStatusList.Add(newCameraStatus);

                        //                    Marshal.FreeHGlobal(ptrChanInfo);
                        //                    break;
                        //                case 6:
                        //                    IntPtr ptrChanInfoV40 = Marshal.AllocHGlobal((Int32)dwSize);
                        //                    Marshal.StructureToPtr(m_struIpParaCfgV40.struStreamMode[videoChannel].uGetStream, ptrChanInfoV40, false);
                        //                    m_struChanInfoV40 = (CHCNetSDK.NET_DVR_IPCHANINFO_V40)Marshal.PtrToStructure(ptrChanInfoV40, typeof(CHCNetSDK.NET_DVR_IPCHANINFO_V40));

                        //                    Marshal.FreeHGlobal(ptrChanInfoV40);
                        //                    break;
                        //                default:
                        //                    break;
                        //            }
                        //        }
                        //    }
                        //    else
                        //    {
                        //        foreach (var camera in deviceInfo.CameraList.FindAll(_ => _.StreamMedia_DeviceID == streamMedia.DeviceID))
                        //        {
                        //            CameraStatusList newCameraStatus = new CameraStatusList();
                        //            newCameraStatus.DeviceID = camera.DeviceID;
                        //            newCameraStatus.Name = camera.VideoName;
                        //            //newCameraStatus.IsOnline = true;
                        //            //newCameraStatus.NetStatus = newCameraStatus.IsOnline;
                        //            //newCameraStatus.ImgStatus = 0;
                        //            //newCameraStatus.ImgQuality = 0;
                        //            newCameraStatus.Time = DateTime.Now;
                        //            cameraStatusList.Add(newCameraStatus);
                        //        }
                        //    }
                        //}
                        #endregion

                        CHCNetSDK.NET_DVR_IPPARACFG_V40 m_struIpParaCfgV40 = new CHCNetSDK.NET_DVR_IPPARACFG_V40();
                        uint dwSizeIpParaCfgV40 = (uint)Marshal.SizeOf(m_struIpParaCfgV40);
                        IntPtr ptrIpParaCfgV40  = Marshal.AllocHGlobal((Int32)dwSizeIpParaCfgV40);
                        Marshal.StructureToPtr(m_struIpParaCfgV40, ptrIpParaCfgV40, false);
                        uint dwReturn = 0;
                        int iGroupNo  = 0;       //该Demo仅获取第一组64个通道,如果设备IP通道大于64路,需要按组号0~i多次调用NET_DVR_GET_IPPARACFG_V40获取

                        if (dwDChanTotalNum > 0) //数字通道
                        {
                            if (!CHCNetSDK.NET_DVR_GetDVRConfig(userInfo.UserID, CHCNetSDK.NET_DVR_GET_IPPARACFG_V40, iGroupNo, ptrIpParaCfgV40, dwSizeIpParaCfgV40, ref dwReturn))
                            {
                                uint iLastErr     = CHCNetSDK.NET_DVR_GetLastError();
                                string errContent = "NET_DVR_GET_IPPARACFG_V40 failed, error code= " + iLastErr;
                                //获取IP资源配置信息失败,输出错误号 Failed to get configuration of IP channels and output the error code
                                LogServerManager.AddErrLog(ErrLogType.InterfaceErr, null, this.GetType().ToString(), "Query_CameraStatus_Info", errContent);
                                isGetDVRConfig = false;
                            }
                            else
                            {
                                m_struIpParaCfgV40 = (CHCNetSDK.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(CHCNetSDK.NET_DVR_IPPARACFG_V40));
                                Marshal.FreeHGlobal(ptrIpParaCfgV40);
                                isGetDVRConfig = true;
                            }
                        }

                        CHCNetSDK.NET_DVR_WORKSTATE_V30 struDvrWorkstate = new CHCNetSDK.NET_DVR_WORKSTATE_V30();
                        uint dwSizeDvrWorkstate = (uint)Marshal.SizeOf(struDvrWorkstate);
                        IntPtr ptrDvrWorkstate  = Marshal.AllocHGlobal((int)dwSizeDvrWorkstate);
                        Marshal.StructureToPtr(struDvrWorkstate, ptrDvrWorkstate, false);
                        if (!CHCNetSDK.NET_DVR_GetDVRWorkState_V30(userInfo.UserID, ptrDvrWorkstate))
                        {
                            uint iLastErr     = CHCNetSDK.NET_DVR_GetLastError();
                            string errContent = "NET_DVR_GetDVRWorkState_V30 failed, error code= " + iLastErr;
                            //获取IP资源配置信息失败,输出错误号 Failed to get configuration of IP channels and output the error code
                            LogServerManager.AddErrLog(ErrLogType.InterfaceErr, null, this.GetType().ToString(), "Query_CameraStatus_Info", errContent);
                            isGetDVRWorkstate = false;
                        }
                        else
                        {
                            struDvrWorkstate = (CHCNetSDK.NET_DVR_WORKSTATE_V30)Marshal.PtrToStructure(ptrDvrWorkstate, typeof(CHCNetSDK.NET_DVR_WORKSTATE_V30));
                            Marshal.FreeHGlobal(ptrDvrWorkstate);
                            isGetDVRWorkstate = true;
                        }

                        foreach (var camera in deviceInfo.CameraList.FindAll(_ => _.StreamMedia_DeviceID == streamMedia.DeviceID))
                        {
                            int channelNum = camera.VideoChannel - 1;
                            CameraStatusList newCameraStatus = new CameraStatusList();
                            newCameraStatus.DeviceID         = camera.DeviceID;
                            newCameraStatus.Name             = camera.VideoName;
                            if (dwDChanTotalNum > 0 && isGetDVRConfig)         //有数字通道且获取到了配置信息
                            {
                                int videoChannel   = camera.VideoChannel - 33; //实际通道号
                                byte byStreamType  = m_struIpParaCfgV40.struStreamMode[videoChannel].byGetStreamType;
                                uint dwSizeStream  = (uint)Marshal.SizeOf(m_struIpParaCfgV40.struStreamMode[videoChannel].uGetStream);
                                IntPtr ptrChanInfo = Marshal.AllocHGlobal((int)dwSizeStream);
                                Marshal.StructureToPtr(m_struIpParaCfgV40.struStreamMode[videoChannel].uGetStream, ptrChanInfo, false);
                                CHCNetSDK.NET_DVR_IPCHANINFO m_struChanInfo = (CHCNetSDK.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK.NET_DVR_IPCHANINFO));
                                newCameraStatus.IsOnline = BitConverter.ToBoolean(new byte[] { m_struChanInfo.byEnable }, 0);
                                Marshal.FreeHGlobal(ptrChanInfo);
                            }
                            else if (dwDChanTotalNum > 0 && !isGetDVRConfig)//有数字通道但未获取到了配置信息
                            {
                                newCameraStatus.IsOnline = false;
                            }
                            else//模拟通道默认都在线
                            {
                                newCameraStatus.IsOnline = true;
                            }
                            if (isGetDVRWorkstate)
                            {
                                newCameraStatus.RecordStatus   = struDvrWorkstate.struChanStatic[channelNum].byRecordStatic + 1;
                                newCameraStatus.SignalStatus   = struDvrWorkstate.struChanStatic[channelNum].bySignalStatic + 1;
                                newCameraStatus.HardwareStatus = struDvrWorkstate.struChanStatic[channelNum].byHardwareStatic + 1;
                                newCameraStatus.BitRate        = (int)struDvrWorkstate.struChanStatic[channelNum].dwBitRate;
                            }
                            newCameraStatus.Time = DateTime.Now;
                            cameraStatusList.Add(newCameraStatus);
                        }
                    }
                }));
            }

            Task.WaitAll(taskList.ToArray());
            string jsonContent = JsonConvert.SerializeObject(cameraStatusList);
            sendCameraStatus(jsonContent);

            //sp.Stop();
            //Console.WriteLine(sp.Elapsed);
        }