该笔记是接上篇 sdk初始化写的,部分方法函数请看上篇SDK初始化和登录
函数接口 HCNetSDK 见上篇
// 回调函数
private static HikvisionAlarmCallBack fMSFCallBack_V31 = null;
/**
* 建立布防上传通道,用于传输数据
*
* @param lUserID 唯一标识符
*/
public int setupAlarmChan(int lUserID) {
int lAlarmHandle = -1;
// 根据设备注册生成的lUserID建立布防的上传通道,即数据的上传通道
if (lUserID == -1) {
log.info("请先注册");
return lAlarmHandle;
}
if (lAlarmHandle < 0) {
// 设备尚未布防,需要先进行布防
if (fMSFCallBack_V31 == null) {
fMSFCallBack_V31 = new HikvisionAlarmCallBack();
Pointer pUser = null;
if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUser)) {
log.info("设置回调函数失败!", hCNetSDK.NET_DVR_GetLastError());
} else {
log.info("设置回调函数成功!");
}
}
/** 设备上传的报警信息是COMM_VCA_ALARM(0x4993)类型,
在SDK初始化之后增加调用NET_DVR_SetSDKLocalCfg(enumType为NET_DVR_LOCAL_CFG_TYPE_GENERAL)设置通用参数NET_DVR_LOCAL_GENERAL_CFG的byAlarmJsonPictureSeparate为1,
将Json数据和图片数据分离上传,这样设置之后,报警布防回调函数里面接收到的报警信息类型为COMM_ISAPI_ALARM(0x6009),
报警信息结构体为NET_DVR_ALARM_ISAPI_INFO(与设备无关,SDK封装的数据结构),更便于解析。*/
// 这里需要对设备进行相应的参数设置,不设置或设置错误都会导致设备注册失败
NET_DVR_SETUPALARM_PARAM m_strAlarmInfo = new NET_DVR_SETUPALARM_PARAM();
m_strAlarmInfo.dwSize = m_strAlarmInfo.size();
// 智能交通布防优先级:0 - 一等级(高),1 - 二等级(中),2 - 三等级(低)
m_strAlarmInfo.byLevel = 1;
// 智能交通报警信息上传类型:0 - 老报警信息(NET_DVR_PLATE_RESULT), 1 - 新报警信息(NET_ITS_PLATE_RESULT)
m_strAlarmInfo.byAlarmInfoType = 1;
// 布防类型(仅针对门禁主机、人证设备):0 - 客户端布防(会断网续传),1 - 实时布防(只上传实时数据)
m_strAlarmInfo.byDeployType = 0;
// 抓拍,这个类型要设置为 0 ,最重要的一点设置
// m_strAlarmInfo.byFaceAlarmDetection = 0;
m_strAlarmInfo.write();
// 布防成功,返回布防成功的数据传输通道号
lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID, m_strAlarmInfo);
log.info("设备布防通道", lAlarmHandle);
if (lAlarmHandle == -1) {
log.info("设备布防失败,错误码=========={}", hCNetSDK.NET_DVR_GetLastError());
// 注销 释放sdk资源
logout(lUserID);
} else {
log.info("设备布防成功");
}
}
return lAlarmHandle;
}
/**
* 撤销布防
*/
public void closeCancelDeployment(int lAlarmHandle) {
if (lAlarmHandle > -1) {
if (hCNetSDK.NET_DVR_CloseAlarmChan_V30(lAlarmHandle)) {
log.info("撤防成功");
}
}
}
获得上传报警数据时,包含的图片根据设备不同,有的是上传二进制,有点是图片路径
/**
* @author czm
* @date 2023/5/15
*/
@Slf4j
public class HikvisionAlarmCallBack implements HCNetSDK.FMSGCallBack_V31 {
// lCommand 上传消息类型,这个是设备上传的数据类型,比如现在测试的门禁设备,回传回来的是 COMM_ALARM_ACS = 0x5002; 门禁主机报警信息
// pAlarmer 报警设备信息
// pAlarmInfo 报警信息 根据 lCommand 来选择接收的报警信息数据结构
// dwBufLen 报警信息缓存大小
// pUser 用户数据
//报警信息回调函数
@Override
public boolean invoke(int lCommand, NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
RedisMessageProducer redisMessageProducer = SpringUtil.getBean(RedisMessageProducer.class);
log.info("报警信息回调函数!", dwBufLen);
// AlarmDataParse.alarmDataHandle(lCommand, pAlarmer, pAlarmInfo, dwBufLen, pUser);
log.info("报警事件类型: lCommand:{}", Integer.toHexString(lCommand));
switch (lCommand) {
case IotHikNetConstant.COMM_ALARM_ACS: //门禁主机报警信息
// alarmFaceResult 自定义类,用来收集数据
IotAlarmFaceMonitorResult alarmFaceResult = new IotAlarmFaceMonitorResult();
NET_DVR_ACS_ALARM_INFO strACSInfo = new NET_DVR_ACS_ALARM_INFO();
strACSInfo.write();
Pointer pACSInfo = strACSInfo.getPointer();
pACSInfo.write(0, pAlarmInfo.getByteArray(0, strACSInfo.size()), 0, strACSInfo.size());
strACSInfo.read();
/**门禁事件的详细信息解析,通过主次类型的可以判断当前的具体门禁类型,例如(主类型:0X5 次类型:0x4b 表示人脸认证通过,
主类型:0X5 次类型:0x4c 表示人脸认证失败)*/
log.info("【门禁主机报警信息】卡号:{},卡类型:{}, 报警主类型:{},报警次类型:{}", new String(strACSInfo.struAcsEventInfo.byCardNo).trim(),
strACSInfo.struAcsEventInfo.byCardType, Integer.toHexString(strACSInfo.dwMajor), Integer.toHexString(strACSInfo.dwMinor));
//不为事件
if (strACSInfo.dwMajor != 5) {
break;
}
log.info("工号1:{},图片:{},考勤状态:{},实时温度值:{},dwYear:{},dwMonth: {},dwDay: {},dwHour: {},dwMinute: {},dwSecond: {},设备IP:{},",
strACSInfo.struAcsEventInfo.dwEmployeeNo, strACSInfo.dwPicDataLen, strACSInfo.byAcsEventInfoExtend, strACSInfo.byAcsEventInfoExtendV20,
strACSInfo.struTime.dwYear, strACSInfo.struTime.dwMonth, strACSInfo.struTime.dwDay, strACSInfo.struTime.dwHour, strACSInfo.struTime.dwMinute,
strACSInfo.struTime.dwSecond, new String(pAlarmer.sDeviceIP).trim()
);
log.info("strACSInfo:{} ", JSONUtil.toJsonStr(strACSInfo));
//卡号
alarmFaceResult.setCardNo(new String(strACSInfo.struAcsEventInfo.byCardNo).trim());
alarmFaceResult.setDeviceIp(new String(pAlarmer.sDeviceIP).trim());
log.info("设备唯一编码 :{}", strACSInfo.struAcsEventInfo.byDeviceNo);
log.info("人员工号:{}" , strACSInfo.struAcsEventInfo.dwEmployeeNo);
log.info("通进类型(0:入场,1:离场):{}" , strACSInfo.struAcsEventInfo.dwDoorNo);
log.info("人员类型(0:白名单,1:访客,2:黑名单):{}" ,strACSInfo.struAcsEventInfo.byCardType);
//人脸保存路径
if (strACSInfo.dwPicDataLen > 0) {
//将字节写入文件
long offset = 0;
Buffer buffers = strACSInfo.pPicData.getByteBuffer(offset, strACSInfo.dwPicDataLen);
assembleDataBytes(buffers,strACSInfo.dwPicDataLen,alarmFaceResult);
// byte[] bytes = new byte[strACSInfo.dwPicDataLen];
// buffers.rewind();
// ((ByteBuffer) buffers).get(bytes);
// buffers.get(bytes);
// Base64 encoder = new Base64();
// String stringBase64 = (bytes != null ? encoder.encodeToString(bytes) : "");
// log.info("人脸图片数据 {}", stringBase64);
// if (StrUtil.isNotEmpty(stringBase64)) {
// alarmFaceResult.setFaceImg("data:image/jpg;base64," + stringBase64);
// }
//温度信息(如果设备支持测温功能,人脸温度信息从NET_DVR_ACS_EVENT_INFO_EXTEND_V20结构体获取)
if (strACSInfo.byAcsEventInfoExtendV20 == 1) {
NET_DVR_ACS_EVENT_INFO_EXTEND_V20 strAcsInfoExV20 = new NET_DVR_ACS_EVENT_INFO_EXTEND_V20();
strAcsInfoExV20.write();
Pointer pAcsInfoExV20 = strAcsInfoExV20.getPointer();
pAcsInfoExV20.write(0, strACSInfo.pAcsEventInfoExtendV20.getByteArray(0, strAcsInfoExV20.size()), 0, strAcsInfoExV20.size());
strAcsInfoExV20.read();
log.info("实时温度值:" + strAcsInfoExV20.fCurrTemperature);
}
//考勤状态
if (strACSInfo.byAcsEventInfoExtend == 1) {
NET_DVR_ACS_EVENT_INFO_EXTEND strAcsInfoEx = new NET_DVR_ACS_EVENT_INFO_EXTEND();
strAcsInfoEx.write();
Pointer pAcsInfoEx = strAcsInfoEx.getPointer();
pAcsInfoEx.write(0, strACSInfo.pAcsEventInfoExtend.getByteArray(0, strAcsInfoEx.size()), 0, strAcsInfoEx.size());
strAcsInfoEx.read();
log.info("考勤状态:" + strAcsInfoEx.byAttendanceStatus);
log.info("工号2:" + new String(strAcsInfoEx.byEmployeeNo).trim());
String userId = new String(strAcsInfoEx.byEmployeeNo).trim();
if (StrUtil.isNotEmpty(userId)) {
alarmFaceResult.setUserId(Long.parseLong(userId));
}
}
//报警时间
String year = Integer.toString(strACSInfo.struTime.dwYear);
String SwipeTime = year + dateForm(strACSInfo.struTime.dwMonth) + dateForm(strACSInfo.struTime.dwDay) + dateForm(strACSInfo.struTime.dwHour)
+ dateForm(strACSInfo.struTime.dwMinute) + dateForm(strACSInfo.struTime.dwSecond);
log.info("报警时间 {}", SwipeTime);
alarmFaceResult.setAlarmTime(DateUtil.parse(SwipeTime, DatePattern.PURE_DATETIME_FORMAT).getTime());
if (ObjectUtil.isNotNull(alarmFaceResult) && StrUtil.isNotEmpty(alarmFaceResult.getFaceImg())) {
log.info("doSendMessage: {},{},{},{}", alarmFaceResult.getDeviceIp(), alarmFaceResult.getLocation(),
alarmFaceResult.getUserId(), alarmFaceResult.getAlarmTime());
redisMessageProducer.doSendMessage(IotRedisTopicConstant.REDIS_FACE_MONITORING_ALARM_TOPIC, JSON.toJSONString(alarmFaceResult));
}
}
break;
case IotHikNetConstant.COMM_UPLOAD_FACESNAP_RESULT: //实时人脸抓拍上传
log.info("#########################实时人脸抓拍上传#############################");
NET_VCA_FACESNAP_RESULT strFaceSnapInfo = new NET_VCA_FACESNAP_RESULT();
strFaceSnapInfo.write();
Pointer pFaceSnapInfo = strFaceSnapInfo.getPointer();
pFaceSnapInfo.write(0, pAlarmInfo.getByteArray(0, strFaceSnapInfo.size()), 0, strFaceSnapInfo.size());
strFaceSnapInfo.read();
//前端设备信息
String devIp = new String(strFaceSnapInfo.struDevInfo.struDevIP.sIpV4).trim();
log.info("抓拍设备IP:{}", devIp);
//事件时间
int dwYear = (strFaceSnapInfo.dwAbsTime >> 26) + 2000;
int dwMonth = (strFaceSnapInfo.dwAbsTime >> 22) & 15;
int dwDay = (strFaceSnapInfo.dwAbsTime >> 17) & 31;
int dwHour = (strFaceSnapInfo.dwAbsTime >> 12) & 31;
int dwMinute = (strFaceSnapInfo.dwAbsTime >> 6) & 63;
int dwSecond = (strFaceSnapInfo.dwAbsTime >> 0) & 63;
String strAbsTime = "" + String.format("%04d", dwYear) +
String.format("%02d", dwMonth) +
String.format("%02d", dwDay) +
String.format("%02d", dwHour) +
String.format("%02d", dwMinute) +
String.format("%02d", dwSecond);
//人脸属性信息
String sFaceAlarmInfo = "Abs时间:" + strAbsTime + ",年龄:" + strFaceSnapInfo.struFeature.byAge +
",性别:" + strFaceSnapInfo.struFeature.bySex + ",是否戴口罩:" +
strFaceSnapInfo.struFeature.byMask + ",是否微笑:" + strFaceSnapInfo.struFeature.bySmile;
log.info("人脸信息:{}", sFaceAlarmInfo);
String year = Integer.toString(dwYear);
String SwipeTime = year + dateForm(dwMonth) + dateForm(dwDay) + dateForm(dwHour)
+ dateForm(dwMinute) + dateForm(dwSecond);
log.info("报警时间 {}", SwipeTime);
//人脸测温信息
if (strFaceSnapInfo.byAddInfo == 1) {
NET_VCA_FACESNAP_ADDINFO strAddInfo = new NET_VCA_FACESNAP_ADDINFO();
strAddInfo.write();
Pointer pAddInfo = strAddInfo.getPointer();
pAddInfo.write(0, strFaceSnapInfo.pAddInfoBuffer.getByteArray(0, strAddInfo.size()), 0, strAddInfo.size());
strAddInfo.read();
String sTemperatureInfo = "测温是否开启:" + strAddInfo.byFaceSnapThermometryEnabled + "人脸温度:" + strAddInfo.fFaceTemperature + "温度是否异常"
+ strAddInfo.byIsAbnomalTemperature + "报警温度阈值:" + strAddInfo.fAlarmTemperature;
log.info("人脸温度信息:{}" ,sTemperatureInfo);
}
try {
// long offset = 0;
// Buffer buffers = strFaceSnapInfo.pBuffer1.getByteBuffer(offset, strFaceSnapInfo.dwFacePicLen);
// byte[] bytes = new byte[strFaceSnapInfo.dwFacePicLen];
// buffers.rewind();
// ((ByteBuffer) buffers).get(bytes);
// Base64 encoder = new Base64();
// String stringBase64 = (bytes != null ? encoder.encodeToString(bytes) : "");
// log.info("人脸图片数据 {}", stringBase64);
} catch (Exception ex) {
ex.printStackTrace();
}
break;
case IotHikNetConstant.COMM_SNAP_MATCH_ALARM: //人脸比对报警
log.info("#####################################人脸比对报警##################################");
IotAlarmFaceMonitorResult alarmFaceResult2 = new IotAlarmFaceMonitorResult();
NET_VCA_FACESNAP_MATCH_ALARM strFaceSnapMatch = new NET_VCA_FACESNAP_MATCH_ALARM();
strFaceSnapMatch.write();
Pointer pFaceSnapMatch = strFaceSnapMatch.getPointer();
pFaceSnapMatch.write(0, pAlarmInfo.getByteArray(0, strFaceSnapMatch.size()), 0, strFaceSnapMatch.size());
strFaceSnapMatch.read();
NET_VCA_DEV_INFO struDevInfo = strFaceSnapMatch.struSnapInfo.struDevInfo;
alarmFaceResult2.setDeviceIp(new String(struDevInfo.struDevIP.sIpV4).trim());
log.info("对比设备IP:{}", new String(struDevInfo.struDevIP.sIpV4).trim());
//事件时间
int yearf = (strFaceSnapMatch.struSnapInfo.dwAbsTime >> 26) + 2000;
int month = (strFaceSnapMatch.struSnapInfo.dwAbsTime >> 22) & 15;
int day = (strFaceSnapMatch.struSnapInfo.dwAbsTime >> 17) & 31;
int hour = (strFaceSnapMatch.struSnapInfo.dwAbsTime >> 12) & 31;
int minute = (strFaceSnapMatch.struSnapInfo.dwAbsTime >> 6) & 63;
int second = (strFaceSnapMatch.struSnapInfo.dwAbsTime >> 0) & 63;
String swipeTime = yearf + dateForm(month) + dateForm(day) + dateForm(hour)
+ dateForm(minute) + dateForm(second);
log.info("报警时间 {}", swipeTime);
alarmFaceResult2.setAlarmTime(DateUtil.parse(swipeTime, DatePattern.PURE_DATETIME_FORMAT).getTime());
//比对结果,0-保留,1-比对成功,2-比对失败
float fSimilarity = strFaceSnapMatch.fSimilarity * 100;
log.info("相似度:{}", (int) fSimilarity);
alarmFaceResult2.setFaceSimilarity((int) fSimilarity);
log.info("对比结果:{},相似度:{}", strFaceSnapMatch.byContrastStatus, strFaceSnapMatch.fSimilarity);
try {
log.info("获取struBlockListInfo信息:{}", JSONUtil.toJsonStr(strFaceSnapMatch.struBlockListInfo));
NET_VCA_BLOCKLIST_INFO_ALARM struBlockListInfo = strFaceSnapMatch.struBlockListInfo;
log.info("对比名单注册id:{}", struBlockListInfo.struBlockListInfo.dwRegisterID);
NET_VCA_HUMAN_ATTRIBUTE struAttribute = struBlockListInfo.struBlockListInfo.struAttribute;
log.info("获取struAttribute信息:{}", JSONUtil.toJsonStr(struAttribute));
log.info("对比姓名:{}", new String(struAttribute.byName, StandardCharsets.US_ASCII).trim());
log.info("对比证件号:{}", new String(struAttribute.byCertificateNumber).trim());
alarmFaceResult2.setIdCard(new String(struAttribute.byCertificateNumber).trim());
} catch (Exception e) {
log.error("获取人员信息异常", e);
}
if (strFaceSnapMatch.struBlockListInfo.dwFDIDLen > 0) {
long offset1 = 0;
Buffer buffers1 = strFaceSnapMatch.struBlockListInfo.pFDID.getByteBuffer(offset1, strFaceSnapMatch.struBlockListInfo.dwFDIDLen);
byte[] bytes1 = new byte[strFaceSnapMatch.struBlockListInfo.dwFDIDLen];
((ByteBuffer) buffers1).get(bytes1);
log.info("人脸库ID:{}", new String(bytes1));
}
if (strFaceSnapMatch.struBlockListInfo.dwPIDLen > 0) {
long offset2 = 0;
Buffer buffers2 = strFaceSnapMatch.struBlockListInfo.pPID.getByteBuffer(offset2, strFaceSnapMatch.struBlockListInfo.dwPIDLen);
byte[] bytes2 = new byte[strFaceSnapMatch.struBlockListInfo.dwPIDLen];
((ByteBuffer) buffers2).get(bytes2);
log.info("图片ID:{}", new String(bytes2));
}
//人脸比对报警图片保存,图片格式二进制
if ((strFaceSnapMatch.dwSnapPicLen > 0) && (strFaceSnapMatch.byPicTransType == 0)) {
try {
//将字节写入文件
long offset = 0;
Buffer buffers = strFaceSnapMatch.pSnapPicBuffer.getByteBuffer(offset, strFaceSnapMatch.dwSnapPicLen);
assembleDataBytes(buffers,strFaceSnapMatch.dwSnapPicLen,alarmFaceResult2);
// byte[] bytes = new byte[strFaceSnapMatch.dwSnapPicLen];
// buffers.rewind();
// ((ByteBuffer) buffers).get(bytes);
// Base64 encoder = new Base64();
// String stringBase64 = (bytes != null ? encoder.encodeToString(bytes) : "");
log.info("人脸图片数据 {}", stringBase64);
// if (StrUtil.isNotEmpty(stringBase64)) {
// alarmFaceResult2.setFaceImg("data:image/jpg;base64," + stringBase64);
// }
} catch (Exception e) {
log.error("获取人脸异常", e);
}
}
if ((strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen > 0) && (strFaceSnapMatch.byPicTransType == 0)) {
try {
//将字节写入文件
long offset = 0;
Buffer buffers = strFaceSnapMatch.struSnapInfo.pBuffer1.getByteBuffer(offset, strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen);
assembleDataBytes(buffers,strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen,alarmFaceResult2);
} catch (Exception e) {
log.error("获取人脸异常", e);
}
}
if ((strFaceSnapMatch.struBlockListInfo.dwBlockListPicLen > 0) && (strFaceSnapMatch.byPicTransType == 0)) {
try {
//将字节写入文件
long offset = 0;
Buffer buffers = strFaceSnapMatch.struBlockListInfo.pBuffer1.getByteBuffer(offset, strFaceSnapMatch.struBlockListInfo.dwBlockListPicLen);
assembleDataBytes(buffers,strFaceSnapMatch.struBlockListInfo.dwBlockListPicLen,alarmFaceResult2);
} catch (Exception e) {
log.error("获取人脸异常", e);
}
}
//人脸比对报警图片保存,图片格式URL格式
if ((strFaceSnapMatch.dwSnapPicLen > 0) && (strFaceSnapMatch.byPicTransType == 1)) {
long offset = 0;
Buffer buffers = strFaceSnapMatch.pSnapPicBuffer.getByteBuffer(offset, strFaceSnapMatch.dwSnapPicLen);
byte[] bytes = new byte[strFaceSnapMatch.dwSnapPicLen];
buffers.rewind();
((ByteBuffer) buffers).get(bytes);
String SnapPicUrl = new String(bytes);
log.info("抓拍图URL:{}", SnapPicUrl);
}
if ((strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen > 0) && (strFaceSnapMatch.byPicTransType == 1)) {
long offset = 0;
Buffer buffers = strFaceSnapMatch.struSnapInfo.pBuffer1.getByteBuffer(offset, strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen);
// byte[] bytes = new byte[strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen];
// buffers.rewind();
// ((ByteBuffer) buffers).get(bytes);
// String SnapPicUrl = new String(bytes);
// log.info("抓拍人脸子图URL:{}", SnapPicUrl);
assembleDataUrl(buffers,strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen,alarmFaceResult2);
}
if ((strFaceSnapMatch.struBlockListInfo.dwBlockListPicLen > 0) && (strFaceSnapMatch.byPicTransType == 1)) {
long offset = 0;
Buffer buffers = strFaceSnapMatch.struBlockListInfo.pBuffer1.getByteBuffer(offset, strFaceSnapMatch.struBlockListInfo.dwBlockListPicLen);
byte[] bytes = new byte[strFaceSnapMatch.struBlockListInfo.dwBlockListPicLen];
buffers.rewind();
((ByteBuffer) buffers).get(bytes);
String SnapPicUrl = new String(bytes);
log.info("人脸库人脸图的URL:{}" , SnapPicUrl);
}
if (ObjectUtil.isNotNull(alarmFaceResult2) && StrUtil.isNotEmpty(alarmFaceResult2.getFaceImg())) {
log.info("doSendMessage人脸对比: {},{},{}",alarmFaceResult2.getDeviceIp(),alarmFaceResult2.getIdCard(),alarmFaceResult2.getCardNo() );
redisMessageProducer.doSendMessage(IotRedisTopicConstant.REDIS_FACE_MONITORING_ALARM_TOPIC, JSON.toJSONString(alarmFaceResult2));
}
break;
default:
break;
}
return true;
}
private String dateForm(int val) {
String strVal;
if (val < 10) {
strVal = "0" + val;
} else {
strVal = String.valueOf(val);
}
return strVal;
}
private void assembleDataBytes(Buffer buffers,int dwSnapPicLen,IotAlarmFaceMonitorResult alarmFaceResult){
byte[] bytes = new byte[dwSnapPicLen];
buffers.rewind();
((ByteBuffer) buffers).get(bytes);
Base64 encoder = new Base64();
String stringBase64 = (bytes != null ? encoder.encodeToString(bytes) : "");
// log.info("人脸图片数据 {}", stringBase64);
if (StrUtil.isNotEmpty(stringBase64)) {
alarmFaceResult.setFaceImg("data:image/jpg;base64," + stringBase64);
}
}
private void assembleDataUrl(Buffer buffers,int dwSnapPicLen,IotAlarmFaceMonitorResult alarmFaceResult){
byte[] bytes = new byte[dwSnapPicLen];
buffers.rewind();
((ByteBuffer) buffers).get(bytes);
String SnapPicUrl = new String(bytes);
log.info("抓拍人脸子图URL:{}", SnapPicUrl);
String filePath = FileUtil.getTmpDirPath() + File.separator + new Date().getTime() + ".jpg";
DownFileUrlUtil.fileUrl(SnapPicUrl, filePath);
String base64File = ImageBase64Format.encodeBase64File(FileUtil.file(filePath));
// log.info("人脸图片数据 {}", base64File);
if (StrUtil.isNotEmpty(base64File)) {
alarmFaceResult.setFaceImg("data:image/jpg;base64," + base64File);
}
}
}
/**
* 设备布防
*/
public void equipmentDeployment() {
int lUserID = login_V40("192.168.10.240", (short) 8000, "admin", "123");
log.info("登录句柄 lUserID {} ", lUserID);
int lAlarmHandle = setupAlarmChan(lUserID);
}