最近在做这一块的内容,通过海康的sdk获取其NVR上面IP通道接入配置,简单来说就是获取如下信息:
于是查询海康官网的JAVA Demo,和chm文档,就找到了如下内容
到这一步都还挺顺利的,内容基本都有,当时当我把 NET_DVR_IPPARACFG_V40 这个结构体的名字去HCNetSDK.java 文件内查询,竟然没有查询到,难道要自己创建一个,于是我发邮件给海康技术,得到的回复是暂时没有样例,只能自己按照其他结构体的定义来来自己定义这个结构体了,这个结构体嵌套了三层,最后一层还是一个联合结构体,我就是在这里出了问题,之前没了解过jna,所以在定义的时候,随便模仿的去定义了,最终使用sdk跑数据的时候,发现如下的结构的联合结构体的内容始终为 0
其他都获取正常,我第一次的定义如下:
找了很多原因没有找到,后面突然找到一个文章说是要 重写 write和read方法 ,抱着试一试的想法,改了之后竟然可以了,最后获取到的信息如下:
关键结构体的定义如下:
public static class NET_DVR_STREAM_MODE extends Structure
{
public byte byGetStreamType; //取流方式GET_STREAM_TYPE,0-直接从设备取流,1-从流媒体取流、2-通过IPServer获得ip地址后取流,3.通过IPServer找到设备,再通过流媒体去设备的流
//4-通过流媒体由URL去取流,5-通过hkDDNS取流,6-直接从设备取流(扩展),使用NET_DVR_IPCHANINFO_V40结构, 7-通过RTSP协议方式进行取流
public byte [] byRes = new byte[3]; //保留字节
public NET_DVR_GET_STREAM_UNION uGetStream; // 不同取流方式结构体
public static class ByValue extends NET_DVR_STREAM_MODE implements Structure.ByValue{}
public static class ByReference extends NET_DVR_STREAM_MODE implements Structure.ByReference{}
@Override
public void read() {
super.read();
switch(byGetStreamType) {
case 0:
uGetStream.setType(NET_DVR_IPCHANINFO.class);
break;
case 1:
uGetStream.setType(NET_DVR_IPSERVER_STREAM.class);
break;
case 2:
uGetStream.setType(NET_DVR_PU_STREAM_CFG.class);
break;
case 3:
uGetStream.setType(NET_DVR_DDNS_STREAM_CFG.class);
break;
case 4:
uGetStream.setType(NET_DVR_PU_STREAM_URL.class);
break;
case 5:
uGetStream.setType(NET_DVR_HKDDNS_STREAM.class);
break;
case 6:
uGetStream.setType(NET_DVR_IPCHANINFO_V40.class);
break;
}
uGetStream.read();
}
@Override
public void write() {
super.write();
switch(byGetStreamType) {
case 0:
uGetStream.setType(NET_DVR_IPCHANINFO.class);
break;
case 1:
uGetStream.setType(NET_DVR_IPSERVER_STREAM.class);
break;
case 2:
uGetStream.setType(NET_DVR_PU_STREAM_CFG.class);
break;
case 3:
uGetStream.setType(NET_DVR_DDNS_STREAM_CFG.class);
break;
case 4:
uGetStream.setType(NET_DVR_PU_STREAM_URL.class);
break;
case 5:
uGetStream.setType(NET_DVR_HKDDNS_STREAM.class);
break;
case 6:
uGetStream.setType(NET_DVR_IPCHANINFO_V40.class);
break;
}
uGetStream.write();
}
}