C#中如何连接海康威视

下面我将详细讲解如何在C#中连接海康威视。

1.准备工作

在开始之前,我们需要做一些准备工作。

  1. 安装海康威视设备的SDK,可以从海康威视官网下载对应版本的SDK。

  2. 将SDK的bin目录下的HCNetSDK.dll文件拷贝到C#项目的bin目录下。

2.连接海康威视

接下来,我们将通过以下步骤连接海康威视。

  1. 引入HCNetSDK.dll

在代码中添加以下代码:

using System.Runtime.InteropServices;
[DllImport("HCNetSDK.dll")]
public static extern bool NET_DVR_Init();
[DllImport("HCNetSDK.dll")]
public static extern bool NET_DVR_Cleanup();
[DllImport("HCNetSDK.dll")]
public static extern int NET_DVR_Login_V30(string sDVRIP, int wDVRPort, string sUserName, string sPassword, ref NET_DVR_DEVICEINFO_V30 lpDeviceInfo);
[DllImport("HCNetSDK.dll")]
public static extern bool NET_DVR_Logout(int iUserID);
  1. 初始化SDK

在代码中添加以下代码:

if (NET_DVR_Init()) 
{
   Console.WriteLine("初始化SDK成功!");
}
else 
{
   Console.WriteLine("初始化SDK失败!错误码:" + NET_DVR_GetLastError());
   return;
}

其中,NET_DVR_GetLastError()函数可以获取当前SDK的错误码。

  1. 登录设备

在代码中添加以下代码:

NET_DVR_DEVICEINFO_V30 deviceInfo = new NET_DVR_DEVICEINFO_V30();
int userID = NET_DVR_Login_V30("设备IP地址", 端口号, "用户名", "密码", ref deviceInfo);
if (userID < 0) 
{
   Console.WriteLine("登录设备失败!错误码:" + NET_DVR_GetLastError());
   NET_DVR_Cleanup();
   return;
}
else 
{
   Console.WriteLine("登录设备成功!");
}

其中,NET_DVR_Login_V30()函数返回的是userID,如果返回值小于0,则表示登录失败。

  1. 登出设备

在代码中添加以下代码:

bool logout = NET_DVR_Logout(userID);
if (!logout) 
{
   Console.WriteLine("登出设备失败!错误码:" + NET_DVR_GetLastError());
}
else 
{
   Console.WriteLine("登出设备成功!");
}

3.示例

下面是两个示例。第一个示例连接设备并获取设备参数。第二个示例连接设备并打开实时预览。

示例1:获取设备参数

using System;
using System.IO;
using System.Text;
using System.Runtime.InteropServices;
using System.Threading;

namespace Hikvision
{    
    [StructLayout(LayoutKind.Sequential)]
    public struct NET_DVR_DEVICEINFO_V30
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 48)]
        public string sSerialNumber;
        public byte byAlarmInPortNum;
        public byte byAlarmOutPortNum;
        public byte byDiskNum;
        public byte byDVRType;
        public byte byChanNum;
        public byte byStartChan;
        public byte byAudioChanNum;
        public byte byIPChanNum;
        public byte byZeroChanNum;
        public byte bySupport;
        public byte byRes1;
        public ushort wDevType;
        public byte byRes2;
    }

    public class HikvisionTest
    {
        [DllImport("HCNetSDK.dll")]
        public static extern bool NET_DVR_Init();

        [DllImport("HCNetSDK.dll")]
        public static extern bool NET_DVR_Cleanup();

        [DllImport("HCNetSDK.dll")]
        public static extern int NET_DVR_Login_V30(string sDVRIP, int wDVRPort, string sUserName, string sPassword, ref NET_DVR_DEVICEINFO_V30 lpDeviceInfo);

        [DllImport("HCNetSDK.dll")]
        public static extern bool NET_DVR_Logout(int iUserID);

        [DllImport("HCNetSDK.dll")]
        public static extern int NET_DVR_GetLastError();

        static void Main(string[] args)
        {
            if (NET_DVR_Init()) 
            {
                Console.WriteLine("初始化SDK成功!");
            }
            else 
            {
                Console.WriteLine("初始化SDK失败!错误码:" + NET_DVR_GetLastError());
                return;
            }

            NET_DVR_DEVICEINFO_V30 deviceInfo = new NET_DVR_DEVICEINFO_V30();
            int userID = NET_DVR_Login_V30("设备IP地址", 端口号, "用户名", "密码", ref deviceInfo);
            if (userID < 0) 
            {
                Console.WriteLine("登录设备失败!错误码:" + NET_DVR_GetLastError());
                NET_DVR_Cleanup();
                return;
            }
            else 
            {
                Console.WriteLine("登录设备成功!");
            }

            Console.WriteLine("设备序列号:" + deviceInfo.sSerialNumber);
            Console.WriteLine("通道数:" + deviceInfo.byChanNum);

            bool logout = NET_DVR_Logout(userID);
            if (!logout) 
            {
                Console.WriteLine("登出设备失败!错误码:" + NET_DVR_GetLastError());
            }
            else 
            {
                Console.WriteLine("登出设备成功!");
            }

            NET_DVR_Cleanup();
        }
    }
}

示例2:打开实时预览

using System;
using System.IO;
using System.Text;
using System.Runtime.InteropServices;
using System.Threading;

namespace Hikvision
{    
    [StructLayout(LayoutKind.Sequential)]
    public struct NET_DVR_DEVICEINFO_V30
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 48)]
        public string sSerialNumber;
        public byte byAlarmInPortNum;
        public byte byAlarmOutPortNum;
        public byte byDiskNum;
        public byte byDVRType;
        public byte byChanNum;
        public byte byStartChan;
        public byte byAudioChanNum;
        public byte byIPChanNum;
        public byte byZeroChanNum;
        public byte bySupport;
        public byte byRes1;
        public ushort wDevType;
        public byte byRes2;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct NET_DVR_PREVIEWINFO
    {
        public int lChannel;
        public int dwStreamType;
        public int dwLinkMode;
        public IntPtr hPlayWnd;
        public int bBlocked;
        public int bPassbackRecord;
        public int bPreviewMode;
        public int bRetrieveIPChannel;
        public int dwDisplayBufNum;
        public IntPtr byRes;
    }

    public class HikvisionTest
    {
        [DllImport("HCNetSDK.dll")]
        public static extern bool NET_DVR_Init();

        [DllImport("HCNetSDK.dll")]
        public static extern bool NET_DVR_Cleanup();

        [DllImport("HCNetSDK.dll")]
        public static extern int NET_DVR_Login_V30(string sDVRIP, int wDVRPort, string sUserName, string sPassword, ref NET_DVR_DEVICEINFO_V30 lpDeviceInfo);

        [DllImport("HCNetSDK.dll")]
        public static extern bool NET_DVR_Logout(int iUserID);

        [DllImport("HCNetSDK.dll")]
        public static extern int NET_DVR_GetLastError();

        [DllImport("HCNetSDK.dll")]
        public static extern int NET_DVR_RealPlay_V40(int iUserID, ref NET_DVR_PREVIEWINFO lpPreviewInfo, RealDataCallBack_V30 fRealDataCallBack_V30, IntPtr pUser);

        public delegate void RealDataCallBack_V30(int lRealHandle, ref NET_DVR_PACKET_INFO_EX pstruPacketInfo, IntPtr pUser);

        static void Main(string[] args)
        {
            if (NET_DVR_Init()) 
            {
                Console.WriteLine("初始化SDK成功!");
            }
            else 
            {
                Console.WriteLine("初始化SDK失败!错误码:" + NET_DVR_GetLastError());
                return;
            }

            NET_DVR_DEVICEINFO_V30 deviceInfo = new NET_DVR_DEVICEINFO_V30();
            int userID = NET_DVR_Login_V30("设备IP地址", 端口号, "用户名", "密码", ref deviceInfo);
            if (userID < 0) 
            {
                Console.WriteLine("登录设备失败!错误码:" + NET_DVR_GetLastError());
                NET_DVR_Cleanup();
                return;
            }
            else 
            {
                Console.WriteLine("登录设备成功!");
            }

            NET_DVR_PREVIEWINFO lpPreviewInfo = new NET_DVR_PREVIEWINFO();
            lpPreviewInfo.hPlayWnd = IntPtr.Zero;
            lpPreviewInfo.lChannel = 1;
            lpPreviewInfo.dwStreamType = 0;
            lpPreviewInfo.dwLinkMode = 0;
            lpPreviewInfo.bBlocked = true;
            lpPreviewInfo.dwDisplayBufNum = 15;

            int playHandle = NET_DVR_RealPlay_V40(userID, ref lpPreviewInfo, null, IntPtr.Zero);
            if (playHandle < 0) 
            {
                Console.WriteLine("打开实时预览失败!错误码:" + NET_DVR_GetLastError());
            }
            else 
            {
                Console.WriteLine("打开实时预览成功!");
            }

            Thread.Sleep(5000);//5秒钟后关闭实时预览

            bool stopPreview = NET_DVR_StopRealPlay(playHandle);
            if (!stopPreview) 
            {
                Console.WriteLine("关闭实时预览失败!错误码:" + NET_DVR_GetLastError());
            }
            else 
            {
                Console.WriteLine("关闭实时预览成功!");
            }

            bool logout = NET_DVR_Logout(userID);
            if (!logout) 
            {
                Console.WriteLine("登出设备失败!错误码:" + NET_DVR_GetLastError());
            }
            else 
            {
                Console.WriteLine("登出设备成功!");
            }

            NET_DVR_Cleanup();
        }
    }
}

以上就是连接海康威视的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中如何连接海康威视 - Python技术站

(1)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • HTML5-WebSocket实现聊天室示例

    下面是“HTML5-WebSocket实现聊天室示例”的完整攻略: HTML5-WebSocket实现聊天室示例 1. 什么是WebSocket? WebSocket是HTML5新增的一种协议,它是基于TCP协议实现的一种全双工通信机制,可以在浏览器和服务器之间建立实时的、双向的通信。相比传统的HTTP请求/响应模式,WebSocket更加高效、快速、可靠,…

    C# 2023年5月31日
    00
  • C#实现统计字数功能的方法

    下面是“C#实现统计字数的功能”的完整攻略: 一、需求分析 在进行编码之前,我们需要先分析需求,明确要实现的功能。在这个任务中,我们需要实现统计一段文本中包含的字符数和单词数的功能。 字符数的统计比较简单,只需要计算文本长度即可。而对单词数的统计涉及到对文本内容的分词和统计,需要采用一定的算法实现。 二、实现步骤 1. 统计字符数 要统计字符数,首先需要获取…

    C# 2023年6月1日
    00
  • C# BinaryReader.ReadBytes – 读取字节数组

    BinaryReader.ReadBytes 方法是 .NET Framework 内置的一个方法,可以用来从流中读取指定长度的字节,并将其存储在字节数组中。该方法返回一个字节数组,表示从流中读取的数据。 使用该方法需要先创建一个 BinaryReader 实例,该实例包含了一个可以读取的流。然后可以调用 ReadBytes 方法来读取指定长度的字节。该方法…

    C# 2023年4月19日
    00
  • Asp.Net Core中基于Session的身份验证的实现

    下面是”Asp.Net Core中基于Session的身份验证的实现”的详细攻略。 简介 身份验证是Web应用程序中必不可少的功能之一。在ASP.NET Core中,我们可以使用Session来实现身份验证。Session是一种记录Web应用程序状态的机制,它允许我们将数据在不同的页面间传递和存储。在ASP.NET Core中,Session机制支持在Web…

    C# 2023年6月3日
    00
  • C#字符串使用密钥进行加解密

    接下来我将为你详细讲解C#字符串使用密钥进行加解密的完整攻略。 首先,我们需要了解几个基本的概念:加密、解密、密钥。在此之前,我们需要知道需要使用到的命名空间:System.Security.Cryptography。 加密和解密 加密是指将信息转换为密文的过程,解密是指将密文恢复成信息的过程。在这个过程中,需要使用特定的算法对信息进行加密和解密。我们在C#…

    C# 2023年6月8日
    00
  • 使用C#正则表达式获取必应每日图片地址

    下面是使用C#正则表达式获取必应每日图片地址的完整攻略。 1. 确定获取的页面 每日图片地址是在必应的主页上展示的,我们需要确定获取的页面地址为 https://cn.bing.com/。 2. 发起HTTP请求获取页面内容 我们需要使用C#中的HttpClient类,通过其GetAsync方法获取页面内容。 示例代码: HttpClient httpCli…

    C# 2023年6月8日
    00
  • ASP.NET中的跳转 200, 301, 302转向实现代码

    ASP.NET中的跳转可以实现页面的重定向,通常情况下分为三类:200、301、302。 200:表示页面返回成功,这意味着页面在原url地址下保持不变,不会发生跳转。 301:表示永久重定向,也就是说,原url地址会永久改变到新的url地址,搜索引擎也会将原url流量自动传递给新的url地址。 302:表示临时重定向,也就是说原url地址会暂时改变到新的u…

    C# 2023年5月31日
    00
  • C#解决SQlite并发异常问题的方法(使用读写锁)

    让我来详细讲解“C#解决SQlite并发异常问题的方法(使用读写锁)”的完整攻略。 什么是SQlite并发异常问题 SQlite是一个非常流行的轻量级数据库,但由于其特殊的设计,使得它在并发访问时容易引发异常问题。例如,如果多个线程同时进行写操作,很容易引发数据被覆盖的情况,从而导致数据的不一致。 解决SQlite并发异常问题的方法 为了解决这个问题,我们可…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部