zoukankan      html  css  js  c++  java
  • 【设备编程】海康视频监控设备C#二次开发系列一

    海康的官方Demo有个C#版本的演示项目

    这个演示项目最重要的类是那个C#调用C++接口的映射类

    这个类的所在文件的名称为HCNetSDK.cs

    至于这个类的细节 鉴于篇幅的关系 就不复制粘贴过来了

    下面要说的是C#在调用这些转换过来的C#代码接口的关键点

    放眼望去 HCNetSDK.cs这个文件里的类 很多都是指针句柄化的int类型的参数

    在C#里面对应的是IntPtr类型(IntPtc这个类型就不详细说明了)

    这个类型的正确使用 就是成功开发海康DVR的关键了

    HCNetSDK.cs里面IntPtr类型实际可以看成一个结构体的指针或者句柄(可以这么理解)

    至于哪些方法int类型是对应结构体 可以看官方的SDK说明文档 里面方法参数代表什么结构体说得很清楚

    那些对应结构体的int参数 可以和结构体进行互相转化 需要用一个C#类转换:

    IntPtr转结构体 > Marshal.PtrToStructure

    结构体转IntPtr > Marshal.StructureToPtr

    Marshal类在命名空间System.Runtime.InteropServices下

    下面看些例子

      1 /// <summary>
      2         /// 用户登录设备。
      3         /// </summary>
      4         /// <param name="ip">设备IP地址</param>
      5         /// <param name="port">设备端口号</param>
      6         /// <param name="uname">登录的用户名 </param>
      7         /// <param name="psw">用户密码</param>
      8         /// <param name="dif">设备信息</param>
      9         /// <returns>-1表示失败,其他值表示返回的用户ID值。该用户ID具有唯一性,后续对设备的操作都需要通过此ID实现。</returns>
     10         public static int DVRLogin(string ip, ushort port, string uname, string psw,ref CHCNetSDK.NET_DVR_DEVICEINFO dif)
     11         {
     12             return CHCNetSDK.NET_DVR_Login(ip, port, uname, psw, ref dif);
     13         }
     14 
     15         /// <summary>
     16         /// 登出设备
     17         /// </summary>
     18         /// <param name="userID">用户ID号,NET_DVR_Login或NET_DVR_Login_V30的返回值</param>
     19         /// <returns>TRUE表示成功,FALSE表示失败</returns>
     20         public static bool DVRLogout(int userID)
     21         {
     22             return CHCNetSDK.NET_DVR_Logout(userID);
     23         }
     24         /// <summary>
     25         /// 获取DVR设备的名称
     26         /// </summary>
     27         /// <param name="dif">设备信息</param>
     28         /// <returns>DVR设备名称</returns>
     29         public static string GetDVRName(int lUserID)
     30         { 
     31             IntPtr ip=new IntPtr();
     32             uint lpBytesReturned = 0;
     33             CHCNetSDK.NET_DVR_DEVICECFG deviceInfo=new CHCNetSDK.NET_DVR_DEVICECFG();
     34             if (!CHCNetSDK.NET_DVR_GetDVRConfig(lUserID, HikDVR.CHCNetSDK.NET_DVR_GET_DEVICECFG, -1, ip,deviceInfo.dwSize, ref lpBytesReturned))
     35             {
     36                 return null;
     37             }
     38             Marshal.PtrToStructure(ip, deviceInfo);
     39             return System.Text.Encoding.Default.GetString(deviceInfo.sDVRName);
     40         }
     41         /// <summary>
     42         /// 设置DVR名称
     43         /// </summary>
     44         /// <param name="dif">设备信息</param>
     45         /// <param name="newDVRName">需要设置的DVR新名称</param>
     46         /// <returns>是否设置成功</returns>
     47         public static bool SetDVRName(int lUserID, string newDVRName)
     48         {
     49             if (string.IsNullOrEmpty(newDVRName)) {
     50                 return false;
     51             }
     52             IntPtr ip=new IntPtr();
     53             uint lpBytesReturned = 0;
     54             CHCNetSDK.NET_DVR_DEVICECFG deviceInfo = new CHCNetSDK.NET_DVR_DEVICECFG();
     55             if (!CHCNetSDK.NET_DVR_GetDVRConfig(lUserID, HikDVR.CHCNetSDK.NET_DVR_GET_DEVICECFG, -1, ip, deviceInfo.dwSize, ref lpBytesReturned))
     56             {
     57                 return false;
     58             }
     59             Marshal.PtrToStructure(ip, deviceInfo);
     60             deviceInfo.sDVRName = System.Text.Encoding.Default.GetBytes(newDVRName);
     61             Marshal.StructureToPtr(deviceInfo, ip, true);
     62             return CHCNetSDK.NET_DVR_SetDVRConfig(lUserID, HikDVR.CHCNetSDK.NET_DVR_SET_DEVICECFG, -1, ip, deviceInfo.dwSize);
     63         }
     64         /// <summary>
     65         /// 获取DVR日志
     66         /// </summary>
     67         /// <param name="lUserID">NET_DVR_Login或NET_DVR_Login_V30的返回值</param>
     68         /// <param name="searchMode">搜索模式设置</param>
     69         /// <param name="logTopCount">日志数量</param>
     70         /// <param name="startTime">开始时间</param>
     71         /// <param name="endTime">结束时间</param>
     72         /// <returns>结果集</returns>
     73         public static IList<CHCNetSDK.NET_DVR_LOG> GetLog(int lUserID,int searchMode, int logTopCount,DateTime startTime,DateTime endTime)
     74         {
     75             IList<CHCNetSDK.NET_DVR_LOG> logs = new List<CHCNetSDK.NET_DVR_LOG>();
     76             CHCNetSDK.NET_DVR_TIME dvrStartTime, dvrEndTime;
     77             dvrStartTime = new CHCNetSDK.NET_DVR_TIME() { dwYear = (uint)startTime.Year, dwMonth = (uint)startTime.Month, dwDay = (uint)startTime.Day, dwHour = (uint)startTime.Hour, dwMinute = (uint)startTime.Minute, dwSecond = (uint)startTime.Second };
     78             dvrEndTime=new CHCNetSDK.NET_DVR_TIME() { dwYear = (uint)endTime.Year, dwMonth = (uint)endTime.Month, dwDay = (uint)endTime.Day, dwHour = (uint)endTime.Hour, dwMinute = (uint)endTime.Minute, dwSecond = (uint)endTime.Second };
     79             int logFindHandle = CHCNetSDK.NET_DVR_FindDVRLog(lUserID, searchMode, 0, 0, ref dvrStartTime, ref dvrEndTime);
     80             if (logFindHandle != -1) {
     81                 CHCNetSDK.NET_DVR_LOG log;
     82                 int findResult;
     83                 do
     84                 {
     85                     log = new CHCNetSDK.NET_DVR_LOG();
     86                     findResult = CHCNetSDK.NET_DVR_FindNextLog(logFindHandle, ref log);
     87                     if (findResult == CHCNetSDK.NET_DVR_FILE_SUCCESS)
     88                     {
     89                         logs.Add(log);
     90                     }
     91                 } while (findResult != -1 && findResult != CHCNetSDK.NET_DVR_NOMOREFILE && logs.Count < logTopCount);
     92                 int closeCount = 3;
     93                 while (!CHCNetSDK.NET_DVR_FindLogClose(logFindHandle)) {
     94                     if (--closeCount < 0) {
     95                         break;
     96                     }
     97                 }
     98             }
     99             return logs;
    100         }

    上面的代码可以编译通过

    但是功能上有没有Bug无法现在测试(公司海康监控设备因为权限的原因而无法访问)

    如果以后弄好开放环境测试的时候 有需求修改的时候 再做更正。

  • 相关阅读:
    02-单臂路由实验
    线程高级篇-读写锁ReentrantReadWriteLock
    线程高级篇-Lock锁和Condition条件
    002 flutter的路由管理--命名路由
    fluuter的路由管理--普通路由
    003 文档的操作
    002 索引的操作
    001 elasticsearch的核心概念
    002 使用nacos完成服务的注册和发现
    001 Nacos的基础内容
  • 原文地址:https://www.cnblogs.com/yomho/p/Hik_DVR.html
Copyright © 2011-2022 走看看