海康集成报警主机等设备

报警主机监控流程(报警类型:COMM_ALARMHOST_CID_ALARM)

 <dependency>
   <groupId>com.sun.jna</groupId>
    <artifactId>jna</artifactId>
    <version>3.0.9</version>
 </dependency>
 <dependency>
   <groupId>com.sun.jna.examples</groupId>
    <artifactId>test</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${basedir}/src/main/resources/lib/examples.jar</systemPath>
</dependency>

examples包下载地址,密码:1234

注册登录

目前接触的报警主机或者摄像头注册登录的方式都一样。

	@Value("${hk_device.m_sDeviceIP}")
    public void setMsDeviceIP(String deviceIP) {
        msDeviceIP = deviceIP;
    }
    public static String msDeviceIP;

    @Value("${hk_device.m_sUsername}")
    public void setMsUserName(String userName) {
        msUserName = userName;
    }
    public static String msUserName;

    @Value("${hk_device.m_sPassword}")
    public void setMsPassword(String password) {
        msPassword = password;
    }
    public static String msPassword;

    @Value("${hk_device.m_sPort}")
    public void setMsPort(int port) {
        msPort = port;
    }
    public static int msPort;
	
	/**
	* 要排除的监控项
	*/
    @Value("${hwdz.excludeCodes}")
    public void setExcludeCodes(String codes) {
        excludeCodes = codes;
    }
    public static String excludeCodes;

    @Value("${hwdz.url}")
    public void setUrl(String addr) {
        url = addr;
    }
    public static String url;

    public static List<String> excludeCodeList;

    static int lUserID = -1;

    static int lAlarmHandle = -1;

    /**
     * 加载库文件
     */
    static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;

    /**
     * 报警回调函数实现
     */
    public static HCNetSDK.FMSGCallBack_V31 fMSFCallBack_v31;
 /**
     * 注册登录
     *
     * @return 用户句柄
     */
    public static Result<Object> login() {
        boolean dvrInit = hCNetSDK.NET_DVR_Init();
        if (!dvrInit) {
            return Result.error450("初始化失败...");
        }
        HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG struGeneralCfg = new HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG();
        //控制JSON透传报警数据和图片是否分离,0-不分离,1-分离(分离后走COMM_ISAPI_ALARM回调返回)
        struGeneralCfg.byAlarmJsonPictureSeparate = 1;
        struGeneralCfg.write();
        if (!hCNetSDK.NET_DVR_SetSDKLocalCfg(17, struGeneralCfg.getPointer())) {
            log.error("报警主机NET_DVR_SetSDKLocalCfg失败");
        }
        //设置连接时间与重连时间
        hCNetSDK.NET_DVR_SetConnectTime(2000, 1);
        hCNetSDK.NET_DVR_SetReconnect(10000, true);
        // 注册设备
        //登录参数,包括设备地址、登录用户、密码等
        //设置同步
        /**
         * 设备登录信息
         */
        HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();
        m_strLoginInfo.bUseAsynLogin = false;
        //设置地址
        m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
        System.arraycopy(msDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, msDeviceIP.length());
        //设置用户名
        m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
        System.arraycopy(msUserName.getBytes(), 0, m_strLoginInfo.sUserName, 0, msUserName.length());
        //设置密码
        m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
        System.arraycopy(msPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, msPassword.length());
        //设置端口
        m_strLoginInfo.wPort = (short) msPort;
        m_strLoginInfo.write();
        /**
         * 设备信息
         */
        HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();
        lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);

        if (lUserID == -1) {
            log.error("报警主机注册失败,错误号:" + hCNetSDK.NET_DVR_GetLastError());
            hCNetSDK.NET_DVR_Cleanup();
            return Result.error450("报警主机注册失败,错误号:" + hCNetSDK.NET_DVR_GetLastError());
        } else {
            log.info("报警主机注册成功");
            return Result.ok();
        }
    }

报警主机布防

/**
     * 报警主机布防
     *
     * @return lAlarmHandle
     */
    public static Result<Object> SetupAlarmChan() {
        if (lUserID == -1) {
            log.error("请先注册报警主机");
            lAlarmHandle = -1;
            return Result.error450("请先注册报警主机");
        }
        if (lAlarmHandle < 0) {//尚未布防,需要布防
            //设置报警回调函数
            fMSFCallBack_v31 = new FMSGCallBack_V31();
            boolean flag = hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_v31, null);
            if (!flag) {
                log.error("报警主机设置回调函数失败!");
            }
            //启用布防
            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.error("报警主机布防失败,错误号:" + hCNetSDK.NET_DVR_GetLastError());
                return Result.error450("报警主机布防失败,错误号:" + hCNetSDK.NET_DVR_GetLastError());
            } else {
                log.info("报警主机布防成功");
                return Result.ok("报警主机布防成功");
            }
        }
        return Result.ok("报警主机注册布防成功");
    }

报警主机注销

/**
     * 报警主机注销用户,释放资源
     */
    public static Result<Object> Logout() {
        //报警撤防
        if (lAlarmHandle > -1) {
            if (hCNetSDK.NET_DVR_CloseAlarmChan_V30(lAlarmHandle)) {
                lAlarmHandle = -1;
                log.info("报警主机撤防成功!");
                //注销
                if (lUserID > -1) {
                    if (hCNetSDK.NET_DVR_Logout(lUserID)) {
                        hCNetSDK.NET_DVR_Cleanup();
                        lUserID = -1;
                        log.info("报警主机注销成功!");
                        return Result.ok("报警主机注销用户,撤防成功");
                    } else {
                        log.error("报警主机注销失败,错误号:" + hCNetSDK.NET_DVR_GetLastError());
                    }
                }
            } else {
                log.error("报警主机撤防失败,错误号:" + hCNetSDK.NET_DVR_GetLastError());
            }
        }
        return Result.error450("报警主机注销用户失败,错误号:" + hCNetSDK.NET_DVR_GetLastError());
    }

报警主机下的子系统和防区配置

子系统关联防区

/**
     * 功能描述:子系统关联防区
     * 子系统关联参数设置规则:索引都默认为0代表关联1-8防区(subsystem_param_ex.byJointAlarmIn[0]) 1代表9-16防区,以此类推 subsystem_param_ex.byJointAlarmIn[1])
     * 所设置的十进制值将会转换成2禁止,转成二进制1代表关联,0代表取消关联
     * 注意:防区从右到左依次递增
     * 例如:byJointAlarmIn[0] = 7; 7转换成2进制为:111,代表关联1,2,3三个防区
     * byJointAlarmIn[0] = 5; 5转换成2进制为:101,代表关联1,3两个个防区
     * 注意:由于byte最大值为127,如果8位二进制转成byte超出,直接强转成byte,或自动进行补位
     *
     * @param alarmsubsystem_code:子系统号
     * @return void
     * @author zhouwenjie
     * @date 2022/2/17 16:23
     */
    public static Result<Object> subsystemParamEx(byte[] byJointAlarmIn, int alarmsubsystem_code) {
        /**************开启子系统使能**************/
        HCNetSDK.NET_DVR_ALARMSUBSYSTEMPARAM net_dvr_alarmsubsystemparam = new HCNetSDK.NET_DVR_ALARMSUBSYSTEMPARAM();
        net_dvr_alarmsubsystemparam.dwSize = net_dvr_alarmsubsystemparam.size();
        net_dvr_alarmsubsystemparam.write();
        IntByReference lpBytesReturned = new IntByReference(0);
        boolean b_GetAcsCfg = hCNetSDK.NET_DVR_GetDVRConfig(lUserID, 2001, alarmsubsystem_code, net_dvr_alarmsubsystemparam.getPointer(), net_dvr_alarmsubsystemparam.size(), lpBytesReturned);
        if (b_GetAcsCfg) {
            net_dvr_alarmsubsystemparam.read();
            net_dvr_alarmsubsystemparam.bySubsystemEnable = 1;
            net_dvr_alarmsubsystemparam.bySingleZoneSetupAlarmEnable = 1;
            boolean b_SetAcsCfg = hCNetSDK.NET_DVR_SetDVRConfig(lUserID, 2002, alarmsubsystem_code, net_dvr_alarmsubsystemparam.getPointer(), net_dvr_alarmsubsystemparam.size());
            if (!b_SetAcsCfg) {
                log.error("设置子系统参数失败! 错误码:" + hCNetSDK.NET_DVR_GetLastError());
            }
        } else {
            log.error("获取子系统参数失败! 错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        /**************开启子系统使能**************/
        /***子系统关联防区***/
        HCNetSDK.NET_DVR_SUBSYSTEM_PARAM_EX subsystem_param_ex = new HCNetSDK.NET_DVR_SUBSYSTEM_PARAM_EX();
        subsystem_param_ex.dwSize = subsystem_param_ex.size();
        subsystem_param_ex.write();
        IntByReference sub = new IntByReference(0);
        boolean getConfig = hCNetSDK.NET_DVR_GetDVRConfig(lUserID, 2030, 1, subsystem_param_ex.getPointer(), subsystem_param_ex.size(), sub);
        if (!getConfig) {
            log.error("报警主机获取子系统参数设置失败! 错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }

        subsystem_param_ex.read();
        subsystem_param_ex.byJointAlarmIn = byJointAlarmIn; //表示关联防区
        subsystem_param_ex.write();
        boolean setConfig = hCNetSDK.NET_DVR_SetDVRConfig(lUserID, 2031, 1, subsystem_param_ex.getPointer(), subsystem_param_ex.size());
        if (!setConfig) {
            log.error("报警主机关联设置参数失败! 错误码:" + hCNetSDK.NET_DVR_GetLastError());
            return Result.error450("关联失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        return Result.ok("防区子系统关联成功");
    }

转换防区为海康sdk中需要的格式

/**
     * 功能描述:子系统关联防区
     *
     * @param byJointAlarmIn      防区号为key,是否关联(0,1)作为值,每次都要将所有防区的关联情况传递过来,无论是更改一个还是更改多个,不传递会默认取消已关联的防区
     * @param alarmsubsystem_code 子系统号
     * @return org.hwdz.common.api.vo.Result<?>
     * @author zhouwenjie
     * @date 2022/2/21 8:51
     */
    @PostMapping(value = "/ssToPlay")
    public Result<?> ssToPlay(@RequestBody Map byJointAlarmIn, @RequestParam(name = "alarmsubsystem_code") byte alarmsubsystem_code) {
        //转换
        ArrayList<Integer> integers = new ArrayList<>();
        Map<String, String> map = byJointAlarmIn;
        //拿出所有的key
        for (Map.Entry<String, String> entry : map.entrySet()) {
            integers.add(Integer.parseInt(entry.getKey()));
        }
        //排列
        Collections.sort(integers);
        if (integers.size() < 8) {
            for (int i = 0; i < 8 - integers.size(); i++) {
                integers.add(0);
            }
        }
        //组装二进制数据
        String s = "";
        Integer number = 0;
        byte[] bytes = new byte[512 / 8];
        for (int i = 0; i < integers.size(); i++) {
            String value = map.get(integers.get(i) + "");
            s += value;
            if (integers.size() < 8 && i == integers.size() - 1) {
                //小于8位直接拼接
                String s1 = new StringBuffer(s).reverse().toString();
                int num = Integer.parseInt(s1, 2);
                bytes[number] = (byte) num;
            }
            if ((i != 0 && (i + 1) % 8 == 0) || (integers.size() >= 8 && i == integers.size() - 1)) {
                //每8位代表8个防区,数组下标以此类推
                String s1 = new StringBuffer(s).reverse().toString();
                int num = Integer.parseInt(s1, 2);
                bytes[number] = (byte) num;
                number++;
                s = "";
            }
        }
        return AlarmHk.subsystemParamEx(bytes, alarmsubsystem_code);
    }

防区布撤防、旁路

/**
     * 功能描述:布防防区
     *
     * @param nums
     * @return org.hwdz.common.api.vo.Result<?>
     * @author zhouwenjie
     * @date 2022/2/21 8:59
     */
    @PostMapping(value = "/alarmHostSetupAlarmChan")
    public Result<?> alarmHostSetupAlarmChan(@RequestBody String[] nums) {
	//布防
	Result<Object> result = AlarmHk.alarmHostSetupAlarmChan(ints);
      if (result.isSuccess()) {
           //一切正常,布防成功
       } else {
           //有异常,找出异常
           for (int i = 0; i < ints.size(); i++) {
               int[] codes = new int[nums.length];         
                   codes[i] = Integer.valueOf(s);
                   result = AlarmHk.alarmHostSetupAlarmChan(codes);
                   if (!result.isSuccess()) {
                       result.setMessage("布防失败,防区" + Integer.valueOf(s) + "故障");
                       break;    
               }
           }
       }
       return result;
   }
/**
     * 防区报警布防
     * 设置防区规则:byAssiciateAlarmIn的索引值+1就是防区的编号,默认索引位置+值=防区号
     * 例如:byAssiciateAlarmIn[0] = 1 代表1号防区  byAssiciateAlarmIn[1] = 1 代表2号防区   byAssiciateAlarmIn[2] = 1 代表3号防区
     *
     * @param nums
     */
    public static Result<Object> alarmHostSetupAlarmChan(int[] nums) {
        //报警撤防
        HCNetSDK.NET_DVR_ALARMIN_SETUP net_dvr_alarmin_setup = new HCNetSDK.NET_DVR_ALARMIN_SETUP();
        for (int num : nums) {
            net_dvr_alarmin_setup.byAssiciateAlarmIn[num - 1] = 1; // 对防区布防
        }
        net_dvr_alarmin_setup.write();
        Boolean aBoolean = hCNetSDK.NET_DVR_AlarmHostSetupAlarmChan(lUserID, net_dvr_alarmin_setup);
        if (!aBoolean) {
            log.error("对防区" + Arrays.toString(nums) + "布防失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
            return Result.error450("对防区" + Arrays.toString(nums) + "布防失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        return Result.ok("对防区" + Arrays.toString(nums) + "布防成功");
    }
 /**
     * 防区报警撤防
     *
     * @param nums
     */
    public static Result<Object> alarmHostCloseAlarmChan(int[] nums) {
        //报警撤防
        HCNetSDK.NET_DVR_ALARMIN_SETUP net_dvr_alarmin_setup = new HCNetSDK.NET_DVR_ALARMIN_SETUP();
        for (int num : nums) {
            net_dvr_alarmin_setup.byAssiciateAlarmIn[num - 1] = 1; // 对防区1布防
        }
        net_dvr_alarmin_setup.write();
        Boolean aBoolean = hCNetSDK.NET_DVR_AlarmHostCloseAlarmChan(lUserID, net_dvr_alarmin_setup);
        if (!aBoolean) {
            log.error("对防区" + Arrays.toString(nums) + "撤防失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
            return Result.error450("对防区" + Arrays.toString(nums) + "撤防失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        } else {
            return Result.ok("对防区" + Arrays.toString(nums) + "撤防成功");
        }
    }
/**
     * 对防区旁路。
     * @param nums
     */
    public static Result<Object> alarmHostBypassAlarmChan(int[] nums) {
        //报警撤防
        HCNetSDK.NET_DVR_ALARMIN_SETUP net_dvr_alarmin_setup = new HCNetSDK.NET_DVR_ALARMIN_SETUP();
        for (int num : nums) {
            net_dvr_alarmin_setup.byAssiciateAlarmIn[num - 1] = 1; // 对防区布防
        }
        net_dvr_alarmin_setup.write();
        Boolean aBoolean = hCNetSDK.NET_DVR_BypassAlarmChan(lUserID, net_dvr_alarmin_setup);
        if (!aBoolean) {
            log.error("对防区" + Arrays.toString(nums) + "旁路失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
            return Result.error450("对防区" + Arrays.toString(nums) + "旁路失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        }
        return Result.ok("对防区" + Arrays.toString(nums) + "旁路成功");
    }

子系统布防、撤防、消警

/**
     * 子系统报警布防
     *
     * @param num 子系统号,子系统关联的防区将会全部布防,实现防区一键布防
     */
    public static Result<Object> alarmHostSubSystemSetupAlarmChan(byte num) {
        //报警撤防
        Boolean aBoolean1 = hCNetSDK.NET_DVR_AlarmHostSubSystemSetupAlarmChan(lUserID, num);
        if (!aBoolean1) {
            log.error("对子系统1布防失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
            return Result.error450("对子系统" + num + "布防失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        } else {
            return Result.ok("对子系统" + num + "布防成功");
        }
    }
 /**
     * 子系统报警撤防
     *
     * @param num
     */
    public static Result<Object> alarmHostSubSystemCloseAlarmChan(byte num) {
        //报警撤防
        Boolean aBoolean = hCNetSDK.NET_DVR_AlarmHostSubSystemCloseAlarmChan(lUserID, num);
        if (!aBoolean) {
            log.error("对子系统" + num + "撤防失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
            return Result.error450("对子系统" + num + "撤防失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        } else {
            return Result.ok("对子系统" + num + "撤防成功");
        }
    }
/**
     * 子系统消警
     *
     * @param num
     */
    public static Result<Object> alarmHostClearAlarm(byte num) {
        //报警撤防
        Boolean aBoolean = hCNetSDK.NET_DVR_AlarmHostClearAlarm(lUserID, num);
        if (!aBoolean) {
            log.error("对子系统" + num + "消警失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
            return Result.error450("对子系统" + num + "消警失败,错误码:" + hCNetSDK.NET_DVR_GetLastError());
        } else {
            return Result.ok("对子系统" + num + "消警成功");
        }
    }

判断设备是否在线(报警主机或者摄像头等)

/**
     * 本设备是否在线 接口返回TRUE表示在线,FALSE表示与设备通信失败或者返回错误状态。
     *
     * @param
     * @date 2022/1/4 16:40
     * @author jfb
     */
    public static Integer deviceOnLine() {
        boolean b = hCNetSDK.NET_DVR_RemoteControl(lUserID, 20005, null, 0);
        if (b) {
            return 0;
        } else {
            return 1;
        }
    }

报警主机监控信息反馈

/**
 * @author: zhouwenjie
 * @description: 报警信息
 * @create: 2022-02-21 11:03
 **/
public class FMSGCallBack_V31 implements HCNetSDK.FMSGCallBack_V31 {

    @Override
    public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) throws UnsupportedEncodingException {
        alarmDataHandle(lCommand, pAlarmer, pAlarmInfo, dwBufLen, pUser);
        return true;
    }

    //报警信息回调函数
    public void alarmDataHandle(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) throws UnsupportedEncodingException {
        //报警时间
        String sAlarmType = "lCommand=0x" + Integer.toHexString(lCommand);
        //lCommand是传的报警类型
        switch (lCommand) {
            case HCNetSDK.COMM_ALARMHOST_CID_ALARM:
                HCNetSDK.NET_DVR_CID_ALARM netDvrCidAlarm = new HCNetSDK.NET_DVR_CID_ALARM();
                netDvrCidAlarm.write();
                Pointer pointer = netDvrCidAlarm.getPointer();
                pointer.write(0, pAlarmInfo.getByteArray(0, netDvrCidAlarm.size()), 0, netDvrCidAlarm.size());
                netDvrCidAlarm.read();
                String sCIDDescribe = new String(netDvrCidAlarm.sCIDDescribe, "gbk");
                //去掉空格,否则无法入库
                String trim = sCIDDescribe.trim();
                String sCIDCode = new String(netDvrCidAlarm.sCIDCode);
                if (!AlarmHk.excludeCodeList.contains(sCIDCode)) {
                    System.out.println("CID事件号:" + sCIDCode);
                    System.out.println("CID事件名:" + sCIDDescribe);
                    System.out.println("报告类型:" + netDvrCidAlarm.byReportType);
                    System.out.println("子系统号:" + netDvrCidAlarm.bySubSysNo);
                    System.out.println("防区号:" + (netDvrCidAlarm.wDefenceNo + 1));                    
                }
                break;
            default:
                break;
        }
    }
}

HCNetSDK.java文件

海康demo里自带的有一些接口没有,需要咨询客服,这里是针对本次设备的完成文件
文件下载链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值