提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
在springboot中使用海康sdk时,加载库文件时需要写死路径才能完成加载,由于想在不同的环境下进行灵活的切换,所以想通过nacos配置文件的方式获取库文件路径来进行加载,大体的思路就是在项目启动时读取配置文件的路径后生成bean对象,在需要引入的地方直接注入即可。
一、下载海康sdk
此处以windows版本为例,访问 海康开放平台,下载"设备网络SDK_Win64 V6.1.9.4_build20220412"至电脑指定目录即可。
二、依赖海康提供的jar包
1.拷贝jar包至工程目录
将海康提供的jna.jar、examples.jar拷贝至工程的resources/lib目录下,如图:
2.pom中引入依赖
tips:此方式需要在build-plugin中添加<includeSystemScope>true</includeSystemScope>
,表示maven打包时会将外部引入的jar包(比如在根目录下或resource文件下新加外部jar包)打包到项目jar,如下图所示:
三、添加海康库文件及HCNetSDK
1.拷贝库文件至工程目录
将windows下的库文件拷贝至resources/hikvision/windows目录下,如图:
2.引入HCNetSDK
tips:引入后可注释掉 HCNetSDK INSTANCE = ......
开头的代码,另外可以将extends StdCallLibrary
改成extends Library
,在windows环境下照样可以运行,需要注意的是,改成extends Library
后,接口中所定义的一些回调函数,其继承类需要由原来的extends StdCallCallback
改成 extends Callback
,否则会报错。
四、添加类库加载配置类
package com.qcc.hksdkdemo.config;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.qcc.hksdkdemo.hksdk.HCNetSDK;
import com.sun.jna.Native;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.File;
/**
* @创建人 qianchengcheng
* @创建时间 2022/4/25
* @描述
*/
@Configuration
public class HikLibConfig {
@Value("${hiklib_path}")
private String hikLibPath;
private static HCNetSDK hcNetSDK;
@Bean
public HCNetSDK initHkSDK() {
System.out.println("initHkSDK.getHklibPath=========>"+ hikLibPath);
String os = System.getProperty("os.name");
if (StringUtils.isNotEmpty(os) && os.toLowerCase().startsWith("windows")){
if ("-1".equals(hikLibPath)){
// 未配置海康库文件路径,且未打成jar包,读取工程中的库文件
String path = (HikLibConfig.class.getResource("/").getPath()).replaceAll("%20", " ").substring(1).replace("/",
"\\");
hikLibPath = path + "hikvision" + File.separator + "windows" + File.separator + "HCNetSDK.dll";
}
}
hcNetSDK = (HCNetSDK) Native.loadLibrary(hikLibPath,HCNetSDK.class);
return hcNetSDK;
}
}
tips: hiklib_path
这个值是在nacos中进行了配置,具体的路径为HCNetSDK.dll所在的路径,当然,这边加了一个逻辑,非常的简单,就是判断当前的系统是否是windows且配置值为-1时,当满足此条件时,就读取该工程resources/hikvision/windows路径下的文件,处于此设计的原因为:当其他人想在本地ide中运行你的这部分代码且他没有下载这个库文件时,就可以直接运行了。当然,hiklib_path
改成 -1的场景只适用于windows环境且想在ide中运行此代码时才可以,通过jar的方式只能通过配置库文件路径的方式来进行启动。
五、HCNetSDK的使用
当springboot启动时,会执行HikLibConfig
配置类,读取对应的配置后生成bean对象,此时,只需要使用 @Autowired
注入即可,参考代码如下:
package com.qcc.hksdkdemo.service.impl;
import com.qcc.hksdkdemo.hksdk.HCNetSDK;
import com.qcc.hksdkdemo.service.HikVisionService;
import com.sun.jna.NativeLong;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @创建人 qianchengcheng
* @创建时间 2022/4/25
* @描述
*/
@Service
public class HikVisionServiceImpl implements HikVisionService {
@Autowired
private HCNetSDK hcNetSDK;
@Override
public NativeLong login(String ip, String port, String userName, String passWord) {
// 初始化
if (!hcNetSDK.NET_DVR_Init()){
System.out.println("SDK初始化失败");
return new NativeLong(-10);
}
// 设置连接时间与重连时间
hcNetSDK.NET_DVR_SetConnectTime(2000, 1);
hcNetSDK.NET_DVR_SetReconnect(100000, true);
// 设备信息
HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
// 登录
NativeLong userIdNL = hcNetSDK.NET_DVR_Login_V30(ip,Short.valueOf(port),userName,passWord,m_strDeviceInfo);
if (userIdNL.intValue() == -1){
System.out.println("登录失败,错误号:"+hcNetSDK.NET_DVR_GetLastError());
}
return userIdNL;
}
}
总结
此方式的优点在于,当在不同的环境切换时,只需要修改配置文件即可实现切换,当然,因人而异,对于有这方面需求的兄弟,希望我的这边文章能提供给你们思路,最后,感谢大家的阅读~