天天看點

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

    }

}