提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在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;
    }
}


总结

此方式的优点在于,当在不同的环境切换时,只需要修改配置文件即可实现切换,当然,因人而异,对于有这方面需求的兄弟,希望我的这边文章能提供给你们思路,最后,感谢大家的阅读~

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐