C#批量设置海康和大华录像机NVR,GB28181的通道编码.

我经常要把小区海康或者大华的硬盘录像机推送到自己搭建的gb28181监控平台,每次几百个摄像头编码,有点头大,就用了1个多周写了个批量设置海康和大华硬盘录像机的通道编码的程序,海康和大华的SDK简直不是人看的. 太乱了.

大华读取通道编码的代码

        /// <summary>
        /// 获取通道编码id列表
        /// QQ : 771811549
        /// </summary>
        /// <returns>通道编码id列表</returns>
        public DataTable GetInputIDs()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("id", typeof(string));
            dt.Columns.Add("videoInputID", typeof(string));

            if (info.stuSipServerInfo[0].nChannelInfoNum > 0)// 释放内存
            { Marshal.FreeHGlobal(info.stuSipServerInfo[0].pstuChannnelInfo); }

            info.stuSipServerInfo[0].nChannelInfoNum = (uint)m_DeviceInfo.nChanNum;//设置通道个数
            info.stuSipServerInfo[0].pstuChannnelInfo = Marshal.AllocHGlobal(channelInfoSize * m_DeviceInfo.nChanNum);//分配内存

            NETClient.CLIENT_GetConfig(m_LoginID, -1, ref info);//获取数据

            NET_SIP_SERVER_INFO ser = info.stuSipServerInfo[0];
            for (int j = 0; j < ser.nChannelInfoNum; j++)
            {
                IntPtr currentPtr = new IntPtr(ser.pstuChannnelInfo.ToInt64() + (j * channelInfoSize));//获取数组偏移指针
                NET_CHANNEL_INFO channelInfo = (NET_CHANNEL_INFO)Marshal.PtrToStructure(currentPtr, typeof(NET_CHANNEL_INFO));//获取指针对象
                DataRow dr = dt.NewRow();
                dr["id"] = j + 1;//通道id
                dr["videoInputID"] = channelInfo.szID;//通道编号
                dt.Rows.Add(dr);
            }
            return dt;
        }

海康部分代码

public string XML透传(string Url, string Param = "")
        {
            CHCNetSDK.NET_DVR_XML_CONFIG_INPUT pInputXml = new CHCNetSDK.NET_DVR_XML_CONFIG_INPUT(); //XML透传接口
            Int32 nInSize = Marshal.SizeOf(pInputXml);
            pInputXml.dwSize = (uint)nInSize;//设置大小

            string strRequestUrl = Url;//设置url
            uint dwRequestUrlLen = (uint)strRequestUrl.Length;//url长度
            pInputXml.lpRequestUrl = Marshal.StringToHGlobalAnsi(strRequestUrl);//请求信令
            pInputXml.dwRequestUrlLen = dwRequestUrlLen;//设置长度

            string strInputParam = Param;//设置参数
            pInputXml.lpInBuffer = Marshal.StringToHGlobalAnsi(strInputParam);//设置缓冲区
            pInputXml.dwInBufferSize = (uint)strInputParam.Length;//设置缓冲区大小

            CHCNetSDK.NET_DVR_XML_CONFIG_OUTPUT pOutputXml = new CHCNetSDK.NET_DVR_XML_CONFIG_OUTPUT();
            pOutputXml.dwSize = (uint)Marshal.SizeOf(pInputXml);//结构体大小
            pOutputXml.lpOutBuffer = Marshal.AllocHGlobal(3 * 1024 * 1024);//输出参数缓冲区
            pOutputXml.dwOutBufferSize = 3 * 1024 * 1024;//输出参数缓冲区大小
            pOutputXml.lpStatusBuffer = Marshal.AllocHGlobal(4096 * 4);//返回的状态参数
            pOutputXml.dwStatusSize = 4096 * 4; //状态缓冲区大小(内存大小) 

            //透传
            if (!CHCNetSDK.NET_DVR_STDXMLConfig(m_lUserID, ref pInputXml, ref pOutputXml))
            {
                uint iLastErr = CHCNetSDK.NET_DVR_GetLastError();//失败
                MessageBox.Show("错误号 = " + iLastErr);//XML透传失败,输出错误号
            }

            //获取输出
            uint iXMSize = pOutputXml.dwReturnedXMLSize;
            byte[] managedArray = new byte[iXMSize];
            Marshal.Copy(pOutputXml.lpOutBuffer, managedArray, 0, (int)iXMSize);
            string jg = Encoding.UTF8.GetString(managedArray);
            //释放资源
            Marshal.FreeHGlobal(pInputXml.lpRequestUrl);
            Marshal.FreeHGlobal(pOutputXml.lpOutBuffer);
            Marshal.FreeHGlobal(pOutputXml.lpStatusBuffer);
            return jg;
        }

软件截图:

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值