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

