C# 视频监控系列(6):服务器端——封装API(上)(2)

简介:

 /// <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);
        
/// </code>
        
/// </summary>
        
/// <param name="nChannel">通道号。</param>
        [DllImport("HikServer.dll")]
        
public static extern void MP4_ServerResetChannel(ulong nChannel);

        
/// <summary>
        
/// 设置服务端的网络端口号和客户端的网络端口号。
        
///     服务端使用端口如下(假设dServerPort=5050):
        
///     TCP只需要占用5050。
        
///     UDP和多播需要占用5050、5060----(5060+2*通道个数)。
        
///     
        
///     客户端使用端口如下(假设dClientPort =6050):
        
///     TCP和多播只需要占用6057。
        
///     UDP需要占用6057、6060----(6060+2*窗口个数)。
        
/// <code>
        
/// 14.  BOOL  __stdcall  MP4_ServerSetNetPort(WORD dServerPort,WORD dClientPort);
        
/// </code>
        
/// </summary>
        
/// <param name="dServerPort">服务端的起始网络端口号。必须和函数MP4_ClientSetNetPort的dServerPort参数相同。</param>
        
/// <param name="dClientPort">客户端的网络端口号。必须和函数MP4_ClientSetNetPort的dClientPort参数相同。</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失败。</returns>
        [DllImport("HikServer.dll")]
        
public static extern int MP4_ServerSetNetPort(ushort dServerPort, ushort dClientPort);

        
/// <summary>
        
/// 设置多播的TTL参数。
        
///     注意: 如果您不调用函数MP4_ServerSetTTL,默认TTL值是32。
        
///     MP4_ServerSetTTL设置的值在MP4_ServerStop之后会失效,恢复成默认的32,所以您如果需要指定TTL
        
///     大小,每次在MP4_ServerStart之前都需要调用MP4_ServerSetTTL。
        
/// <code>
        
/// 15.  BOOL  __stdcall  MP4_ServerSetTTL(unsigned char cTTLVal); 
        
/// </code>
        
/// </summary>
        
/// <param name="cTTLVal">TTL值。1-255。</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失败。</returns>
        [DllImport("HikServer.dll")]
        
public static extern int MP4_ServerSetTTL(byte cTTLVal);

        
/// <summary>
        
/// 设置发送缓冲区大小。
        
///     注意: 如果您不调用函数MP4_ServerSetBufNum,默认缓冲区是30。
        
///     MP4_ServerSetBufNum设置的值在MP4_ServerStop之后会失效,恢复成默认的30,所以您如果需要指定
        
///     缓冲区大小,每次在MP4_ServerStart之前都需要调用MP4_ServerSetBufNum。
        
/// <code>
        
/// 16.  BOOL  __stdcall  MP4_ServerSetBufNum(DWORD nChannel,WORD dBufNum); 
        
/// </code>
        
/// </summary>
        
/// <param name="nChannel">通道号。</param>
        
/// <param name="dBufNum">缓冲区大小。单位是8K,如果dBufNum=10,那么缓冲区大小为80K,建议设置成30。范围:10-100。</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失败。</returns>
        [DllImport("HikServer.dll")]
        
public static extern int MP4_ServerSetBufNum(ushort nChannel, ushort dBufNum);

        
/// <summary>
        
/// 设置自动调节帧率的回调函数,只在电话线连接中使用。
        
///     在回调函数SetIBP中只调用SetIBPMode函数
        
/// <code>
        
/// 17.  void  __stdcall  MP4_ServerSetIBPMode(void(CALLBACK *SetIBP)(int nChannel,int framerat));
        
/// </code>
        
/// </summary>
        
/// <param name="setIBP"></param>
        [DllImport("HikServer.dll")]
        
public static extern void MP4_ServerSetIBPMode(SetIBP setIBP);

        
/// <summary>
        
/// 设置连接客户端的等待时间和尝试次数。
        
///     说明:当服务端给客户端发送消息的时候,需要等待客户端应答,以保证客户端收到消息,如果失败,还
        
///     可以继续尝试dTrynum-1次发送。
        
///     注意:
        
///     1>如果这两个参数设得太小,当网络繁忙或客户端繁忙的时候,可能会导致发送消息失败;如果这两个参
        
///     数设得太大,当试图连接的客户端不存在(IP地址错误、或者关机、或者没有启动客户端软件),消息发送
        
///     函数会等待很久才返回。
        
///     2>这两个参数设置之后一直有效,直到下次调用该函数修改。
        
/// <code>
        
/// 18.  BOOL  __stdcall  MP4_ServerSetWait(DWORD dEachWaitTime,DWORD dTrynum); 
        
/// </code>
        
/// </summary>
        
/// <param name="dEachWaitTime">等待时间。单位是毫秒,范围300-10000。如果不调用这个函数,默认是2000。</param>
        
/// <param name="dTrynum">尝试次数。范围1-50。如果不调用这个函数,默认是2次。</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失败。</returns>
        [DllImport("HikServer.dll")]
        
public static extern bool MP4_ServerSetWait(ulong dEachWaitTime, ulong dTrynum);

        
/// <summary>
        
/// 给连接在指定通道上的所有客户端发送消息字符串。
        
/// <code>
        
/// 19.  BOOL  __stdcall  MP4_ServerStringToClient_other     (char nChannel,char *m_sCommand, WORD m_wLen);  
        
/// </code>
        
/// </summary>
        
/// <param name="nChannel">通道号。</param>
        
/// <param name="m_sCommand">消息缓冲区指针。</param>
        
/// <param name="m_wLen">消息实际长度。</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失败。 </returns>
        [DllImport("HikServer.dll")]
        
public static extern bool MP4_ServerStringToClient_other(int nChannel, string m_sCommand, ushort m_wLen);

        
/// <summary>
        
/// 动态切换通道数据类型。
        
///     注意:调用MP4_ServerChangeChanType之前必须调用StopVideoCapture。(详见DEMO) 
        
/// <code>
        
/// 20.  BOOL  __stdcall  MP4_ServerChangeChanType(char nChannel,char cType); 
        
/// </code>
        
/// </summary>
        
/// <param name="nChannel">通道号。 </param>
        
/// <param name="cType">通道数据类型,是否支持电话线连接(NORMAL或者DIALING)</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失败。</returns>
        [DllImport("HikServer.dll")]
        
public static extern bool MP4_ServerChangeChanType(char nChannel, char cType);

        
/// <summary>
        
/// 设置回调,重新生成一个I帧。 
        
/// <code>
        
/// 21.  void  __stdcall  MP4_ServerSetCapIFrame(void(CALLBACK *MakeIFrame) (int port)); 
        
/// </code>
        
/// </summary>
        
/// <param name="mf"></param>
        [DllImport("HikServer.dll")]
        
public static extern void MP4_ServerSetCapIFrame(MakeIFrame mf);

        
/// <summary>
        
/// 获取版本号。
        
/// <code>
        
/// 22.  DWORD  __stdcall  MP4_ServerGetSdkVersion(); 
        
/// </code>
        
/// </summary>
        
/// <returns></returns>
        [DllImport("HikServer.dll")]
        
public static extern ulong MP4_ServerGetSdkVersion();

        
/// <summary>
        
/// 设置每个通道的多播组地址和网络端口号。
        
///     说明:
        
///     1>目前的多播组采用了两种方式:一是开发包内部分配,用户不需要考虑多播组参数细节,默认采用这种
        
///     方式;另一种是调用MP4_ServerCastGroup设置多播组参数。
        
///     2>用户可以通过MP4_ServerCastGroup修改参数bSet,在两种方式之间做切换。
        
///     每个多播组会占用wPort开始的4个端口。
        
/// <code>
        
/// 23.  BOOL  __stdcall  MP4_ServerCastGroup(BOOL bSet,DWORD dChannel, char *sIP, WORD wPort); 
        
/// </code>
        
/// </summary>
        
/// <param name="bSet">是否使用自定义的多播组地址和网络端口号。TRUE表示使用,FALSE表示仍然沿用开发包内部自动分配的多播地址和网络端口号。 </param>
        
/// <param name="dChannel">通道号。每个通道号对应的多播组地址和网络端口号都是单独设置的。</param>
        
/// <param name="sIP">多播组地址。</param>
        
/// <param name="wPort">多播组网络端口号</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失败。 </returns>
        [DllImport("HikServer.dll")]
        
public static extern bool MP4_ServerCastGroup(bool bSet, ulong dChannel, string sIP, ushort wPort);

        
/// <summary>
        
/// 设置每个通道的最大用户数量。
        
/// <code>
        
/// 24.  BOOL  __stdcall  MP4_ServerMaxUser(DWORD dwChannel,int nMaxNum)
        
/// </code>
        
/// </summary>
        
/// <param name="dwChannel">通道号。</param>
        
/// <param name="nMaxNum">用户数量。</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失败。</returns>
        [DllImport("HikServer.dll")]
        
public static extern int MP4_ServerMaxUser(uint dwChannel, int nMaxNum);

        
/// <summary>
        
/// 往发送缓存写数据。网络开发包通过这个接口获得板卡的数据。 
        
///     说明:
        
///     现在开发包内部不会直接调用StartVideoCapture和StopVideoCapture函数,而是通过StartCap
        
///     和StopCap来启动和停止捕获数据。如果用户调用StopVideoCapture或者停止调用MP4_ServerWriteDataEx
        
///     都会使客户端无法收到数据。原来的MP4_ServerWriteData内部调用MP4_ServerWriteDataEx完成相关功能。
        
/// <code>
        
/// 25.  void  __stdcall  MP4_ServerWriteDataEx(DWORD nPort,UCHAR *pPacketBuffer,DWORD nPacketSize,int frameType,int breakable,int nImgFormat)
        
/// </code>
        
/// </summary>
        
/// <param name="nPort">通道号。</param>
        
/// <param name="pPacketBuffer">缓冲区指针。</param>
        
/// <param name="nPacketSize">缓冲区长度。</param>
        
/// <param name="frameType">帧类型。</param>
        
/// <param name="breakable">ReadStreamData的返回值</param>
        
/// <param name="nImgFormat">
        
///     图像格式。nImgFormat 为0 时表示发送主通道的音视频数据
        
///     nImgFormat 为1 时表示发送子通道的音视频数据。
        
/// </param>
        [DllImport("HikServer.dll")]
        
//public unsafe static extern void MP4_ServerWriteDataEx(uint nPort, void* pPacketBuffer, uint nPacketSize, int frameType, int breakable, int nImgFormat);
        public static extern void MP4_ServerWriteDataEx(int nPort, IntPtr pPacketBuffer, int nPacketSize, int frameType, int breakable, int nImgFormat);
        
//public static extern void MP4_ServerWriteDataEx(uint nPort, byte[] pPacketBuffer, uint nPacketSize, int frameType, int breakable, int nImgFormat);

    }
}

 

修改记录 

      1.      2009-8-19,修改了MP4_ServerReadLastMessage,非常感谢 阿斯顿啊 的贡献!
            修正前:public static extern void MP4_ServerReadLastMessage(string m_sIP, string m_sCommand, out ushort m_wLen);
            修正后:public static extern void MP4_ServerReadLastMessage(StringBuilder m_sIP, StringBuilder m_sCommand, out ushort m_wLen);



本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586673,如需转载请自行联系原作者

相关文章
|
3月前
|
数据采集 Java API
深度解析:爬虫技术获取淘宝商品详情并封装为API的全流程应用
本文探讨了如何利用爬虫技术获取淘宝商品详情并封装为API。首先介绍了爬虫的核心原理与工具,包括Python的Requests、BeautifulSoup和Scrapy等库。接着通过实战案例展示了如何分析淘宝商品页面结构、编写爬虫代码以及突破反爬虫策略。随后讲解了如何使用Flask框架将数据封装为API,并部署到服务器供外部访问。最后强调了在开发过程中需遵守法律与道德规范,确保数据使用的合法性和正当性。
|
1月前
|
人工智能 API 定位技术
MCP 开发实战:手把手教你封装高德地图与 arXiv API
本教程为 MCP(Model Context Protocol)开发实战第二阶段,带你从零封装第三方 API 为 AI 模型可用工具。通过高德地图地理编码与 arXiv 论文检索两个实例,涵盖项目搭建、工具声明、资源定义、错误处理等核心内容,助你快速上手 MCP 开发并集成至 Claude 使用。
|
1月前
|
人工智能 自然语言处理 安全
Python构建MCP服务器:从工具封装到AI集成的全流程实践
MCP协议为AI提供标准化工具调用接口,助力模型高效操作现实世界。
384 1
|
10月前
|
设计模式 开发框架 安全
C# 一分钟浅谈:GraphQL API 与 C#
本文介绍了 GraphQL API 的基本概念及其优势,并通过 C# 实现了一个简单的 GraphQL 服务。GraphQL 是一种高效的 API 查询语言,允许客户端精确请求所需数据,减少不必要的数据传输。文章详细讲解了如何使用 `GraphQL.NET` 库在 C# 中创建和配置 GraphQL 服务,并提供了常见问题的解决方案和代码示例。
243 4
|
11月前
|
开发框架 .NET API
RESTful API 设计与实现:C# 开发者的一分钟入门
【10月更文挑战第5天】本文从零开始,介绍了如何使用 C# 和 ASP.NET Core 设计并实现一个简单的 RESTful API。首先解释了 RESTful API 的概念及其核心原则,然后详细说明了设计 RESTful API 的关键步骤,包括资源识别、URI 设计、HTTP 方法选择、状态码使用和错误处理。最后,通过一个用户管理 API 的示例,演示了如何创建项目、定义模型、实现控制器及运行测试,帮助读者掌握 RESTful API 的开发技巧。
400 7
|
缓存 测试技术 API
API的封装步骤流程
API封装流程是一个系统化的过程,旨在将内部功能转化为可复用的接口供外部调用。流程包括明确需求、设计接口、选择技术和工具、编写代码、测试、文档编写及部署维护。具体步骤为确定业务功能、数据来源;设计URL、请求方式、参数及响应格式;选择开发语言、框架和数据库技术;实现数据连接、业务逻辑、错误处理;进行功能、性能测试;编写详细文档;部署并持续维护。通过这些步骤,确保API稳定可靠,提高性能。
|
10月前
|
设计模式 API C#
C# 一分钟浅谈:GraphQL 服务器端实现
本文通过C#语言从零开始构建一个简单的GraphQL服务器端实现,介绍了环境准备、项目创建、定义Schema、配置GraphQL等步骤。同时,探讨了常见问题如数据源问题、类型定义不一致、性能问题和权限控制,提供了相应的解决方法。希望帮助读者更好地理解和应用GraphQL。
120 3
|
12月前
|
API PHP
ThinkPHP 通用的API格式封装
本文介绍了在ThinkPHP框架中如何统一封装API返回格式的方法,包括创建状态码枚举类、编写统一格式化函数以及在BaseController和Error控制器中重写`__call`方法来处理不存在的方法或控制器调用,以实现统一的错误处理和返回格式。
ThinkPHP 通用的API格式封装
|
11月前
|
JSON JavaScript API
(API接口系列)商品详情数据封装接口json数据格式分析
在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦!
|
11月前
|
API C#
异步轮询 Web API 的实现与 C# 示例
异步轮询 Web API 的实现与 C# 示例
248 1