下发人脸
首先,设备中需要有这条数据,卡号已经下发了,但没有人脸信息,现在开始下发人脸信息。
只贴核心代码
步骤:登录 启动远程配置 发送长连接 关闭连接
登录 启动远程配置 关闭连接 前面都讲了,这里重点是发送长连接
定义HCNetSDK.NET_DVR_FACE_PARAM_CFG,这个类的c++版本是:
struct{
DWORD dwSize;
BYTE byCardNo[ACS_CARD_NO_LEN];
DWORD dwFaceLen;
char *pFaceBuffer;
BYTE byEnableCardReader[MAX_CARD_READER_NUM_512];
BYTE byFaceID;
BYTE byFaceDataType;
BYTE byRes[126];
}NET_DVR_FACE_PARAM_CFG, *LPNET_DVR_FACE_PARAM_CFG;
需要注意的是pFaceBuffer字段,c++中是char *,这个不能转成String,正确写法如下:
先定义一个类,名字随便取,例如:这个类是存放图片的byte[]信息的
publicstaticclassFACE_INFO extends Structure {
publicbyte[] byFaceInfo;
}
NET_DVR_FACE_PARAM_CFG的java的定义:
publicstaticclassNET_DVR_FACE_PARAM_CFGextendsStructure {
publicintdwSize;
publicbyte[] byCardNo = newbyte[ACS_CARD_NO_LEN];
publicintdwFaceLen;
public Pointer pFaceBuffer;
publicbyte[] byEnableCardReader= newbyte[MAX_CARD_READER_NUM_512];
publicbytebyFaceID;
publicbytebyFaceDataType;
publicbyte[] byRes = newbyte[126];
}
注意:pFaceBuffer被定义成了Pointer而不是String或byte[],其实byte[]我试过,但报错17,就是参数错。
HCNetSDK.FACE_INFO faceInfo = new HCNetSDK.FACE_INFO();
byte[] byteFace = readPic7();
// 将图片转为byte[],java中这里是补码,就是负数,这点和c++,c#不一样,不用管,也不用转成正数。
publicbyte[]readPic7() {
try {
FileInputStreaminputStream= newFileInputStream("D:/facetestimg/test2.jpg");
inti = inputStream.available();
// byte数组用于存放图片字节数据
byte[] buff = newbyte[i];
inputStream.read(buff);
// 关闭输入流
inputStream.close();
returnbuff;
}catch(Exception e) {
e.printStackTrace();
}
returnnull;
}
faceInfo.byFaceInfo = byteFace;
faceInfo.write(); // 这里很重要,必须写,不然发不下去的。
pSendBuf.pFaceBuffer = faceInfo.getPointer(); // 这里就将照片信息赋值进去了
pSendBuf.dwFaceLen = byteFace.length;
pSendBuf.write(); //这个别忘了
// 下发照片
booleanresult= hCNetSDK.NET_DVR_SendRemoteConfig(lHandle, HCNetSDK.ENUM_ACS_INTELLIGENT_IDENTITY_DATA,pSendBuf.getPointer(),pSendBuf.size());
有疑问的可以联系我 [email protected],只要我知道的,尽量回答。
最后贴一下核心代码:
HCNetSDK.NET_DVR_FACE_PARAM_COND lpInBuffer = newHCNetSDK.NET_DVR_FACE_PARAM_COND();
StringcardNo= "1234567";
for (inti = 0; i < cardNo.length(); i++) {
lpInBuffer.byCardNo[i] = (byte) cardNo.charAt(i);
}
lpInBuffer.dwFaceNum = 1;
lpInBuffer.byFaceID = (byte) 1;
lpInBuffer.byEnableCardReader = newbyte[HCNetSDK.MAX_CARD_READER_NUM_512];
lpInBuffer.byEnableCardReader[0] = 1;
lpInBuffer.dwSize = lpInBuffer.size();
FRemoteConfigCallbackfRemoteConfigCallback = newFRemoteConfigCallback();
lpInBuffer.write();
// 启动远程配置。
NativeLonglHandle= hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_SET_FACE_PARAM_CFG,
lpInBuffer.getPointer(), lpInBuffer.size(), fRemoteConfigCallback,pLoginInfo.pUser);
error = hCNetSDK.NET_DVR_GetLastError();
lpInBuffer.read();
// 发送长连接数据
HCNetSDK.NET_DVR_FACE_PARAM_CFGpSendBuf= newHCNetSDK.NET_DVR_FACE_PARAM_CFG();
for (inti = 0; i < cardNo.length(); i++) {
pSendBuf.byCardNo[i] = (byte) cardNo.charAt(i);
}
// pSendBuf.byCardNo = new byte[] { 1, 2, 4, 6, 7 };
HCNetSDK.FACE_INFOfaceInfo= newHCNetSDK.FACE_INFO();
byte[] byteFace = readPic7();
faceInfo.byFaceInfo = byteFace;
faceInfo.write();
pSendBuf.pFaceBuffer = faceInfo.getPointer();
pSendBuf.dwFaceLen = byteFace.length; pSendBuf.byEnableCardReader= newbyte[HCNetSDK.MAX_CARD_READER_NUM_512];
pSendBuf.byEnableCardReader[0]= 1;
pSendBuf.byFaceID = (byte) 1;
pSendBuf.byFaceDataType = (byte) 1;
pSendBuf.dwSize = pSendBuf.size();
pSendBuf.write();
booleanresult = hCNetSDK.NET_DVR_SendRemoteConfig(lHandle, HCNetSDK.ENUM_ACS_INTELLIGENT_IDENTITY_DATA,
pSendBuf.getPointer(), pSendBuf.size());