基于海康威视的SDK实现二次开发
前言因为网上关于海康威视SDK这块的开发资源比较少,自己也是一步一步摸索过来,知道那种痛苦,所以把自己的一些过来人的经验写出来供大家学习参考
1.对接海康威视的SDK进入海康威视官网在这里插入图片描述
下载你所需要的SDK开发包(这里我就用windows来作为案列)在这里插入图片描述
下载完SDK解压里面有开发文档和SDK的动态库文件,有各种开发语言的Demo案列。(可以参考一下他的接口调用)
在这里插入图片描述
注:这里需要注意的是开发文档,很重要!里面有一份文档接口的API,和各种编程指南
运行Demo示例这里我使用的语言是Java,通过他的提示导入所需要的dll文件
在这里插入图片描述
在这里插入图片描述
这里可以参考一下我导入的文件
注:这两个jar包需要编译
在这里插入图片描述
注:导入成功之后如果能正确运行Demo并且能够通过海康威视的摄像头进行预览的话说明导入的文件是正确的
在这里插入图片描述
开发接口之前的环境配置现在就可以进行自己的开发节奏了。记住上面那两个jar包,和lib文件夹里面的那些文件。
创建一个springboot项目
把lib包放到springboot项目中的resources文件中
编译那两个jar包(这里建议是使用mvn的命令把jar包打入到自己的maven仓库会比较好一点)
mvm install:install-file-Dfile=你jar包的路径\examples.jar-DgroupId=com.xx.xx-DartifactId=examples-Dversion=1.0-SNAPSHOT-Dpackaging=jar123456不导入的话也可以直接编译到项目中去,或者使用maven的路径引用
<dependency><groupId>examples</groupId><artifactId>examples</artifactId><version>1.0</version><scope>system</scope><systemPath>${basedir}/src/main/resources/lib/examples.jar</systemPath></dependency><dependency><groupId>jna</groupId><artifactId>jna</artifactId><version>1.0</version><scope>system</scope><systemPath>${basedir}/src/main/resources/lib/jna.jar</systemPath></dependency>1234567891011121314加载SDK库
注:这个接口就是后面开发用到的海康威视的SDK
在这里插入图片描述
在这里添加这句代码
HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(CommonKit.getWebPath() + "HCNetSDK.dll", HCNetSDK.class);1这里我才用的是用动态获取路径的方式来加载的。
注:这里的路径很重要,如果不行的话可以配置为绝对路径
public class CommonKit {/*** 获取项目webapp目录* @return String*/public static String getWebPath() {return CommonKit.class.getClassLoader().getResource("").getPath().substring(1) + "lib/}}123456789开始基于海康威视SDK的开发注:这里面的SDK其实是一个大杂烩,里面有很多接口其中有摄像头的预览,视频的下载和语言的播报等接口
编写工具类
通过读取海康威视的开发文档我们得知调用海康威视的SDK接口的时候需要初始化,完成操作之后需要释放资源。
在实际开发中项目一般是一直运行的,所以这里我用了spring的两个注解,在项目启动时候初始化,结束项目运行
的时候释放资源。这样就不用每一次操作都去初始化和释放资源了。
注:这两个方法是必须的,所有的接口执行都需要初始化
这里只是初始化和释放资源的代码,其他的方法按照自己的业务逻辑来进行完善。
@Slf4j@Componentpublic class HikvisionUtil { private static final HCNetSDK hcNetSDK = HCNetSDK.INSTANCE;
/** * 初始化 */ @PostConstruct public void init() { boolean flag = hcNetSDK.NET_DVR_Init(); String message = flag ? "成功" : "失败"; log.info("摄像头初始化" + message); } /** * 释放资源 */ @PreDestroy public void leanup() { boolean flag = hcNetSDK.NET_DVR_Cleanup(); String message = flag ? "成功" : "失败"; log.info("摄像头关闭资源" + message); }
}
12345678910111213141516171819202122232425如何排错?
新手在开发的时候可能会发生很多错误,这里我的建议是通过打印报错编码和日志来进行排查错误
这个接口能够返回你上一次失败操作的错误码
hcNetSDK.NET_DVR_GetLastError()1得到错误码,拿到报错的海康SDK接口去他的文档进行查阅
这里我用登录接口来举一个例子
在这里插入图片描述
通过错误码就能够正确的找到错误的原因。
2.总结海康威视的开发第一次对接SDK的常见问题怎么完善海康威视的后续开发?
一般的情况都是基于摄像头进行开发,在对摄像头进行开发的话建议查看此文档,里面有接口调用顺序和参数说明,基于文档完善上面的工具类。
在这里插入图片描述
在这里插入图片描述
如何部署到Linux服务器上面?
首先HCNetSDK接口类需要继承Library,经过本人的尝试最新版本的SDK,继承Library可以同时支持windows和Linux两种环境
在这里插入图片描述
如果需要部署到Linux服务器上面的话,需要下载Linux那一套SDK
下载SDK
注:Linux下面是so文件
在这里插入图片描述
对接海康摄像头出现 java.lang.Error: Structure.getFieldOrder()
Exception in thread "threadPoolTaskExecutor-1" java.lang.Error: Structure.getFieldOrder() on class com.ruoyi.web.equipment.hk.HCNetSDK$NET_DVR_USER_LOGIN_INFO does not provide enough names [0] ([]) to match declared fields [15] ([bUseAsynLogin, byHttps, byLoginMode, byProxyType, byRes2, byUseTransport, byUseUTCTime, byVerifyMode, cbLoginResult, iProxyID, pUser, sDeviceAddress, sPassword, sUserName, wPort])
注:这个问题是因为海康jna.jar比较老,结构体定义没有getFiledOrder,可创建一个类继承 Structure
import com.sun.jna.Structure;import java.lang.reflect.Field;import java.lang.reflect.Modifier;import java.util.ArrayList;import java.util.List;
public class HIKSDKStructure extends Structure {protected List<String> getFieldOrder(){List<String> fieldOrderList = new ArrayList<String>();for (Class<?> cls = getClass();!cls.equals(HIKSDKStructure.class);cls = cls.getSuperclass()) {Field[] fields = cls.getDeclaredFields();int modifiers;for (Field field : fields) {modifiers = field.getModifiers();if (Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) {continue;}fieldOrderList.add(field.getName());}}return fieldOrderList;}}
1234567891011121314151617181920212223242526然后对 HCNetSDK 接口中的静态类里面,所有继承 Structure 替换为 HIKSDKStructure 即可
3.后续完善摄像头在前端的预览摄像头的截图功能摄像头的手动录像功能摄像头的回放下载功能