通过海康摄像头进行车牌识别后,使用摄像头开关闸(抬杆落杆)操作。
(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;
}
}
初始化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;
}