|
|
@@ -0,0 +1,138 @@
|
|
|
+package com.longc.hkserver.haikang;
|
|
|
+
|
|
|
+import com.longc.hkserver.exception.FExceptionCallBackException;
|
|
|
+import com.longc.hkserver.utils.OsSelectUtil;
|
|
|
+import com.sun.jna.Native;
|
|
|
+import com.sun.jna.Pointer;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.context.annotation.Bean;
|
|
|
+import org.springframework.context.annotation.Configuration;
|
|
|
+
|
|
|
+import javax.annotation.PreDestroy;
|
|
|
+
|
|
|
+@Configuration
|
|
|
+@Slf4j
|
|
|
+public class HikVisionConfiguration {
|
|
|
+
|
|
|
+ static HCNetSDK hCNetSDK = null;
|
|
|
+ static PlayCtrl playControl = null;
|
|
|
+ static FExceptionCallBackException fExceptionCallBack;
|
|
|
+ static FMSGCallBack_V31 fMSFCallBack_V31 = null;
|
|
|
+
|
|
|
+ @Value("${video.monitor.load.window}")
|
|
|
+ private String windowPath;
|
|
|
+ @Value("${video.monitor.load.linux}")
|
|
|
+ private String linuxPath;
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 播放库加载
|
|
|
+ */
|
|
|
+// @Bean
|
|
|
+ public PlayCtrl createPlayInstance() {
|
|
|
+ synchronized (PlayCtrl.class) {
|
|
|
+ String strPlayPath = "";
|
|
|
+ try {
|
|
|
+ if (OsSelectUtil.isWindows()) {
|
|
|
+ //win系统加载库路径
|
|
|
+ strPlayPath = windowPath + "\\lib\\PlayCtrl.dll";
|
|
|
+ } else if (OsSelectUtil.isLinux()) {
|
|
|
+ //Linux系统加载库路径
|
|
|
+ strPlayPath = linuxPath + "/lib/libPlayCtrl.so";
|
|
|
+ }
|
|
|
+ playControl = (PlayCtrl) Native.loadLibrary(strPlayPath, PlayCtrl.class);
|
|
|
+ } catch (Exception ex) {
|
|
|
+ log.error("加载失败,loadLibrary: {}", strPlayPath);
|
|
|
+ log.error(ex.getMessage(), ex);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.info("加载PlayCtrl成功");
|
|
|
+ return playControl;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 动态库加载
|
|
|
+ */
|
|
|
+// @Bean
|
|
|
+ public HCNetSDK init() {
|
|
|
+ if (hCNetSDK == null) {
|
|
|
+ synchronized (HCNetSDK.class) {
|
|
|
+ String strDllPath = "";
|
|
|
+ try {
|
|
|
+ //win系统加载库路径
|
|
|
+ if (OsSelectUtil.isWindows()) {
|
|
|
+ strDllPath = windowPath + "\\lib\\HCNetSDK.dll";
|
|
|
+ }
|
|
|
+ //linux系统建议调用以下接口加载组件库
|
|
|
+ else if (OsSelectUtil.isLinux()) {
|
|
|
+ strDllPath = linuxPath + "/lib/libhcnetsdk.so";
|
|
|
+ }
|
|
|
+ hCNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class);
|
|
|
+ //linux系统建议调用以下接口加载组件库
|
|
|
+ if (OsSelectUtil.isLinux()) {
|
|
|
+ HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256);
|
|
|
+ HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256);
|
|
|
+ //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限
|
|
|
+ String strPath1 = linuxPath + "/lib/libcrypto.so.1.1";
|
|
|
+ String strPath2 = linuxPath + "/lib/libssl.so.1.1";
|
|
|
+ log.info("strpaht1:{}",strPath1);
|
|
|
+ log.info("strpaht2:{}",strPath2);
|
|
|
+ System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length());
|
|
|
+ ptrByteArray1.write();
|
|
|
+ hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_LIBEAY_PATH, ptrByteArray1.getPointer());
|
|
|
+ System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length());
|
|
|
+ ptrByteArray2.write();
|
|
|
+ hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_SSLEAY_PATH, ptrByteArray2.getPointer());
|
|
|
+ String strPathCom = linuxPath + "/lib/";
|
|
|
+ HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
|
|
|
+ System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
|
|
|
+ struComPath.write();
|
|
|
+ hCNetSDK.NET_DVR_SetSDKInitCfg(HCNetSDK.NET_SDK_INIT_CFG_SDK_PATH, struComPath.getPointer());
|
|
|
+ }
|
|
|
+ } catch (Exception ex) {
|
|
|
+ log.error("加载失败,loadLibrary: {}" ,strDllPath);
|
|
|
+ log.error(ex.getMessage(), ex);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //SDK初始化,一个程序只需要调用一次
|
|
|
+ hCNetSDK.NET_DVR_Init();
|
|
|
+
|
|
|
+ //异常消息回调
|
|
|
+ if (fExceptionCallBack == null) {
|
|
|
+ fExceptionCallBack = new FExceptionCallBackException();
|
|
|
+ }
|
|
|
+ Pointer pUser = null;
|
|
|
+ if (!hCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, 0, fExceptionCallBack, pUser)) {
|
|
|
+ log.error("设置异常消息回调失败");
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ //设置回调函数,用于在设备接收到数据时触发回调函数进行数据处理
|
|
|
+ if (fMSFCallBack_V31 == null) {
|
|
|
+ fMSFCallBack_V31 = new FMSGCallBack_V31();
|
|
|
+ if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUser)) {
|
|
|
+ log.error("设置回调函数失败!");
|
|
|
+ return null;
|
|
|
+ } else {
|
|
|
+ log.info("设置回调函数成功");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //启动SDK写日志
|
|
|
+ hCNetSDK.NET_DVR_SetLogToFile(3, "./sdkLog", false);
|
|
|
+ log.info("加载hksdk成功");
|
|
|
+ return hCNetSDK;
|
|
|
+ }
|
|
|
+
|
|
|
+ @PreDestroy
|
|
|
+ public void destroy() {
|
|
|
+ if (null != hCNetSDK) {
|
|
|
+ log.info("释放hcNetSDK资源");
|
|
|
+ hCNetSDK.NET_DVR_Cleanup();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|