該功能需要到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(); } }
輸出: