正文
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);
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);
本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586668,如需转载请自行联系原作者