通过c#访问海康DVR

18 篇文章 0 订阅
18 篇文章 0 订阅


利用海康提供的网络sdk,采用P/Invoke的方式可以实现访问海康DVR的各种功能。
下面是采用C#进行sdk封装的方法和结构体。

 

源代码地址:http://download.csdn.net/source/3407206

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace video.hik
{
    /// <summary>
     /// CLR版本:4.0.30319.1
    /// 机器名称:JIAYP
    /// 创建时间:3/28/2011 3:32:13 PM
    /// 创建年份: 2011   
    /// 作者:Administrator
    /// 功能介绍:
    /// 检查时间:
    /// 检查人:
    /// 检查结果:
    /// </summary>
    public class HikVideoVideoDeviceFunction
    {
        //初始化和登录
        [DllImport("Video//Hik//HCNetSDK.dll")]
        public static extern bool NET_DVR_Init();
        [DllImport("Video//Hik//HCNetSDK.dll")]
        public static extern int NET_DVR_Login(String serverIP, int port, String user, String pws, out NET_DVR_DEVICEINFO serInfo);
        [DllImport("Video//Hik//HCNetSDK.dll")]
        //图像预览
        public static extern int NET_DVR_RealPlay(int userID, ref NET_DVR_CLIENTINFO cliInfo);
        [DllImport("Video//Hik//HCNetSDK.dll")]
        public static extern bool NET_DVR_StopRealPlay(int lRealHandle);

        [DllImport("Video//Hik//HCNetSDK.dll")]
        public static extern bool NET_DVR_SaveRealData(int lRealHandle, String fileName);
        [DllImport("Video//Hik//HCNetSDK.dll")]
        public static extern bool NET_DVR_StopSaveRealData(int lRealHandle);
        //外围控制
        [DllImport("Video//Hik//HCNetSDK.dll")]
        public static extern bool NET_DVR_SendToSerialPort(int lUserID, int dwSerialPort, int dwSerialIndex, byte[] pSendBuf, int dwBufSize);
        [DllImport("Video//Hik//HCNetSDK.dll")]
        public static extern int NET_DVR_SerialStart(int lUserID, int lSerialPort, SerialDataCallBackDelegate cbSerialDataCallBack, int dwUser);
         [DllImport("Video//Hik//HCNetSDK.dll")]
        public static extern bool NET_DVR_SerialSend(int lSerialHandle, int lChannel, byte[] pSendBuf, int dwBufSize);
        [DllImport("Video//Hik//HCNetSDK.dll")]
         public static extern bool NET_DVR_SerialStop(int lSerialHandle);
        [DllImport("Video//Hik//HCNetSDK.dll")]
        public static extern int NET_DVR_GetLastError();

     
    }
    public delegate void SerialDataCallBackDelegate(int lSerialHandle, String charpRecvDataBuffer, int dwBufSize, int dwUser);
}

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace video.hik
{
    /// <summary>
          /// CLR版本:4.0.30319.1
    /// 机器名称:JIAYP
    /// 创建时间:3/28/2011 4:30:42 PM
    /// 创建年份: 2011   
    /// 作者:Administrator
    /// 功能介绍:
    /// 检查时间:
    /// 检查人:
    /// 检查结果:
    /// </summary>
    ///

    public class HikVideoConstant
    {
       public static int  NET_DVR_NOERROR =0;  //没有错误
public static int   NET_DVR_PASSWORD_ERROR =   1;  //用户名密码错误
public static int   NET_DVR_NOENOUGHPRI  =  2;  //权限不足
public static int   NET_DVR_NOINIT    =  3;  //没有初始化
public static int   NET_DVR_CHANNEL_ERROR   = 4;  //通道号错误
public static int   NET_DVR_OVER_MAXLINK   = 5;  //连接到DVR的客户端个数超过最大
public static int   NET_DVR_VERSIONNOMATCH  = 6;  //版本不匹配
public static int   NET_DVR_NETWORK_FAIL_CONNECT= 7; //连接服务器失败
public static int   NET_DVR_NETWORK_SEND_ERROR = 8; //向服务器发送失败
public static int   NET_DVR_NETWORK_RECV_ERROR = 9; //从服务器接收数据失败
public static int   NET_DVR_NETWORK_RECV_TIMEOUT= 10; //从服务器接收数据超时
public static int   NET_DVR_NETWORK_ERRORDATA=  11; //传送的数据有误
public static int   NET_DVR_ORDER_ERROR  =  12; //调用次序错误
public static int   NET_DVR_OPERNOPERMIT =  13; //无此权限
public static int   NET_DVR_COMMANDTIMEOUT =  14; //DVR命令执行超时
public static int   NET_DVR_ERRORSERIALPORT  = 15; //串口号错误
public static int   NET_DVR_ERRORALARMPORT  = 16; //报警端口错误
public static int   NET_DVR_PARAMETER_ERROR  = 17;  //参数错误
public static int   NET_DVR_CHAN_EXCEPTION  = 18; //服务器通道处于错误状态
public static int   NET_DVR_NODISK    = 19; //没有硬盘
public static int   NET_DVR_ERRORDISKNUM  = 20; //硬盘号错误
public static int   NET_DVR_DISK_FULL   = 21; //服务器硬盘满
public static int   NET_DVR_DISK_ERROR   = 22; //服务器硬盘出错
public static int   NET_DVR_NOSUPPORT   = 23; //服务器不支持
public static int   NET_DVR_BUSY    = 24; //服务器忙
public static int   NET_DVR_MODIFY_FAIL   = 25; //服务器修改不成功
public static int   NET_DVR_PASSWORD_FORMAT_ERROR= 26; //密码输入格式不正确
public static int   NET_DVR_DISK_FORMATING  = 27; //硬盘正在格式化,不能启动操作
public static int   NET_DVR_DVRNORESOURCE  = 28; //DVR资源不足
public static int   NET_DVR_DVROPRATEFAILED  = 29;  //DVR操作失败
public static int   NET_DVR_OPENHOSTSOUND_FAIL  = 30;  //打开PC声音失败
public static int   NET_DVR_DVRVOICEOPENED   = 31;  //服务器语音对讲被占用
public static int   NET_DVR_TIMEINPUTERROR  = 32;  //时间输入不正确
public static int   NET_DVR_NOSPECFILE   = 33;  //回放时服务器没有指定的文件
public static int   NET_DVR_CREATEFILE_ERROR = 34; //创建文件出错
public static int   NET_DVR_FILEOPENFAIL  = 35;  //打开文件出错
public static int   NET_DVR_OPERNOTFINISH =  36;  //上次的操作还没有完成
public static int   NET_DVR_GETPLAYTIMEFAIL =  37;  //获取当前播放的时间出错
public static int   NET_DVR_PLAYFAIL   = 38 ; //播放出错
public static int   NET_DVR_FILEFORMAT_ERROR = 39;  //文件格式不正确
public static int   NET_DVR_DIR_ERROR   = 40; //路径错误
public static int   NET_DVR_ALLOC_RESOUCE_ERROR = 41;  //资源分配错误
public static int   NET_DVR_AUDIO_MODE_ERROR = 42; //声卡模式错误
public static int   NET_DVR_NOENOUGH_BUF  = 43; //缓冲区太小
public static int   NET_DVR_CREATESOCKET_ERROR = 44; //创建SOCKET出错
public static int   NET_DVR_SETSOCKET_ERROR  = 45; //设置SOCKET出错
public static int   NET_DVR_MAX_NUM    = 46; //个数达到最大
public static int   NET_DVR_USERNOTEXIST  = 47; //用户不存在
public static int   NET_DVR_WRITEFLASHERROR  = 48;  //写FLASH出错
public static int   NET_DVR_UPGRADEFAIL   = 49;  //DVR升级失败
public static int   NET_DVR_CARDHAVEINIT  = 50;  //解码卡已经初始化过
public static int   NET_DVR_PLAYERFAILED  = 51; //播放器中错误
public static int   NET_DVR_MAX_USERNUM   = 52; //用户数达到最大
public static int   NET_DVR_GETLOCALIPANDMACFAIL= 53;  //获得客户端的IP地址或物理地址失败
public static int   NET_DVR_NOENCODEING   = 54; //该通道没有编码
public static int   NET_DVR_IPMISMATCH   = 55; //IP地址不匹配
public static int   NET_DVR_MACMISMATCH   = 56; //MAC地址不匹配
public static int   NET_DVR_UPGRADELANGMISMATCH = 57; //升级文件语言不匹配

//查找文件和日志函数返回值
public static int   NET_DVR_FILE_SUCCESS  =  1000; //获得文件信息
public static int   NET_DVR_FILE_NOFIND   = 1001; //没有文件
public static int   NET_DVR_ISFINDING   = 1002; //正在查找文件
public static int   NET_DVR_NOMOREFILE   = 1003; //查找文件时没有更多的文件
public static int   NET_DVR_FILE_EXCEPTION  =  1004; //查找文件时异常

//NET_DVR_IsSupport()返回值
//1-9位分别表示以下信息(位与是TRUE)表示支持;
public static int   NET_DVR_SUPPORT_DDRAW  = 0x01;//支持DIRECTDRAW,如果不支持,则播放器不能工作;
public static int   NET_DVR_SUPPORT_BLT   =0x02;//显卡支持BLT操作,如果不支持,则播放器不能工作;
public static int   NET_DVR_SUPPORT_BLTFOURCC = 0x04;//显卡BLT支持颜色转换,如果不支持,播放器会用软件方法作RGB转换;
public static int   NET_DVR_SUPPORT_BLTSHRINKX = 0x08;//显卡BLT支持X轴缩小;如果不支持,系统会用软件方法转换;
public static int   NET_DVR_SUPPORT_BLTSHRINKY = 0x10;//显卡BLT支持Y轴缩小;如果不支持,系统会用软件方法转换;
public static int   NET_DVR_SUPPORT_BLTSTRETCHX = 0x20;//显卡BLT支持X轴放大;如果不支持,系统会用软件方法转换;
public static int   NET_DVR_SUPPORT_BLTSTRETCHY = 0x40;//显卡BLT支持Y轴放大;如果不支持,系统会用软件方法转换;
public static int   NET_DVR_SUPPORT_SSE  = 0x80;//CPU支持SSE指令,Intel Pentium3以上支持SSE指令;
public static int   NET_DVR_SUPPORT_MMX  = 0x100;//CPU支持MMX指令集,Intel Pentium3以上支持SSE指令;

public static int   SET_PRESET = 8; // 设置预置点
public static int   CLE_PRESET = 9; // 清除预置点
public static int   GOTO_PRESET = 39; // 转到预置点

public static int   LIGHT_PWRON = 2; /* 接通灯光电源 */
public static int   WIPER_PWRON = 3; /* 接通雨刷开关 */
public static int   FAN_PWRON = 4; /* 接通风扇开关 */
public static int   HEATER_PWRON= 5; /* 接通加热器开关 */
public static int   AUX_PWRON = 6; /* 接通辅助设备开关 */

public static int   ZOOM_IN  = 11; /* 焦距以速度SS变大(倍率变大) */
public static int   ZOOM_OUT = 12; /* 焦距以速度SS变小(倍率变小) */
public static int   FOCUS_NEAR = 13; /* 焦点以速度SS前调 */
public static int   FOCUS_FAR = 14; /* 焦点以速度SS后调 */
public static int   IRIS_OPEN = 15; /* 光圈以速度SS扩大 */
public static int   IRIS_CLOSE = 16; /* 光圈以速度SS缩小 */
public static int   TILT_UP  = 21; /* 云台以SS的速度上仰 */
public static int   TILT_DOWN = 22; /* 云台以SS的速度下俯 */
public static int   PAN_LEFT = 23; /* 云台以SS的速度左转 */
public static int   PAN_RIGHT = 24; /* 云台以SS的速度右转 */
public static int   PAN_AUTO = 29; /* 云台以SS的速度左右自动扫描 */

public static int   RUN_CRUISE = 36; /* 开始轨迹 */
public static int   RUN_SEQ  = 37; /* 开始巡航 */
public static int   STOP_SEQ = 38; /* 停止巡航 */

 

public static int   NET_DVR_SYSHEAD  =1; //系统头数据
public static int   NET_DVR_STREAMDATA  =2; //流数据

//播放控制命令宏定义 NET_DVR_PlayBackControl,NET_DVR_PlayControlLocDisplay,NET_DVR_DecPlayBackCtrl的宏定义
public static int   NET_DVR_PLAYSTART  =1;//开始播放
public static int   NET_DVR_PLAYSTOP  =2;//停止播放
public static int   NET_DVR_PLAYPAUSE  =3;//暂停播放
public static int   NET_DVR_PLAYRESTART  =4;//恢复播放
public static int   NET_DVR_PLAYFAST  =5;//快放
public static int   NET_DVR_PLAYSLOW  =6;//慢放
public static int   NET_DVR_PLAYNORMAL  =7;//正常速度
public static int   NET_DVR_PLAYFRAME  =8;//单帧放
public static int   NET_DVR_PLAYSTARTAUDIO  =9;//打开声音
public static int   NET_DVR_PLAYSTOPAUDIO  =10;//关闭声音
public static int   NET_DVR_PLAYAUDIOVOLUME  =11;//调节音量
public static int   NET_DVR_PLAYSETPOS  =12;//改变文件回放的进度
public static int   NET_DVR_PLAYGETPOS  =13;//获取文件回放的进度
public static int   NET_DVR_PLAYGETTIME  =14;//获取当前已经播放的时间
public static int   NET_DVR_PLAYGETFRAME  =15;//获取当前已经播放的帧数
public static int   NET_DVR_GETTOTALFRAMES   =16;//获取当前播放文件总的帧数
public static int   NET_DVR_GETTOTALTIME     =17;//获取当前播放文件总的时间
public static int   NET_DVR_THROWBFRAME  =20;//丢B帧

//NET_DVR_GetDVRConfig,NET_DVR_GetDVRConfig的命令定义
public static int   NET_DVR_GET_DEVICECFG  =100;  //获取设备参数
public static int   NET_DVR_SET_DEVICECFG  =101;  //设置设备参数
public static int   NET_DVR_GET_NETCFG  =102;  //获取网络参数
public static int   NET_DVR_SET_NETCFG  =103;  //设置网络参数
public static int   NET_DVR_GET_PICCFG  =104;  //获取图象参数
public static int   NET_DVR_SET_PICCFG  =105;  //设置图象参数
public static int   NET_DVR_GET_COMPRESSCFG = 106 ; //获取压缩参数
public static int   NET_DVR_SET_COMPRESSCFG = 107;  //设置压缩参数
public static int   NET_DVR_GET_RECORDCFG = 108;  //获取录像时间参数
public static int   NET_DVR_SET_RECORDCFG = 109;  //设置录像时间参数
public static int   NET_DVR_GET_DECODERCFG = 110 ; //获取解码器参数
public static int   NET_DVR_SET_DECODERCFG  =111;  //设置解码器参数
public static int   NET_DVR_GET_RS232CFG   =112;  //获取232串口参数
public static int   NET_DVR_SET_RS232CFG  =113;  //设置232串口参数
public static int   NET_DVR_GET_ALARMINCFG  = 114 ; //获取报警输入参数
public static int   NET_DVR_SET_ALARMINCFG  =115;  //设置报警输入参数
public static int   NET_DVR_GET_ALARMOUTCFG = 116 ; //获取报警输出参数
public static int   NET_DVR_SET_ALARMOUTCFG  =117;  //设置报警输出参数
public static int   NET_DVR_GET_TIMECFG  = 118 ; //获取DVR时间
public static int   NET_DVR_SET_TIMECFG  =119;  //设置DVR时间
public static int   NET_DVR_GET_PREVIEWCFG  = 120 ; //获取预览参数
public static int   NET_DVR_SET_PREVIEWCFG = 121;  //设置预览参数
public static int   NET_DVR_GET_VIDEOOUTCFG = 122;  //获取视频输出参数
public static int   NET_DVR_SET_VIDEOOUTCFG = 123;  //设置视频输出参数
public static int   NET_DVR_GET_USERCFG  = 124;  //获取用户参数
public static int   NET_DVR_SET_USERCFG  =125; //设置用户参数
public static int   NET_DVR_GET_EXCEPTIONCFG=  126;  //获取异常参数
public static int   NET_DVR_SET_EXCEPTIONCFG= 127;  //设置异常参数
public static int   NET_DVR_GET_SHOWSTRING = 130 ; //获取叠加字符参数
public static int   NET_DVR_SET_SHOWSTRING = 131;  //设置叠加字符参数
public static int   NET_DVR_GET_AUXOUTCFG = 140 ; //获取辅助输出设置
public static int   NET_DVR_SET_AUXOUTCFG = 141;  //设置辅助输出设置
public static int   NET_DVR_GET_PICCFG_EX = 200;  //获取图象参数(扩展)
public static int   NET_DVR_SET_PICCFG_EX = 201;  //设置图象参数(扩展)
public static int   NET_DVR_GET_USERCFG_EX  = 202 ; //获取用户参数
public static int   NET_DVR_SET_USERCFG_EX = 203 ; //设置用户参数

//回调函数类型
public static int   COMM_ALARM   =0x1100; //报警信息
public static int   COMM_TRADEINFO  =0x1500; //ATMDVR主动上传交易信息

//消息方式
//异常类型
public static int   EXCEPTION_EXCHANGE   =0x8000; //用户交互时异常
public static int   EXCEPTION_AUDIOEXCHANGE= 0x8001; //语音对讲异常
public static int   EXCEPTION_ALARM  =0x8002; //报警异常
public static int   EXCEPTION_PREVIEW =0x8003; //网络预览异常
public static int   EXCEPTION_SERIAL =0x8004; //透明通道异常
public static int   EXCEPTION_RECONNECT =0x8005; //预览时重连

public static int   NAME_LEN  =32;
public static int   SERIALNO_LEN  =48;
public static int   MACADDR_LEN  =6;
public static int   MAX_ETHERNET  =2;
public static int   PATHNAME_LEN  =128;
public static int   PASSWD_LEN=  16;
public static int   MAX_CHANNUM = 16;
public static int   MAX_ALARMOUT  =4;
public static int   MAX_TIMESEGMENT =4;
public static int   MAX_PRESET= 128;
public static int   MAX_DAYS  =7;
public static int   PHONENUMBER_LEN= 32;
public static int   MAX_DISKNUM  =16;
public static int   MAX_WINDOW  =16;
public static int   MAX_VGA  =1;
public static int   MAX_USERNUM  =16;
public static int   MAX_EXCEPTIONNUM =16;
public static int   MAX_LINK  =6;
public static int   MAX_ALARMIN  =16;
public static int   MAX_VIDEOOUT  =2;
public static int   MAX_NAMELEN =16 ; //DVR本地登陆名
public static int   MAX_RIGHT =32 ; //权限
public static int   CARDNUM_LEN  =20;
public static int   MAX_SHELTERNUM =4; //遮挡区域数
public static int   MAX_DECPOOLNUM = 4;
public static int   MAX_DECNUM  = 4;
public static int   MAX_TRANSPARENTNUM =2;
public static int   MAX_STRINGNUM = 4;
public static int   MAX_AUXOUT  = 4;

/* 网络接口定义 */
public static int   NET_IF_10M_HALF = 1;     /* 10M ethernet */
public static int   NET_IF_10M_FULL = 2;
public static int   NET_IF_100M_HALF= 3;    /* 100M ethernet */
public static int   NET_IF_100M_FULL= 4;
public static int   NET_IF_AUTO = 5;

//设备型号(DVR类型)
public static int   DVR     =     1;
public static int   ATMDVR=       2;
public static int   DVS    =      3;
public static int   DEC    =      4;  /* 6001D */
public static int   ENC_DEC =     5;  /* 6001F */
public static int   DVR_HC=       6;
public static int   DVR_HT  =     7;
public static int   DVR_HF  =     8;
public static int   DVR_HS  =     9;
public static int   DVR_HTS  =    10;
public static int   DVR_HB  =     11;
public static int   DVR_HCS =     12;
public static int   DVS_A =  13 ;
}
//显示模式
public enum VideoShowMode {NORMALMODE = 0,OVERLAYMODE};
//发送模式
public enum SendMode {PTOPTCPMODE,PTOPUDPMODE,MULTIMODE,RTPMODE,AUDIODETACH,NOUSEMODE};
    [StructLayout(LayoutKind.Sequential)]
    public struct NET_DVR_DEVICEINFO
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)]
        public byte[] sSerialNumber; //序列号         
        public byte byAlarmInPortNum;          //DVR报警输入个数
        public byte byAlarmOutPortNum;          //DVR报警输出个数
        public byte byDiskNum;            //DVR硬盘个数
        public byte byDVRType;            //DVR类型, 1:DVR 2:ATM DVR 3:DVS ......
        public byte byChanNum;            //DVR 通道个数
        public byte byStartChan;           //起始通道号,例如DVS-1,DVR - 1
    }

     [StructLayout(LayoutKind.Sequential)]
    public struct NET_DVR_CLIENTINFO
    {
        public int lChannel;//通道号
        public int lLinkMode;//最高位(31)为0表示主码流,为1表示子码流,0-30位表示码流连接方式: 0:TCP方式,1:UDP方式,2:多播方式,3 - RTP方式,4-音视频分开(TCP)
        public IntPtr hPlayWnd;//播放窗口的句柄,为NULL表示不播放图象  
        [MarshalAs(UnmanagedType.LPTStr)]
        public string sMultiCastIP;
    }
     [StructLayout(LayoutKind.Sequential)]
     public struct NET_DVR_DISPLAY_PARA
     {
         public int bToScreen;
         public int bToVideoOut;
         public int nLeft;
         public int nTop;
         public int nWidth;
         public int nHeight;
         public int nReserved;
      }
    [StructLayout(LayoutKind.Sequential)]
    public struct NET_DVR_CARDINFO
    {
  public int lChannel;//通道号
  public int lLinkMode; //最高位(31)为0表示主码流,为1表示子码流,0-30位表示码流连接方式: 0:TCP方式,1:UDP方式,2:多播方式,3 - RTP方式,4-电话线,5-128k宽带,6-256k宽带,7-384k宽带,8-512k宽带;
  [MarshalAs(UnmanagedType.LPTStr)]
     public string sMultiCastIP;
  NET_DVR_DISPLAY_PARA struDisplayPara;
     }

    [StructLayout(LayoutKind.Sequential)]
    public struct NET_DVR_TIME
    {
        public int dwYear;  //年
        public int dwMonth;  //月
        public int dwDay;  //日
        public int dwHour;  //时
        public int dwMinute;  //分
        public int dwSecond;  //秒
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值