当前位置: 首页 > news >正文

C# 视频监控系列(2):客户端——封装API (1)

正文

     本章主要是贴封装好的API调用代码,所以直接就贴代码了。

 

     代码说明:

          1.     C#调用VC++写好的DLL在这里就不介绍了,重点和难点在于参数数据类型对应,下一章将有所总结。

          2.     注释比较详尽,注释里summary节点里有函数的VC++原型。

 

using  System;
using  System.Runtime.InteropServices;

namespace  HikClient
{
    
#region  struct

    
///   <summary>
    
///  客户端的参数结构
    
///  说明:如果将m_bUserCheck置为FALSE,则把用户名和密码作为空指针发送到服务器。虽然用户名和密
    
///  码的内容不能超过50字节,但是用户名和密码缓冲区长度必须大于等于50,因为内部操作的时候直接从
    
///  用户名或密码缓冲区拷贝50字节到发送缓冲区里。 
    
///   </summary>
     public   struct  CLIENT_VIDEOINFO
    {
        
///   <summary>
        
///  对应服务端的的通道号
        
///   </summary>
         public   byte  m_bRemoteChannel;
        
///   <summary>
        
///  网络连接方式
        
///   </summary>
         public   byte  m_bSendMode;
        
///   <summary>
        
///  图像格式,0为服务端主通道的图像 ;1为服务端子通道的图像
        
///   </summary>
         public   byte  m_nImgFormat;
        
///   <summary>
        
///  服务端的IP地址
        
///   </summary>
         public   string  m_sIPAddress;
        
///   <summary>
        
///  用户名 
        
///   </summary>
         public   string  m_sUserName;
        
///   <summary>
        
///  密码 
        
///   </summary>
         public   string  m_sUserPassword;
        
///   <summary>
        
///  是否需要发送用户名和密码
        
///   </summary>
         public   bool  m_bUserCheck;
        
///   <summary>
        
///  显示区域
        
///   </summary>
         public  System.IntPtr m_hShowVideo;
    }

    
#endregion

    
#region  enum

    
///   <summary>
    
///  网络连接方式
    
///   </summary>
     public   enum  SEND_MODE
    {
        
///   <summary>
        
///  UDP方式
        
///   </summary>
        UDPMODE  =   0 ,
        
///   <summary>
        
///  TCP方式
        
///   </summary>
        TCPMODE,
        
///   <summary>
        
///  多播方式
        
///   </summary>
        MULTIMODE,
        
///   <summary>
        
///  电话线方式
        
///   </summary>
        DIALING,
        
///   <summary>
        
///  音频流畅模式
        
///   </summary>
        AUDIODETACH
    };

    
///   <summary>
    
///  显示模式
    
///   </summary>
     public   enum  DISP_MODE
    {
        
///   <summary>
        
///  可以同时显示多个窗口,但对显卡有一定要求
        
///   </summary>
        NORMALMODE  =   0 ,
        
///   <summary>
        
///  只能同时显示一个窗口,但是对显卡没有什么要求
        
///   </summary>
        OVERLAYMODE
    };

    
#endregion

    
#region  delegate

    
///   <summary>
    
///  读实时数据回调。用于读取数据流。如果ReadDataCallBack为null,表示不需要读取数据流
    
///  
    
///  Void(CALLBACK*ReadDataCallBack)(DWORD nChannel,UCHAR *pPacketBuffer,DWORD nPacketSize)); 
    
///   </summary>
    
///   <param name="nChannel"> 表示通道号 </param>
    
///   <param name="pPacketBuffer"> 数据缓存指针 </param>
    
///   <param name="nPacketSize"> 数据个数 </param>
     public   delegate   void  ReadDataCallBack( ulong  nChannel, [MarshalAs(UnmanagedType.LPArray)]  byte [] pPacketBuffer,  ulong  nPacketSize);

    
///   <summary>
    
///  捕图回调
    
///  
    
///  void (CALLBACK* CapPicFun)(long StockHandle, char * pBuf, long nSize, long nWidth, long nHeight, long nStamp, long nType, long nReceaved)
    
///   </summary>
    
///   <param name="StockHandle"> MP4_ClientStart成功返回的值。 </param>
    
///   <param name="pBuf"> 返回图像数据 </param>
    
///   <param name="nSize"> 返回图像数据大小 </param>
    
///   <param name="nWidth"> 画面宽,单位像素 </param>
    
///   <param name="nHeight"> 画面高 </param>
    
///   <param name="nStamp"> 时标信息,单位毫秒 </param>
    
///   <param name="nType"> 数据类型, T_RGB32,T_UYVY详见宏定义说明。 </param>
    
///   <param name="nReceaved"> 保留 </param>
     public   delegate   void  CapPicFun( int  StockHandle, IntPtr pBuf,  int  nSize,  int  nWidth,  int  nHeight,  int  nStamp,  int  nType,  int  nReceaved);

    
///   <summary>
    
///  画
    
///   </summary>
     public   delegate   void  DrawFun( int  StockHandle, System.Drawing.Graphics hDc,  int  nUser);


    
#endregion

    
///   <summary>
    
///  hikclient.dll   HikClient
    
///   </summary>
     public   class  PcHikClient
    {

        
public   static   readonly   uint  WM_USER  =   0x0400 ;

        
#region  客户端函数

        
///   <summary>
        
///  对客户端初始化
        
///      注:在调用所有其他客户端函数之前调用。
        
///  
        
///  1.  BOOL  __stdcall MP4_ClientStartup(UINT nMessage,HWND hWnd);
        
///   </summary>
        
///   <param name="nMessage"> 表示对应接收程序的消息。 </param>
        
///   <param name="hWnd"> 表示应用程序窗口句柄。 </param>
        
///   <returns> 返回TRUE表示成功,返回FALSE表示失败。 </returns>
        [DllImport( " hikclient.dll " )]
        
public   static   extern   bool  MP4_ClientStartup( uint  nMessage, IntPtr hWnd);

        
///   <summary>
        
///  结束调用客户端函数。
        
///      注:调用MP4_ClientCleanup()后不能再调用其他客户端函数。
        
///  
        
///  2.  BOOL  __stdcall MP4_ClientCleanup();
        
///   </summary>
        
///   <returns> 返回TRUE表示成功,返回FALSE表示失败。 </returns>
        [DllImport( " hikclient.dll " )]
        
public   static   extern   bool  MP4_ClientCleanup();

        
///   <summary>
        
///  启动客户端
        
///      注 :MP4_ClientStart返回成功,并不表示已经成功连接服务端。您需要通过MP4_ClientGetState函数 
        
///      去获得网络连接的状态 
        
///  
        
///  3.  LONG __stdcall MP4_ClientStart(PCLIENT_VIDEOINFO pClientinfo, Void(CALLBACK*ReadDataCallBack)(DWORD nChannel,UCHAR *pPacketBuffer,DWORD nPacketSize));
        
///   </summary>
        
///   <param name="pClientinfo"></param>
        
///   <param name="rdcb"> 用来读取数据流。如果ReadDataCallBack为NULL,表示不需要读取数据流。  </param>
        
///   <returns> 返回-1表示失败,其他值表示成功。作为后续操作的参数。 </returns>
        [DllImport( " hikclient.dll " )]
        
public   static   extern   int  MP4_ClientStart( ref  CLIENT_VIDEOINFO pClientinfo, ReadDataCallBack rdcb);

        
///   <summary>
        
///  停止客户端。
        
///  
        
///  4.  BOOL  __stdcall MP4_ClientStop(LONG StockHandle); 
        
///   </summary>
        
///   <param name="StockHandle"> MP4_ClientStart成功返回的值。 </param>
        
///   <returns> 返回TRUE表示成功,返回FALSE表示失败。 </returns>
        [DllImport( " hikclient.dll " )]
        
public   static   extern   bool  MP4_ClientStop( long  StockHandle);

        
///   <summary>
        
///  获取客户端状态
        
///      -1  :   无效
        
///      1   :   连接
        
///      2   :   开始接收图像
        
///      3   :   异常退出
        
///      4   :   接收完毕,退出
        
///      5   :   无法联系服务器
        
///      6   :   服务器拒绝访问
        
///  
        
///  5.LONG  __stdcall MP4_ClientGetState(LONG StockHandle);
        
///   </summary>
        
///   <param name="StockHandle"> 成功返回的值 </param>
        
///   <returns></returns>
        [DllImport( " hikclient.dll " )]
        
public   static   extern   int  MP4_ClientGetState( long  StockHandle);

        
///   <summary>
        
///  开始客户端的数据捕获(回调方式,使用MP4_ClientStart中的ReadDataCallBack函数)。
        
///  
        
///  6.BOOL __stdcall MP4_ClientStartCapture(LONG StockHandle);
        
///   </summary>
        
///   <param name="StockHandle"> MP4_ClientStart成功返回的值。 </param>
        
///   <returns> 返回TRUE表示成功,返回FALSE表示失败。 </returns>
        [DllImport( " hikclient.dll " )]
        
public   static   extern   bool  MP4_ClientStartCapture( long  StockHandle);

        
///   <summary>
        
///  开始客户端的数据捕获(直接写文件方式)。
        
///  
        
///  7.BOOL  __stdcall MP4_ClientStartCaptureFile(LONG StockHandle, LPTSTR FileName);
        
///   </summary>
        
///   <param name="StockHandle"> MP4_ClientStart成功返回的值。 </param>
        
///   <param name="FileName"> 文件名。  </param>
        
///   <returns> 返回TRUE表示成功,返回FALSE表示失败。 </returns>
        [DllImport( " hikclient.dll " )]
        
public   static   extern   bool  MP4_ClientStartCaptureFile( int  StockHandle,  string  FileName);

        
///   <summary>
        
///  停止客户端的数据捕获。
        
///      对MP4_ClientStartCapture和MP4_ClientStartCaptureFile都有效。 
        
///  
        
///  8.BOOL __stdcall MP4_ClientStopCapture(LONG StockHandle); 
        
///   </summary>
        
///   <param name="StockHandle"> MP4_ClientStart成功返回的值。 </param>
        
///   <returns> 返回TRUE表示成功,返回FALSE表示失败。 </returns>
        [DllImport( " hikclient.dll " )]
        
public   static   extern   bool  MP4_ClientStopCapture( int  StockHandle);
        
        
///   <summary>
        
///  获取服务端的通道数。
        
///  
        
///  9.WORD  __stdcall MP4_ClientGetServerChanNum(LPCTSTR m_sIPAddress);
        
///   </summary>
        
///   <param name="m_sIPAddress"> 服务端的IP地址。 </param>
        
///   <returns> 返回0表示失败,其他值表示通道数。 </returns>
        [DllImport( " hikclient.dll " )]
        
public   static   extern   ushort  MP4_ClientGetServerChanNum( string  m_sIPAddress);

        
///   <summary>
        
///  给服务器发送字符串
        
///  
        
///  10.BOOL  __stdcall MP4_ClientCommandtoServer(LPCTSTR m_lAddrIP, char *m_sCommand,WORD m_wLen)
        
///   </summary>
        
///   <param name="m_lAddrIP"> 服务器IP地址 </param>
        
///   <param name="m_sCommand"> 消息缓冲指针 </param>
        
///   <param name="m_wLen"> 消息缓冲长度,必须小于900个字节 </param>
        
///   <returns> 返回0表示失败,其他值表示通道数。  </returns>
        [DllImport( " hikclient.dll " )]
        
public   static   extern   bool  MP4_ClientCommandtoServer( string  m_lAddrIP,  string  m_sCommand,  ushort  m_wLen);

        
///   <summary>
        
///  对服务端的nChannel通道网络连接初始化,结束当前所有用户对它的访问。
        
///  
        
///  11.BOOL  __stdcall MP4_ClientShut(LPCTSTR m_lAddrIP,char nChannel);
        
///   </summary>
        
///   <param name="m_lAddrIP"> 表示服务端的IP地址。 </param>
        
///   <param name="cChannel"> 表示服务端通道号。 </param>
        
///   <returns> 返回TRUE表示成功,返回FALSE表示失败。  </returns>
        [DllImport( " hikclient.dll " )]
        
public   static   extern   bool  MP4_ClientShut( string  m_lAddrIP,  char  cChannel);

        
///   <summary>
        
///  读取服务端消息。
        
///      读取服务端MP4_ServerStringToClient函数发送过来的消息。(不超过900字节)
        
///  
        
///  12.  void  __stdcall MP4_ClientReadLastMessage(char * m_sIP ,char *m_sCommand,WORD *m_wLen); 
        
///   </summary>
        
///   <param name="m_sIP"> 消息来自哪个IP地址。 </param>
        
///   <param name="m_sCommand"> 消息缓冲区指针。  </param>
        
///   <param name="m_wLen"> 消息缓冲区长度。 </param>
        [DllImport( " hikclient.dll " )]
        
public   static   extern   void  MP4_ClientReadLastMessage( string  m_sIP,  out   string  m_sCommand,  out   ushort  m_wLen);

        
///   <summary>
        
///  设置当前播放器音量。
        
///  
        
///  13.BOOL  __stdcall MP4_ClientAudioVolume(WORD wVolume); 
        
///   </summary>
        
///   <param name="wVolume"> 音量值(0-0xffff)  </param>
        
///   <returns> 返回TRUE表示成功,返回FALSE表示失败。 </returns>
        [DllImport( " hikclient.dll " )]
        
public   static   extern   bool  MP4_ClientAudioVolume( ushort  wVolume);

        
///   <summary>
        
///  选定某个播放器播放声音,其他播放器静止。
        
///  
        
///  14.  BOOL  __stdcall MP4_ClientAudioStart(LONG StockHandle);
        
///   </summary>
        
///   <param name="StockHandle"> MP4_ClientStart成功返回的值。 </param>
        
///   <returns> 返回TRUE表示成功,返回FALSE表示失败。 </returns>
        [DllImport( " hikclient.dll " )]
        
public   static   extern   bool  MP4_ClientAudioStart( long  StockHandle);

        
///   <summary>
        
///  停止播放声音
        
///  
        
///  15.  BOOL  __stdcall MP4_ClientAudioStop();
        
///   </summary>
        
///   <returns> 返回TRUE表示成功,返回FALSE表示失败。  </returns>
        [DllImport( " hikclient.dll " )]
        
public   static   extern   bool  MP4_ClientAudioStop();

        
///   <summary>
        
///  功能同MP4_ClientCommandtoServer,只是第一个参数使用了MP4_ClientStart成功返回的值。
        
///  
        
///  16. BOOL __stdcall MP4_ClientCommandtoServer_Handle(LONG StockHandle,char *m_sCommand, WORD m_wLen); 
        
///   </summary>
        
///   <param name="StockHandle"></param>
        
///   <param name="m_sCommand"></param>
        
///   <param name="m_wLen"></param>
        
///   <returns> 返回TRUE表示成功,返回FALSE表示失败。 </returns>
        [DllImport( " hikclient.dll " )]
        
public   static   extern   bool  MP4_ClientCommandtoServer_Handle( int  StockHandle,  out   string  m_sCommand,  ushort  m_wLen);

        
///   <summary>
        
///  系统是否支持网络播放器(在显示模式设为NORMALMODE的情况下)。
        
///  
        
///  17.int   __stdcall MP4_ClientIsSupport(); 
        
///   </summary>
        
///   <returns> 返回值的低8位每位表示一个信息。每一位的定义如上所示,0表示不支持,1表示支持。 
        
///  如果SUPPORT_DDRAW、SUPPORT_BLT、SUPPORT_CPU其中有一个为0,表示播放器根本无法播放; 
        
///  如果SUPPORT_BLTFOUR、SUPPORT_BLTSHRINKX、SUPPORT_BLTSHRINKY、 
        
///  SUPPORT_BLTSTRETCHX、SUPPORT_BLTSTRETCHY其中有一个为0,表示播放器虽然能够播放,但
        
///  是效率很低,有可能因为CPU利用率太高而无法显示。 
        
///  播放器必须在增强色(16位),或者真彩色(32位)模式下运行。如果出现SUPPORT_BLTFOURCC、 
        
///  SUPPORT_BLTSHRINKX、SUPPORT_BLTSHRINKY、SUPPORT_BLTSTRETCHX、 
        
///  SUPPORT_BLTSTRETCHY其中有一个为0,会采用软件显示方式,这时候必须在真彩色(32位)模式下才
        
///  能运行。 
        
///   </returns>
        [DllImport( " hikclient.dll " )]
        
public   static   extern   int  MP4_ClientIsSupport();


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

相关文章:

  • Silverlight书籍推荐阅读排行榜【续】
  • 文本编辑命令
  • VI批量替换
  • Heron and His Triangle 2017 沈阳区域赛
  • Oracle在线 redo log文件丢失后的恢复
  • python time 与datetime之间的区别与联系
  • Exchange帐号如何手动更新?
  • MySQL体系结构:八大功能模块浅析
  • 如何读取磁盘温度
  • 【FTP】FTP 命令模式下 PASV OR PORT
  • mysql如何保证redolog和binlog的一致性,安全性,效率。
  • C++连接mysql数据库的两种方法
  • 集成银联3.3.0
  • 群集笔记
  • 教徒计划出品:同一端口同时启用PEAP和MAC地址旁路(适用于IPPhone串接PC的网络环境)...
  • 【前端学习】-粗谈选择器
  • Apache的80端口被占用以及访问时报错403
  • exif信息对照
  • iOS小技巧之UIImagePickerController实现头像选择
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaWeb(学习笔记二)
  • Java编程基础24——递归练习
  • orm2 中文文档 3.1 模型属性
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • PHP变量
  • Promise初体验
  • Redis中的lru算法实现
  • Spark学习笔记之相关记录
  • Transformer-XL: Unleashing the Potential of Attention Models
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 从零开始的无人驾驶 1
  • 观察者模式实现非直接耦合
  • 面试遇到的一些题
  • 日剧·日综资源集合(建议收藏)
  • 入手阿里云新服务器的部署NODE
  • 系统认识JavaScript正则表达式
  • 一个JAVA程序员成长之路分享
  • 最近的计划
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (阿里云万网)-域名注册购买实名流程
  • (层次遍历)104. 二叉树的最大深度
  • (四)Controller接口控制器详解(三)
  • (转) Android中ViewStub组件使用
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)Sublime Text3配置Lua运行环境
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .mysql secret在哪_MYSQL基本操作(上)
  • .net framework4与其client profile版本的区别
  • .NET导入Excel数据
  • .NET开发者必备的11款免费工具
  • .NET面试题(二)
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .NET文档生成工具ADB使用图文教程