天天看点

通过c#访问海康DVR

利用海康提供的网络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; 

public static int   ZOOM_OUT = 12; 

public static int   FOCUS_NEAR = 13; 

public static int   FOCUS_FAR = 14; 

public static int   IRIS_OPEN = 15; 

public static int   IRIS_CLOSE = 16; 

public static int   TILT_UP  = 21; 

public static int   TILT_DOWN = 22; 

public static int   PAN_LEFT = 23; 

public static int   PAN_RIGHT = 24; 

public static int   PAN_AUTO = 29; 

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;     

public static int   NET_IF_10M_FULL = 2;

public static int   NET_IF_100M_HALF= 3;    

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; 

public static int   ENC_DEC =     5; 

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;  //秒

    }

}