JAVA Spring Boot与海康威视摄像头的故事

发布时间 2023-04-05 14:31:47作者: 三岁6

前言:JAVA Spring Boot与海康威视摄像头的故事

这两天因工作原因,需要对海康威视摄像头进行二次开发。说实话,刚打开开发手册的那一刻,很劝退。由于之前接触硬件开发不多,对于其中的嵌入式设备SDK、DLL动态组件库的内容不甚了解。挠破了头皮,冲!

关于本贴

刚开始的时候,真的是一步一个坑,虽说网上有相关教程以及官方的DEMO和文档。但是对于我这样的新手来说这些还是需要踩很多的坑。所以我决定使用博客文章的形式,来记录一下自己的学习过程以及遇到的问题,万一除了自己还有其他人需要,避免重复踩坑。话不多说,内容开始:

干货部分

首先我这边需要做的任务内容是基于海康sdk在java Spring boot 的集成开发,暂不需要开发前台展示,所需要的也只是抓拍(车辆与人员信息等)这一部分。那么我这边就参考官方文档以及对应demo,展开描述。

官方文档以及SDK下载地址:海康威视官方SDK下载地址

进入官网,选择sdk下载:

在这里插入图片描述

下载所需要的开发包(以下教程以windows为例):

在这里插入图片描述

下载完SDK解压并打开

在这里插入图片描述

打开后,红色区域的三个文件夹是重点内容。其中:Demo文件中存放官方Demo示例,对后续开发具有参考。开发文档中存放了各种接口的API,和各种编程指南。库文件中存放了下述步骤中所需要的dll动态库以及jar包。

运行Demo

打开Demo文件夹,找到对应的Java语言。通过他的提示导入所需要的dll文件。
在这里插入图片描述
然后找到Demo文件的启动文件,运行并启动。
在这里插入图片描述

注意这边启动后,可能会出现因为jar包未引入的错误。

点击项目设置
在这里插入图片描述
在这里插入图片描述
选择要添加jar包的项目,然后点击右边的“+”按钮,找到Demo文件中lib中的jar包存放路径,选择后点击ok。
在这里插入图片描述
没看明白?没关系,看这里:idea 引入jar包

项目创建

  1. 创建Spring boot 项目(基础操作,不多赘述)。

引入SDK

  1. 将上述步骤下载好的官方demo中的sdk文件夹放到自己的项目中(一般都放在lib文件夹中,这个理论上放哪里都行只要配置好路径能正确找到)。这里边放置的是需要的dll动态库文件,以及jna.jar、examples.jar等所需要的jar包文件。大概如图(动态库和jar包放一块就行):
  2. pom文件中引入
    <!--resources文件夹配置-->
        <resources>
            <!--将lib目录编译到对应的jar的依赖目录下-->
            <resource>
                <directory>${project.basedir}/lib</directory>
                <targetPath>BOOT-INF/lib/</targetPath>
                <includes>
                    <include>**/*.jar</include>
                </includes>
            </resource>

            <!--将lib目录打包到target目录的lib文件夹下-->
            <resource>
                <directory>${project.basedir}/lib</directory>
                <targetPath>../lib</targetPath>
            </resource>

            <!--让resources资源目录下的配置文件生效-->
            <resource>
                <directory>${basedir}/src/main/resources</directory>
            </resource>
        </resources>

在这里插入图片描述

关于jar包以及SDK文件。

海康威视官方提供的设备网络SDK是封装的动态链接库(Windows的dll或者Linux的so),各种开发语言对接SDK,都是通过加载动态库链接,调用动态库中的接口实现功能模块对接。而Java与dll之间的引用并不友好,所以,需要利用上述中引入的jna.jar来辅助我们的代码操作。


通过JNA的方式调用动态链接库中的接口,JNA(Java Native Access)框架是SUN公司主导开发的开源java框架,是建立在JNI的基础上的一个框架,JNA框架提供了一组java工具类用于在运行期间动态访问动态链接库(native library:如Window的dll、Linux的so),实现在java语言中调用C/C++语言封装的接口,java开发人员只需要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射,而不需要编写任何Native/JNI代码,大大降低了Java调用动态链接库的开发难度。相比于JNI的方式,JNA大大简化了调用本地方法的过程,使用很方便,基本上不需要脱离Java环境就可以完成。JNA调用C/C++的过程大致如下:
在这里插入图片描述

引入HCNetSDK接口文件

  1. HCNetSDK接口文件是海康摄像头的接口文件,里边存放了各种api。
    在这里插入图片描述

正式开始

ok,到了这一步,恭喜你,基础环境配置你已经搞定,接下来就看着接口文档来做自己需要的功能吧。
在这里插入图片描述

实现原理

  1. 初始化sdk

在这里插入图片描述

  1. 设置报警回调

在这里插入图片描述

  1. 用户(设备)注册

在这里插入图片描述

  1. 注销注册

  2. 注销sdk使用

在这里插入图片描述

具体代码实现最好是自己动手,内容参考接口文档以及Demo即可。

下图以交通产品功能示例,其他功能差别不大
在这里插入图片描述
在这里插入图片描述

后续完善

后续我会继续发布学习的新内容,欢迎大家讨论交流,共同进步。
很高兴可以帮助到有需要的人。

注意事项

注意:SDK所有回调都是子线程,JNA是弱引用,建议回调函数对象写成全局静态,防止被系统回收
这个一定要注意,我就是踩了这个坑出现各种各样的问题无从排查。后经公司大佬指点迷津。