海康威视SDK告警上传功能整合到springboot(一)

1、下载SDK (海康开放平台)

    根据不同系统及操作位数下载对应的sdk,并解压好,放到一固定位置项目中需要用到

2、idea创建springboot项目

     

 项目结构如上图,hkdll(windos的sdk)

3、将sdk中的 两个 jna.jarexamples.jar打入本地仓库方便maven引用

 <!--海康威视-->
        <dependency>
            <groupId>net.java.jna</groupId>
            <artifactId>jna</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>net.java.examples</groupId>
            <artifactId>examples</artifactId>
            <version>1.0.0</version>
        </dependency>
mvn install:install-file -DgroupId=net.java.jna -DartifactId=jna -Dversion=1.0.0 -Dpackaging=jar -Dfile=C:/Users/bwx686365/Desktop/DeskTable/lib/jna.jar

4、将sdk中demo的HCNetSDK.java拷贝到项目中

 截图是我为了兼容Linux和Windows修改后的样子

修改类面的路径 windos和Linux加载的不一样

HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(PropertyUtil.getPath() + "HCNetSDK.dll", HCNetSDK.class);

 5、初始化资源

/**资源初始化
* @return
*/
public int initDevice() {
    if (!hCNetSDK.NET_DVR_Init()) {
        //初始化失败
        return 1;
    }
    return 0;
}

6、注册设备

/**
     * 设备注册
     * @param ip
     * @param name
     * @param password
     * @param lUserID
     * @return
     */
public int deviceRegister(int lUserID,String ip ,String name, String password,String port){
    //注册之前先注销已注册的用户
    if (lUserID > -1) {
        //先注销
        hCNetSDK.NET_DVR_Logout(lUserID);
        lUserID = -1;
    }
    //ip地址
    m_sDeviceIP = ip;
    m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
    System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());
    //设备用户名
    m_sUsername = name;
    m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
    System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());
    //设备密码
    m_sPassword = password;
    m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
    System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());
    m_strLoginInfo.wPort = (short) Integer.parseInt(port);
    //是否异步登录:0- 否,1- 是
    m_strLoginInfo.bUseAsynLogin = false;
    m_strLoginInfo.write();
    lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
    if (lUserID == -1) {
        log.info("注册失败,错误号====={}" , hCNetSDK.NET_DVR_GetLastError());
        return -1;
    } else {
        log.info("注册成功");
        return lUserID;
    }
}

7、 建立布防上传通道

    /**
     * 建立布防上传通道
     */
    public int setupAlarmChan(int lUserID,int lAlarmHandle) {
        if (lUserID == -1) {
            log.info("请先注册");
            return lUserID;
        }
        if (lAlarmHandle < 0) {
            //尚未布防,需要布防
            if (fMSFCallBack_V31 == null) {
                fMSFCallBack_V31 = new FMSGCallBack_V31();
                Pointer pUser = null;
                if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUser)) {
                    log.info("设置回调函数失败!", hCNetSDK.NET_DVR_GetLastError());
                }
            }
            HCNetSDK.NET_DVR_SETUPALARM_PARAM m_strAlarmInfo = new HCNetSDK.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 = 1;
            m_strAlarmInfo.write();
            lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID, m_strAlarmInfo);
            if (lAlarmHandle == -1) {
                log.info("布防失败,错误码=========={}", hCNetSDK.NET_DVR_GetLastError());
                //注销 释放sdk资源
                logout(lUserID);
                return lAlarmHandle;
            } else {
                log.info("布防成功");
                return lAlarmHandle;
            }
        }
        return lAlarmHandle;
    }

 8、接收设备上传递的报警信息

    /**
     *  接收设备上传的报警信息
     * @param lCommand 上传消息类型
     * @param pAlarmer 报警设备信息
     * @param pAlarmInfo 报警信息
     * @param dwBufLen 报警信息缓存大小
     * @param pUser 用户数据
     * @return
     */
    public void alarmDataHandle(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
        String sAlarmType = new String();
        String[] newRow = new String[3];
        //报警时间
        Date today = new Date();
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String[] sIP = new String[2];
​
        sAlarmType = new String("lCommand=0x") + Integer.toHexString(lCommand);
        //lCommand是传的报警类型
        switch (lCommand) {
            //客流统计
            case HCNetSDK.COMM_ALARM_PDC:
                HCNetSDK.NET_DVR_PDC_ALRAM_INFO strPDCResult = new HCNetSDK.NET_DVR_PDC_ALRAM_INFO();
                strPDCResult.write();
                Pointer pPDCInfo = strPDCResult.getPointer();
                pPDCInfo.write(0, pAlarmInfo.getByteArray(0, strPDCResult.size()), 0, strPDCResult.size());
                strPDCResult.read();
                if (strPDCResult.byMode == 0) {
                    strPDCResult.uStatModeParam.setType(HCNetSDK.NET_DVR_STATFRAME.class);
                    sAlarmType = sAlarmType + ":客流量统计,进入人数:" + strPDCResult.dwEnterNum + ",离开人数:" + strPDCResult.dwLeaveNum +
                            ", byMode:" + strPDCResult.byMode + ", dwRelativeTime:" + strPDCResult.uStatModeParam.struStatFrame.dwRelativeTime +
                            ", dwAbsTime:" + strPDCResult.uStatModeParam.struStatFrame.dwAbsTime;
                }
                if (strPDCResult.byMode == 1) {
                    strPDCResult.uStatModeParam.setType(HCNetSDK.NET_DVR_STATTIME.class);
                    String strtmStart = "" + String.format("%04d", strPDCResult.uStatModeParam.struStatTime.tmStart.dwYear) +
                            String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmStart.dwMonth) +
                            String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmStart.dwDay) +
                            String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmStart.dwHour) +
                            String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmStart.dwMinute) +
                            String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmStart.dwSecond);
                    String strtmEnd = "" + String.format("%04d", strPDCResult.uStatModeParam.struStatTime.tmEnd.dwYear) +
                            String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmEnd.dwMonth) +
                            String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmEnd.dwDay) +
                            String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmEnd.dwHour) +
                            String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmEnd.dwMinute) +
                            String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmEnd.dwSecond);
                    sAlarmType = sAlarmType + ":客流量统计,进入人数:" + strPDCResult.dwEnterNum + ",离开人数:" + strPDCResult.dwLeaveNum +
                            ", byMode:" + strPDCResult.byMode + ", tmStart:" + strtmStart + ",tmEnd :" + strtmEnd;
                }
​
                newRow[0] = dateFormat.format(today);
                //报警类型
                newRow[1] = sAlarmType;
                //报警设备IP地址
                sIP = new String(strPDCResult.struDevInfo.struDevIP.sIpV4).split("\0", 2);
                newRow[2] = sIP[0];
                log.info("客流信息数量======{}", Arrays.toString(newRow));
                break;
            case HCNetSDK.COMM_UPLOAD_FACESNAP_RESULT:
                //实时人脸抓拍上传
                HCNetSDK.NET_VCA_FACESNAP_RESULT strFaceSnapInfo = new HCNetSDK.NET_VCA_FACESNAP_RESULT();
                strFaceSnapInfo.write();
                Pointer pFaceSnapInfo = strFaceSnapInfo.getPointer();
                pFaceSnapInfo.write(0, pAlarmInfo.getByteArray(0, strFaceSnapInfo.size()), 0, strFaceSnapInfo.size());
                strFaceSnapInfo.read();
                sAlarmType = sAlarmType + ":人脸抓拍上传[人脸评分:" + strFaceSnapInfo.dwFaceScore + ",年龄:" + strFaceSnapInfo.struFeature.byAge + ",性别:" + strFaceSnapInfo.struFeature.bySex + "]";
                newRow[0] = dateFormat.format(today);
                //报警类型
                newRow[1] = sAlarmType;
                //报警设备IP地址
                sIP = new String(strFaceSnapInfo.struDevInfo.struDevIP.sIpV4).split("\0", 2);
                newRow[2] = sIP[0];
                log.info("人脸抓拍========{}",Arrays.toString(newRow));
                //设置日期格式
                SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
                // new Date()为获取当前系统时间
                String time = df.format(new Date());
                //人脸图片写文件
                File file = new File(System.getProperty("user.dir") + "\\pic\\");
                if (!file.exists()){
                    file.mkdir();
                }
                try {
                    FileOutputStream big = new FileOutputStream(System.getProperty("user.dir") + "\\pic\\" + time + "background.jpg");
                    if (strFaceSnapInfo.dwFacePicLen > 0) {
                        if (strFaceSnapInfo.dwFacePicLen > 0) {
                            try {
                                big.write(strFaceSnapInfo.pBuffer2.getByteArray(0, strFaceSnapInfo.dwBackgroundPicLen), 0, strFaceSnapInfo.dwBackgroundPicLen);
                                big.close();
                            }  catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                break;
            default:
                newRow[0] = dateFormat.format(today);
                //报警类型
                newRow[1] = sAlarmType;
                //报警设备IP地址
                sIP = new String(pAlarmer.sDeviceIP).split("\0", 2);
                newRow[2] = sIP[0];
                log.info("其他报警信息=========={}",Arrays.toString(newRow));
                break;
        }
    }

9、报警回调函数 

public class FMSGCallBack_V31 implements HCNetSDK.FMSGCallBack_V31 {
        //报警信息回调函数
        //lCommand 上传消息类型  pAlarmer 报警设备信息  pAlarmInfo  报警信息   dwBufLen 报警信息缓存大小   pUser  用户数据
        @Override
        public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
            alarmDataHandle(lCommand, pAlarmer, pAlarmInfo, dwBufLen, pUser);
            return true;
        }
    }

10、撤防

 /**
     * 报警撤防
     */
    public int closeAlarmChan(int lAlarmHandle) {
        if (lAlarmHandle > -1) {
            if (hCNetSDK.NET_DVR_CloseAlarmChan_V30(lAlarmHandle)) {
                log.info("撤防成功");
                lAlarmHandle = -1;
                return lAlarmHandle;
            }
            return lAlarmHandle;
        }
        return lAlarmHandle;
    }

11、注销 

 /**
     * 注销
     * @param lUserID
     */
    public void logout(int lUserID){
        //注销
        hCNetSDK.NET_DVR_Logout(lUserID);
        //释放SDK资源
        hCNetSDK.NET_DVR_Cleanup();
    }
​

测试代码

    public static void main(String[] args) {
        HCNetAlarm hcNetAlarm = new HCNetAlarm();
        int lAlarmHandle = -1;
        int row = hcNetAlarm.initDevice();
        if (row == 1){
            log.info("初始化失败");
        }
        //设置连接超时时间与重连功能
        hCNetSDK.NET_DVR_SetConnectTime(2000,1);
        hCNetSDK.NET_DVR_SetReconnect(10000,true);
        //注册
        hcNetAlarm.deviceRegister(lUserID,"设备ip","设备登录名","设备登录密码","端口号");
​
        //设置报警回调函数
        //建立报警上传通道(启用布防)
        //布防参数
        hcNetAlarm.setupAlarmChan();
        try {
            //等待设备上传报警信息
            log.info("等待设备上传报警信息====================");
            Thread.sleep(100*60*60);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //撤销布防上传通道
        hcNetAlarm.closeAlarmChan();
        //注销 释放sdk资源
        hcNetAlarm.logout();
    }

 

至此Windows 的sdk整合完成,关于Linux的和Windows大同小异,下一篇写上兼容windos和Linux的 

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值