项目总结25:海康威视SDK-Java二次开发-客流量分析

前言

  本来一个很简单的SDK接口对接,折腾了好久;总结下原因有:

  1. 海康的SDK底层使用C++写的,我不熟悉C++;
  2. 海康Java源码示例写的是一个Swing桌面应用,我需要的是嵌入到web项目;
  3. 海康《设备网络SDK使用手册》中的示例是用C++写的;并且会出现使用手册和Java源码示例版本不匹配的情况(用手册版本高于Java源码示例版)  

我的需求

  1. 统计一个出入口的实时进出客流量;即将摄像头产生的数据 抓取出来保存到业务数据库
  2. SDK版本:6.0.2.35

准备工作

  1. 海康摄像头iDS-2CD681XYZUV-ABD/C;并已经现场安装成功;
  2. 海康的SDK,下载地址(win64):https://www.hikvision.com/cn/download_more_570.html;后面用到的全部文档和参考源码全部在SDK文档中

代码处理

  1. 将SDK开发包【库文件】里的HCNetSDK.dll、HCCore.dll、PlayCtrl.dll、SuperRender.dll、AudioRender.dll、HCNetSDKCom文件夹、ssleay32.dll、libeay32.dll文件均要加载到程序里面,【HCNetSDKCom文件夹】(包含里面的功能组件dll库文件)需要和HCNetSDK.dll、HCCore.dll一起加载,放在同一个目录下(我的事springboot项目,放在resources目录下),且HCNetSDKCom文件夹名不能修改。
  2. 将路径:Demo示例\4- Java 开发示例\2-报警布防监听\AlarmJavaDemo\src\alarmjavademo下的HCNetSDK类植入到项目中;
  3. 修改HCNetSDK类中的HCNetSDK加载的路径,否则会报无法加载HCNetSDK.dll错误;
        HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("HCNetSDK",HCNetSDK.class);改成String path=(HCNetSDK.class.getResource("/").getPath()).replaceAll("%20", " ").substring(1).replace("/", "\\")+"HCNetSDK.dll";HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(path,HCNetSDK.class); 

  4. 写MemberFlowUploadService类,实现数据的抓取(见业务源码1);代码逻辑说明,可参考《设备网络SDK使用手册》-编程导引-客流量功模块的示例说明
  5. 写MemberFlowUPloadCallBackImpl类,即回调函数(见业务源码2);回调函数的实现,我参考书hideSDK中的Demo示例\4- Java 开发示例\2-报警布防监听\AlarmJavaDemo\src\alarmjavademo下的AlarmJavaDemoView类
  6. 控制台结果输出    
进入回调了
sAlarmType---》lCommand=4355:客流量统计,进入人数:78,离开人数:83, byMode:0, dwRelativeTime:1298991096, dwAbsTime:1298991096
进入回调了
sAlarmType---》lCommand=4355:客流量统计,进入人数:0,离开人数:1, byMode:1, tmStart:20190522163123,tmEnd :20190522163200
进入回调了
sAlarmType---》lCommand=4355:客流量统计,进入人数:79,离开人数:83, byMode:0, dwRelativeTime:1298991115, dwAbsTime:1298991115  

源码分析

源码1:MemberFlowUploadService类

package com.hs.api.service.haikang.meberflow;import org.springframework.stereotype.Service;
import java.util.Timer;
import java.util.TimerTask;@Service
public class MemberFlowUploadService{static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;static HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();//设备登录信息static HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();//设备信息static String m_sDeviceIP = "192.168.1.X";//已登录设备的IP地址static String m_sUsername = "XXX";//设备用户名static String m_sPassword = "XXXXXX";//设备密码static short m_sPort = 8000;//端口号public  void initMemberFlowUpload(int remainMinuteTime){// 初始化
        hCNetSDK.NET_DVR_Init();//设置连接时间与重连时间hCNetSDK.NET_DVR_SetConnectTime(2000, 1);hCNetSDK.NET_DVR_SetReconnect(10000, true);// 注册设备-登录参数,包括设备地址、登录用户、密码等m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());m_strLoginInfo.wPort = m_sPort;m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是
        m_strLoginInfo.write();//设备信息, 输出参数int lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo,m_strDeviceInfo);System.out.println("lUserID.size-->" + lUserID);if(lUserID< 0){System.out.println("hCNetSDK.NET_DVR_Login_V30()"+"\n" +hCNetSDK.NET_DVR_GetErrorMsg(null));hCNetSDK.NET_DVR_Cleanup();return;}//设置报警回调函数hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(new MemberFlowUPloadCallBackImpl(),null );//启用布防-其他报警布防参数不需要设置,不支持HCNetSDK.NET_DVR_SETUPALARM_PARAM lpSetupParam = new HCNetSDK.NET_DVR_SETUPALARM_PARAM();lpSetupParam.dwSize = 0;int lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID,lpSetupParam);if (lAlarmHandle< 0){System.out.println("NET_DVR_SetupAlarmChan_V41 error, %d\n"+hCNetSDK.NET_DVR_GetLastError());hCNetSDK.NET_DVR_Logout(lUserID);hCNetSDK.NET_DVR_Cleanup();return;}//等待过程中,如果设备上传报警信息,在报警回调函数里面接收和处理报警信息Timer timer = new Timer();// 实例化Timer类timer.schedule(new TimerTask() {public void run() {//撤销布防上传通道if (! hCNetSDK.NET_DVR_CloseAlarmChan_V30(lAlarmHandle)){System.out.println("! hCNetSDK.NET_DVR_CloseAlarmChan_V31(lAlarmHandle)\n"+ hCNetSDK.NET_DVR_GetLastError() +"\n" +hCNetSDK.NET_DVR_GetErrorMsg(null) );hCNetSDK.NET_DVR_Logout(lUserID);hCNetSDK. NET_DVR_Cleanup();return;}//注销用户
                hCNetSDK.NET_DVR_Logout(lUserID);//释放SDK资源
                hCNetSDK.NET_DVR_Cleanup();this.cancel();System.gc();//主动回收垃圾
            }}, remainMinuteTime * 60 * 1000 );// 这里毫秒
    }
}

源码2:MemberFlowUPloadCallBackImpl类

package com.hs.api.service.haikang.meberflow;import com.hs.dao.entity.saichang.statistics.StatisticsMemberInOut;
import com.hs.dao.service.impl.saichang.statistics.StatisticsMemberInOutService;
import com.sun.jna.Pointer;
import org.springframework.beans.factory.annotation.Autowired;import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;public class MemberFlowUPloadCallBackImpl implements HCNetSDK.FMSGCallBack_V31 {@Autowiredprivate StatisticsMemberInOutService statisticsMemberInOutService;@Overridepublic boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {System.out.println("进入回调了");try {String sAlarmType = new String();//报警时间Date today = new Date();DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");String[] sIP = new String[2];sAlarmType = new String("lCommand=") + lCommand;//lCommand是传的报警类型HCNetSDK.NET_DVR_PDC_ALRAM_INFO strPDCResult = new HCNetSDK.NET_DVR_PDC_ALRAM_INFO();strPDCResult.write();Pointer pPDCInfo = strPDCResult.getPointer();pPDCInfo.write(0, pAlarmInfo.getByteArray(0, strPDCResult.size()), 0, strPDCResult.size());strPDCResult.read();if (strPDCResult.byMode == 0) {strPDCResult.uStatModeParam.setType(HCNetSDK.NET_DVR_STATFRAME.class);sAlarmType = sAlarmType + ":客流量统计,进入人数:" + strPDCResult.dwEnterNum + ",离开人数:" + strPDCResult.dwLeaveNum +", byMode:" + strPDCResult.byMode + ", dwRelativeTime:" + strPDCResult.uStatModeParam.struStatFrame.dwRelativeTime +", dwAbsTime:" + strPDCResult.uStatModeParam.struStatFrame.dwAbsTime;}if (strPDCResult.byMode == 1) {strPDCResult.uStatModeParam.setType(HCNetSDK.NET_DVR_STATTIME.class);//在这里实现数据的保存等业务逻辑,下面注释的代码是SDK提供的参考示例/*                    String strtmStart = "" + String.format("%04d", strPDCResult.uStatModeParam.struStatTime.tmStart.dwYear) +String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmStart.dwMonth) +String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmStart.dwDay) +String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmStart.dwHour) +String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmStart.dwMinute) +String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmStart.dwSecond);String strtmEnd = "" + String.format("%04d", strPDCResult.uStatModeParam.struStatTime.tmEnd.dwYear) +String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmEnd.dwMonth) +String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmEnd.dwDay) +String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmEnd.dwHour) +String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmEnd.dwMinute) +String.format("%02d", strPDCResult.uStatModeParam.struStatTime.tmEnd.dwSecond);sAlarmType = sAlarmType + ":客流量统计,进入人数:" + strPDCResult.dwEnterNum + ",离开人数:" + strPDCResult.dwLeaveNum +", byMode:" + strPDCResult.byMode + ", tmStart:" + strtmStart + ",tmEnd :" + strtmEnd;*/}System.out.println("sAlarmType---》" +sAlarmType);//报警类型//报警设备IP地址sIP = new String(strPDCResult.struDevInfo.struDevIP.sIpV4).split("\0", 2);return true;} catch (Exception ex) {Logger.getLogger(MemberFlowUPloadCallBackImpl.class.getName()).log(Level.SEVERE, null, ex);return false;}}
}

 其他问题解决

  1. 项目开发没有问题,最后用maven打包项目时,HCNetSDK的加载出了问题,分析错误日志,发现是因为maven打包时进行了test,无法找到HCNetSDK,只要打包时不test就可以了;
  2. windos server 2008 在jdk1.8.0_131下可以加载到HCNetSDK.dll(这里JDK默认在C:\Program Files );  在更新的JDK版本中就不行(这里JDK默认在C:\Program Files (x86))

转载于:https://www.cnblogs.com/wobuchifanqie/p/10909700.html

项目总结25:海康威视SDK-Java二次开发-客流量分析相关推荐

  1. Linux环境中对海康威视工业相机SDK进行二次开发(QT+CMake+Opencv+海康SDK)

    关于在Windows环境中对海康威视工业相机SDK进行二次开发的话,可以参考这两篇博客. 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一) 海康威视工业相机SDK二 ...

  2. 基于Qt的海康威视网络摄像头SDK的二次开发——摄像头登录和预览

    海康威视网络摄像头SDK的二次开发,需要摄像头IP地址,与主机的IP地址在同一网段,能够ping通摄像头IP,才能登录成功.摄像头是有账户名和密码,这需要记住,在开发的时候需要用到. 在开发前可以先用 ...

  3. 基于Qt的海康威视网络摄像头SDK的二次开发

    最近用Qt做了一个基于海康威视网络摄像头SDK的二次开发,效果还不错.文章最后将开发的资料和demo软件通过链接方式分享,有兴趣的可以看下效果. 开发情况介绍: qt版本:Qt5.14.2 海康SDK ...

  4. EasyCVR视频融合平台基于宇视SDK进行二次开发的详细步骤

    EasyCVR视频融合平台部署轻快.功能灵活,在视频能力上,可提供视频直播.录像.回放.检索.云存储.级联.告警.对讲等功能.平台可支持多协议.多类型设备接入,包括国标GB28181.RTMP.RTS ...

  5. 基于大恒相机SDK,二次开发

    基于大恒相机SDK,二次开发(C#) 界面如下 有曝光.增益两个参数可以调整(平台是X64) 有问题可以问 看到就回答 using System; using System.Collections.G ...

  6. 海康威视多摄像头实时视频预览(基于SDK的二次开发)

    项目背景 很久没有做工程项目了,最近突然接单,要做多摄像头下运动物体入侵检测及拌线检测,本文测试用到的摄像头是海康威视的DS-2CD23**D摄像头. 环境配置: 1.下载SDK 2.vs2010开发 ...

  7. 基于海康威视的SDK实现二次开发

    文章目录 前言 1.对接海康威视的SDK 进入海康威视官网 下载你所需要的SDK开发包(这里我就用windows来作为案列) 下载完SDK解压 运行Demo示例 开发接口之前的环境配置 开始基于海康威 ...

  8. 海康威视Sdk java推流

    使用海康威视sdk进行推流,实现实时预览,回放等功能. 环境准备 开发工具:eclipse Jdk版本:jdk1.8 开发语言:java,界面使用swing开发 摄像头:DS-2CD1221D-I3 ...

  9. 调用Kubernetes SDK实现二次开发

    版权声明:本文为CSDN博主「you can make it」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.ne ...

最新文章

  1. 聚类之isodata算法
  2. yum安装时报错,提示/var/run/yum.pid 已被锁定,解决办法
  3. 如何判断一个字符串的编码类型?
  4. 逐渐增高_健身能不能增高?真相原来是这样
  5. 霍夫码编码(一种不等长,非前缀编码方式)
  6. linux下挂载samba服务器,Linux使用mount挂载samba共享
  7. OAuth2.0认证服务器之客户端相关配置
  8. spring cloud 学习笔记(1)
  9. GPS 经纬度换算方法和定位误差计算
  10. Android自动化测试框架Robotium
  11. HealthKit详解
  12. Python:暴力破解密码
  13. session跨域共享
  14. 用PS把人物皮肤处理的质感又通透
  15. linux设置用户密码
  16. IDEA的使用大全(快捷键、TomCat、Maven......)
  17. 应用ceph块存储(ceph-13.2.10)
  18. 一步一步在 Windows 10 用 visual studio 2019 编译 zmqpp 4.2.0 版
  19. vmware 虚拟机使用windows的 http/socks 代理
  20. ASM 系列详细教程-02-ASM 整体概览

热门文章

  1. python入门指南_Python中的逻辑门–入门指南
  2. jquery 遍历无限极树_jQuery parent()和children()树遍历函数示例
  3. jquery水平垂直居中_Java Web应用程序集成的jQuery UI选项卡(水平和垂直)示例
  4. 为VS2010添加背景图
  5. Java基础篇:如何解决成员的访问和继承?
  6. CentOS下通过yum安装svn及配置
  7. 【Objective-C】Objective-C语言的动态性
  8. 【HDOJ】1261 字串数【组合数学--排列+代数】
  9. 九、Promises
  10. Javascript this 的一些学习总结