对接海康门禁设备-布防报警

标题对接海康门禁设备-布防报警

该笔记是接上篇 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);
    }

你可能感兴趣的:(海康,java,开发语言)