利用海康提供的網絡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; //秒
}
}