java调用海康人脸识别机5603的sdk的使用总结(一)

这篇是入门教程

准备工作:

1.      从官网下载demo,其中包含了java的demo

2.      将HCNetSDK.java 直接复制到自己的项目中

3.      将java的demo中的examples.jar和jna.jar加载到自己的项目中

开始编程:

l  java的数据类型和C++的对应关系(大部分可用,小部分需要根据实际情况调整)

C++

Java

char  *

String

word

short

byte

byte

byte[]

byte[]

dword

int

long

NativeLong

Void  *

Pointer

lpvoid

Pointer

lpDword

IntByReference

HWND

HWND

char[]

byte[]

byte  *

Pointer

 

l  根据sdk手册的信息建立相应的类,接口,回调函数,新建立的这些最好也放到HCNetSDK.java中。

l  在自己的类中需要实例化HCNetSDK,具体写法是:staticHCNetSDK hCNetSDK = HCNetSDK.INSTANCE;

l  然后再初始化:booleaninitSuc = hCNetSDK.NET_DVR_Init();  返回true表示成功。

举例:NET_DVR_USER_LOGIN_INFO

c++中的写法是:

struct{
  char                    sDeviceAddress[NET_DVR_DEV_ADDRESS_MAX_LEN];
  BYTE                    byRes1;
  WORD                    wPort;
  char                    sUserName[NET_DVR_LOGIN_USERNAME_MAX_LEN];
  char                    sPassword[NET_DVR_LOGIN_PASSWD_MAX_LEN];
  fLoginResultCallBack    cbLoginResult;
  void                    *pUser;
  BOOL                    bUseAsynLogin;
  BYTE                    byRes2[128];
}NET_DVR_USER_LOGIN_INFO,*LPNET_DVR_USER_LOGIN_INFO;

改成相应的java的写法是:需要注意的是必须继承Structure类,数组类必须初始化并定义长度,长度严格按照sdk手册上的定义。

public staticclass NET_DVR_USER_LOGIN_INFO extends Structure {
       public byte[] sDeviceAddress = newbyte[NET_DVR_DEV_ADDRESS_MAX_LEN];
       public bytebyRes1;
       public shortwPort;
       public byte[] sUserName = newbyte[NET_DVR_LOGIN_USERNAME_MAX_LEN];
       public byte[] sPassword = newbyte[NET_DVR_LOGIN_PASSWD_MAX_LEN];
       public FLoginResultCallBack cbLoginResult;
       public Pointer pUser;
       public booleanbUseAsynLogin;
       public byte[] byRes2 = newbyte[128];
}

在这个类中,有回调函数FLoginResultCallBack,该函数在c++中的定义为:

Callback Function
typedef void(CALLBACK *fLoginResultCallBack)(
  LONG                        lUserID,
  DWORD                       dwResult,
  LPNET_DVR_DEVICEINFO_V30    lpDeviceInfo,
  void                        *pUser
);

改成java后如下:这个接口定义在HCNetSDK.java中

public static interface FLoginResultCallBack extends StdCallCallback {
       public void invoke(NativeLong lUserID, intdwResult, Pointer pUser);
    }

然后在自己的类中写关于回调函数的如下代码:

 

class FLoginResultCallBackimplementsHCNetSDK.FLoginResultCallBack {
       publicvoid invoke(NativeLong lUserID, intdwResult, Pointer pUser) {
           //这里按自己的需要写
       }
    }

下面为NET_DVR_USER_LOGIN_INFO类填充信息

sDeviceAddress:这个是人脸机的ip地址,可以这么赋值:

String sDeviceIP = "192.168.0.13";
for (inti = 0; i < sDeviceIP.length(); i++) {
       pLoginInfo.sDeviceAddress[i] = (byte) sDeviceIP.charAt(i);
}

需要注意的是pLoginInfo.sDeviceAddress[]在类NET_DVR_USER_LOGIN_INFO定义的时候已经初始化并定义了长度了,这个长度必须按照sdk手册上的来,不能自己定义长度。

同理可给用户名和密码赋值。

端口号设置:pLoginInfo.wPort = (short) 8000;

回调函数赋值:前面已经定义了回调函数了,这里进行赋值

FLoginResultCallBack fLoginResultCallBack= newFLoginResultCallBack();
pLoginInfo.cbLoginResult = fLoginResultCallBack;

至此,登录的类已经完成。

我使用的是NET_DVR_Login_V40这个方法进行登录,因此还需要NET_DVR_DEVICEINFO_V40类,和NET_DVR_USER_LOGIN_INFO类的定义方法类似。

 

HCNetSDK.java中对方法NET_DVR_Login_V40进行定义

NativeLong NET_DVR_Login_V40(NET_DVR_USER_LOGIN_INFO pLoginInfo,NET_DVR_DEVICEINFO_V40 lpDeviceInfo);

 

在NET_DVR_Login_V40方法中,对于lpDeviceInfo,只要new一个就可以了,不用对里面的属性进行赋值。

然后进行登录:

NativeLong lUserID = hCNetSDK.NET_DVR_Login_V40(pLoginInfo, lpDeviceInfo);

lUserID的返回值大于-1就是成功了。

最后整理下整个流程

定义两个类:

HCNetSDK.NET_DVR_USER_LOGIN_INFO pLoginInfo = newHCNetSDK.NET_DVR_USER_LOGIN_INFO();
HCNetSDK.NET_DVR_DEVICEINFO_V40 lpDeviceInfo = newHCNetSDK.NET_DVR_DEVICEINFO_V40();

对pLoginInfo的属性进行赋值:之前漏了一个pLoginInfo.bUseAsynLogin = false;

调用登录方法NativeLonglUserID = hCNetSDK.NET_DVR_Login_V40(pLoginInfo, lpDeviceInfo);

返回大于-1的整数表示成功,如果返回-1,则可以调用

int error = hCNetSDK.NET_DVR_GetLastError(); 根据返回的错误代码,在sdk手册中找出相应的原因。

 

HCNetSDK.java这个类中已经定义了很多方法,接口,类了,因此在定义的时候先查找一下是否已经存在了。

就登录而言,很多设备的方法大同小异,不止局限于人脸机5603

sdk中的很多类中有类,一层套一层,定义的时候需要把它们都定义了。

你可能感兴趣的:(海康,java)