Java海康SDK开关闸 抬杆落杆 二次开发

项目场景:

        通过海康摄像头进行车牌识别后,使用摄像头开关闸(抬杆落杆)操作。

        Java海康SDK开关闸 抬杆落杆 二次开发_第1张图片

 

注意避坑:

(1)将官方文档的【库文件】里的HCNetSDK.dll、HCCore.dllHCNetSDKCom文件夹、libssl-1_1-x64.dll.dll、libcrypto-1_1-x64.dll.dll、hlog.dll、hpr.dll、zlib1.dll、log4cxx.properties等文件均拷贝到java.exe同级目录下(xxx/jdk/bin或者xxx/jdk/jre/bin)。

(2)把官方DEMO中的HCNetSDK.java拷贝至项目当中。

(3)加载HCNetSDK.dll(在HCNetSDK.java添加以下内容)

HCNetSDK INSTANCE = Native.load( "HCNetSDK", HCNetSDK.class);

 (4)继承Structure可能会报错,需要添加HIKSDKStructure 重写,然后将HCNetSDK.java中所有继承Structure改成继承HIKSDKStructure即可。

package com.support.sdk.hikvision;

import com.sun.jna.Structure;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;

public class HIKSDKStructure extends Structure {

    @Override
    protected List getFieldOrder(){
        List fieldOrderList = new ArrayList();
        for (Class cls = getClass();
             !cls.equals(HIKSDKStructure.class);
             cls = cls.getSuperclass()) {
            Field[] fields = cls.getDeclaredFields();
            int modifiers;
            for (Field field : fields) {
                modifiers = field.getModifiers();
                if (Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) {
                    continue;
                }
                fieldOrderList.add(field.getName());
            }
        }
        return fieldOrderList;
    }
}


总体流程

  1. 初始化SDK
  2. 用户登录
  3. 获取设备能力集(是否具备远程控制能力)
  4. 调用开关闸(抬杆/落杆)     

SDK初始化:

提示:lUserID=连接摄像头后返回的句柄数(0成功)。

/**
     * 初始化连接摄像头
     */
    private void initConn(String deviceIp, Short devicePort, String userName, String pwd) {
        // SDK未初始化
        boolean initSuc = HCNetSDK.INSTANCE.NET_DVR_Init();
        if (!initSuc) {
            log.error("SDK初始化失败");
            return;
        }

        //设置连接时间与重连时间
        HCNetSDK.INSTANCE.NET_DVR_SetConnectTime(2000, 1);
        HCNetSDK.INSTANCE.NET_DVR_SetReconnect(100000, true);

        // 设备登录信息
        HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();

        // 设备信息
        HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();

        // 设置ip、port、userName、pwd
        m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
        System.arraycopy(deviceIp.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, deviceIp.length());
        m_strLoginInfo.wPort = devicePort;
        m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
        System.arraycopy(userName.getBytes(), 0, m_strLoginInfo.sUserName, 0, userName.length());
        m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
        System.arraycopy(pwd.getBytes(), 0, m_strLoginInfo.sPassword, 0, pwd.length());


        // 是否异步登录:false- 否,true- 是
        m_strLoginInfo.bUseAsynLogin = false;
        m_strLoginInfo.write();
        lUserID = HCNetSDK.INSTANCE.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);

        if (lUserID == -1) {
            System.out.println("登录失败,错误码为" + HCNetSDK.INSTANCE.NET_DVR_GetLastError());
            HCNetSDK.INSTANCE.NET_DVR_Cleanup();
            return;
        } else {
            System.out.println("登录成功!");
            // read()后,结构体中才有对应的数据
            m_strDeviceInfo.read();
        }

    }


获取设备能力:

提示:通过连接句柄获取设备能力

能力类型 能力值 描述
IPC_FRONT_PARAMETER_V20 0x009 设备前端参数
DEVICE_ABILITY_INFO 0x011 智能交通摄像机和ITS智能终端设备能力
SNAPCAMERA_ABILITY 0x300 智能交通摄像机抓拍能力
ITC_TRIGGER_MODE_ABILITY 0x301 智能交通摄像机(V3.1及以后版本)的触发模式能力
private boolean getCameraAbility() {
        HCNetSDK.NET_DVR_STD_ABILITY ability = new HCNetSDK.NET_DVR_STD_ABILITY();
        ability.dwOutSize = ability.size();
        ability.write();
        return HCNetSDK.INSTANCE.NET_DVR_GetDeviceAbility(lUserID, 0x011, null, 0, ability.getPointer(), ability.size());
    }


开关闸(抬杆/落杆):

提示:

       lUserId:

            登录句柄号

       channel通道号

           1.可从配置文件中获取,

           2.可从获取能力集内容中获取(DEVICE_ABILITY_INFO中pOutBuf中获取

       controlType控制类型(此处只用到0/1)

            0=关闭道闸

            1=开启道闸

            2= 停止道闸

            3=锁定道闸

            4= 解锁道闸

private boolean controlGate(int lUserId, int channel, byte controlType) {
        boolean isControl = false;
        try {
            HCNetSDK.NET_DVR_BARRIERGATE_CFG cfg = new HCNetSDK.NET_DVR_BARRIERGATE_CFG();
            // 通道号
            cfg.dwChannel = channel;

            // 结构体大小
            cfg.dwSize = cfg.size();

            // 道闸号:0-表示无效值(设备需要做有效值判断),1-道闸1
            cfg.byLaneNo = 1;

            // 控制参数  0-关闭道闸,1-开启道闸,2-停止道闸,3-锁定道闸
            cfg.byBarrierGateCtrl = controlType;

            // 保留,置为0
            cfg.byRes[0] = 0;

            // 控制闸
            Pointer name = cfg.getPointer();

            cfg.write();
            isControl = HCNetSDK.INSTANCE.NET_DVR_RemoteControl(lUserId, 3128, name, cfg.size());

        } catch (Exception e) {
            log.error("控制道闸失败,控制类型=" + controlType);
        }
        return isControl;
    }

你可能感兴趣的:(二次开发,java)