SDK介绍

概述

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

功能

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

下载

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

对接指南

以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++的过程大致如下:

集成

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

初始化项目

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

  1. <dependency>
  2.         <groupId>com.sun.jna</groupId>
  3.         <artifactId>jna</artifactId>
  4.         <version>3.0.9</version>
  5. </dependency>
  6. <dependency>
  7.         <groupId>com.alibaba.fastjson2</groupId>
  8.         <artifactId>fastjson2</artifactId>
  9.         <version>2.0.20</version>
  10. </dependency>          
  • 将下载下来的海康sdk放到项目目录,并根据操作系统不同分别创建相应的文件夹
  • 若出现 HCNetSDK.NET_DVR_PREVIEWINFO.HWND找不到引用,可做如下处理:1:在ProjectStructure中引入官方示例代码中的 examples.jar ;2:将 HWND 类型修改为 int

  • 设置一个喜欢的端口 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的初始化

  1. package com.ramble.hikvisionsdkintegration;
  2. import com.ramble.hikvisionsdkintegration.service.SdkInitService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.boot.ApplicationArguments;
  5. import org.springframework.boot.ApplicationRunner;
  6. import org.springframework.stereotype.Component;
  7. @Component
  8. public class AppRunner  implements ApplicationRunner {
  9.     @Autowired
  10.     private SdkInitService hksdkInitService;
  11.     @Override
  12.     public void run(ApplicationArguments args) throws Exception {
  13.         hksdkInitService.initSdk();
  14.     }
  15. }

新建SdkInitService

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

SdkInitService:


  1. package com.ramble.hikvisionsdkintegration.service;
  2. import com.ramble.hikvisionsdkintegration.sdklib.HCNetSDK;
  3. import com.ramble.hikvisionsdkintegration.task.InitSdkTask;
  4. import com.ramble.hikvisionsdkintegration.util.OSUtils;
  5. import com.sun.jna.Native;
  6. import com.sun.jna.Pointer;
  7. import lombok.extern.slf4j.Slf4j;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.stereotype.Component;
  10. import java.util.concurrent.ThreadPoolExecutor;
  11. @Slf4j
  12. @Component
  13. public class SdkInitService {
  14.     public static HCNetSDK hCNetSDK = null;
  15.     static FExceptionCallBack_Imp fExceptionCallBack;
  16.     static class FExceptionCallBack_Imp implements HCNetSDK.FExceptionCallBack {
  17.         public void invoke(int dwType, int lUserID, int lHandle, Pointer pUser) {
  18.             System.out.println("异常事件类型:" + dwType);
  19.             return;
  20.         }
  21.     }
  22.     public SdkInitService() {
  23.         if (hCNetSDK == null) {
  24.             synchronized (HCNetSDK.class) {
  25.                 try {
  26.                     hCNetSDK = (HCNetSDK) Native.loadLibrary(OSUtils.getLoadLibrary(), HCNetSDK.class);
  27.                 } catch (Exception ex) {
  28.                     log.error("SdkInitService-init-hCNetSDK-error");
  29.                 }
  30.             }
  31.         }
  32.     }
  33.     @Autowired
  34.     private ThreadPoolExecutor executor;
  35.     public void initSdk() {
  36.         log.info("HKSDKInitService-init-coming");
  37.         executor.execute(new InitSdkTask());
  38.     }
  39. }

OSUtils:


  1. package com.ramble.hikvisionsdkintegration.util;
  2. import com.sun.jna.Platform;
  3. import lombok.extern.slf4j.Slf4j;
  4. import java.io.File;
  5. @Slf4j
  6. public class OSUtils {
  7.     // 获取操作平台信息
  8.     public static String getOsPrefix() {
  9.         String arch = System.getProperty("os.arch").toLowerCase();
  10.         final String name = System.getProperty("os.name");
  11.         String osPrefix;
  12.         if (Platform.isWindows()) {
  13.             if ("i386".equals(arch)) {
  14.                 arch = "x86";
  15.             }
  16.             osPrefix = "win32-" + arch;
  17.         } else if (Platform.isLinux()) {
  18.             if ("x86".equals(arch)) {
  19.                 arch = "i386";
  20.             } else if ("x86_64".equals(arch)) {
  21.                 arch = "amd64";
  22.             }
  23.             osPrefix = "linux-" + arch;
  24.         } else {
  25.             osPrefix = name.toLowerCase();
  26.             if ("x86".equals(arch)) {
  27.                 arch = "i386";
  28.             }
  29.             if ("x86_64".equals(arch)) {
  30.                 arch = "amd64";
  31.             }
  32.             int space = osPrefix.indexOf(" ");
  33.             if (space != -1) {
  34.                 osPrefix = osPrefix.substring(0, space);
  35.             }
  36.             osPrefix += "-" + arch;
  37.         }
  38.         return osPrefix;
  39.     }
  40.     public static String getOsName() {
  41.         String osName = "";
  42.         String osPrefix = getOsPrefix();
  43.         if (osPrefix.toLowerCase().startsWith("win32-x86")
  44.                 || osPrefix.toLowerCase().startsWith("win32-amd64")) {
  45.             osName = "win";
  46.         } else if (osPrefix.toLowerCase().startsWith("linux-i386")
  47.                 || osPrefix.toLowerCase().startsWith("linux-amd64")) {
  48.             osName = "linux";
  49.         }
  50.         return osName;
  51.     }
  52.     /**
  53.      * 获取库文件
  54.      * 区分win、linux
  55.      *
  56.      * @return
  57.      */
  58.     public static String getLoadLibrary() {
  59.         if (isChecking()) {
  60.             return null;
  61.         }
  62.         String userDir = System.getProperty("user.dir");
  63.         log.info("getLoadLibrary-userDir={}", userDir);
  64.         String loadLibrary = "";
  65.         String library = "";
  66.         String osPrefix = getOsPrefix();
  67.         if (osPrefix.toLowerCase().startsWith("win32-x86")) {
  68.             loadLibrary = System.getProperty("user.dir") + File.separator + "sdk" + File.separator + "hklibwin32" + File.separator;
  69.             library = "HCNetSDK.dll";
  70.         } else if (osPrefix.toLowerCase().startsWith("win32-amd64")) {
  71.             loadLibrary = System.getProperty("user.dir") + File.separator + "sdk" + File.separator + "hklibwin64" + File.separator;
  72.             library = "HCNetSDK.dll";
  73.         } else if (osPrefix.toLowerCase().startsWith("linux-i386")) {
  74.             //同 linux-amd64
  75.             loadLibrary = "";
  76.             library = "libhcnetsdk.so";
  77.         } else if (osPrefix.toLowerCase().startsWith("linux-amd64")) {
  78.             //方式一:使用系统默认的加载库路径,在系统的/usr/lib文件中加入你Java工程所需要使用的so文件,然后将HCNetSDKCom文件夹下的组件库也复制到/usr/lib目录,HCNetSDKCom文件夹中的组件库不要随意更换路径。CentOS 64位需拷贝到/usr/lib64下。
  79.             //针对方式一,前缀就是绝对路径
  80.             //loadLibrary = "/usr/lib64/lib/hkliblinux64/";
  81.             //方式二:配置LD_LIBRARY_PATH环境变量加载库文件;配置/etc/ld.so.conf,加上你自己的Java工程所需要的so文件的路径
  82.             //针对方式二,无需添加前缀,程序会从linux系统的so共享库中查找libhcnetsdk.so
  83.             loadLibrary = "";
  84.             library = "libhcnetsdk.so";
  85.         }
  86.         log.info("================= Load library Path :{} ==================", loadLibrary + library);
  87.         return loadLibrary + library;
  88.     }
  89.     private static boolean checking = false;
  90.     public static void setChecking() {
  91.         checking = true;
  92.     }
  93.     public static void clearChecking() {
  94.         checking = false;
  95.     }
  96.     public static boolean isChecking() {
  97.         return checking;
  98.     }
  99. }

新建InitSdkTask

  • 此类实现 Runnable 接口,并重写run方法。
  • 新建一个私有属性 hCNetSDK 并赋值为 SdkInitService.hCNetSDK ,因为初始化需要用到 HCNetSDK 这个对象和设备交互,所以初始化前必须确保此对象已经创建,本例中,程序在执行 SdkInitService 构造函数的时候初始化了 HCNetSDK 对象,并放到一个全局静态变量中
  • 其实也可以不新建私有属性 hCNetSDK ,在需要用到此对象的地方 使用 SdkInitService.hCNetSDK 的方式获取也可以
  • 通过调用  hCNetSDK.NET_DVR_Init 方法执行初始化,并可以通过返回值确定是否初始化成功,初始化成功后,将可以调用业务接口向设备发送指令。
  • NET_DVR_SetConnectTime,NET_DVR_SetReconnect 是可选的,并不会对初始化SDK本身造成影响。
  • 为了避免对主程序造成影响,初始化代码将需要做 try - catch 处理

InitSdkTask:


  1. package com.ramble.hikvisionsdkintegration.task;
  2. import com.ramble.hikvisionsdkintegration.sdklib.HCNetSDK;
  3. import com.ramble.hikvisionsdkintegration.service.SdkInitService;
  4. import com.ramble.hikvisionsdkintegration.util.OSUtils;
  5. import lombok.extern.slf4j.Slf4j;
  6. import java.util.Objects;
  7. @Slf4j
  8. public class InitSdkTask implements Runnable {
  9.     /**
  10.      * 装配 sdk 所需依赖
  11.      */
  12.     private static HCNetSDK hCNetSDK = SdkInitService.hCNetSDK;
  13.     @Override
  14.     public void run() {
  15.         try {
  16.             if (Objects.equals(OSUtils.getOsName(), "linux")) {
  17.                 log.info("InitSdk-is-linux");
  18.                 String userDir = System.getProperty("user.dir");
  19.                 log.info("InitSdk-userDir={}", userDir);
  20.                 String osPrefix = OSUtils.getOsPrefix();
  21.                 if (osPrefix.toLowerCase().startsWith("linux-i386")) {
  22.                     HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256);
  23.                     HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256);
  24.                     //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限
  25.                     //linux 下, 库加载参考:OSUtils.getLoadLibrary()
  26.                     String strPath1 = System.getProperty("user.dir") + "/hkliblinux32/libcrypto.so.1.1";
  27.                     String strPath2 = System.getProperty("user.dir") + "/hkliblinux32/libssl.so.1.1";
  28.                     System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length());
  29.                     ptrByteArray1.write();
  30.                     hCNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArray1.getPointer());
  31.                     System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length());
  32.                     ptrByteArray2.write();
  33.                     hCNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArray2.getPointer());
  34.                     //linux 下, 库加载参考:OSUtils.getLoadLibrary()
  35.                     String strPathCom = System.getProperty("user.dir") + "/hkliblinux32/HCNetSDKCom/";
  36.                     HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
  37.                     System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
  38.                     struComPath.write();
  39.                     hCNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());
  40.                 } else if (osPrefix.toLowerCase().startsWith("linux-amd64")) {
  41.                     HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256);
  42.                     HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256);
  43.                     //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限
  44.                     //linux 下, 库加载参考:OSUtils.getLoadLibrary()
  45.                     String strPath1 = System.getProperty("user.dir") + "/hkliblinux64/libcrypto.so.1.1";
  46.                     String strPath2 = System.getProperty("user.dir") + "/hkliblinux64/libssl.so.1.1";
  47.                     System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length());
  48.                     ptrByteArray1.write();
  49.                     hCNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArray1.getPointer());
  50.                     System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length());
  51.                     ptrByteArray2.write();
  52.                     hCNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArray2.getPointer());
  53.                     String strPathCom = System.getProperty("user.dir") + "/hkliblinux64/HCNetSDKCom/";
  54.                     //linux 下, 库加载参考:OSUtils.getLoadLibrary()
  55.                     HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
  56.                     System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
  57.                     struComPath.write();
  58.                     hCNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());
  59.                 } else {
  60.                     log.info("osPrefix={}", osPrefix);
  61.                 }
  62.             }
  63.             //初始化sdk
  64.             boolean isOk = hCNetSDK.NET_DVR_Init();
  65.             hCNetSDK.NET_DVR_SetConnectTime(10, 1);
  66.             hCNetSDK.NET_DVR_SetReconnect(100, true);
  67.             if (!isOk) {
  68.                 log.error("=================== InitSDK init fail ===================");
  69.             } else {
  70.                 log.info("============== InitSDK init success ====================");
  71.             }
  72.         } catch (Exception e) {
  73.             log.error("InitSDK-error,e={}", e.getMessage());
  74.             e.printStackTrace();
  75.         }
  76.     }
  77. }

新建 HCNetSDK

直接从官方示例代码中copy过来即可

调用业务接口

  • 新建一个controller ,尝试调用 获取SDK状态 的接口。
  • 调用所有的业务接口之前都需要先登录

  1. package com.ramble.hikvisionsdkintegration.controller;
  2. import com.alibaba.fastjson2.JSON;
  3. import com.ramble.hikvisionsdkintegration.dto.GlobalResponseEntity;
  4. import com.ramble.hikvisionsdkintegration.sdklib.HCNetSDK;
  5. import com.ramble.hikvisionsdkintegration.service.SdkInitService;
  6. import com.sun.jna.Memory;
  7. import com.sun.jna.Pointer;
  8. import com.sun.jna.ptr.IntByReference;
  9. import lombok.AllArgsConstructor;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.springframework.web.bind.annotation.GetMapping;
  12. import org.springframework.web.bind.annotation.RequestMapping;
  13. import org.springframework.web.bind.annotation.RestController;
  14. @Slf4j
  15. @AllArgsConstructor
  16. @RestController
  17. @RequestMapping("/test")
  18. public class TestController {
  19.     private static String m_sDeviceIP = "192.168.1.142";
  20.     private static String m_sUsername = "xxx";
  21.     private static String m_sPassword = "xxx";
  22.     /**
  23.      * 获取sdk状态
  24.      *
  25.      * @return {@link GlobalResponseEntity}<{@link String}>
  26.      * 返回值举例:{"success":true,"code":"000000","message":"request successfully",
  27.      * "data":"{\"dwRes\":[0,0,0,0,0,0,0,0,0,0],\"dwTotalAlarmChanNum\":0,\"dwTotalBroadCastNum\":0,\"dwTotalFileSearchNum\":0,\"dwTotalFormatNum\":0,
  28.      * \"dwTotalLogSearchNum\":0,\"dwTotalLoginNum\":1,\"dwTotalPlayBackNum\":0,\"dwTotalRealPlayNum\":0,\"dwTotalSerialNum\":0,\"dwTotalUpgradeNum\":0,
  29.      * \"dwTotalVoiceComNum\":0,\"autoRead\":true,\"autoWrite\":true,\"pointer\":{\"size\":84,\"valid\":true}}"}
  30.      */
  31.     @GetMapping("/state")
  32.     public GlobalResponseEntity<String> getSdkState() {
  33.         //登录
  34.         Integer userId = login();
  35.         log.info("userId={}", userId);
  36.         HCNetSDK.NET_DVR_SDKSTATE sdkState = new HCNetSDK.NET_DVR_SDKSTATE();
  37.         //获取当前SDK状态信息
  38.         boolean result = SdkInitService.hCNetSDK.NET_DVR_GetSDKState(sdkState);
  39.         if (result) {
  40.             sdkState.read();
  41.             String s = JSON.toJSONString(sdkState);
  42.             return GlobalResponseEntity.success(s);
  43.         } else {
  44.             int error = SdkInitService.hCNetSDK.NET_DVR_GetLastError();
  45.             return GlobalResponseEntity.error("获取失败,错误码为:" + error);
  46.         }
  47.     }
  48.     private Integer login() {
  49.         HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();//设备登录信息
  50.         m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
  51.         System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());
  52.         m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
  53.         System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());
  54.         m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
  55.         System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());
  56.         m_strLoginInfo.wPort = Short.valueOf("8000");
  57.         m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是
  58.         m_strLoginInfo.write();
  59.         HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();//设备信息
  60.         int loginHandler = SdkInitService.hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
  61.         if (loginHandler == -1) {
  62.             int errorCode = SdkInitService.hCNetSDK.NET_DVR_GetLastError();
  63.             IntByReference errorInt = new IntByReference(errorCode);
  64.             log.error("[HK] login fail errorCode:{}, errMsg:{}", errorCode, SdkInitService.hCNetSDK.NET_DVR_GetErrorMsg(errorInt));
  65.             return null;
  66.         } else {
  67.             return loginHandler;
  68.         }
  69.     }
  70. }

部署

拷贝so库文件到部署目录

所有厂家的所有版本sdk库文件均维护在项目源代码中,需要将linux库文件so文件拷贝到部署根目录,和jar文件同级

追加环境变量

通过配置 LD_LIBRARY_PATH 环境变量加载库文件,打开系统的 /etc/profile 配置文件,在最后追加so库文件所在目录:


  1. export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/app/jars/hkliblinux64:/home/app/jars/hkliblinux64/HCNetSDKCom

如上所示:

● 32位就追加  hkliblinux32 目录,64位就追加 hkliblinux64 目录

● 不要忘记 HCNetSDKCom 目录也需要配置,因为里面也有so库文件。

执行source 命令,让配置生效:


  1. source   /etc/profile

追加so库加载路径

打开 /etc/ld.so.conf 配置文件,追加so库文件所在目录


  1. /home/app/jars/hkliblinux64
  2. /home/app/jars/hkliblinux64/HCNetSDKCom

如上所示:

● 32位就追加  hkliblinux32 目录,64位就追加 hkliblinux64 目录。

● 不要忘记 HCNetSDKCom 目录也需要配置,因为里面也有so库文件。

执行 ldconfig 命令,让配置生效:


  1. ldconfig

验证SDK初始化是否成功

一般来说,可以在程序初始化SDK的时候添加日志,通过日志输出判断是否初始化成功。

代码

https://gitee.com/naylor_personal/ramble-spring-boot/tree/master/hikvision-sdk-integration

SpringBoot集成海康网络设备SDK的更多相关文章

  1. 海康JAVA SDK库动态路径加载

    海康JAVA SDK初始化路径默认是放在classes下面,见下: HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("HCNetSDK&q ...

  2. 在Qt中配置海康工业相机SDK及遇到的问题(报错)

    1.在项目的.pro文件里导入海康工业相机的SDK路径 INCLUDEPATH += \ D:\HKVersion\MVS_3.1.0\MVS\Development\Includes #这时到入Op ...

  3. 海康相机SDK二次开发只有视频无声音问题

    海康SDK相信做企业开发的的同仁,在项目中经常会用到,毕竟使用范围这么广. 本次就开发遇到的奇葩问题来说明一下我们的解决方案. 场景 虽然海康有4200客户端,但是对于高度定制化的项目,肯定不能再使用 ...

  4. 配置海康相机SDK文件

    前言 项目使用到海康摄像机,进行二次开发需要首先对SDK文件进行相关配置. 实现过程 1.下载SDK开发包: 网址:http://www.hikvision.com/cn/download_61.ht ...

  5. 海康SDK编程指南(C#二次开发版本)

    海康SDK编程指南 目前使用的海康SDK包括IPC_SDK(硬件设备),Plat_SDK(平台),其中两套SDK都需单独调用海康播放库PlayCtrl.dll来解码视频流,返回视频信息和角度信息.本文 ...

  6. 海康SDK编程指南

    转至心澄欲遣 目前使用的海康SDK包括IPC_SDK(硬件设备),Plat_SDK(平台),其中两套SDK都需单独调用海康播放库PlayCtrl.dll来解码视频流,返回视频信息和角度信息.本文仅对视 ...

  7. EasyRTMP结合海康HCNetSDK获取海康摄像机H.264实时流并转化成为RTMP直播推流(附源码)

    最近一家深耕于南方电网的科技公司同事找到我们,咨询关于调用海康HCNetSDK取流,并进行互联网转化的方案,经过反复的沟通以及自身在EasyDSS和EasyNVR方面的经验,我们推荐了海康HCNetS ...

  8. 通过ISAPI http协议控制海康摄像头

    一直用海康的SDK进行摄像头控制,但有时候非常不灵活,必须有X86的主机,在嵌入式上面就不行,通过写一个HTTPCLIENT可以通过ISAPI来控制海康的摄像头. 代码如下:git@github.co ...

  9. 封装海康SDK出现无法加载 DLL“..\bin\HCNetSDK.dll”: 找不到指定的模块

    今天在封装海康设备的时候出现了这么一个问题,在初始化的时候提升无法加载 DLL“..\bin\HCNetSDK.dll”: 找不到指定的模块. 在网上查找了几个方法,并不是很靠谱,于是从源头找找,是什 ...

  10. 海康抓拍机SDK开发

    前言 项目采购的海康威视的抓拍机,需要首先获取抓拍图片,之后基于抓拍图片进行图像处理.本文基于海康SDK开发文档,按照开发步骤,咨询海康技术人员,现将开发过程记录如下. 主要过程的c++代码: /** ...

随机推荐

  1. not eligible for getting processed by all BeanPostProcessors

    描述 这个BUG大的起源是我上线以后,在后台看日志的时候发现一行奇怪的INFO日志: 2022-06-09 23:34:24 [restartedMain] [org.springframework. ...

  2. 汇编debug工具Dosbox使用

    汇编debug工具DOSBOX使用说明 首先新建文件,更改后缀名为asm,然后写入一段汇编程序 之后打开DosBox    输入masm + 文件名(加不加文件名后缀都可以)但如果要加的话,应该加上. ...

  3. Python 删除文件及文件夹

    2种方式: [不删除给定的目录] path1 = "D:\\dev\\workspace\\python\\pytestDemo\\222" def del_filedir(pat ...

  4. openSUSE Tumbleweed 安装原生微信

    优麒麟网站上有![微信原生版](https://www.ubuntukylin.com/applications/106-cn.html)提供下载. 之前用 Ubuntu的时候,直接安装就可以使用. ...

  5. python 创建虚拟环境python –m venv方式

    1.环境准备 1.1.刷新包清单 sudo yum update 1.2.安装SCL实用程序 sudo yum install centos-release-scl 1.3.安装Python 3.6 ...

  6. Linux下查看全部的环境变量

    在Windows下,查看环境变量的命令是:set,这个命令会输出系统当前的环境变量. ... Linux查看环境变量使用env命令显示所有的环境变量 $ env

  7. 生成Funnel漏斗图

    -----------第一步----------- import jsonlist_p = [{"action":"浏览商品","PV":5 ...

  8. 高德地图使用websocket后重新设置点进行优化

    // 设置第一次点赋值,重新定义一个新数组,将设备号为对象名,索引值作为键值 const getListNEW = useCallback( (params, reload, gps) => { ...

  9. pandas数据增删改查+拼接

    pandas数据的拼接+增删改查 def lengthways_joint(df,df1): #纵向拼接 if list(df.columns) == list(df1.columns): leb_j ...

  10. MySQL分库分表原理

    转自https://www.jianshu.com/p/7aec260ca1a2 前言 在互联网还未崛起的时代,我们的传统应用都有这样一个特点:访问量.数据量都比较小,单库单表都完全可以支撑整个业务. ...