【设备编程】海康视频监控设备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无法现在测试(公司海康监控设备因为权限的原因而无法访问)

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

posted @ 2013-04-01 15:58  哈哈好玩  阅读(5551)  评论(0编辑  收藏  举报