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手册上的定义。

publicstaticclassNET_DVR_USER_LOGIN_INFOextendsStructure {

       publicbyte[] sDeviceAddress = newbyte[NET_DVR_DEV_ADDRESS_MAX_LEN];

       publicbytebyRes1;

       publicshortwPort;

       publicbyte[] sUserName = newbyte[NET_DVR_LOGIN_USERNAME_MAX_LEN];

       publicbyte[] sPassword = newbyte[NET_DVR_LOGIN_PASSWD_MAX_LEN];

       public FLoginResultCallBack cbLoginResult;

       public Pointer pUser;

       publicbooleanbUseAsynLogin;

       publicbyte[] 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中

publicstaticinterfaceFLoginResultCallBackextendsStdCallCallback {

       publicvoid 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中的很多类中有类,一层套一层,定义的时候需要把它们都定义了。

猜你喜欢

转载自blog.csdn.net/shijieming/article/details/81017921
今日推荐