该功能需要到JNA的知识。
通过查阅海康设备网络SDK编程指南(DVR&NVR)可以知道海康SDK的调用方法都要同过如下过程:
虚线框的流程是可选部分,不会影响其他流程和模块的功能使用。具体的模块说明可以自行参考SDK开发文件。
主要功能代码:
测试例子,因此虚线部分功能不实现
1.初始化设备SDK:对整个网络SDK 系统的初始化,内存预分配等操作。
代码:HCNetSDK sdk = HCNetSDK.INSTANCE;
sdk.NET_DVR_Init();//返回booleaan值
2.注册设备:实现用户的注册功能,注册成功后,返回的用户ID 作为其他功能操作的唯一标识
代码: NativeLong uid=new NativeLong(-1);
NET_DVR_DEVICEINFO_V30 devinfo=new NET_DVR_DEVICEINFO_V30();//设备信息
uid=sdk.NET_DVR_Login_V30((string)IP,(short)PORT,(string)user,string()pwd,devinfo);//返回一个用户编号,同时将设备信息写入devinfo
3.设备工作状态获取(参数配置模块):
代码:NET_DVR_WORKSTATE_V30 devwork=new NET_DVR_WORKSTATE_V30();
sdk.NET_DVR_GetDVRWorkState_V30(uid, devwork);//返回Boolean值,判断是否获取设备能力
IntByReference ibrBytesReturned = new IntByReference(0);//获取IP接入配置参数
NET_DVR_IPPARACFG ipcfg=new NET_DVR_IPPARACFG();
ipcfg.write();
Pointer lpIpParaConfig =ipcfg.getPointer();
sdk.NET_DVR_GetDVRConfig(uid,sdk.NET_DVR_GET_IPPARACFG,new NativeLong(0),lpIpParaConfig,ipcfg.size(),ibrBytesReturned);
ipcfg.read();
4.注销设备:
代码:sdk.NET_DVR_Logout(uid);
5.释放SDK
代码:sdk.NET_DVR_Cleanup();
详细例子:
package ClientDemo; import com.sun.jna.NativeLong; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import ClientDemo.HCNetSDK.NET_DVR_DEVICEINFO_V30; import ClientDemo.HCNetSDK.NET_DVR_IPPARACFG; import ClientDemo.HCNetSDK.NET_DVR_WORKSTATE_V30; public class Device_demo { public static void main(String[] args) { // TODO Auto-generated method stub HCNetSDK sdk = HCNetSDK.INSTANCE; if(!sdk.NET_DVR_Init()){ System.out.println("SDK初始化失败"); return ; } NativeLong uid=new NativeLong(-1); NET_DVR_DEVICEINFO_V30 devinfo=new NET_DVR_DEVICEINFO_V30();//设备信息 String ip="192.168.10.191"; short port=8000; uid=sdk.NET_DVR_Login_V30(ip,port,"admin","hk123456",devinfo);//返回一个用户编号,同时将设备信息写入devinfo int Iuid=uid.intValue(); if(Iuid<0){ System.out.println("设备注册失败"); return ; } NET_DVR_WORKSTATE_V30 devwork=new NET_DVR_WORKSTATE_V30(); if(!sdk.NET_DVR_GetDVRWorkState_V30(uid, devwork)){ //返回Boolean值,判断是否获取设备能力 System.out.println("返回设备状态失败"); } IntByReference ibrBytesReturned = new IntByReference(0);//获取IP接入配置参数 NET_DVR_IPPARACFG ipcfg=new NET_DVR_IPPARACFG(); ipcfg.write(); Pointer lpIpParaConfig =ipcfg.getPointer(); sdk.NET_DVR_GetDVRConfig(uid,sdk.NET_DVR_GET_IPPARACFG,new NativeLong(0),lpIpParaConfig,ipcfg.size(),ibrBytesReturned); ipcfg.read(); System.out.print("IP地址:"+ip); System.out.println("|设备状态:"+devwork.dwDeviceStatic);//0正常,1CPU占用率过高,2硬件错误,3未知 //显示模拟通道 for(int i=0;i< devinfo.byChanNum;i++){ System.out.print("Camera"+i+1);//模拟通道号名称 System.out.print("|是否录像:"+devwork.struChanStatic[i].byRecordStatic);//0不录像,不录像 System.out.print("|信号状态:"+devwork.struChanStatic[i].bySignalStatic);//0正常,1信号丢失 System.out.println("|硬件状态:"+devwork.struChanStatic[i].byHardwareStatic);//0正常,1异常 } sdk.NET_DVR_Logout(uid); sdk.NET_DVR_Cleanup(); } }
输出: