Exemple #1
0
        /// <summary>
        /// 根据ip返回通道号
        /// </summary>
        /// <param name="_sIp">摄像机ip</param>
        /// <param name="sStreamIp">流媒体服务器ip(海康)</param>
        private int RetChannelWithIp(string _sIp, string sStreamIp)
        {
            int iChannel = -1;

            if (m_lstSaveHikChannelInfo.Count > 0)
            {
                for (int i = 0; i < m_lstSaveHikChannelInfo.Count; i++)
                {
                    if (m_lstSaveHikChannelInfo[i].m_sStreamIp == sStreamIp)
                    {
                        for (int j = 0; j < m_lstSaveHikChannelInfo[i].m_lstHikChannelInfo.Count; j++)
                        {
                            for (int z = 0; z < m_lstSaveHikChannelInfo[i].m_lstHikChannelInfo[j].struIPDevInfo.Length; z++)
                            {
                                uint   dwSize      = (uint)Marshal.SizeOf(m_lstSaveHikChannelInfo[i].m_lstHikChannelInfo[j].struStreamMode[z].uGetStream);
                                IntPtr ptrChanInfo = Marshal.AllocHGlobal((Int32)dwSize);
                                Marshal.StructureToPtr(m_lstSaveHikChannelInfo[i].m_lstHikChannelInfo[j].struStreamMode[z].uGetStream, ptrChanInfo, false);

                                CHCNetSDK.NET_DVR_IPCHANINFO m_struChanInfo = (CHCNetSDK.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK.NET_DVR_IPCHANINFO));
                                int iDevId = Convert.ToInt32(m_struChanInfo.byIPID) + Convert.ToInt32(m_struChanInfo.byIPIDHigh) * 256;
                                if (iDevId > 0)
                                {
                                    if (_sIp == m_lstSaveHikChannelInfo[i].m_lstHikChannelInfo[j].struIPDevInfo[iDevId - 1].struIP.sIpV4)
                                    {
                                        iChannel = z + 1;
                                        return(iChannel);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return(iChannel);
        }
        public void InfoIPChannel()
        {
            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(m_lUserID, CHCNetSDK.NET_DVR_GET_IPPARACFG_V40, iGroupNo, ptrIpParaCfgV40, dwSize, ref dwReturn))
            {
                iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                str1     = "NET_DVR_GET_IPPARACFG_V40 failed, error code= " + iLastErr; //获取IP资源配置信息失败,输出错误号
                MessageBox.Show(str1);
            }
            else
            {
                // succ
                m_struIpParaCfgV40 = (CHCNetSDK.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(CHCNetSDK.NET_DVR_IPPARACFG_V40));

                for (i = 0; i < dwAChanTotalNum; i++)
                {
                    ListAnalogChannel(i + 1, m_struIpParaCfgV40.byAnalogChanEnable[i]);
                    iChannelNum[i] = i + (int)DeviceInfo.byStartChan;
                }

                byte byStreamType;
                uint iDChanNum = 64;

                if (dwDChanTotalNum < 64)
                {
                    iDChanNum = dwDChanTotalNum; //如果设备IP通道小于64路,按实际路数获取
                }

                for (i = 0; i < iDChanNum; i++)
                {
                    iChannelNum[i + dwAChanTotalNum] = i + (int)m_struIpParaCfgV40.dwStartDChan;

                    byStreamType     = m_struIpParaCfgV40.struStreamMode[i].byGetStreamType;
                    m_unionGetStream = m_struIpParaCfgV40.struStreamMode[i].uGetStream;

                    switch (byStreamType)
                    {
                    //目前NVR仅支持0- 直接从设备取流一种方式
                    case 0:
                        dwSize = (uint)Marshal.SizeOf(m_unionGetStream);
                        IntPtr ptrChanInfo = Marshal.AllocHGlobal((Int32)dwSize);
                        Marshal.StructureToPtr(m_unionGetStream, ptrChanInfo, false);
                        m_struChanInfo = (CHCNetSDK.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK.NET_DVR_IPCHANINFO));

                        //列出IP通道
                        ListIPChannel(i + 1, m_struChanInfo.byEnable, m_struChanInfo.byIPID);
                        Marshal.FreeHGlobal(ptrChanInfo);
                        break;

                    default:
                        break;
                    }
                }
            }
            Marshal.FreeHGlobal(ptrIpParaCfgV40);
        }
        /***获取通道***/
        public void GetDevChanList()
        {
            int    i = 0, j = 0;
            string str;

            m_struChanNoInfo.Init();

            if (m_struDeviceInfo.byIPChanNum > 0)
            {
                uint dwSize = (uint)Marshal.SizeOf(m_struIpParaCfgV40);

                IntPtr ptrIpParaCfgV40 = Marshal.AllocHGlobal((Int32)dwSize);
                Marshal.StructureToPtr(m_struIpParaCfgV40, ptrIpParaCfgV40, false);

                uint dwReturn = 0;
                if (!CHCNetSDK.NET_DVR_GetDVRConfig(m_lUserID, CHCNetSDK.NET_DVR_GET_IPPARACFG_V40, -1, ptrIpParaCfgV40, dwSize, ref dwReturn))
                {
                    iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                    strErr   = "NET_DVR_GET_IPPARACFG_V40 failed, error code= " + iLastErr;
                    //获取IP通道信息失败,输出错误号 Failed to Get IP Channel info and output the error code
                    MessageBox.Show(strErr);
                }
                else
                {
                    m_struIpParaCfgV40 = (CHCNetSDK.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(CHCNetSDK.NET_DVR_IPPARACFG_V40));

                    //获取可用的模拟通道
                    for (i = 0; i < m_struIpParaCfgV40.dwAChanNum; i++)
                    {
                        if (m_struIpParaCfgV40.byAnalogChanEnable[i] == 1)
                        {
                            str = String.Format("通道{0}", i + 1);
                            comboBoxChan.Items.Add(str);
                            m_struChanNoInfo.lChannelNo[j] = i + m_struDeviceInfo.byStartChan;
                            j++;
                        }
                    }

                    //获取在线的IP通道
                    byte byStreamType;
                    for (i = 0; i < m_struIpParaCfgV40.dwDChanNum; i++)
                    {
                        byStreamType = m_struIpParaCfgV40.struStreamMode[i].byGetStreamType;
                        CHCNetSDK.NET_DVR_STREAM_MODE m_struStreamMode = new CHCNetSDK.NET_DVR_STREAM_MODE();
                        dwSize = (uint)Marshal.SizeOf(m_struStreamMode);
                        switch (byStreamType)
                        {
                        //0- 直接从设备取流 0- get stream from device directly
                        case 0:
                            IntPtr ptrChanInfo = Marshal.AllocHGlobal((Int32)dwSize);
                            Marshal.StructureToPtr(m_struIpParaCfgV40.struStreamMode[i].uGetStream, ptrChanInfo, false);
                            CHCNetSDK.NET_DVR_IPCHANINFO m_struChanInfo = new CHCNetSDK.NET_DVR_IPCHANINFO();
                            m_struChanInfo = (CHCNetSDK.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK.NET_DVR_IPCHANINFO));

                            //列出IP通道 List the IP channel
                            if (m_struChanInfo.byEnable == 1)
                            {
                                str = String.Format("IP通道{0}", i + 1);
                                comboBoxChan.Items.Add(str);
                                m_struChanNoInfo.lChannelNo[j] = i + (int)m_struIpParaCfgV40.dwStartDChan;
                                j++;
                            }
                            Marshal.FreeHGlobal(ptrChanInfo);
                            break;

                        //6- 直接从设备取流扩展 6- get stream from device directly(extended)
                        case 6:
                            IntPtr ptrChanInfoV40 = Marshal.AllocHGlobal((Int32)dwSize);
                            Marshal.StructureToPtr(m_struIpParaCfgV40.struStreamMode[i].uGetStream, ptrChanInfoV40, false);
                            CHCNetSDK.NET_DVR_IPCHANINFO_V40 m_struChanInfoV40 = new CHCNetSDK.NET_DVR_IPCHANINFO_V40();
                            m_struChanInfoV40 = (CHCNetSDK.NET_DVR_IPCHANINFO_V40)Marshal.PtrToStructure(ptrChanInfoV40, typeof(CHCNetSDK.NET_DVR_IPCHANINFO_V40));

                            //列出IP通道 List the IP channel
                            if (m_struChanInfoV40.byEnable == 1)
                            {
                                str = String.Format("IP通道{0}", i + 1);
                                comboBoxChan.Items.Add(str);
                                m_struChanNoInfo.lChannelNo[j] = i + (int)m_struIpParaCfgV40.dwStartDChan;
                                j++;
                            }
                            Marshal.FreeHGlobal(ptrChanInfoV40);
                            break;

                        default:
                            break;
                        }
                    }
                }
                Marshal.FreeHGlobal(ptrIpParaCfgV40);
            }
            else
            {
                for (i = 0; i < m_struDeviceInfo.byChanNum; i++)
                {
                    str = String.Format("通道{0}", i + 1);
                    comboBoxChan.Items.Add(str);
                    m_struChanNoInfo.lChannelNo[j] = i + m_struDeviceInfo.byStartChan;
                    j++;
                }
            }
            comboBoxChan.SelectedIndex = 0;
        }
Exemple #4
0
        /// <summary>
        /// 获取通道信息
        /// </summary>
        private void InfoIPChannel()
        {
            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(m_lUserID, CHCNetSDK.NET_DVR_GET_IPPARACFG_V40, iGroupNo, ptrIpParaCfgV40, dwSize, ref dwReturn))
            {
                iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                str      = "NET_DVR_GET_IPPARACFG_V40 failed, error code= " + iLastErr;
                //获取IP资源配置信息失败,输出错误号 Failed to get configuration of IP channels and output the error code
                throw new VideoPlayerException(str);
            }
            else
            {
                m_struIpParaCfgV40 = (CHCNetSDK.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(CHCNetSDK.NET_DVR_IPPARACFG_V40));

                byte byStreamType = 0;
                uint iDChanNum    = 64;

                if (dwDChanTotalNum < 64)
                {
                    iDChanNum = dwDChanTotalNum; //如果设备IP通道小于64路,按实际路数获取
                }

                for (i = 0; i < iDChanNum; i++)
                {
                    iChannelNum[i + dwAChanTotalNum] = i + (int)m_struIpParaCfgV40.dwStartDChan;
                    byStreamType = m_struIpParaCfgV40.struStreamMode[i].byGetStreamType;

                    dwSize = (uint)Marshal.SizeOf(m_struIpParaCfgV40.struStreamMode[i].uGetStream);
                    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[i].uGetStream, ptrChanInfo, false);
                        m_struChanInfo = (CHCNetSDK.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK.NET_DVR_IPCHANINFO));

                        iIPDevID[i] = m_struChanInfo.byIPID + m_struChanInfo.byIPIDHigh * 256 - iGroupNo * 64 - 1;

                        Marshal.FreeHGlobal(ptrChanInfo);
                        break;

                    case 6:
                        IntPtr ptrChanInfoV40 = Marshal.AllocHGlobal((Int32)dwSize);
                        Marshal.StructureToPtr(m_struIpParaCfgV40.struStreamMode[i].uGetStream, ptrChanInfoV40, false);
                        m_struChanInfoV40 = (CHCNetSDK.NET_DVR_IPCHANINFO_V40)Marshal.PtrToStructure(ptrChanInfoV40, typeof(CHCNetSDK.NET_DVR_IPCHANINFO_V40));
                        iIPDevID[i]       = m_struChanInfoV40.wIPID - iGroupNo * 64 - 1;

                        Marshal.FreeHGlobal(ptrChanInfoV40);
                        break;

                    default:
                        break;
                    }
                }
            }
            Marshal.FreeHGlobal(ptrIpParaCfgV40);
        }
Exemple #5
0
        public override bool Initialilize()
        {
            LastRunTime      = DateTime.Now.Ticks / 10000;
            struIpParaCfgV40 = new CHCNetSDK.NET_DVR_IPPARACFG_V40();
            struPicCfgV40    = new CHCNetSDK.NET_DVR_PICCFG_V40();
            m_struShowStrCfg = new CHCNetSDK.NET_DVR_SHOWSTRING_V30();
            Console.WriteLine("开始初始化");
            heartbeat.Interval = 60 * 1000 * 3;
            heartbeat.Elapsed -= Heartbeat_Elapsed;
            heartbeat.Elapsed += Heartbeat_Elapsed;
            heartbeat.Start();
            if (!Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + "SdkLog\\"))
            {
                Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "SdkLog\\");
            }
            Config config = new Config(configpath)
            {
                GroupName = "service"
            };

            string[] host = config.GetSectionValues();
            if (NVRInfos == null)
            {
                CHCNetSDK.NET_DVR_SetLogToFile(0, AppDomain.CurrentDomain.BaseDirectory + "SdkLog\\", true);
                bool init = CHCNetSDK.NET_DVR_Init();
                if (!init)
                {
                    _log.Error("初始化失败" + CHCNetSDK.NET_DVR_GetLastError());
                    ErrorMsg = "初始化失败";
                    return(false);
                }

                bool retime = CHCNetSDK.NET_DVR_SetConnectTime(3000, 500);
                if (!retime)
                {
                    _log.Error("连接超时设置" + CHCNetSDK.NET_DVR_GetLastError());
                    ErrorMsg = "连接超时设置";
                }
                bool re = CHCNetSDK.NET_DVR_SetReconnect(3000, 1);
                if (!re)
                {
                    _log.Error("重连设置" + CHCNetSDK.NET_DVR_GetLastError());
                    ErrorMsg = "重连设置";
                }

                NVRInfos = new List <NVRInfo>();
            }
            for (int x = 0; x < host.Length; x++)
            {
                string name = host[x];
                config.Section = name;
                string ip       = config.GetValue("host", "ip", "192.168.2.1");
                int    port     = config.GetValue("host", "port", 8000);
                string username = config.GetValue("host", "username", "admin");
                string password = config.GetValue("host", "password", "ywwy2016");
                _log.Error(name + "." + x);
                NVRInfo nvr = NVRInfos.FirstOrDefault(o => o.Host.DVRIPAddress == ip);

                if (nvr == null)
                {
                    nvr = new NVRInfo()
                    {
                        Host = new NVRHostHiKv()
                        {
                            DVRIPAddress = ip, DVRPassword = password, DVRPort = port, DVRUserName = username, LUserId = -1
                        }, IPCs = new List <IPC>()
                    };
                }
                CHCNetSDK.NET_DVR_DEVICEINFO_V30 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V30();
                int _login = -1;
                if (nvr.Host.LUserId > -1)
                {
                    _login = nvr.Host.LUserId;
                }
                else
                {
                    _login = CHCNetSDK.NET_DVR_Login_V30(ip, port, username, password, ref DeviceInfo);
                    Console.WriteLine(x + "登录" + _login);
                }

                if (_login >= 0)
                {
                    nvr.DeviceInfo   = DeviceInfo;
                    nvr.Host.LUserId = _login;
                    uint dwSize = (uint)Marshal.SizeOf(struIpParaCfgV40);

                    IntPtr ptrIpParaCfgV40 = Marshal.AllocHGlobal((Int32)dwSize);
                    Marshal.StructureToPtr(struIpParaCfgV40, ptrIpParaCfgV40, true);

                    uint dwReturn = 0;
                    int  iGroupNo = 0;
                    #region IPC通道
                    if (DeviceInfo.byIPChanNum > 0)
                    {
                        if (!CHCNetSDK.NET_DVR_GetDVRConfig(_login, CHCNetSDK.NET_DVR_GET_IPPARACFG_V40, iGroupNo, ptrIpParaCfgV40, dwSize, ref dwReturn))
                        {
                            ErrorMsg = "获取IPC失败." + CHCNetSDK.NET_DVR_GetLastError();
                            Console.WriteLine(ErrorMsg);
                            _log.Error(ErrorMsg);
                            Marshal.FreeHGlobal(ptrIpParaCfgV40);
                        }
                        else
                        {
                            struIpParaCfgV40 = (CHCNetSDK.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(CHCNetSDK.NET_DVR_IPPARACFG_V40));
                            CHCNetSDK.NET_DVR_IPDEVINFO_V31[] ipdevinfos = struIpParaCfgV40.struIPDevInfo;
                            #region 获取通道信息
                            for (int m = 0; m < ipdevinfos.Length; m++)
                            {
                                CHCNetSDK.NET_DVR_GET_STREAM_UNION unionGetStream = struIpParaCfgV40.struStreamMode[m].uGetStream;
                                uint   unSize      = (uint)Marshal.SizeOf(unionGetStream);
                                IntPtr ptrChanInfo = Marshal.AllocHGlobal((Int32)unSize);
                                Marshal.StructureToPtr(unionGetStream, ptrChanInfo, true);
                                CHCNetSDK.NET_DVR_IPCHANINFO struChanInfo = (CHCNetSDK.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK.NET_DVR_IPCHANINFO));
                                IPC ipc = new IPC()
                                {
                                    AdminPort = ipdevinfos[m].wDVRPort.ToString(), ChannelIndex = m + (int)struIpParaCfgV40.dwStartDChan, ChannelIp = ipdevinfos[m].struIP.sIpV4, ChannelName = "IPCamera" + m, Status = ipdevinfos[m].byEnable, UserName = Encoding.UTF8.GetString(ipdevinfos[m].sUserName).Trim('\0')
                                };
                                #region 获取通道名称
                                if (ipc.Status == 1)
                                {
                                    Int32  nSize     = Marshal.SizeOf(struPicCfgV40);
                                    IntPtr ptrPicCfg = Marshal.AllocHGlobal(nSize);
                                    Marshal.StructureToPtr(struPicCfgV40, ptrPicCfg, true);
                                    if (!CHCNetSDK.NET_DVR_GetDVRConfig(_login, CHCNetSDK.NET_DVR_GET_PICCFG_V40, ipc.ChannelIndex, ptrPicCfg, (UInt32)nSize, ref dwReturn))
                                    {
                                        ipc.ErrorMsg = CHCNetSDK.NET_DVR_GetLastError().ToString();
                                        ipc.Status   = 0;
                                        IPC oldipc = nvr.IPCs.FirstOrDefault(o => o.ChannelIp == ipc.ChannelIp);
                                        if (oldipc != null)
                                        {
                                            nvr.IPCs.Remove(oldipc);
                                        }
                                        nvr.IPCs.Add(ipc);
                                    }
                                    else
                                    {
                                        struPicCfgV40 = (CHCNetSDK.NET_DVR_PICCFG_V40)Marshal.PtrToStructure(ptrPicCfg, typeof(CHCNetSDK.NET_DVR_PICCFG_V40));
                                        if (struPicCfgV40.sChanName != null)
                                        {
                                            ipc.ChannelNumber = System.Text.Encoding.GetEncoding("GBK").GetString(struPicCfgV40.sChanName).Trim('\0');
                                        }
                                        ipc.Status = struChanInfo.byEnable;
                                        _log.Info("2:" + ipc.ChannelIndex + "." + ipc.ChannelIp + "." + struChanInfo.byEnable + "." + ipc.ChannelNumber);
                                        Console.WriteLine(ipc.ChannelIndex + "." + ipc.ChannelIp + "." + struChanInfo.byEnable + "." + ipc.ChannelNumber);
                                        IPC oldipc = nvr.IPCs.FirstOrDefault(o => o.ChannelIp == ipc.ChannelIp);
                                        if (oldipc != null)
                                        {
                                            nvr.IPCs.Remove(oldipc);
                                        }
                                        nvr.IPCs.Add(ipc);
                                    }
                                    Marshal.FreeHGlobal(ptrPicCfg);
                                }
                                #endregion
                                Marshal.FreeHGlobal(ptrChanInfo);
                            }
                            #endregion
                        }

                        NVRInfo oldnvr = NVRInfos.FirstOrDefault(o => o.Host.DVRIPAddress == ip);
                        if (nvr != null)
                        {
                            NVRInfos.Remove(oldnvr);
                        }
                        NVRInfos.Add(nvr);
                    }
                    #endregion
                    #region 其他通道
                    else
                    {
                        for (int i = 0; i < DeviceInfo.byChanNum; i++)
                        {
                            dwReturn = 0;

                            Int32  nSize     = Marshal.SizeOf(struPicCfgV40);
                            IntPtr ptrPicCfg = Marshal.AllocHGlobal(nSize);
                            Marshal.StructureToPtr(struPicCfgV40, ptrPicCfg, true);
                            int chancelid = i + DeviceInfo.byStartChan;
                            if (!CHCNetSDK.NET_DVR_GetDVRConfig(_login, CHCNetSDK.NET_DVR_GET_PICCFG_V40, chancelid, ptrPicCfg, (UInt32)nSize, ref dwReturn))
                            {
                                ErrorMsg = CHCNetSDK.NET_DVR_GetLastError().ToString();
                            }
                            else
                            {
                                struPicCfgV40 = (CHCNetSDK.NET_DVR_PICCFG_V40)Marshal.PtrToStructure(ptrPicCfg, typeof(CHCNetSDK.NET_DVR_PICCFG_V40));
                                IPC ipc = new IPC()
                                {
                                    AdminPort = "", ChannelIndex = chancelid, ChannelIp = nvr.Host.DVRIPAddress, ChannelName = "IPCamera" + i, Status = 1, ChannelNumber = System.Text.Encoding.GetEncoding("GBK").GetString(struPicCfgV40.sChanName).Trim('\0')
                                };

                                IPC oldipc = nvr.IPCs.FirstOrDefault(o => o.ChannelIp == ipc.ChannelIp);
                                if (oldipc != null)
                                {
                                    nvr.IPCs.Remove(oldipc);
                                }
                                nvr.IPCs.Add(ipc);
                            }
                            NVRInfo oldnvr = NVRInfos.FirstOrDefault(o => o.Host.DVRIPAddress == ip);
                            if (nvr != null)
                            {
                                NVRInfos.Remove(oldnvr);
                            }
                            NVRInfos.Add(nvr);
                            Marshal.FreeHGlobal(ptrPicCfg);
                        }
                    }
                    #endregion

                    Marshal.FreeHGlobal(ptrIpParaCfgV40);
                }
                else
                {
                    NVRInfo nvrerr = new NVRInfo()
                    {
                        Host = new NVRHostHiKv()
                        {
                            DVRIPAddress = ip, DVRPassword = password, DVRPort = port, DVRUserName = username, LUserId = -1
                        }, IPCs = new List <IPC>()
                    };

                    ErrorMsg             = "登录失败." + CHCNetSDK.NET_DVR_GetLastError();
                    nvrerr.Host.ErrorMsg = ErrorMsg;
                    Console.WriteLine(ErrorMsg);
                    _log.Error(ErrorMsg);
                    NVRInfo oldnvr = NVRInfos.FirstOrDefault(o => o.Host.DVRIPAddress == ip);
                    if (nvr != null)
                    {
                        NVRInfos.Remove(oldnvr);
                    }
                    NVRInfos.Add(nvrerr);
                }
            }
            GC.Collect();
            GC.WaitForPendingFinalizers();
            Console.WriteLine("完成初始化");

            return(true);
        }
        public void InfoIPChannel()
        {
            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;

            if (!CHCNetSDK.NET_DVR_GetDVRConfig(camera_id, CHCNetSDK.NET_DVR_GET_IPPARACFG_V40, iGroupNo, ptrIpParaCfgV40, dwSize, ref dwReturn))
            {
                iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                str      = "NET_DVR_GET_IPPARACFG_V40 failed, error code= " + iLastErr;
                //获取IP资源配置信息失败,输出错误号 Failed to get configuration of IP channels and output the error code
                DebugInfo(str);
            }
            else
            {
                DebugInfo("NET_DVR_GET_IPPARACFG_V40 succ!");

                m_struIpParaCfgV40 = (CHCNetSDK.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(CHCNetSDK.NET_DVR_IPPARACFG_V40));

                for (i = 0; i < dwAChanTotalNum; i++)
                {
                    ListAnalogChannel(i + 1, m_struIpParaCfgV40.byAnalogChanEnable[i]);
                    iChannelNum[i] = i + (int)DeviceInfo_top.byStartChan;
                }

                byte byStreamType;
                for (i = 0; i < m_struIpParaCfgV40.dwDChanNum; i++)
                {
                    iChannelNum[i + dwAChanTotalNum] = i + (int)m_struIpParaCfgV40.dwStartDChan;
                    byStreamType = m_struIpParaCfgV40.struStreamMode[i].byGetStreamType;

                    dwSize = (uint)Marshal.SizeOf(m_struIpParaCfgV40.struStreamMode[i].uGetStream);
                    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[i].uGetStream, ptrChanInfo, false);
                        m_struChanInfo = (CHCNetSDK.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK.NET_DVR_IPCHANINFO));

                        //列出IP通道 List the IP channel
                        ListIPChannel(i + 1, m_struChanInfo.byEnable, m_struChanInfo.byIPID);
                        iIPDevID[i] = m_struChanInfo.byIPID + m_struChanInfo.byIPIDHigh * 256 - iGroupNo * 64 - 1;

                        Marshal.FreeHGlobal(ptrChanInfo);
                        break;

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

                        //列出IP通道 List the IP channel
                        ListIPChannel(i + 1, m_struChanInfoV40.byEnable, m_struChanInfoV40.wIPID);
                        iIPDevID[i] = m_struChanInfoV40.wIPID - iGroupNo * 64 - 1;

                        Marshal.FreeHGlobal(ptrChanInfoV40);
                        break;

                    default:
                        break;
                    }
                }
            }
            Marshal.FreeHGlobal(ptrIpParaCfgV40);
        }
        private void InfoIpChannel()
        {
            var dwSize = (uint)Marshal.SizeOf(_struIpParaCfgV40);

            var ptrIpParaCfgV40 = Marshal.AllocHGlobal((int)dwSize);

            Marshal.StructureToPtr(_struIpParaCfgV40, ptrIpParaCfgV40, false);

            uint      dwReturn = 0;
            const int iGroupNo = 0; //该Demo仅获取第一组64个通道,如果设备IP通道大于64路,需要按组号0~i多次调用NET_DVR_GET_IPPARACFG_V40获取

            if (!CHCNetSDK.NET_DVR_GetDVRConfig(_loginUserId, CHCNetSDK.NET_DVR_GET_IPPARACFG_V40, iGroupNo, ptrIpParaCfgV40, dwSize, ref dwReturn))
            {
                _lastError = CHCNetSDK.NET_DVR_GetLastError();
                DisplayMessage($"获取录像机通道信息失败。错误码{_lastError}");
                return;
            }
            _struIpParaCfgV40 = (CHCNetSDK.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(CHCNetSDK.NET_DVR_IPPARACFG_V40));

            for (var i = 0; i < _dwAChanTotalNum; i++)
            {
                _iChannelNum[i] = i + _deviceInfo.byStartChan;
            }

            uint iDChanNum = 64;

            if (_dwDChanTotalNum < 64)
            {
                iDChanNum = _dwDChanTotalNum; //如果设备IP通道小于64路,按实际路数获取
            }

            for (var i = 0; i < iDChanNum; i++)
            {
                _iChannelNum[i + _dwAChanTotalNum] = i + (int)_struIpParaCfgV40.dwStartDChan;
                var byStreamType = _struIpParaCfgV40.struStreamMode[i].byGetStreamType;

                dwSize = (uint)Marshal.SizeOf(_struIpParaCfgV40.struStreamMode[i].uGetStream);
                switch (byStreamType)
                {
                //目前NVR仅支持直接从设备取流 NVR supports only the mode: get stream from device directly
                case 0:
                    var ptrChanInfo = Marshal.AllocHGlobal((int)dwSize);
                    Marshal.StructureToPtr(_struIpParaCfgV40.struStreamMode[i].uGetStream, ptrChanInfo, false);
                    _struChanInfo = (CHCNetSDK.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK.NET_DVR_IPCHANINFO));

                    _iIpDevId[i] = _struChanInfo.byIPID + (_struChanInfo.byIPIDHigh * 256) - (iGroupNo * 64) - 1;

                    Marshal.FreeHGlobal(ptrChanInfo);
                    break;

                case 6:
                    var ptrChanInfoV40 = Marshal.AllocHGlobal((int)dwSize);
                    Marshal.StructureToPtr(_struIpParaCfgV40.struStreamMode[i].uGetStream, ptrChanInfoV40, false);
                    _struChanInfoV40 = (CHCNetSDK.NET_DVR_IPCHANINFO_V40)Marshal.PtrToStructure(ptrChanInfoV40, typeof(CHCNetSDK.NET_DVR_IPCHANINFO_V40));

                    _iIpDevId[i] = _struChanInfoV40.wIPID - (iGroupNo * 64) - 1;

                    Marshal.FreeHGlobal(ptrChanInfoV40);
                    break;
                }
            }
            Marshal.FreeHGlobal(ptrIpParaCfgV40);
            DisplayMessage("控件初始化完成,可以启动预览。");
        }
        private void IPChannelConfig_Load(object sender, EventArgs e)
        {
            int i = 0;

            //获取设备支持IPC协议列表
            if (CHCNetSDK.NET_DVR_GetIPCProtoList(m_lUserID, ref m_struProtoList))
            {
                for (i = 0; i < (int)m_struProtoList.dwProtoNum; i++)
                {
                    comboBoxFactory.Items.Add(m_struProtoList.struProto[i].byDescribe);
                }
            }

            comboBoxStreamType.SelectedIndex = 0;
            comboBoxFactory.SelectedIndex    = 0;
            comboBoxStream.SelectedIndex     = 0;
            comboBoxProtocol.SelectedIndex   = 0;

            /***********************************************************
             * 显示当前IP通道配置
             * **********************************************************/
            if (iIPDevIndex < 0)
            {
                //该通道未添加有设备,空闲状态
                return;
            }

            comboBoxStreamType.SelectedIndex = m_struIPParaCfgV40.struStreamMode[iChanIndex].byGetStreamType;                       //取流方式
            textBoxIPAddr.Text   = System.Text.Encoding.UTF8.GetString(m_struIPParaCfgV40.struIPDevInfo[iIPDevIndex].struIP.sIpV4); //前端设备IP地址
            textBoxPort.Text     = Convert.ToString(m_struIPParaCfgV40.struIPDevInfo[iIPDevIndex].wDVRPort);                        //前端设备端口
            textBoxUserName.Text = System.Text.Encoding.UTF8.GetString(m_struIPParaCfgV40.struIPDevInfo[iIPDevIndex].sUserName);    //前端设备用户名
            textBoxPsw.Text      = System.Text.Encoding.UTF8.GetString(m_struIPParaCfgV40.struIPDevInfo[iIPDevIndex].sPassword);    //前端设备密码
            for (i = 0; i < (int)m_struProtoList.dwProtoNum; i++)
            {
                //设备(厂家)协议类型,通过NET_DVR_GetIPCProtoList获取
                if (m_struProtoList.struProto[i].dwType == m_struIPParaCfgV40.struIPDevInfo[iIPDevIndex].byProType)
                {
                    comboBoxFactory.SelectedIndex = i;
                }
            }

            switch (m_struIPParaCfgV40.struStreamMode[iChanIndex].byGetStreamType)
            {
            case 0:     //直接从设备取流,对应联合体中结构NET_DVR_IPCHANINFO
                IntPtr ptrChanInfo = Marshal.AllocHGlobal((Int32)dwUnionSize);
                Marshal.StructureToPtr(m_struIPParaCfgV40.struStreamMode[iChanIndex].uGetStream, ptrChanInfo, false);
                m_struChanInfo      = (CHCNetSDK.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK.NET_DVR_IPCHANINFO));
                textBoxChannel.Text = Convert.ToString(m_struChanInfo.byChannel);
                Marshal.FreeHGlobal(ptrChanInfo);
                break;

            case 6:    //直接从设备取流(扩展),对应联合体中结构NET_DVR_IPCHANINFO_V40
                IntPtr ptrChanInfoV40 = Marshal.AllocHGlobal((Int32)dwUnionSize);
                Marshal.StructureToPtr(m_struIPParaCfgV40.struStreamMode[iChanIndex].uGetStream, ptrChanInfoV40, false);
                m_struChanInfoV40              = (CHCNetSDK.NET_DVR_IPCHANINFO_V40)Marshal.PtrToStructure(ptrChanInfoV40, typeof(CHCNetSDK.NET_DVR_IPCHANINFO_V40));
                textBoxChannel.Text            = Convert.ToString(m_struChanInfoV40.dwChannel);
                comboBoxStream.SelectedIndex   = m_struChanInfoV40.byTransMode;
                comboBoxProtocol.SelectedIndex = m_struChanInfoV40.byTransProtocol;
                Marshal.FreeHGlobal(ptrChanInfoV40);
                break;

            default:
                break;
            }
        }
Exemple #9
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);
        }
        public void InfoIPChannel()
        {
            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;

            if (!CHCNetSDK.NET_DVR_GetDVRConfig(m_lUserID, CHCNetSDK.NET_DVR_GET_IPPARACFG_V40, iGroupNo, ptrIpParaCfgV40, dwSize, ref dwReturn))
            {
                iLastErr = CHCNetSDK.NET_DVR_GetLastError();
                str      = "NET_DVR_GET_IPPARACFG_V40 failed, error code= " + iLastErr;

                DebugInfo(str);
            }
            else
            {
                DebugInfo("NET_DVR_GET_IPPARACFG_V40 succ!");

                m_struIpParaCfgV40 = (CHCNetSDK.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(CHCNetSDK.NET_DVR_IPPARACFG_V40));



                byte byStreamType = 0;
                uint iDChanNum    = 64;

                if (dwDChanTotalNum < 64)
                {
                    iDChanNum = dwDChanTotalNum;
                }

                for (i = 0; i < iDChanNum; i++)
                {
                    iChannelNum[i + dwAChanTotalNum] = i + (int)m_struIpParaCfgV40.dwStartDChan;
                    byStreamType = m_struIpParaCfgV40.struStreamMode[i].byGetStreamType;

                    dwSize = (uint)Marshal.SizeOf(m_struIpParaCfgV40.struStreamMode[i].uGetStream);
                    switch (byStreamType)
                    {
                    case 0:
                        IntPtr ptrChanInfo = Marshal.AllocHGlobal((Int32)dwSize);
                        Marshal.StructureToPtr(m_struIpParaCfgV40.struStreamMode[i].uGetStream, ptrChanInfo, false);
                        m_struChanInfo = (CHCNetSDK.NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(CHCNetSDK.NET_DVR_IPCHANINFO));



                        iIPDevID[i] = m_struChanInfo.byIPID + m_struChanInfo.byIPIDHigh * 256 - iGroupNo * 64 - 1;

                        Marshal.FreeHGlobal(ptrChanInfo);
                        break;

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



                        iIPDevID[i] = m_struChanInfoV40.wIPID - iGroupNo * 64 - 1;

                        Marshal.FreeHGlobal(ptrChanInfoV40);
                        break;

                    default:
                        break;
                    }
                }
            }
            Marshal.FreeHGlobal(ptrIpParaCfgV40);
        }