C# 海康sdk

本文介绍了使用C#开发视频点播系统的过程,重点是封装海康SDK,包括处理海康SDK的回调函数、结构体和错误码,以及与服务器的交互。内容涵盖了一系列与视频流、网络配置、报警状态和硬盘状态相关的结构体和函数调用。

以前用vc开发一个客户端,现在公司需要做一个视频点播系统。由于项目比较急用vc做,时间可能会不够,所以选择用c#来完成。这个点播系统主要包括客户端和流媒体服务器两个部分。开始项目之前要重新写海康的.h文件,引用vc写的dll。封装.h文件。

namespace HIK
{

    public delegate void fVoiceDataCallBack(int lVoiceComHandle, [MarshalAs(UnmanagedType.LPArray)]  byte[] pRecvDataBuffer, uint dwBufSize, byte byAudioFlag, uint dwUser);

    public delegate void SerialDataCallBack(int lSerialHandle, [MarshalAs(UnmanagedType.LPArray)]  byte[] pRecvDataBuffer, uint dwBufSize, uint dwUser);

    public delegate void DrawFun(int lRealHandle, System.Drawing.Graphics hDc, uint dwUser);

    public delegate void RealDataCallBack(int lRealHandle, uint dwDataType, [MarshalAs(UnmanagedType.LPArray, SizeConst = 11520)] byte[] pBuffer, uint dwBufSize, uint dwUser);

    public delegate void PlayDataCallBack(int lPlayHandle, uint dwDataType, [MarshalAs(UnmanagedType.LPArray)]  byte[] pBuffer, uint dwBufSize, uint dwUser);

    public struct NET_DVR_DEVICEINFO
    {
        // [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] 

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)]
        public byte[] sSerialNumber;//[SERIALNO_LEN];  //序列号
        public byte byAlarmInPortNum;  //DVR报警输入个数
        public byte byAlarmOutPortNum;  //DVR报警输出个数
        public byte byDiskNum;    //DVR 硬盘个数
        public byte byDVRType;    //DVR类型,
        public byte byChanNum;    //DVR 通道个数
        public byte byStartChan;   //起始通道号,例如DVS-1,DVR - 1
    }


    public struct NET_DVR_DISKSTATE
    {
        public uint dwVolume;//硬盘的容量
        public uint dwFreeSpace;//硬盘的剩余空间
        public uint dwHardDiskStatic; //硬盘的状态,休眠,活动,不正常等
    }


    public struct NET_DVR_TIME
    {
        public uint dwYear;  //年
        public uint dwMonth;  //月
        public uint dwDay;  //日
        public uint dwHour;  //时
        public uint dwMinute;  //分
        public uint dwSecond;  //秒
    }

    public struct NET_DVR_FIND_DATA
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
        public string sFileName;//文件名
        public NET_DVR_TIME struStartTime;//文件的开始时间
        public NET_DVR_TIME struStopTime;//文件的结束时间
        public uint dwFileSize;//文件的大小
    }


    public struct NET_DVR_CHANNELSTATE
    {
        public byte byRecordStatic; //通道是否在录像,0-不录像,1-录像
        public byte bySignalStatic; //连接的信号状态,0-正常,1-信号丢失
        public byte byHardwareStatic;//通道硬件状态,0-正常,1-异常,例如DSP死掉
        public char reservedData;
        public uint dwBitRate;//实际码率
        public uint dwLinkNum;//客户端连接的个数
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]  //MAX_LINK
        public uint[] dwClientIP;//客户端的IP地址
    }

    public struct NET_DVR_WORKSTATE
    {

        public uint dwDeviceStatic;  //设备的状态,0-正常,1-CPU占用率太高,超过85%,2-硬件错误,例如串口死掉

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
        public NET_DVR_DISKSTATE[] struHardDiskStatic; //MAX_DISKNUM

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
        public NET_DVR_CHANNELSTATE[] struChanStatic;//通道的状态MAX_CHANNUM

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
        public byte[] byAlarmInStatic; //报警端口的状态,0-没有报警,1-有报警MAX_ALARMIN

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        public byte[] byAlarmOutStatic; //报警输出端口的状态,0-没有输出,1-有报警输出MAX_ALARMOUT
        public uint dwLocalDisplay;//本地显示状态,0-正常,1-不正常
    }

    public struct NET_DVR_ETHERNET
    {
        public string sDVRIP;          //DVR IP地址
        public string sDVRIPMask;      // DVR IP地址掩码
        public uint dwNetInterface;   //网络接口 1-10MBase-T 2-10MBase-T全双工 3-100MBase-TX 4-100M全双工 5-10M/100M自适应
        public ushort wDVRPort;  //端口号
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
        public byte[] byMACAddr;  //服务器的物理地址MACADDR_LEN
    }


    public struct NET_DVR_NETCFG
    {
        public uint dwSize;

        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
        public NET_DVR_ETHERNET[] struEtherNet;  /* 以太网口 */
        public string sManageHostIP;  //远程管理主机地址
        public short wManageHostPort; //远程管理主机端口号
        public string sDNSIP;            //DNS服务器地址 
        public string sMultiCastIP;     //多播组地址
        public string sGatewayIP;        //网关地址
        public string sNFSIP;   //NAS主机IP地址
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
        public byte[] sNFSDirectory;//NAS目录PATHNAME_LEN
        public uint dwPPPOE;    //0-不启用,1-启用
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
        public byte[] sPPPoEUser; //PPPoE用户名NAME_LEN
        //  [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
        public string sPPPoEPassword;// PPPoE密码
        public string sPPPoEIP;   //PPPoE IP地址(只读)
        public ushort wHttpPort;    //HTTP端口号
    }

    public struct NET_DVR_ALARMOUTSTATUS
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        public byte[] Output;//MAX_ALARMOUT
    }

    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 System.IntPtr hPlayWnd;//播放窗口的句柄,为NULL表示不播放图象
        public string sMultiCastIP;//多播组地址
    }

    /// <summary>
    /// 海康嵌入式
    /// </summary>
    public sealed class Hik_HCNetSDK
    {
        #region 常量定义
        public const int NET_DVR_NOERROR = 0; //没有错误
        public const int NET_DVR_PASSWORD_ERROR = 1;  //用户名密码错误
        public const int NET_DVR_NOENOUGHPRI = 2;  //权限不足
        public const int NET_DVR_NOINIT = 3; //没有初始化
        public const int NET_DVR_CHANNEL_ERROR = 4;  //通道号错误
        public const int NET_DVR_OVER_MAXLINK = 5; //连接到DVR的客户端个数超过最大
        public const int NET_DVR_VERSIONNOMATCH = 6; //版本不匹配
        public const int NET_DVR_NETWORK_FAIL_CONNECT = 7;//连接服务器失败
        public const int NET_DVR_NETWORK_SEND_ERROR = 8; //向服务器发送失败
        public const int NET_DVR_NETWORK_RECV_ERROR = 9;//从服务器接收数据失败
        public const int NET_DVR_NETWORK_RECV_TIMEOUT = 10; //从服务器接收数据超时

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值