Ejemplo n.º 1
0
 /// <summary>
 /// 海康主机登录
 /// </summary>
 public void HikHostLogin()
 {
     if (m_lstLoginInfo.Count > 0)
     {
         for (int i = 0; i < m_lstLoginInfo.Count; i++)
         {
             if (m_lstLoginInfo[i].iHandle == -1)
             {
                 NET_DVR_USER_LOGIN_INFO struLoginInfo = new NET_DVR_USER_LOGIN_INFO();
                 NET_DVR_DEVICEINFO_V40  devInfor      = new NET_DVR_DEVICEINFO_V40();
                 devInfor.byRes2 = new byte[246];
                 devInfor.struDeviceV30.sSerialNumber = new byte[48];
                 devInfor.byRes2 = new byte[246];
                 devInfor.struDeviceV30.sSerialNumber = new byte[48];
                 struLoginInfo.sDeviceAddress         = m_lstLoginInfo[i].sStreamIp;
                 struLoginInfo.wPort         = Convert.ToUInt16(m_lstLoginInfo[i].sPort); //设备服务端口
                 struLoginInfo.sUserName     = m_lstLoginInfo[i].sUser;                   //设备登录用户名
                 struLoginInfo.sPassword     = m_lstLoginInfo[i].sPass;                   //设备登录密码
                 struLoginInfo.bUseAsynLogin = false;                                     //同步登录方式(异步现在设备不在线时会报错,不知道啥原因)
                 struLoginInfo.byLoginMode   = 0;
                 struLoginInfo.byHttps       = 2;
                 //m_lstLoginInfo[i].iHandle = HikVideoAPI.NET_HIK_Login_V40(ref struLoginInfo, ref devInfor);
                 m_lstLoginInfo[i].iHandle = CHCNetSDK.NET_DVR_Login_V40(ref struLoginInfo, ref devInfor);
                 //失败
                 if (m_lstLoginInfo[i].iHandle < 0)
                 {
                     CHCNetSDK.NET_DVR_Logout(m_lstLoginInfo[i].iHandle);
                     CHCNetSDK.NET_DVR_Cleanup();
                     return;
                 }
                 else
                 {
                     //存储数据用来计算通道号
                     NET_DVR_IPPARACFG_V40 oIpParaCfgV40 = new NET_DVR_IPPARACFG_V40();
                     uint   dwSize          = (uint)Marshal.SizeOf(oIpParaCfgV40);
                     IntPtr ptrIpParaCfgV40 = Marshal.AllocHGlobal((Int32)dwSize);
                     Marshal.StructureToPtr(oIpParaCfgV40, ptrIpParaCfgV40, false);
                     uint dwReturn = 0;
                     //int iGroupNo = 0; //该Demo仅获取第一组64个通道,如果设备IP通道大于64路,需要按组号0~i多次调用NET_DVR_GET_IPPARACFG_V40获取
                     for (int iGroupNo = 0; iGroupNo < 4; iGroupNo++)
                     {
                         if (CHCNetSDK.NET_DVR_GetDVRConfig(m_lstLoginInfo[i].iHandle, CHCNetSDK.NET_DVR_GET_IPPARACFG_V40, iGroupNo, ptrIpParaCfgV40, dwSize, ref dwReturn))
                         {
                             oIpParaCfgV40 = (CHCNetSDK.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(CHCNetSDK.NET_DVR_IPPARACFG_V40));
                             m_lstStruIpParaCfgV40.Add(oIpParaCfgV40);
                         }
                     }
                 }
                 //第二种登录
                 //CHCNetSDK.NET_DVR_DEVICEINFO_V30 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V30();
                 //m_lstLoginInfo[i].iHandle = CHCNetSDK.NET_DVR_Login_V30(m_lstLoginInfo[i].sIp, Convert.ToInt32(m_lstLoginInfo[i].sPort),
                 //    m_lstLoginInfo[i].sUser, m_lstLoginInfo[i].sPass, ref DeviceInfo);
             }
         }
     }
 }
Ejemplo n.º 2
0
 /// <summary>
 /// 使用线程登录
 /// </summary>
 public void ThreadLogin()
 {
     //string file = "G:\\天津白泽技术有限公司项目\\天津白泽技术项目源文件等\\CentralEcoCity\\bin\\HCNetSDK.dll";
     //InitHikVideoSDK(m_iHCNetDllPath);
     Thread.Sleep(2000);
     while (true)
     {
         lock (m_oSingleLock)
         {
             if (m_lstLoginInfo.Count > 0)
             {
                 for (int i = 0; i < m_lstLoginInfo.Count; i++)
                 {
                     if (m_lstLoginInfo[i].iHandle == -1)
                     {
                         NET_DVR_USER_LOGIN_INFO struLoginInfo = new NET_DVR_USER_LOGIN_INFO();
                         NET_DVR_DEVICEINFO_V40  devInfor      = new NET_DVR_DEVICEINFO_V40();
                         devInfor.byRes2 = new byte[246];
                         devInfor.struDeviceV30.sSerialNumber = new byte[48];
                         devInfor.byRes2 = new byte[246];
                         devInfor.struDeviceV30.sSerialNumber = new byte[48];
                         struLoginInfo.sDeviceAddress         = m_lstLoginInfo[i].sIp;
                         struLoginInfo.wPort         = Convert.ToUInt16(m_lstLoginInfo[i].sPort); //设备服务端口
                         struLoginInfo.sUserName     = m_lstLoginInfo[i].sUser;                   //设备登录用户名
                         struLoginInfo.sPassword     = m_lstLoginInfo[i].sPass;                   //设备登录密码
                         struLoginInfo.bUseAsynLogin = false;                                     //同步登录方式(异步现在设备不在线时会报错,不知道啥原因)
                         struLoginInfo.byLoginMode   = 0;
                         //struLoginInfo.byHttps = 2;
                         //m_lstLoginInfo[i].iHandle = HikVideoAPI.NET_HIK_Login_V40(ref struLoginInfo, ref devInfor);
                         m_lstLoginInfo[i].iHandle = CHCNetSDK.NET_DVR_Login_V40(ref struLoginInfo, ref devInfor);
                         //将通道信息和对应的ip存储到list集合中
                         if (m_lstLoginInfo[i].iHandle >= 0)
                         {
                             NET_DVR_IPPARACFG_V40 oIpParaCfgV40 = new NET_DVR_IPPARACFG_V40();
                             uint   dwSize          = (uint)Marshal.SizeOf(oIpParaCfgV40);
                             IntPtr ptrIpParaCfgV40 = Marshal.AllocHGlobal((Int32)dwSize);
                             Marshal.StructureToPtr(oIpParaCfgV40, ptrIpParaCfgV40, false);
                             uint dwReturn = 0;
                             //int iGroupNo = 0; //该Demo仅获取第一组64个通道,如果设备IP通道大于64路,需要按组号0~i多次调用NET_DVR_GET_IPPARACFG_V40获取
                             for (int iGroupNo = 0; iGroupNo < 4; iGroupNo++)
                             {
                                 if (CHCNetSDK.NET_DVR_GetDVRConfig(m_lstLoginInfo[i].iHandle, CHCNetSDK.NET_DVR_GET_IPPARACFG_V40, iGroupNo, ptrIpParaCfgV40, dwSize, ref dwReturn))
                                 {
                                     oIpParaCfgV40 = (CHCNetSDK.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(CHCNetSDK.NET_DVR_IPPARACFG_V40));
                                     m_lstStruIpParaCfgV40.Add(oIpParaCfgV40);
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
 }
Ejemplo n.º 3
0
        /// <summary>
        /// 获取模拟通道信息
        /// </summary>
        /// <param name="info">登录设备时的UseInfo对象</param>
        /// <returns>通道属性对象集合</returns>
        private List <ChannelState> GetAnalogChannelInfo(ref DvrUseInfo info)
        {
            NET_DVR_IPPARACFG_V40  m_struIpParaCfgV40 = new NET_DVR_IPPARACFG_V40();
            NET_DVR_DEVICEINFO_V30 deviceInfo         = new NET_DVR_DEVICEINFO_V30();
            List <ChannelState>    states             = new List <ChannelState>();
            uint dwSize = (uint)Marshal.SizeOf(m_struIpParaCfgV40);

            IntPtr ptrIpParaCfgV40 = Marshal.AllocHGlobal((Int32)dwSize);

            Marshal.StructureToPtr(m_struIpParaCfgV40, ptrIpParaCfgV40, false);

            uint dwReturn = 0;

            if (!HikApi.NET_DVR_GetDVRConfig(info.UserId, NET_DVR_GET_IPPARACFG_V40, -1, ptrIpParaCfgV40, dwSize, ref dwReturn))
            {
                return(states);
            }
            else
            {
                m_struIpParaCfgV40 = (NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(NET_DVR_IPPARACFG_V40));
                for (int i = 0; i < dwAChanTotalNum; i++)
                {
                    ChannelState state = new ChannelState()
                    {
                        Num = i + 1, IsIpChannel = false
                    };
                    if (m_struIpParaCfgV40.byAnalogChanEnable[i] == 0)
                    {
                        state.IsEnabled = false;  //通道已被禁用 This channel has been disabled
                    }
                    else
                    {
                        state.IsEnabled = true;  //通道处于启用状态
                    }
                    states.Add(state);
                    iChannelNum[i] = i + (int)deviceInfo.byStartChan;
                }
            }
            Marshal.FreeHGlobal(ptrIpParaCfgV40);
            return(states);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 使用线程登录(使用)
        /// </summary>
        public void ThreadLogin()
        {
            int iDelay = 0;/*\ 延迟 /*/

            while (!m_bTerminated)
            {
                if (m_lstLoginInfo.Count == 0)
                {
                    Thread.Sleep(1000);
                }
                else
                {
                    iDelay = 0;
                    if (m_lstLoginInfo.Count > 0)
                    {
                        for (int i = 0; i < m_lstLoginInfo.Count; i++)
                        {
                            if (m_lstLoginInfo[i].iHandle == -1)
                            {
                                NET_DVR_USER_LOGIN_INFO struLoginInfo = new NET_DVR_USER_LOGIN_INFO();
                                NET_DVR_DEVICEINFO_V40  devInfor      = new NET_DVR_DEVICEINFO_V40();
                                devInfor.byRes2 = new byte[246];
                                devInfor.struDeviceV30.sSerialNumber = new byte[48];
                                devInfor.byRes2 = new byte[246];
                                devInfor.struDeviceV30.sSerialNumber = new byte[48];
                                struLoginInfo.sDeviceAddress         = m_lstLoginInfo[i].sIp;
                                struLoginInfo.wPort         = Convert.ToUInt16(m_lstLoginInfo[i].sPort); //设备服务端口
                                struLoginInfo.sUserName     = m_lstLoginInfo[i].sUser;                   //设备登录用户名
                                struLoginInfo.sPassword     = m_lstLoginInfo[i].sPass;                   //设备登录密码
                                struLoginInfo.bUseAsynLogin = false;                                     //同步登录方式(异步现在设备不在线时会报错,不知道啥原因)
                                struLoginInfo.byLoginMode   = 0;
                                //struLoginInfo.byHttps = 2;
                                //m_lstLoginInfo[i].iHandle = HikVideoAPI.NET_HIK_Login_V40(ref struLoginInfo, ref devInfor);
                                m_lstLoginInfo[i].iHandle = CHCNetSDK.NET_DVR_Login_V40(ref struLoginInfo, ref devInfor);
                                //将通道信息和对应的ip存储到list集合中
                                if (m_lstLoginInfo[i].iHandle >= 0)
                                {
                                    CSaveHikChannelInfo oSaveHikChannelInfo = new CSaveHikChannelInfo();
                                    oSaveHikChannelInfo.m_lstHikChannelInfo = new List <NET_DVR_IPPARACFG_V40>();
                                    oSaveHikChannelInfo.m_sStreamIp         = m_lstLoginInfo[i].sIp;
                                    NET_DVR_IPPARACFG_V40 oIpParaCfgV40 = new NET_DVR_IPPARACFG_V40();
                                    uint   dwSize          = (uint)Marshal.SizeOf(oIpParaCfgV40);
                                    IntPtr ptrIpParaCfgV40 = Marshal.AllocHGlobal((Int32)dwSize);
                                    Marshal.StructureToPtr(oIpParaCfgV40, ptrIpParaCfgV40, false);
                                    uint dwReturn = 0;
                                    //int iGroupNo = 0; //该Demo仅获取第一组64个通道,如果设备IP通道大于64路,需要按组号0~i多次调用NET_DVR_GET_IPPARACFG_V40获取
                                    /*\ 共16组每组64个 /*/
                                    for (int iGroupNo = 0; iGroupNo < 15; iGroupNo++)
                                    {
                                        if (CHCNetSDK.NET_DVR_GetDVRConfig(m_lstLoginInfo[i].iHandle, CHCNetSDK.NET_DVR_GET_IPPARACFG_V40, iGroupNo, ptrIpParaCfgV40, dwSize, ref dwReturn))
                                        {
                                            lock (m_oSingleLock)
                                            {
                                                oIpParaCfgV40 = (CHCNetSDK.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(CHCNetSDK.NET_DVR_IPPARACFG_V40));
                                                oSaveHikChannelInfo.m_lstHikChannelInfo.Add(oIpParaCfgV40);
                                                m_lstSaveHikChannelInfo.Add(oSaveHikChannelInfo);
                                            }
                                        }
                                    }
                                    Marshal.FreeHGlobal(ptrIpParaCfgV40);
                                }
                            }
                        }
                        while (!m_bTerminated)
                        {
                            iDelay++;
                            Thread.Sleep(1000);
                            if (iDelay > 10)
                            {
                                break;
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 5
0
        //使用线程登录
        private void ThreadLoginHost()
        {
            Thread.Sleep(2000);
            while (true)
            {
                lock (m_singleLock)
                {
                    for (int i = 0; i < m_lstLoginInfo.Count; i++)
                    {
                        if (m_lstLoginInfo[i].iHandle == -1)
                        {
                            NET_DVR_USER_LOGIN_INFO struLoginInfo = new NET_DVR_USER_LOGIN_INFO();
                            NET_DVR_DEVICEINFO_V40  devInfor      = new NET_DVR_DEVICEINFO_V40();
                            devInfor.byRes2 = new byte[246];
                            devInfor.struDeviceV30.sSerialNumber = new byte[48];
                            devInfor.byRes2 = new byte[246];
                            devInfor.struDeviceV30.sSerialNumber = new byte[48];
                            struLoginInfo.sDeviceAddress         = m_lstLoginInfo[i].sStreamIp;
                            struLoginInfo.wPort         = Convert.ToUInt16(m_lstLoginInfo[i].sPort); //设备服务端口
                            struLoginInfo.sUserName     = m_lstLoginInfo[i].sUser;                   //设备登录用户名
                            struLoginInfo.sPassword     = m_lstLoginInfo[i].sPass;                   //设备登录密码
                            struLoginInfo.bUseAsynLogin = false;                                     //同步登录方式(异步现在设备不在线时会报错,不知道啥原因)
                            struLoginInfo.byLoginMode   = 0;
                            struLoginInfo.byHttps       = 2;
                            //m_lstLoginInfo[i].iHandle = HikVideoAPI.NET_HIK_Login_V40(ref struLoginInfo, ref devInfor);
                            m_lstLoginInfo[i].iHandle = CHCNetSDK.NET_DVR_Login_V40(ref struLoginInfo, ref devInfor);
                            //失败
                            if (m_lstLoginInfo[i].iHandle < 0)
                            {
                                CHCNetSDK.NET_DVR_Logout(m_lstLoginInfo[i].iHandle);
                                CHCNetSDK.NET_DVR_Cleanup();
                                return;
                            }
                            if (m_lstLoginInfo[i].iHandle >= 0)
                            {
                                NET_DVR_IPPARACFG_V40 oIpParaCfgV40 = new NET_DVR_IPPARACFG_V40();
                                uint   dwSize          = (uint)Marshal.SizeOf(oIpParaCfgV40);
                                IntPtr ptrIpParaCfgV40 = Marshal.AllocHGlobal((Int32)dwSize);
                                Marshal.StructureToPtr(oIpParaCfgV40, ptrIpParaCfgV40, false);
                                uint dwReturn = 0;
                                //int iGroupNo = 0; //该Demo仅获取第一组64个通道,如果设备IP通道大于64路,需要按组号0~i多次调用NET_DVR_GET_IPPARACFG_V40获取
                                for (int iGroupNo = 0; iGroupNo < 4; iGroupNo++)
                                {
                                    if (CHCNetSDK.NET_DVR_GetDVRConfig(m_lstLoginInfo[i].iHandle, CHCNetSDK.NET_DVR_GET_IPPARACFG_V40, iGroupNo, ptrIpParaCfgV40, dwSize, ref dwReturn))
                                    {
                                        oIpParaCfgV40 = (CHCNetSDK.NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(CHCNetSDK.NET_DVR_IPPARACFG_V40));
                                        m_lstStruIpParaCfgV40.Add(oIpParaCfgV40);
                                    }
                                }
                            }

                            //NET_DVR_USER_LOGIN_INFO struLoginInfo = new NET_DVR_USER_LOGIN_INFO();
                            //struLoginInfo.sDeviceAddress = m_lstLoginInfor[i].strIp;
                            //struLoginInfo.wPort = Convert.ToUInt16(m_lstLoginInfor[i].iPort); //设备服务端口
                            //struLoginInfo.sUserName = m_lstLoginInfor[i].strUser; //设备登录用户名
                            //struLoginInfo.sPassword = m_lstLoginInfor[i].strPsw; //设备登录密码
                            //struLoginInfo.bUseAsynLogin = false; //同步登录方式(异步现在设备不在线时会报错,不知道啥原因)
                            //struLoginInfo.byLoginMode = 0;
                            ////struLoginInfo.byHttps = 2;
                            //try
                            //{
                            //    m_lstLoginInfor[i].iHandle = HikVideoAPI.NET_HIK_Login_V40(ref struLoginInfo, ref m_lstLoginInfor[i].devInfor);
                            //}
                            //finally
                            //{
                            //    if (m_lstLoginInfor[i].iHandle >= 0)
                            //    {
                            //        if (m_lstLoginInfor[i].iType == 1 && m_lstLoginInfor[i].iRemoteHanle == -1) //热成像摄像机
                            //        {
                            //            NET_DVR_REALTIME_THERMOMETRY_COND struThermCond = new NET_DVR_REALTIME_THERMOMETRY_COND();
                            //            struThermCond.dwSize = (uint)Marshal.SizeOf(struThermCond);
                            //            struThermCond.byRuleID = 1;       //规则ID,0代表获取全部规则,具体规则ID从1开始
                            //            struThermCond.dwChan = 2; //从1开始,0xffffffff代表获取全部通道
                            //            int dwSize = Marshal.SizeOf(struThermCond);
                            //            IntPtr ptrStruCond = Marshal.AllocHGlobal(dwSize);
                            //            Marshal.StructureToPtr(struThermCond, ptrStruCond, false);
                            //            m_lstLoginInfor[i].iRemoteHanle = HikVideoAPI.NET_HIK_StartRemoteConfig(m_lstLoginInfor[i].iHandle, 3629,
                            //                ptrStruCond, Marshal.SizeOf(struThermCond),
                            //                m_ReMoteConfig, (IntPtr)m_lstLoginInfor[i].iHandle);
                            //            //后加
                            //            LPNET_DVR_SETUPALARM_PARAM strSetData = new LPNET_DVR_SETUPALARM_PARAM();
                            //            HikVideoAPI.NET_HIK_SetupAlarmChan_V41(m_lstLoginInfor[i].iHandle, strSetData);
                            //        }
                            //        //是动环主机
                            //        if (m_lstLoginInfor[i].iType == 2)
                            //        {
                            //            HikVideoAPI.NET_HIK_SetupAlarmChan_V30(m_lstLoginInfor[i].iHandle);
                            //            //LPNET_DVR_SETUPALARM_PARAM strSetData = new LPNET_DVR_SETUPALARM_PARAM();
                            //            //HikVideoAPI.NET_HIK_SetupAlarmChan_V41(m_lstLoginInfor[i].iHandle, strSetData);
                            //            //HikVideoAPI.NET_HIK_StartListen_V30(null, 8000, MsgCallback_V31, (IntPtr)m_lstLoginInfor[i].iHandle);
                            //        }
                            //        //门禁
                            //        if (m_lstLoginInfor[i].iType == 3)
                            //        {
                            //            LPNET_DVR_SETUPALARM_PARAM strSetData = new LPNET_DVR_SETUPALARM_PARAM();
                            //            HikVideoAPI.NET_HIK_SetupAlarmChan_V41(m_lstLoginInfor[i].iHandle, strSetData);
                            //            //}
                            //        }
                            //}
                        }
                    }
                }
            }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 获取IP通道信息
        /// </summary>
        /// <param name="info">登录设备时的UseInfo对象</param>
        /// <returns>通道属性对象集合</returns>
        private List <ChannelState> GetIPChannelInfo(ref DvrUseInfo info)
        {
            NET_DVR_IPPARACFG_V40    m_struIpParaCfgV40 = new NET_DVR_IPPARACFG_V40();
            NET_DVR_GET_STREAM_UNION m_unionGetStream   = new NET_DVR_GET_STREAM_UNION();
            NET_DVR_IPCHANINFO       m_struChanInfo     = new NET_DVR_IPCHANINFO();
            List <ChannelState>      states             = new List <ChannelState>();
            uint dwSize = (uint)Marshal.SizeOf(m_struIpParaCfgV40);

            IntPtr ptrIpParaCfgV40 = Marshal.AllocHGlobal((Int32)dwSize);

            Marshal.StructureToPtr(m_struIpParaCfgV40, ptrIpParaCfgV40, false);

            uint dwReturn = 0;

            if (!HikApi.NET_DVR_GetDVRConfig(info.UserId, NET_DVR_GET_IPPARACFG_V40, -1, ptrIpParaCfgV40, dwSize, ref dwReturn))
            {
                return(states);
            }
            else
            {
                m_struIpParaCfgV40 = (NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(NET_DVR_IPPARACFG_V40));

                byte byStreamType;
                for (int i = 0; i < m_struIpParaCfgV40.dwDChanNum; i++)
                {
                    ChannelState state = new ChannelState();
                    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    = (NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(NET_DVR_IPCHANINFO));
                        state.Num         = i + 1;
                        state.IsIpChannel = true;

                        if (m_struChanInfo.byIPID == 0)
                        {
                            state.IsNull = true;      //通道空闲,没有添加前端设备
                        }
                        else
                        {
                            state.IsNull = false;
                            if (m_struChanInfo.byEnable == 0)
                            {
                                state.IsOnline = false;     //通道不在线
                            }
                            else
                            {
                                state.IsOnline = true;     //通道在线
                            }
                        }
                        Marshal.FreeHGlobal(ptrChanInfo);
                        states.Add(state);
                        break;

                    default:
                        break;
                    }
                }
            }
            Marshal.FreeHGlobal(ptrIpParaCfgV40);
            return(states);
        }
Ejemplo n.º 7
0
        public void InfoIPChannel()
        {
            NET_DVR_IPPARACFG_V40  m_struIpParaCfgV40 = new NET_DVR_IPPARACFG_V40();
            NET_DVR_DEVICEINFO_V30 DeviceInfo         = new NET_DVR_DEVICEINFO_V30();
            NET_DVR_STREAM_MODE    m_struStreamMode   = new NET_DVR_STREAM_MODE();
            NET_DVR_IPCHANINFO     m_struChanInfo     = new NET_DVR_IPCHANINFO();

            NET_DVR_IPCHANINFO_V40 m_struChanInfoV40 = new NET_DVR_IPCHANINFO_V40();

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

            IntPtr ptrIpParaCfgV40 = Marshal.AllocHGlobal((Int32)dwSize);

            Marshal.StructureToPtr(m_struIpParaCfgV40, ptrIpParaCfgV40, false);

            uint dwReturn = 0;

            if (!NET_DVR_GetDVRConfig(_intDVRHwd, NET_DVR_GET_IPPARACFG_V40, 0, ptrIpParaCfgV40, dwSize, ref dwReturn))
            {
            }
            else
            {
                m_struIpParaCfgV40 = (NET_DVR_IPPARACFG_V40)Marshal.PtrToStructure(ptrIpParaCfgV40, typeof(NET_DVR_IPPARACFG_V40));

                for (iip = 0; iip < dwAChanTotalNum; iip++)
                {
                    iChannelNum[iip] = iip + (int)DeviceInfo.byStartChan + 1;
                    //iChannelNum[iip] = iip + (int)DeviceInfo.byStartChan;
                }

                byte byStreamType;
                for (iip = 0; iip < m_struIpParaCfgV40.dwDChanNum; iip++)
                {
                    iChannelNum[iip + dwAChanTotalNum] = iip + (int)m_struIpParaCfgV40.dwStartDChan;
                    byStreamType = m_struIpParaCfgV40.struStreamMode[iip].byGetStreamType;
                    switch (byStreamType)
                    {
                    //目前NVR仅支持0- 直接从设备取流一种方式 NVR supports only one mode: 0- get stream from device directly
                    case 0:
                        dwSize = (uint)Marshal.SizeOf(m_struStreamMode);
                        IntPtr ptrChanInfo = Marshal.AllocHGlobal((Int32)dwSize);
                        Marshal.StructureToPtr(m_struIpParaCfgV40.struStreamMode[iip].uGetStream, ptrChanInfo, false);
                        m_struChanInfo = (NET_DVR_IPCHANINFO)Marshal.PtrToStructure(ptrChanInfo, typeof(NET_DVR_IPCHANINFO));
                        Marshal.FreeHGlobal(ptrChanInfo);
                        break;

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

                        //列出IP通道 List the IP channel
                        //iIPDevID[i] = m_struChanInfoV40.wIPID - iGroupNo * 64 - 1;

                        Marshal.FreeHGlobal(ptrChanInfoV40);
                        break;

                    default:
                        break;
                    }
                }
            }
        }