JAVA 对 海康SDK二次开发
前言
由于项目要求需要使用海康闸机 。导入java demo并按知道添加动态库运行,靠报错 无法加载动态库Exception in thread “main” java.lang.UnsatisfiedLinkError: Unable to load library ‘PlayCtrl’: ÕҲ»µ½ָ¶¨当然 sdk也报错Exception in thread “main” java.lang.UnsatisfiedLinkError: Unable to load library 'HCNetSDK: ÕҲ»µ½ָ¶然后按官网的方法各种尝试,还好最后搞定了。差点崩溃的是数据解析
一、初始化
示例:
@Configuration
public class HCNetSDKConfiguration {
@Value("${turn.Path}")
String Path;//yml文件中配置引用的lib绝对路径
/**
* @Author: fant
* @Description: 创建HCNetSDK类的实例,HCNetSDK类与HCNetSDK.dll文件结构体相对应,加载c++函数库
* @Date: 2020/7/29 15:19
**/
@Bean
public HCNetSDK hcNetSDK() {
HCNetSDK hcNetSDK = (HCNetSDK) Native.loadLibrary(Path + "HCNetSDK", HCNetSDK.class);
if (hcNetSDK.NET_DVR_Init()) {// 初始化sdk
System.out.println("sdk初始化成功");
} else {
throw new RuntimeException("sdk初始化失败");
}
return hcNetSDK;
}
}
二、数据解析
1.数据解析
代码如下(示例):
public void invoke(NativeLong lCommand, NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
String sAlarmType = null;
switch (lCommand.intValue()) {
/**
* 这里根据SDK获取
*/
case HCNetSDK.COMM_ALARM_ACS:// 闸机红外扫描获取二维码信息,自定义上传消息类型
String[] sIP = new String[2];
try {
// 处理自己的业务
// 报警消息是字节流,需自己处理 NET_DVR_ACS_ALARM_INFO
HCNetSDK.NET_DVR_ACS_ALARM_INFO strACSInfo = new HCNetSDK.NET_DVR_ACS_ALARM_INFO();
strACSInfo.write();
Pointer pACSInfo = strACSInfo.getPointer();
pACSInfo.write(0, pAlarmInfo.getByteArray(0, strACSInfo.size()), 0, strACSInfo.size());
strACSInfo.read();
sAlarmType = "门禁主机报警信息:卡号:" + new String(strACSInfo.struAcsEventInfo.byCardNo).trim() + ",卡类型:"
+ strACSInfo.struAcsEventInfo.byCardType + ",报警主类型:" + strACSInfo.dwMajor + ",报警次类型:"
+ strACSInfo.dwMinor;
System.out.println(sAlarmType);
// 报警设备IP地址
sIP = new String(pAlarmer.sDeviceIP).split("\0", 2);
String ip = sIP[0].toString();
System.out.println(ip);
// 门禁红外扫描二维码信息
String cardNo = new String(strACSInfo.struAcsEventInfo.byCardNo).trim();
// 红外扫描器编号,门1:进;门2:出
controlDoor(turn.getUserId().intValue(),1,1);
} catch (Exception e) {
e.printStackTrace();
}
break;
}
System.out.println("报警信息结束");
System.out.println("告警类型" + sAlarmType);
System.out.println("ip:" + new String(pAlarmer.sDeviceIP));
System.out.println("用户凭证:" + pAlarmer.lUserID);
}
2.门闸控制
代码如下(示例):
public boolean controlDoor(int lUserID, int lGatewayIndex, int dwStaic){
boolean flag = hcNetSDK.NET_DVR_ControlGateway(lUserID,lGatewayIndex,dwStaic);
System.out.println("门禁控制:"+flag);
return flag;
}
总结
一次总结,小小的记录一下,源码地址.