在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前言 写系列文章的时候[前言]部分变得无言了,可能来得顺利了点吧: ) 本章中提供的封装均是我用笨办法从<<Hikvision 板卡网络开发包编程手册V4.7>>和<<DS-4000HC、HCS、HC+、HF、HS、MD卡的Windows编程指南V4.3>>中拷贝出来并参照VC++代码进行整理的,主要是针对HikServer.dll和DS40xxSDK.dll的调用封装。
注意 本系列文章限于学习交流,注重过程,由于涉及公司,所以不提供源代码下载,非常抱歉!!但是请大家放心,核心、实现以及其他能够贴出来的代码我都会贴出来,并且争取尽所能的回答留言里的每一个问题,感谢大家关注,欢迎交流 :)
系列 5. C# 视频监控系列(5):客户端——给服务器端发送字符串和录像(数据捕获) 6. C# 视频监控系列(6):服务器端——封装API(上) [HikServer.dll]
正文 1. HikServer.dll
using System;
using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace HikServer { public struct PSERVER_VIDEOINFO { /// <summary> /// 序列号 /// BYTE m_datatype[64]; /// </summary> [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)] public byte[] m_datatype; /// <summary> /// 系统的通道个数 /// BYTE m_channum; /// </summary> public byte m_channum; /// <summary> /// 超时等待时间,1-300单位:分钟 /// DWORD m_waittime; /// </summary> public int m_waittime; /// <summary> /// 目前没有使用 /// DWORD m_bufnum; /// </summary> public ulong m_bufnum; } //[StructLayout(LayoutKind.Sequential)] //public struct PSERVER_VIDEOINFO //{ // public IntPtr m_datatype; //序列号 // public byte m_channum;//系统的通道个数 // public int m_waittime;//超时等待时间,1-300单位:分钟 // public int m_bufnum;//目前没有使用 //} /// <summary> /// 通道数据类型 /// </summary> public enum ChannelDataType { NORMAL = 50, DIALING, SMALLPIC } /// <summary> /// VC++Demo:委托内调用SetIBPMode(ChannelHandle[port],211,2,2,framerat); /// </summary> /// <param name="port"></param> /// <param name="framerat"></param> public delegate void SetIBP(int port, int framerat); /// <summary> /// VC++Demo:委托内调用CaptureIFrame(ChannelHandle[port]); /// </summary> /// <param name="port"></param> public delegate void MakeIFrame(int port); /// <summary> /// VC++Demo:委托内调用StartVideoCapture(ChannelHandle[port]); /// </summary> /// <param name="nChannel"></param> public delegate void StartCap(int nChannel); /// <summary> /// VC++Demo:委托内调用StopVideoCapture(ChannelHandle[port]); /// </summary> /// <param name="nChannel"></param> public delegate void StopCap(int nChannel); /// <summary> /// 验证用户名密码 /// </summary> /// <param name="username"></param> /// <param name="namelen"></param> /// <param name="password"></param> /// <param name="passlen"></param> /// <returns></returns> [UnmanagedFunctionPointer(CallingConvention.StdCall)] public delegate int CheckPassword(string username, ushort namelen, string password, ushort passlen); /// <summary> /// 验证IP /// VC++Demo:return 0; /// </summary> /// <param name="nChannel"></param> /// <param name="nIP"></param> /// <returns></returns> [UnmanagedFunctionPointer(CallingConvention.StdCall)] public delegate int CheckIP(int nChannel, string nIP); public static class HikServer { public static readonly uint WM_USER = 0x0400; /// <summary> /// 启动服务端 /// 返回true表示成功,返回false表示失败 /// <code> /// BOOL __stdcall MP4_ServerStart(PSERVER_VIDEOINFO videoinfo); /// </code> /// </summary> /// <param name="videoinfo"></param> /// <returns></returns> [DllImport("HikServer.dll")] public static extern int MP4_ServerStart(ref PSERVER_VIDEOINFO videoinfo); /// <summary> /// 停止服务端 /// 返回true表示成功,返回false表示失败 /// <code> /// BOOL __stdcall MP4_ServerStop(); /// </code> /// </summary> /// <returns></returns> [DllImport("HikServer.dll")] public static extern bool MP4_ServerStop(); /// <summary> /// 获取服务器状态 /// 返回true表示服务器已经启动,返回false表示服务器没有启动 /// <code> /// BOOL __stdcall MP4_ServerGetState(WORD * clientnum); /// typedef unsigned short WORD; /// </code> /// </summary> /// <param name="clientnum">表示当前与服务器相连的客户端数据</param> /// <returns></returns> [DllImport("HikServer.dll")] public static extern bool MP4_ServerGetState(out ushort clientnum); /// <summary> /// 给客户端发送命令码 /// 和函数MP4_ServerStringToClient不同,它给正连接在该通道上的所有客户端发送命令码。 /// 返回true表示成功,返回false表示失败 /// <code> /// BOOL __stdcall MP4_ServerCommandToClient(char cCommand,char nChannel); /// </code> /// </summary> /// <param name="cCommand">命令码</param> /// <param name="nChannel">通道号</param> [DllImport("HikServer.dll")] public static extern void MP4_ServerCommandToClient(int cCommand, int nChannel); /// <summary> /// 设置接收命令码的相关参数 /// <code> /// void __stdcall MP4_ServerSetMessage(UINT nMessage,HWND hWnd); /// </code> /// </summary> /// <param name="nMessage">对应接收程序的消息</param> /// <param name="hWnd">应用程序窗口句柄</param> [DllImport("HikServer.dll")] public static extern void MP4_ServerSetMessage(uint nMessage, IntPtr hWnd); /// <summary> /// 设置是否进行IP验证。 /// 如果进行IP验证,调用该函数,那么每次客户端连接的时候,会调用CheckIP。 /// 如果不进行IP验证,不需要调用该函数。 /// 如果调用了MP4_ServerCheckIP之后,又想取消IP验证,只需要调用MP4_ServerCheckIP(NULL)。 /// <code> /// void __stdcall MP4_ServerCheckIP(int(CALLBACK *CheckIP)(DWORD nChannel,char* nIP)); /// CheckIP函数说明:nChannel表示通道号,nIP表示客户端的IP地址。返回0表示验证通过,返回-1 /// 表示验证没有通过。 /// </code> /// </summary> [DllImport("HikServer.dll")] public static extern void MP4_ServerCheckIP(CheckIP cip); /// <summary> /// 设置是否进行用户身份验证。 /// 使用同MP4_ServerCheckIP。 /// 目前namelen和password两个值无效,都是50,并不表示用户名和密码的实际长度。用户名和密码必须小于50个字节。 /// 说明: /// 1>因为开发包对用户名和密码不做任何处理,只是简单地分别发送50字节的数据到服务端,所以在验证 /// 的实现过程中,用户可以通过设置标志位的方法来确定用户名和密码的实际长度。 /// 2>也可以同时进行IP验证和用户身份验证。在开发包中先进行用户身份验证,再进行IP验证。 /// <code> /// 7. void __stdcall MP4_ServerCheckPassword(int(CALLBACK *CheckPassword)(char *username,WORD namelen,char *password,WORD passlen)); /// CheckPassword函数说明:username表示用户名,namelen表示用户名字符串长度,password表示密码,passlen表示密码字符串长度。 /// </code> /// </summary> /// <param name="nMessage"></param> /// <param name="hWnd"></param> [DllImport("HikServer.dll")] public static extern void MP4_ServerCheckPassword(CheckPassword cp); /// <summary> /// 往发送缓存写数据。 /// 网络开发包通过这个接口获得板卡的数据。 /// 说明: /// 现在开发包内部不会直接调用StartVideoCapture和StopVideoCapture函数,而是通过StartCap和StopCap /// 来启动和停止捕获数据。如果用户调用StopVideoCapture或者停止调用MP4_ServerWriteData都会使客户 /// 端无法收到数据。 /// <code> /// 8. void __stdcall MP4_ServerWriteData(DWORD nChannel,UCHAR *pPacketBuffer, DWORD nPacketSize, int frameType, int breakable); /// typedef unsigned long DWORD; /// typedef unsigned char UCHAR; /// </code> /// </summary> /// <param name="nChannel">通道号。</param> /// <param name="pPacketBuffer">缓冲区指针。</param> /// <param name="nPacketSize">缓冲区长度。 </param> /// <param name="frameType">帧类型。</param> /// <param name="breakable">ReadStreamData的返回值</param> [DllImport("HikServer.dll")] public static extern void MP4_ServerWriteData(ulong nChannel, string pPacketBuffer, ulong nPacketSize, int frameType, int breakable); /// <summary> /// 设置启动捕获的回调。 /// <code> /// 9. void __stdcall MP4_ServerSetStart(void(CALLBACK *StartCap)(int nChannel)); /// StartCap函数说明:用户实现这个函数,只需要调用StartVideoCapture。 /// nChannel表示通道号。 /// </code> /// </summary> /// <param name="sc"></param> [DllImport("HikServer.dll")] public static extern void MP4_ServerSetStart(StartCap sc); /// <summary> /// 设置停止捕获的回调。 /// <code> /// 10. void __stdcall MP4_ServerSetStop(void(CALLBACK *StopCap)(int nChannel)); /// StopCap函数说明:用户实现这个函数,只需要调用StopVideoCapture。 /// nChannel表示通道号。 /// </code> /// </summary> /// <param name="sc"></param> [DllImport("HikServer.dll")] public static extern void MP4_ServerSetStop(StopCap sc); /// <summary> /// 读取客户端消息。 /// 读取客户端MP4_ClientCommandtoServer函数发送过来的消息(不超过900字节),消息的内容和长度由用户自己定义。 /// <code> /// 11. void __stdcall MP4_ServerReadLastMessage(char *m_sIP,char *m_sCommand,WORD *m_wLen); /// </code> /// </summary> /// <param name="m_sIP">消息来自哪个IP地址</param> /// <param name="m_sCommand">消息缓冲区指针。</param> /// <param name="m_wLen">消息实际长度。 </param> [DllImport("HikServer.dll")] public static extern void MP4_ServerReadLastMessage(StringBuilder m_sIP, StringBuilder m_sCommand, out ushort m_wLen); /// <summary> /// 给客户端发送消息字符串。 /// <code> /// 12. BOOL __stdcall MP4_ServerStringToClient(LPCTSTR m_lAddrIP,char *m_sCommand, WORD m_wLen); /// typedef LPCSTR LPCTSTR; /// typedef CONST CHAR *LPCSTR /// </code> /// </summary> /// <param name="m_lAddrIP">客户端IP地址。</param> /// <param name="m_sCommand">消息缓冲区指针。</param> /// <param name="m_wLen">消息实际长度。</param> /// <returns>返回TRUE表示成功,返回FALSE表示失败</returns> [DllImport("HikServer.dll")] public static extern bool MP4_ServerStringToClient(string m_lAddrIP, string m_sCommand, ushort m_wLen); /// <summary> /// 对nChannel通道的网络连接进行复位。 /// 如果需要单独终止该通道目前的客户端连接,或者该通道目前的网络状态处于异常状况,都可以调用该函 /// 数。该函数对任何板卡SDK对应操作都不会有任何影响。 /// <code> /// 13. void __stdcall MP4_ServerResetChannel(DWORD nChannel); 全部评论
专题导读
热门推荐
热门话题
阅读排行榜
|
请发表评论