【設備編程】海康視頻監控設備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無法現在測試(公司海康監控設備因為權限的原因而無法訪問)

如果以后弄好開放環境測試的時候 有需求修改的時候 再做更正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM