利用海康提供的网络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
{
///
[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
{
///
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; //秒
}
}