SpringBoot集成海康设备网络SDK

本文详细介绍了如何在SpringBoot项目中集成海康设备网络SDK,包括SDK的功能介绍、下载链接、对接指南,以及集成步骤,如初始化项目、初始化SDK、调用业务接口和部署过程。在集成过程中,通过JNA框架调用动态链接库,实现与设备的交互,同时提供了在Windows和Linux环境下部署的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SDK介绍

概述

设备网络SDK是基于设备私有网络通信协议开发的,为嵌入式网络硬盘录像机、NVR、网络摄像机、网络球机、视频服务器、解码器、报警主机、网络存储等产品服务的配套模块,用于远程访问和控制设备软件的二次开发。

功能

图像预览, 文件回放和下载, 云台控制, 布防/撤防, 语音对讲, 日志管理, 解码卡, 远程升级, 远程重启/关闭, 格式化硬盘, 参数配置(系统配置, 通道配置, 串口配置, 报警配置, 用户配置), 多路解码器, 智能设备功能和获取设备能力集等。

下载

https://open.hikvision.com/download/5cda567cf47ae80dd41a54b3?type=10
1678439082400.png

对接指南

以java为例

由于我司提供的设备网络SDK是封装的动态链接库(Windows的dll或者Linux的so),各种开发语言对接SDK,都是通过加载动态库链接,调用动态库中的接口实现功能模块对接,因此,设备网络SDK的对接不区分开发语言,而且对接的流程和对应的接口都是通用的,各种语言调用动态库的方式有所不同。本文重点介绍java开发语言如何对接设备网络SDK。目前我司提供的java语言开发的demo是通过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++的过程大致如下:

1678439136114.png

集成

SpringBoot 项目为例,海康SDK版本为6.1.9.47,JNA版本为3.0.9,在windows环境使用Intellij IDEA 2022.2.3开发

初始化项目

  • 新建 SpringBoot 项目,版本 2.5.3
  • 添加pom依赖:jna,fastjson2

<dependency>
        <groupId>com.sun.jna</groupId>
        <artifactId>jna</artifactId>
        <version>3.0.9</version>
</dependency>


<dependency>
        <groupId>com.alibaba.fastjson2</groupId>
        <artifactId>fastjson2</artifactId>
        <version>2.0.20</version>
</dependency>          


  • 将下载下来的海康sdk放到项目目录,并根据操作系统不同分别创建相应的文件夹
  • 若出现 HCNetSDK.NET_DVR_PREVIEWINFO.HWND找不到引用,可做如下处理:1:在ProjectStructure中引入官方示例代码中的 examples.jar ;2:将 HWND 类型修改为 int

1678772887942.png

  • 设置一个喜欢的端口 server.port

初始化SDK

初始化SDK概述

一般的,我们希望在程序启动的时候就初始化sdk。

  • 这里使用了 ApplicationRunner 作为初始化入口,当程序启动成功后,将执行 Runner 做初始化
  • 为避免初始化sdk对主线程造成影响,所以 ApplicationRunner 需要放在线程池中 ThreadPoolExecutor,并添加try-catch处理
  • HCNetSDK是SDK示例代码中提供的一个对象,此对象继承Library,负责和更底层的C/C++库(更底层也许是C写的,这里不确定)交互,即执行 Native 调用。通过实例化此对象完成sdk依赖库的导入,并在后续业务开发中使用此对象向摄像机发布指令。
  • 涉及多操作系统平台的差异性,官方分别提供不同sdk依赖库,具体包含:win32,win64,linux32,linux64等,所以当初始化SDK的时候需要根据当前所处环境不同分别加载不同的依赖库文件
  • 上述提到的依赖库文件,在windows下就是 dll 后缀文件 , 在 linux 下就是 so 后缀文件
  • 真正执行初始化就是调用 hCNetSDK.NET_DVR_Init() 此方法,并可通过返回值为 truefalse 判断初始化是否成功。
新建AppRunner
  • AppRunner 需要实现 ApplicationRunner 接口,并将
    AppRunner作为组件放到Spring 容器中管理
  • AppRunner 中注入SdkInitService ,并在run 方法中调用 SdkInitService 的initSdk 方法实现SDK的初始化

package com.ramble.hikvisionsdkintegration;
import com.ramble.hikvisionsdkintegration.service.SdkInitService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component
public class AppRunner  implements ApplicationRunner {
    @Autowired
    private SdkInitService hksdkInitService;
    @Override
    public void run(ApplicationArguments args) throws Exception {
        hksdkInitService.initSdk();
    }
}


新建SdkInitService
  • 定义一个公开的 hCNetSDK 属性,类型为 HCNetSDK ,并在构造函数中初始化 hCNetSDK 属性的值,此值需要全局唯一,这里参照官方代码做了单例处理。HCNetSDK 是官方提供的一个接口,一般的都是直接copy到项目源代码中,你会发现,所有和设备交互的地方都是通过这个接口来完成的
  • 内部定义一个异常回调类,用来处理和设备交互的时候全局异常的处理
  • 注入 ThreadPoolExecutor 执行器,真正的初始化将放到子线程中进行
  • 定义 initSdk 方法用来执行初始化
  • 需要注意的是,构造函数中为 hCNetSDK 属性初始化值,仅仅只是为了将 sdk 所需的依赖库文件 加载到运行时中,并没有真正的做初始化SDK的工作
  • 需要重点关注OSUtils中的代码,加载依赖库文件的前提是找到对应的库文件,的操作是在 getLoadLibrary 方法中管理的,这里编写的代码需要和部署时候选择的部署方式对应,否则可能会出现在windows中开发正常,部署到linux 中就报异常的问题

SdkInitService:


package com.ramble.hikvisionsdkintegration.service;
import com.ramble.hikvisionsdkintegration.sdklib.HCNetSDK;
import com.ramble.hikvisionsdkintegration.task.InitSdkTask;
import com.ramble.hikvisionsdkintegration.util.OSUtils;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.concurrent.ThreadPoolExecutor;

@Slf4j
@Component
public class SdkInitService {
    public static HCNetSDK hCNetSDK = null;
    static FExceptionCallBack_Imp fExceptionCallBack;
    static class FExceptionCallBack_Imp implements HCNetSDK.FException
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ramble_Naylor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值