JAVA Spring Boot与海康威视摄像头的故事
前言: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包
项目创建
- 创建Spring boot 项目(基础操作,不多赘述)。
引入SDK
- 将上述步骤下载好的官方demo中的sdk文件夹放到自己的项目中(一般都放在lib文件夹中,这个理论上放哪里都行只要配置好路径能正确找到)。这里边放置的是需要的dll动态库文件,以及jna.jar、examples.jar等所需要的jar包文件。大概如图(动态库和jar包放一块就行):
- 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接口文件
- HCNetSDK接口文件是海康摄像头的接口文件,里边存放了各种api。
正式开始
ok,到了这一步,恭喜你,基础环境配置你已经搞定,接下来就看着接口文档来做自己需要的功能吧。
实现原理
-
初始化sdk
-
设置报警回调
-
用户(设备)注册
-
注销注册
-
注销sdk使用
具体代码实现最好是自己动手,内容参考接口文档以及Demo即可。
下图以交通产品功能示例,其他功能差别不大
后续完善
后续我会继续发布学习的新内容,欢迎大家讨论交流,共同进步。
很高兴可以帮助到有需要的人。
注意事项
注意:SDK所有回调都是子线程,JNA是弱引用,建议回调函数对象写成全局静态,防止被系统回收
这个一定要注意,我就是踩了这个坑出现各种各样的问题无从排查。后经公司大佬指点迷津。