由于官方的例子中没有关于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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)