Linux系统下使用java语言调用海康威视SDK连接摄像头过程记录
1.准备工作
- 1.1. 设备型号
萤石多功能互联网摄像头 CS-C2C-3B2WFR - 1.2. SDK下载
通过海康威视官网可以下载到最新的Linux下的SDK开发包,分为32位和64位,根据电脑情况选择下载即可。路径如下:
(1)设备网络SDK_V6.0.2.35(for Linux32)
http://www1.hikvision.com/cn/download_more_402.html
(2)设备网络SDK_V6.0.2.35(for Linux64)
http://www1.hikvision.com/cn/download_more_403.html - 1.3 sdk目录结构
将下载的sdk压缩包进行解压,本人下载的是64位的开发包,目录结构如下:
进入LinuxJavaDemo中,目录如下:
找到src目录下HCNetSDK.java文件,以及jna.jar和example.jar两个jar包,这几个文件也是需要加载到后面自己创建的java项目中的。 - 1.4 linux系统下动态链接库文件路径配置
在《Linux下JavaDemo使用说明.docx》以及《readme.txt》两个文档中介绍了在linux下配置so动态链接库文件路径的几种方式:
方法一
在系统的/usr/lib文件中加入你Java工程所需要使用的so文件,然后将HCNetSDKCom文件夹下的组件库也copy到/usr/lib目录
方法二
修改etc目录下ld.so.conf文件中的配置。加上你自己的Java工程所需要的so文件的路径。然后调用ldconfig命令使配置生效
方式三
修改etc目录下profile文件中的配置,将网络SDK各动态库路径加入到LD_LIBRARY_PATH环境变量,然后执行source /etc/profile命令使环境变量生效。
我选择了方法三进行配置。
2.代码开发
- 2.1 新建项目,并添加HCNetSDK.java文件,以及jna.jar和example.jar两个jar包
- 2.2 将jna.jar和example.jar两个jar包添加到项目中
通过上述几个步骤将第三方的jar包添加到项目中 - 2.3 修改HCNetSDK.java文件
红框中Native.loadLibrary(“hcnetsdk”,HCNetSDK.class)的第一个参数必须和官方提供的动态链接库文件名一致,且必须要按照1.4小节所述正确配置LD_LIBRARY_PATH,只有这样项目运行的时候可以正确调用libhcnetsdk.so文件。 - 2.4 LoginService 实现设备的初始化、登录、登出
@Service("loginService")
public class LoginService {private final static Logger logger = LoggerFactory.getLogger(LoginService.class);private HCNetSDK.NET_DVR_DEVICEINFO_V30 deviceInfo;static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;boolean initSuc = false;@Autowiredprivate UserIdMap userIdMap;@Autowiredprivate Result result;LoginService() {}public Response init() {// 初始化SDKinitSuc = hCNetSDK.NET_DVR_Init();if (initSuc == false) {return result.failed(hCNetSDK.NET_DVR_GetLastError());}return result.successed();}public Response login(String uuid, String ip, Short port, String username, String password) {// 用户注册设备deviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();NativeLong userID = new NativeLong(-1);userID = hCNetSDK.NET_DVR_Login_V30(ip, port, username, password, deviceInfo);userIdMap.put(uuid, userID.longValue());if (0 != userID.longValue()) {return result.failed(hCNetSDK.NET_DVR_GetLastError());}return result.successed();}public Response logout(String uuid) {long userID = userIdMap.get(uuid);// 用户注销if (!hCNetSDK.NET_DVR_Logout(new NativeLong(userID))) {return result.failed(hCNetSDK.NET_DVR_GetLastError());}userIdMap.put(uuid, userIdMap.INVALID_USERID);return result.successed();}
}
- 2.5 DeployService 主要实现设备的布防/撤防
@Service("deployService")
public class DeployService {static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;@Autowiredprivate FmsgCallBackV31 fmsfCallBackV31;@Autowiredprivate AlarmHandleMap alarmHandleMap;@Autowiredprivate UserIdMap userIdMap;@Autowiredprivate Result result;public Response deploy(String uuid) {// 注册回调函数,接收设备报警消息等Pointer pUser = null;if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fmsfCallBackV31, pUser)) {return result.failed(hCNetSDK.NET_DVR_GetLastError());}long userID = userIdMap.get(uuid);// 建立报警上传通道,获取报警等信息HCNetSDK.NET_DVR_SETUPALARM_PARAM alarmInfo = new HCNetSDK.NET_DVR_SETUPALARM_PARAM();alarmInfo.dwSize = alarmInfo.size();alarmInfo.byLevel = 1;alarmInfo.byAlarmInfoType = 1;alarmInfo.byFaceAlarmDetection = 0;alarmInfo.write();NativeLong alarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V41(new NativeLong(userID), alarmInfo);alarmHandleMap.put(uuid, alarmHandle.longValue());if (alarmHandleMap.INVALID_ALARMHANDLE == alarmHandle.intValue()) {return result.failed(hCNetSDK.NET_DVR_GetLastError());}return result.successed();}public Response unDeploy(String uuid) {// 撤销报警上传通道long alarmHandle = alarmHandleMap.get(uuid);if (!hCNetSDK.NET_DVR_CloseAlarmChan_V30(new NativeLong(alarmHandle))) {return result.failed(hCNetSDK.NET_DVR_GetLastError());}alarmHandleMap.put(uuid, alarmHandleMap.INVALID_ALARMHANDLE);return result.successed();}
}
- 2.6 FmsgCallBackV31 回调函数实现,实现报警事件的处理
@Component
public class FmsgCallBackV31 implements HCNetSDK.FMSGCallBack_V31 {@Autowiredprivate EventMap eventMap;public boolean invoke(NativeLong lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer,Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {alarmDataHandle(lCommand, pAlarmer, pAlarmInfo, dwBufLen, pUser);return true;}// 事件转json字符串public String eventToJson(String time, String type, String id, int door) {Event atd = new Event();atd.setId(id);atd.setTime(time);atd.setType(type);atd.setDoor(door);ObjectMapper objectMapper = new ObjectMapper();String json = null;try {json = objectMapper.writeValueAsString(atd);} catch (JsonProcessingException e) {e.printStackTrace();}return json;}public void alarmDataHandle(NativeLong lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {switch (lCommand.intValue()) {// 门禁报警case HCNetSDK.COMM_ALARM_ACS:HCNetSDK.NET_DVR_ACS_ALARM_INFO strAlarmInfo = new HCNetSDK.NET_DVR_ACS_ALARM_INFO();strAlarmInfo.write();Pointer pAlarm = strAlarmInfo.getPointer();pAlarm.write(0, pAlarmInfo.getByteArray(0, strAlarmInfo.size()), 0, strAlarmInfo.size());strAlarmInfo.read();if (HCNetSDK.MAJOR_EVENT == strAlarmInfo.dwMajor) {// 事件类报警switch (strAlarmInfo.dwMinor) {case HCNetSDK.MINOR_FINGERPRINT_COMPARE_PASS:// 指纹比对通过case HCNetSDK.MINOR_FACE_VERIFY_PASS:// 人脸认证通过try {String time = strAlarmInfo.struTime.toStringTime();String id = new String(strAlarmInfo.struAcsEventInfo.byCardNo, "GB2312").trim();String type = eventMap.getEvent(strAlarmInfo.dwMinor);int door = strAlarmInfo.struAcsEventInfo.dwDoorNo;System.out.println("time: "+time+" ,type: "+type+" , id: "+id+" ,door: "+door);//jcsString json = eventToJson(time, type, id, door);System.out.println(json);} catch (UnsupportedEncodingException e) {e.printStackTrace();}break;default:break;}}break;case HCNetSDK.COMM_ALARM_V30:HCNetSDK.NET_DVR_ALARMINFO_V30 struAlarmInfo30 = new HCNetSDK.NET_DVR_ALARMINFO_V30();struAlarmInfo30.write();Pointer pAlarmInfo30 = struAlarmInfo30.getPointer();pAlarmInfo30.write(0, pAlarmInfo30.getByteArray(0, struAlarmInfo30.size()), 0, struAlarmInfo30.size());struAlarmInfo30.read();//报警类型:0-信号量报警,1-硬盘满,2-信号丢失,3-移动侦测,// 4-硬盘未格式化,5-读写硬盘出错,6-遮挡报警,7-制式不匹配,// 8-非法访问,9-视频信号异常,10-录像/抓图异常,11-智能场景变化,// 12-阵列异常,13-前端/录像分辨率不匹配,15-智能侦测,16-POE供电异常,// 17-闪光灯异常,18-磁盘满负荷异常报警,19-音频丢失,23-脉冲报警,// 24-人脸库硬盘异常,25-人脸库变更,26-人脸库图片变更int alarmType = struAlarmInfo30.dwAlarmType;switch (alarmType){case 0:System.out.println("信号量报警");break;case 3:System.out.println("移动侦测");break;case 6:System.out.println("遮挡报警");break;default:System.out.println("其他报警");break;}default:break;}}
}
3 项目打包
因为项目要在linux下运行,所以需要在windows下将项目进行打包,本文将项目打成jar包。接下来介绍一下pom.xml文件中关于打包的配置。
<build><!-- 主要配置:将引用的第三方 jar 包打进生成的 jar 文件的 BOOT-INF/lib 目录中 --><resources><resource><directory>src\main\java\com\test\utils</directory><targetPath>BOOT-INF\lib</targetPath></resource><resource><directory>src/main/resources</directory><targetPath>.</targetPath></resource></resources><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!-- 配置加载第三方jar包的目录 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>${maven-compiler-plugin.version}</version><configuration><source>1.8</source><target>1.8</target><skip>true</skip><encoding>UTF-8</encoding><compilerArguments><extdirs>${project.basedir}/src/main/java/com/test/utils</extdirs></compilerArguments></configuration></plugin></plugins>
</build>
通过上述的配置,可以将第三方包(jna\example.jar)打包到jar的BOOT-INF\lib目录下,否则的话打包出来的jar包将缺少这两个重要的文件而导致jar包运行失败。
4.总结
本文主要介绍了如何使用官方提供的linux下的SDK来开发能够在linux系统下运行的java程序,主要包括对sdk目录的介绍,对几个重要文件的说明,linux系统下动态链接库文件路径的配置,以及项目代码的简单说明,希望能够对要做类似工作的朋友提供一定的帮助。
5.下载
Linux下海康威视IPC二次开发资源包
个人实现的IPC设备管理程序
Linux系统下使用java语言调用海康威视SDK连接摄像头过程记录相关推荐
- linux进程创建心得体会,Linux系统下计算机C语言编程心得体会
摘 要:C语言编程是目前计算机领域中应用较为广泛的编程语言, 很多信息系统都基于C语言编程实现.Linux系统是免费且可以自由传播的操作系统, 支持多用户.多平台应用, 实际生活中应用也较为广泛 ...
- Linux系统下计算机C语言的编程技巧
C语言在多程序编辑中发挥着基础性作用,并在国际范围得到了全面应用.科技的蓬勃发展,使得人们更加重视C语言技术,并对C语言提出更多的要求.但Linux系统是最主要的操作系统之一,基于此开展C语言编程工作 ...
- linux系统下,浏览器怎么调用本地硬件设备如指纹仪等。
linux系统下,浏览器怎么调用本地硬件设备如指纹仪等. 这个问题是一个同学在项目开发中遇到的问题,做的也是政府部门相关的项目,由于现在政府部门都在慢慢开始放弃windows系统改用Linux系统了, ...
- 二、JAVA调用海康威视SDK实现摄像头预览完整版
接上一章:一.JAVA调用海康威视SDK实现摄像头预览 添加摄像头信息输入框 添加视频控制按钮 添加截图功能 代码: PreView.java package com.kx.hcws;import j ...
- 五、JAVA调用海康威视SDK实现摄像头内网转外网并前端展示
接上一章:四.JAVA调用海康威视SDK实现摄像头内网推流到阿里云 本章实现摄像头内网推流到阿里云服务器并再浏览器WEB前端展示. 环境准备 开发工具:eclipse Jdk版本:jdk1.8 开发语 ...
- Linux系统下搭建java开发环境
文章目录 安装jdk8 安装maven 安装idea 参考文章 不论在windows系统下,还是在linux系统下,搭建java开发环境的过程基本都是一样的,都要 下载.安装jdk,配置环境变量:JA ...
- 在linux系统下使用C语言操作临时文件
有时程序需要存储很大量的数据,或者在几个进程间交换数据,这时您可能考虑到使用临时文件.使用临时文件要考虑几个问题: 1.保证临时文件间的文件名不互助冲突. 2.保证临时文件中内容不被其他用户或者黑客偷 ...
- Linux系统下的C语言学习
学习目标: C Learning- C语言的优点 C语言的缺点 打印C语言的特点 学习内容: 前言 C语言的优点 1. C语言简洁.紧凑.灵活 C语言的核心内容很少,只有32个关键字,9种控制语句:程 ...
- linux 系统下配置java环境变量
liunx桌面版本系统下载地址:http://www.ubuntukylin.com/downloads/ 1.源码包准备: 首先到官网下载jdk,http://www.oracle.com/tech ...
最新文章
- 【面试题】如何设计一个高并发的系统?
- Struts2 原理
- freemarker 学习笔记
- 三星android5.0基带,三星首款5G手机没用高通!问题来了:5G基带哪家强?
- 被娱乐在线报道的“唐骏造假门事件”
- 浙大29岁“粉色系”女博导获百万大奖!最爱少女粉的她,既是实验高手还是个“大厨”......
- 定时器_Qt定时器小坑
- 【分享】请回答1988(二)
- 自学python要多久-自学Python多久能找到工作
- 福利彩票-双色球爬虫数据分析实战
- 2021年PMP考试模拟题2(含答案)
- Windows电脑上不错的五款办公软件
- 认证的服务号可以快速注册并认证小程序,但是有额度限制
- java cap是什么_分布式CAP是什么?它的原理是什么?
- 中国计算机学会CCF推荐国际学术会议和期刊目录
- 开发常用镜像站 - 阿里云镜像站
- MBR30200FCT低压降肖特基二极管ASEMI原装
- 面试题: !=!=未看12 略多 sql语句练习 非常 有用
- 易语言源码 VX多开 思路+源码
- cmd结束指定端口号的进程