【设备编程】海康视频监控设备C#⼆次开发系列⼀
海康的官⽅Demo有个C#版本的演⽰项⽬
这个演⽰项⽬最重要的类是那个C#调⽤C++接⼝的映射类
这个类的所在⽂件的名称为HCNetSDK.cs
⾄于这个类的细节鉴于篇幅的关系就不复制粘贴过来了
param name下⾯要说的是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>
10public static int DVRLogin(string ip, ushort port, string uname, string psw,ref CHCNetSDK.NET_DVR_DEVICEINFO dif)
11 {
12return 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>
20public static bool DVRLogout(int userID)
21 {
22return CHCNetSDK.NET_DVR_Logout(userID);
23 }
24///<summary>
25///获取DVR设备的名称
26///</summary>
27///<param name="dif">设备信息</param>
28///<returns>DVR设备名称</returns>
29public static string GetDVRName(int lUserID)
30 {
31 IntPtr ip=new IntPtr();
32uint lpBytesReturned = 0;
33 CHCNetSDK.NET_DVR_DEVICECFG deviceInfo=new CHCNetSDK.NET_DVR_DEVICECFG();
34if (!CHCNetSDK.NET_DVR_GetDVRConfig(lUserID, HikDVR.CHCNetSDK.NET_DVR_GET_DEVICECFG, -1, ip,deviceInfo.dwSize, ref lpBytesReturned))
35 {
36return null;
37 }
38 Marshal.PtrToStructure(ip, deviceInfo);
39return 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>
47public static bool SetDVRName(int lUserID, string newDVRName)
48 {
49if (string.IsNullOrEmpty(newDVRName)) {
50return false;
51 }
52 IntPtr ip=new IntPtr();
53uint lpBytesReturned = 0;
54 CHCNetSDK.NET_DVR_DEVICECFG deviceInfo = new CHCNetSDK.NET_DVR_DEVICECFG();
55if (!CHCNetSDK.NET_DVR_GetDVRConfig(lUserID, HikDVR.CHCNetSDK.NET_DVR_GET_DEVICECFG, -1, ip, deviceInfo.dwSize, ref lpBytesReturned))
56 {
57return false;
58 }
59 Marshal.PtrToStructure(ip, deviceInfo);
60 deviceInfo.sDVRName = System.Text.Encoding.Default.GetBytes(newDVRName);
61 Marshal.StructureToPtr(deviceInfo, ip, true);
62return 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>
73public 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, dwMi
nute = (uint)startTime.Minute, dwSecond = (
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 = (
79int logFindHandle = CHCNetSDK.NET_DVR_FindDVRLog(lUserID, searchMode, 0, 0, ref dvrStartTime, ref dvrEndTime);
80if (logFindHandle != -1) {
81 CHCNetSDK.NET_DVR_LOG log;
82int findResult;
83do
84 {
85 log = new CHCNetSDK.NET_DVR_LOG();
86 findResult = CHCNetSDK.NET_DVR_FindNextLog(logFindHandle, ref log);
87if (findResult == CHCNetSDK.NET_DVR_FILE_SUCCESS)
88 {
89 logs.Add(log);
90 }
91 } while (findResult != -1 && findResult != CHCNetSDK.NET_DVR_NOMOREFILE && logs.Count < logTopCount); 92int closeCount = 3;
93while (!CHCNetSDK.NET_DVR_FindLogClose(logFindHandle)) {
94if (--closeCount < 0) {
95break;
96 }
97 }
98 }
99return logs;
100 }
上⾯的代码可以编译通过
但是功能上有没有Bug⽆法现在测试(公司海康监控设备因为权限的原因⽽⽆法访问)
如果以后弄好开放环境测试的时候有需求修改的时候再做更正。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论