海康设备网络SDK开发NET_DVR_GetDeviceConfig

由于官方的例子中没有关于NET_DVR_GetDeviceConfig的示例,在此记录一下“NET_DVR_GET_FIELD_DETECTION 获取区域入侵侦测配置” ,避免其他小伙伴踩坑。

这里只记录主要代码,其中的一些常量自行添加:

1、HCNetSDK.java文件中增加接口NET_DVR_GetDeviceConfig

	boolean NET_DVR_GetDeviceConfig(NativeLong lUserID, int dwCommand, int dwCount, Pointer lpInBuffer,
			int dwInBufferSize, Pointer lpStatusList, Pointer lpOutBuffer, int dwOutBufferSize);
	
	boolean NET_DVR_SetDeviceConfig(NativeLong lUserID, int dwCommand, int dwCount, Pointer lpInBuffer,
			int dwInBufferSize, Pointer lpStatusList, Pointer lpOutBuffer, int dwOutBufferSize);

2、lpInBuffer对应结构体

	public static class NET_DVR_CHANNEL_GROUP extends Structure {
		public int dwSize;
		public int dwChannel;
		public int dwGroup;
		public byte byID;
		public byte[] byRes1 = new byte[3];
		public int dwPositionNo;
		public byte[] byRes2 = new byte[56];
	}

3、lpOutBuffer对应结构体,其中的二维数组不要直接使用[][]

	public static class NET_VCA_FIELDDETECION extends Structure {
		public int dwSize;
		public byte byEnable; //使能,是否开启
		public byte byEnableDualVca;// 启用支持智能后检索 0-不启用,1-启用
		public byte byEnableHumanMisinfoFilter;// 启用人体去误报 0-不启用,1-启用
		public byte byEnableVehicleMisinfoFilter;// 启用车辆去误报 0-不启用,1-启用
		public NET_VCA_INTRUSION[] struIntrusion = new NET_VCA_INTRUSION[MAX_INTRUSIONREGION_NUM];//每个区域的参数设置
		// 不要使用手册上是二维数组[][]
		// public NET_DVR_SCHEDTIME[][] struAlarmSched = new NET_DVR_SCHEDTIME[MAX_DAYS][MAX_TIMESEGMENT_V30];
		public NET_DVR_SCHEDTIMEWEEK[] struAlarmSched = new NET_DVR_SCHEDTIMEWEEK[MAX_DAYS]; //布防时间
		public NET_DVR_HANDLEEXCEPTION_V40 struHandleException; //异常处理方式
		public int dwMaxRelRecordChanNum; //报警触发的录象通道 数(只读)最大支持数量
		public int dwRelRecordChanNum; //报警触发的录象通道 数 实际支持的数量
		public int[] byRelRecordChan = new int[MAX_CHANNUM_V30];//触发录像通道
		public NET_DVR_SCHEDTIME[] struHolidayTime = new NET_DVR_SCHEDTIME[MAX_TIMESEGMENT_V30]; //假日布防时间
		public byte[] byRes2 = new byte[100];
	}
	
	public static class NET_VCA_INTRUSION extends Structure {
		public NET_VCA_POLYGON struRegion;
		public short wDuration;
		public byte bySensitivity;
		public byte byRate;
		public byte byDetectionTarget;
		public byte byPriority;
		public byte byAlarmConfidence;
		public byte byRecordConfidence;
	}
	
	public static class NET_VCA_POLYGON extends Structure {
		public int dwPointNum;
		public NET_VCA_POINT[] struPos = new NET_VCA_POINT[VCA_MAX_POLYGON_POINT_NUM];
	}
	
	public static class NET_VCA_POINT extends Structure {
		public float fX;
		public float fY;
	}

4、主要逻辑代码

	public static void getAndSetFieldDetection() throws UnsupportedEncodingException {
		// 获取参数
		NET_DVR_CHANNEL_GROUP channelGroup = new NET_DVR_CHANNEL_GROUP();
		channelGroup.dwSize = channelGroup.size();
		channelGroup.dwChannel = 1;
		channelGroup.write();
		Pointer lpInBuffer = channelGroup.getPointer();
		NET_VCA_FIELDDETECION userCfg = new NET_VCA_FIELDDETECION();
		Pointer lpOutBuffer = userCfg.getPointer();
		IntByReference lpBytesReturned = new IntByReference(0);
		boolean flag = hCNetSDK.NET_DVR_GetDeviceConfig(lUserID, HCNetSDK.NET_DVR_GET_FIELD_DETECTION, 1,
				lpInBuffer, channelGroup.size(), lpBytesReturned.getPointer(), lpOutBuffer, userCfg.size());
		userCfg.read();
		if (!flag) {
			System.out.println("获取区域入侵侦测配置失败,错误码为" + hCNetSDK.NET_DVR_GetLastError());
			return;
		}else {
			System.out.println("获取区域入侵侦测配置成功");
		}
		System.out.println(userCfg.toString());
		
		// 设置参数
		userCfg.byEnable = 0;
		userCfg.write();
		flag = hCNetSDK.NET_DVR_SetDeviceConfig(lUserID, HCNetSDK.NET_DVR_SET_FIELD_DETECTION, 1,
				lpInBuffer, channelGroup.size(), lpBytesReturned.getPointer(), lpOutBuffer, userCfg.size());
		if (!flag) {
			System.out.println("设置区域入侵侦测配置失败,错误码为" + hCNetSDK.NET_DVR_GetLastError());
			return;
		}else {
			System.out.println("设置区域入侵侦测配置成功");
		}
	}

5、《设备网络SDK开发使用手册》上面都是C++类型,java开发者写数据类型的时候需要格外小心。

C++和Java类型对应:

DWORD-----int

WORD-----short

char-----byte

BYTE-----byte

指针-----Pointer

嵌入式硬盘录像机远程监控的设置与应用 要实现远程监控,首先确定所使用的设备支持那种远程监控方式。就目前来看,只有两种方式:一种是IE远程监控,一种是客户端远程监控;很多压缩卡和硬盘录像机同时支持IE和客户端远程监控。这里,我们仅以2100系列嵌入式硬盘录像机为例,介绍利用硬盘录像机实现远程监控的方法3 n4 K$ v( a$ n2 h " X3 i* j- l6 L5 p6 k% y 一、设备准备:" u9 O9 Q; q8 t5 n5 u   要想实现远程监控,我们首先需要把硬盘录像机连接到网络中。目前来看,大多数中小型企业、办公室、家庭均使用ADSL,而且最经济的方法就是使用ADSL。所以我们要想实现远程监控,硬盘录像机最基本的需要就是ADSL的宽带网络。在开通ADSL后,我们还需要一台支持DDNS功能的路由器(除非你的ADSL仅供硬盘录像机使用,没有其他需要上网的电脑和设备),据我们使用的情况看,TP-LINK系列的路由器就可以,价格和稳定性比较好,操作方法也比较简单,这里也就以TP-LINK410的路由器为例。这样,所需要做的前期工作就是:& L1 S' c6 \2 z# w! l8 z + I: ~2 P+ ?+ l$ _, _. q6 @ 1、ADSL开通并可以正常使用,记住ADSLde上网用户名和密码; 2、安装TP-LINK410路由器(四台电脑以上用户可以选择R810或其他支持DDNS的路由器),连接电脑和硬盘录像机,按照说明书进行路由器设置,将路由器的上网方式设置为“自动连接”,通过电脑检查是否可以正常上网,准备就绪后,进入硬盘录像机的远程监控设置:
<think>好的,我现在需要帮助用户查找关于海康SDKNET_DVR_GET_DEVICECFG函数的使用方法和配置方法。首先,我需要回顾用户提供的引用内容,特别是引用3,其中提到了解析NET_DVR_GET_DEVICECFG的结果。用户可能希望了解如何正确调用这个函数,处理返回的数据结构,以及可能的常见问题。 首先,根据引用1,用户提到海康Java版demo中有使用NET_DVR_GetDVRConfig来获取FTP配置,但没有NET_DVR_GetDeviceConfig的V40方法,需要自己构造。这可能意味着用户对不同的配置获取方法有些混淆,需要明确NET_DVR_GET_DEVICECFG对应的函数是哪一个。通常,海康SDK中,NET_DVR_GetDVRConfig和NET_DVR_GetDeviceConfig可能是不同的函数,用于不同的配置类型。用户需要确认使用的是正确的函数和参数。 引用3详细展示了NET_DVR_GET_DEVICECFG返回的数据结构,包括设备名称、序列号、软件版本等信息,并给出了Java中解析字节数组为字符串的示例。这说明用户在解析时需要注意字符编码,例如sDVRName使用的是GBK编码,而sSerialNumber可能不需要指定编码或者使用默认编码。同时,数据结构中的字段偏移量如@4、@2c等,可能在C/C++的结构体中需要正确对齐,但在Java中通过JNA映射结构体时可能需要特别处理。 接下来,用户的问题是如何使用NET_DVR_GET_DEVICECFG相关的函数。根据海康SDK文档,通常获取设备配置的步骤包括:登录设备获取用户ID,准备配置结构体,调用获取配置的函数,处理返回的数据,最后释放资源。例如,使用NET_DVR_GetDVRConfig函数,并指定参数为NET_DVR_GET_DEVICECFG作为配置命令。 需要确认函数参数是否正确,比如在引用3中用户使用的可能是NET_DVR_GetDVRConfig函数,传入NET_DVR_GET_DEVICECFG作为命令类型,然后填充对应的结构体。此外,错误处理也很重要,比如检查返回值是否为TRUE,调用NET_DVR_GetLastError获取错误码。 用户可能遇到的常见问题包括结构体字段解析错误,特别是字节数组到字符串的转换,以及字符编码的问题。例如,sDVRName使用GBK编码,而其他字段可能使用不同的编码方式,这需要根据实际情况处理。 另外,引用4提到不同的抓图方法,虽然不直接相关,但说明海康SDK中有多种函数实现相似功能,用户需要根据具体情况选择正确的函数。对于配置获取,同样可能存在多个函数,需要区分NET_DVR_GetDVRConfig和NET_DVR_GetDeviceConfig的使用场景。 总结用户需求,他们需要明确的步骤:如何调用函数,如何准备参数,如何处理返回的结构体数据,以及如何处理可能的错误。同时,示例代码会非常有帮助,特别是Java中使用JNA处理结构体的部分,可能需要展示如何正确映射结构体字段,并转换字节数组为字符串。 最后,需要确保回答中提到的函数和参数与用户提供的引用一致,避免混淆不同的配置方法,例如区分NET_DVR_GET_FTPCFG和NET_DVR_GET_DEVICECFG的不同函数使用方式。</think>关于海康设备SDK中$NET_DVR_GET_DEVICECFG$函数的使用方法,以下是基于SDK文档和开发实践的详细说明: ### 一、函数调用流程 1. **设备登录**:首先需通过$NET_DVR_Login_V40$获取有效用户ID 2. **参数准备**:创建$NET_DVR_DEVICECFG$结构体实例 ```java HCNetSDK.NET_DVR_DEVICECFG deviceCfg = new HCNetSDK.NET_DVR_DEVICECFG(); ``` 3. **函数调用**:使用$NET_DVR_GetDVRConfig$接口[^3] ```java boolean ret = hcNetSDK.NET_DVR_GetDVRConfig(lUserID, HCNetSDK.NET_DVR_GET_DEVICECFG, 0, deviceCfg, deviceCfg.size()); ``` 4. **错误处理**:若返回false则调用$NET_DVR_GetLastError()$获取错误码 ### 二、关键数据结构解析 $NET_DVR_DEVICECFG$结构体包含设备基础信息字段: - **sDVRName[32]**:设备名称(GBK编码) - **sSerialNumber[48]**:设备序列号 - **dwSoftwareVersion**:软件版本号 - **dwSoftwareBuildDate**:软件编译日期 ### 三、字段解析示例 ```java // 设备名称解析(注意GBK编码) String dvrName = new String(deviceCfg.sDVRName, "GBK").trim(); // 序列号解析(原始字节数据) String serialNo = new String(deviceCfg.sSerialNumber).trim(); ``` ### 四、常见问题处理 1. **字节对齐问题**:结构体字段偏移量如@4、@2c等需严格对应SDK定义 2. **版本差异**:V4.0以上设备建议使用$NET_DVR_GetDeviceConfig$替代旧接口 3. **内存管理**:需确保结构体内存空间分配正确(Java需通过JNA完成内存映射) ### 五、引用对比说明 与$NET_DVR_GET_FTPCFG$不同,$NET_DVR_GET_DEVICECFG$获取的是设备基础配置而非FTP服务配置[^1]。两者的结构体定义和参数传递方式存在显著差异。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值