springboot 对接海康设备

  1. 新建接口HCNetSDK
import com.stian.util.ClientDemoUtil;
import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;import com.sun.jna.examples.win32.W32API;
import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.StdCallLibrary;import java.nio.ByteBuffer;public interface HCNetSDK extends StdCallLibrary {HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(ClientDemoUtil.DLL_PATH+"HCNetSDK.dll", HCNetSDK.class);public static final int SERIALNO_LEN = 48;   //序列号长度public static final int NAME_LEN = 32;    //用户名长度public static final int PASSWD_LEN = 16;    //密码长度public static final int MAX_DISKNUM_V30 = 33;     //9000设备最大硬盘数/* 最多33个硬盘(包括16个内置SATA硬盘、1个eSATA硬盘和16个NFS盘) */public static final int MAX_AUDIO_V30 = 2;   //9000语音对讲通道数public static final int MAX_LINK = 6;    //8000设备单通道最大视频流连接数//9000 IPC接入public static final int MAX_ANALOG_CHANNUM = 32;    //最大32个模拟通道public static final int MAX_ANALOG_ALARMOUT = 32;    //最大32路模拟报警输出public static final int MAX_ANALOG_ALARMIN = 32;    //最大32路模拟报警输入public static final int MAX_IP_DEVICE = 32;    //允许接入的最大IP设备数public static final int MAX_IP_CHANNEL = 32;   //允许加入的最多IP通道数public static final int MAX_IP_ALARMIN = 128;   //允许加入的最多报警输入数public static final int MAX_IP_ALARMOUT = 64; //允许加入的最多报警输出数/* 最大支持的通道数 最大模拟加上最大IP支持 */public static final int MAX_CHANNUM_V30 = (MAX_ANALOG_CHANNUM + MAX_IP_CHANNEL);//64public static final int MAX_ALARMOUT_V30 = (MAX_ANALOG_ALARMOUT + MAX_IP_ALARMOUT);//96public static final int MAX_ALARMIN_V30 = (MAX_ANALOG_ALARMIN + MAX_IP_ALARMIN);//160//IP接入配置参数 (NET_DVR_IPPARACFG结构)public static final int NET_DVR_GET_IPPARACFG = 1048;    //获取IP接入配置信息public static final int NET_DVR_SET_IPPARACFG = 1049;    //设置IP接入配置信息/********************预览回调函数*********************/public static final int NET_DVR_SYSHEAD = 1;//系统头数据public static final int NET_DVR_STREAMDATA = 2;//视频流数据(包括复合流和音视频分开的视频流数据)public static final int NET_DVR_AUDIOSTREAMDATA = 3;//音频流数据public static final int NET_DVR_STD_VIDEODATA = 4;//标准视频流数据public static final int NET_DVR_STD_AUDIODATA = 5;//标准音频流数据//NET_DVR_Login_V30()参数结构public static class NET_DVR_DEVICEINFO_V30 extends Structure{public  byte[] sSerialNumber = new byte[SERIALNO_LEN];  //序列号public  byte byAlarmInPortNum;              //报警输入个数public  byte byAlarmOutPortNum;             //报警输出个数public  byte byDiskNum;                 //硬盘个数public  byte byDVRType;                   //设备类型, 1:DVR 2:ATM DVR 3:DVS ......public  byte byChanNum;                 //模拟通道个数public  byte byStartChan;                   //起始通道号,例如DVS-1,DVR - 1public  byte byAudioChanNum;                //语音通道数public  byte byIPChanNum;                 //最大数字通道个数public  byte[] byRes1 = new byte[24];                    //保留}boolean  NET_DVR_Logout_V30(NativeLong lUserID);public static class NET_DVR_IPPARACFG extends Structure {/* IP接入配置结构 */public  int dwSize;                                     /* 结构大小 */public  NET_DVR_IPDEVINFO[]  struIPDevInfo = new NET_DVR_IPDEVINFO[MAX_IP_DEVICE];    /* IP设备 */public   byte[] byAnalogChanEnable = new byte[MAX_ANALOG_CHANNUM];        /* 模拟通道是否启用,从低到高表示1-32通道,0表示无效 1有效 */public NET_DVR_IPCHANINFO[] struIPChanInfo = new NET_DVR_IPCHANINFO[MAX_IP_CHANNEL];  /* IP通道 */}//IPC接入参数配置public static class NET_DVR_IPDEVINFO extends Structure {/* IP设备结构 */public   int dwEnable;                   /* 该IP设备是否启用 */public   byte[] sUserName = new byte[NAME_LEN];     /* 用户名 */public   byte[] sPassword = new byte[PASSWD_LEN];     /* 密码 */public   NET_DVR_IPADDR struIP = new NET_DVR_IPADDR();         /* IP地址 */public   short wDVRPort;                  /* 端口号 */public   byte[] byres = new byte[34];             /* 保留 */}public static class NET_DVR_IPCHANINFO extends Structure {/* IP通道匹配参数 */public   byte byEnable;                    /* 该通道是否启用 */public  byte byIPID;                   /* IP设备ID 取值1- MAX_IP_DEVICE */public  byte byChannel;                  /* 通道号 */public   byte[] byres = new byte[33];                 /* 保留 */}public static class NET_DVR_IPADDR extends Structure {public byte[] sIpV4 = new byte[16];public byte[] byRes = new byte[128];public String toString() {return "NET_DVR_IPADDR.sIpV4: " + new String(sIpV4) + "\n" + "NET_DVR_IPADDR.byRes: " + new String(byRes) + "\n";}}//初始化SDK,调用其他SDK函数的前提。boolean NET_DVR_Init();//设置连接时间与重连时间boolean  NET_DVR_SetConnectTime(int dwWaitTime, int dwTryTimes );boolean  NET_DVR_SetReconnect(int dwInterval, boolean bEnableRecon );int  NET_DVR_GetLastError();NativeLong  NET_DVR_Login_V30(String sDVRIP, short wDVRPort, String sUserName, String sPassword, NET_DVR_DEVICEINFO_V30 lpDeviceInfo);public static class NET_DVR_WORKSTATE_V30 extends Structure {//DVR工作状态(9000扩展)public int dwDeviceStatic;     //设备的状态,0-正常,1-CPU占用率太高,超过85%,2-硬件错误,例如串口死掉public NET_DVR_DISKSTATE[]  struHardDiskStatic = new NET_DVR_DISKSTATE[MAX_DISKNUM_V30];public NET_DVR_CHANNELSTATE_V30[] struChanStatic = new NET_DVR_CHANNELSTATE_V30[MAX_CHANNUM_V30];//通道的状态public byte[]  byAlarmInStatic = new byte[MAX_ALARMIN_V30]; //报警端口的状态,0-没有报警,1-有报警public byte[]  byAlarmOutStatic = new byte[MAX_ALARMOUT_V30]; //报警输出端口的状态,0-没有输出,1-有报警输出public int  dwLocalDisplay;//本地显示状态,0-正常,1-不正常public  byte [] byAudioChanStatus = new byte[MAX_AUDIO_V30];//表示语音通道的状态 0-未使用,1-使用中, 0xff无效public  byte[]  byRes = new byte[10];}public static class NET_DVR_DISKSTATE extends Structure {//硬盘状态public int dwVolume;//硬盘的容量public int dwFreeSpace;//硬盘的剩余空间public int dwHardDiskStatic; //硬盘的状态,按位:1-休眠,2-不正常,3-休眠硬盘出错}public static class NET_DVR_CHANNELSTATE_V30 extends Structure {//通道状态(9000扩展)public byte byRecordStatic; //通道是否在录像,0-不录像,1-录像public byte bySignalStatic; //连接的信号状态,0-正常,1-信号丢失public byte byHardwareStatic;//通道硬件状态,0-正常,1-异常,例如DSP死掉public byte reservedData;      //保留public int dwBitRate;//实际码率public int dwLinkNum;//客户端连接的个数public NET_DVR_IPADDR[] struClientIP = new NET_DVR_IPADDR[MAX_LINK];//客户端的IP地址public  int dwIPLinkNum;//如果该通道为IP接入,那么表示IP接入当前的连接数public  byte[] byRes = new byte[12];}boolean  NET_DVR_GetDVRWorkState_V30(NativeLong lUserID, NET_DVR_WORKSTATE_V30 lpWorkState);boolean  NET_DVR_GetDVRConfig(NativeLong lUserID, int dwCommand, NativeLong lChannel, Pointer lpOutBuffer, int dwOutBufferSize, IntByReference lpBytesReturned);boolean  NET_DVR_Logout(NativeLong lUserID);boolean  NET_DVR_Cleanup();//软解码预览参数public static class NET_DVR_CLIENTINFO extends Structure {public NativeLong lChannel;public NativeLong lLinkMode;public W32API.HWND hPlayWnd;public String sMultiCastIP;}/***API函数声明,详细说明见API手册***/public static interface FRealDataCallBack_V30 extends StdCallCallback {public void invoke(NativeLong lRealHandle, int dwDataType,ByteByReference pBuffer, int dwBufSize, Pointer pUser);}NativeLong  NET_DVR_RealPlay_V30(NativeLong lUserID, NET_DVR_CLIENTINFO lpClientInfo, FRealDataCallBack_V30 fRealDataCallBack_V30, Pointer pUser , boolean bBlocked );boolean  NET_DVR_SaveRealData(NativeLong lRealHandle,String sFileName);boolean  NET_DVR_StopRealPlay(NativeLong lRealHandle);//--------------------
//图片质量public static class NET_DVR_JPEGPARA extends Structure {/*注意:当图像压缩分辨率为VGA时,支持0=CIF, 1=QCIF, 2=D1抓图,当分辨率为3=UXGA(1600x1200), 4=SVGA(800x600), 5=HD720p(1280x720),6=VGA,7=XVGA, 8=HD900p仅支持当前分辨率的抓图*/public short  wPicSize;               /* 0=CIF, 1=QCIF, 2=D1 3=UXGA(1600x1200), 4=SVGA(800x600), 5=HD720p(1280x720),6=VGA*/public short    wPicQuality;            /* 图片质量系数 0-最好 1-较好 2-一般 */}//JPEG抓图到内存boolean  NET_DVR_CaptureJPEGPicture_NEW(NativeLong lUserID, NativeLong lChannel, NET_DVR_JPEGPARA lpJpegPara, ByteBuffer sJpegPicBuffer, int dwPicSize, IntByReference lpSizeReturned);//NET_DVR_SetDVRMessage的扩展boolean  NET_DVR_SetExceptionCallBack_V30(int nMessage, int hWnd, FExceptionCallBack fExceptionCallBack, Pointer pUser);public static interface FExceptionCallBack extends StdCallCallback {public void invoke(int dwType, NativeLong lUserID, NativeLong lHandle, Pointer pUser);}
}
  1. 工具类ClientDemoUtil
import com.stian.sdks.ClientDemo;import java.io.UnsupportedEncodingException;public class ClientDemoUtil {public static String DLL_PATH;static{String path=(ClientDemo.class.getResource("/sdk/").getPath()).replaceAll("%20", " ").substring(1).replace("/", "\\");try {DLL_PATH= java.net.URLDecoder.decode(path,"utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}}}
  1. 新建类TestHikvision
@Configuration
public class TestHikvision {static HCNetSDK sdk = HCNetSDK.INSTANCE;/***  注册设备并返回参数*  目的:   注册设备并返回key    :Nativelong* @param cameraInfo* @return*/private Camera getParameter(Camera cameraInfo) {//设置设备通道号   查看Demo代码  通道号为1NativeLong channel = new NativeLong(1);cameraInfo.setChannel(channel);if (!sdk.NET_DVR_Init()) {System.out.println("初始化失败..................");}//创建设备HCNetSDK.NET_DVR_DEVICEINFO_V30 deInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();//注册用户设备NativeLong id = sdk.NET_DVR_Login_V30(cameraInfo.getCameraIp(), (short) cameraInfo.getPort(),cameraInfo.getUserName(), cameraInfo.getUserPwd(), deInfo);cameraInfo.setUserId(id);return cameraInfo;}/*** 获取当前相机的信息 传入连接信息对象* 目的:获取到实时视频存入指定文件中 保存为.jpg格式文件* @param cameraInfo*/public void getDVRConfig(Camera cameraInfo) {//判断摄像头是否开启if (!sdk.NET_DVR_Init()) {return;}//创建设备  设备信息HCNetSDK.NET_DVR_DEVICEINFO_V30 deInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();//登录信息NativeLong id = sdk.NET_DVR_Login_V30(cameraInfo.getCameraIp(), (short) cameraInfo.getPort(),cameraInfo.getUserName(), cameraInfo.getUserPwd(), deInfo);cameraInfo.setUserId(id);// 返回一个用户编号,同时将设备信息写入devinfo//输出int数据if (cameraInfo.getUserId().intValue() < 0) {System.out.println("设备注册失败"+sdk.NET_DVR_GetLastError());return;}//DVR工作状态HCNetSDK.NET_DVR_WORKSTATE_V30 devwork = new HCNetSDK.NET_DVR_WORKSTATE_V30();if (!sdk.NET_DVR_GetDVRWorkState_V30(cameraInfo.getUserId(), devwork)) {// 返回Boolean值,判断是否获取设备能力System.out.println("返回设备状态失败");}IntByReference ibrBytesReturned = new IntByReference(0);// 获取IP接入配置参数HCNetSDK.NET_DVR_IPPARACFG ipcfg = new HCNetSDK.NET_DVR_IPPARACFG();//IP接入配置结构ipcfg.write();Pointer lpIpParaConfig = ipcfg.getPointer();//获取相关参数配置sdk.NET_DVR_GetDVRConfig(cameraInfo.getUserId(), HCNetSDK.NET_DVR_GET_IPPARACFG, new NativeLong(0),lpIpParaConfig, ipcfg.size(), ibrBytesReturned);ipcfg.read();System.out.print("IP地址:" + cameraInfo.getCameraIp());System.out.println("|设备状态:" + devwork.dwDeviceStatic);// 0正常,1CPU占用率过高,2硬件错误,3未知// 显示模拟通道for (int i = 0; i < deInfo.byChanNum; i++) {System.out.print("Camera" + i + 1);// 模拟通道号名称System.out.print("|是否录像:" + devwork.struChanStatic[i].byRecordStatic);// 0不录像,不录像System.out.print("|信号状态:" + devwork.struChanStatic[i].bySignalStatic);// 0正常,1信号丢失System.out.println("|硬件状态:" + devwork.struChanStatic[i].byHardwareStatic);// 0正常,1异常}//注销用户sdk.NET_DVR_Logout(cameraInfo.getUserId());//释放SDK资源sdk.NET_DVR_Cleanup();}//抓拍图片public void getDVRPic(Camera cameraInfo){Camera parameter = getParameter(cameraInfo);if (parameter.getUserId().intValue() < 0) {System.out.println("设备注册失败"+sdk.NET_DVR_GetLastError());return;} else {System.out.println("id:" + parameter.getUserId().intValue());}//判断是否获取到设备能力    //设备工作状态信息结构体。HCNetSDK.NET_DVR_WORKSTATE_V30 devwork = new HCNetSDK.NET_DVR_WORKSTATE_V30();if (!sdk.NET_DVR_GetDVRWorkState_V30(parameter.getUserId(), devwork)) {// 返回Boolean值,判断是否获取设备能力System.out.println("返回设备状态失败");}//图片质量HCNetSDK.NET_DVR_JPEGPARA jpeg = new HCNetSDK.NET_DVR_JPEGPARA();// 设置图片的分辨率jpeg.wPicSize = 2;// 设置图片质量jpeg.wPicQuality = 2;IntByReference a = new IntByReference();//设置图片大小ByteBuffer jpegBuffer = ByteBuffer.allocate(1024 * 1024);//创建文件目录和文件SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");Date date = new Date();//按照每天设置一个目录String fileName = parameter.getPath();File files = new File(fileName);if(!files.exists()){files.mkdirs();}if (files.isDirectory()){String[] imgNumber = files.list();if (imgNumber.length == 50){A:for (int i = 0; i < imgNumber.length; i++) {try {Path path = Paths.get(fileName+imgNumber[i]);BasicFileAttributeView basicview= Files.getFileAttributeView(path, BasicFileAttributeView.class, LinkOption.NOFOLLOW_LINKS );BasicFileAttributes attr = basicview.readAttributes();Date createDate = new Date(attr.creationTime().toMillis()); //文件创建时间SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");deleteFile(fileName+imgNumber[0]); //删除该文件夹下的第一个文件System.out.println(imgNumber[i]+"--------"+sdf1.format(createDate));break A;}catch (Exception e){e.printStackTrace();}}}}//按照日期文件夹放入图片String fileNameString = fileName+"/"+sdf.format(date)+".jpg";File file = new File(fileNameString);// 抓图到内存,单帧数据捕获并保存成JPEG存放在指定的内存空间中//需要加入通道   //NET_DVR_CaptureJPEGPicture_NEWboolean is = sdk.NET_DVR_CaptureJPEGPicture_NEW(parameter.getUserId(), parameter.getChannel(), jpeg,jpegBuffer, 1024 * 1024, a);  //1024*1024  当前抓拍的分辨率if (is) {System.out.println("抓取成功,返回长度:" + a.getValue());} else {System.out.println("抓取失败:"+sdk.NET_DVR_GetLastError());}BufferedOutputStream outputStream = null;try {outputStream = new BufferedOutputStream(new FileOutputStream(file));outputStream.write(jpegBuffer.array(), 0, a.getValue());outputStream.flush();} catch (Exception e) {e.printStackTrace();} finally {if (outputStream != null) {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}//单个图片路径:fileNameString//做自己的操作sdk.NET_DVR_Logout(parameter.getUserId());sdk.NET_DVR_Cleanup();}public void getImages() throws IOException {ICameraService cameraService = (ICameraService) ApplicationContextUtil.getBean("cameraService");QueryWrapper<Camera> queryWrapper = new QueryWrapper<>();queryWrapper.select("id","camera_ip","port","user_name","user_pwd","path","create_time");List<Camera> cameraList = cameraService.list(queryWrapper);TestHikvision testHikvision = new TestHikvision();if (cameraList != null){for (Camera c : cameraList) {new Thread(new Runnable() {@Overridepublic void run() {testHikvision.getDVRConfig(c);testHikvision.getDVRPic(c);}}).start();}}}/*** 每隔500毫秒执行一次*/@Scheduled(fixedRate = 500)public void test1(){try {this.getImages();}catch (IOException e){e.printStackTrace();}}/*** 删除单个文件** @param fileName*            要删除的文件的文件名* @return 单个文件删除成功返回true,否则返回false*/public static boolean deleteFile(String fileName) {File file = new File(fileName);// 如果文件路径所对应的文件存在,并且是一个文件,则直接删除if (file.exists() && file.isFile()) {if (file.delete()) {System.out.println("删除单个文件" + fileName + "成功!");return true;} else {System.out.println("删除单个文件" + fileName + "失败!");return false;}} else {System.out.println("删除单个文件失败:" + fileName + "不存在!");return false;}}}

springboot 对接海康设备相关推荐

  1. 对接海康设备-vue

    海康官方Demo 海康开放平台 对接海康综合安防管理摄像头 说明:官方Demo是原js代码,自己改改就能用,非常简单,下面这个是改成vue的 浏览器需要装的插件↓↓↓↓ https://downloa ...

  2. 关于对接海康设备的坑

    首先千万不要信息他们那边对接人的话,要调用哪个接口自己连接一下设备,打个debug看一下报警参数lCommand 通过这个参数去海康的开发手册去搜索一下,注意:需要把这个参数转换为16进制再去搜,还有 ...

  3. 海康设备注册一直失败的问题

    今天用JAVA对接海康设备,但是注册一直失败,ip.端口.用户名.密码都是正确的,一直百思不得其解,后来一番查询与排错,终于找到了原因,是因为没有初始化设备 初始化设备的代码(红框里的部分): if ...

  4. 海康设备对接sdk错误码汇总 v6.0

    海康设备对接sdk错误码汇总 v6.0

  5. LiveGBS流媒体平台GB/T28181功能-作为上级平台对接海康大华华为宇视等下级平台监控摄像机NVR硬件执法仪等GB28181设备

    LiveGBS作为上级平台对接海康大华华为宇视等下级平台监控摄像机NVR硬件执法仪等GB28181设备 1.背景说明 2.部署国标平台 2.1.安装使用说明 2.2.服务器网络环境 2.3.信令服务配 ...

  6. php对接海康视频教程_EasyNVR无插件互联网直播平台对接海康摄像头如何通过SDK将视频在前端网页播放...

    原标题:EasyNVR无插件互联网直播平台对接海康摄像头如何通过SDK将视频在前端网页播放 市场上常见的海康.大华.宇视等网络摄像头只要支持RTSP协议,都可以接入到EasyNVR中,今天主要给大家分 ...

  7. 国标服务器GBServerPlatform对接海康摄像头的操作说明

    这篇文章讲解一下QuickGBLink开发的国标服务器如何对接海康IPC. (GBT28181国标平台软件下载地址:https://github.com/QuickGBLink88/GB28181_S ...

  8. 国标服务器GBServerPlatform对接海康NVR的操作说明

    这一篇文章介绍QuickGBLink开发的国标服务器如何对接海康NVR(网络硬盘录像机),主要讲解相关的操作步骤. (GBT28181平台软件下载地址:https://github.com/Quick ...

  9. LiveGBS流媒体平台国标GB/T28181作为上级平台对接海康大华华为宇视等下级平台硬件NVR监控摄像机

    LiveGBS流媒体平台国标GB/T28181作为上级平台对接海康.大华.华为.宇视等下级平台NVR硬件监控摄像机 1.背景说明 2.部署国标平台 2.1.安装使用说明 2.2.服务器网络环境 2.3 ...

  10. LiveGBS国标GB/T28181国标视频流媒体平台如何对接海康大华宇视等监控摄像头报警消息报警订阅国标报警信息

    LiveGBS国标GB/T28181国标视频平台如何对接海康大华宇视等监控摄像头报警硬件NVR报警消息 1.配置开启报警订阅 1.1.国标设备编辑 1.2.配置订阅周期 1.3.选择开启报警订阅 2. ...

最新文章

  1. 图论 ---- E. Bear and Forgotten Tree 2(判补图的联通性技巧 图遍历的优化 条件拆分)
  2. 关于fseek和文件ab+打开方式的问题
  3. Docker容器内部署Java微服务的内存限制问题
  4. asp.net的控件视图状态
  5. Hadoop(19)-MapReduce框架原理-Combiner合并
  6. input 赋值_FPGA基础设计:Verilog行为级建模(过程赋值)
  7. 动态规划训练8 [E - Multiplication Puzzle POJ1651]
  8. 安卓手机关闭底部键盘灯的方法(htc G11亲测有效)
  9. 背景色透明,里面内容(图片、文字)不透明
  10. Python虚拟机函数机制之无参调用(一)
  11. 使用SQLQuery 在Hibernate中使用sql语句
  12. java(18) - 枚举类型和静态导入
  13. 深入理解计算机操作系统(六)
  14. 生物统计学(biostatistics)学习笔记(三)
  15. Photoshop 抠图方式
  16. 达人评测 联想YOGA Duet 2021
  17. Android快速开发整理(库、插件,kotlin枚举注解
  18. 人工免疫算法c语言实例,毕业设计_蚁群算法模拟系统的设计与实现.doc
  19. 清空input的type为file时的值
  20. WinRAR(5.70)去广告

热门文章

  1. SSM框架原理以及流程简略
  2. 【华为机试真题 Python实现】分苹果
  3. Hvdc-vsc. 基于vsc的柔性直流输电模型 pscad实现
  4. echarts 多图联动
  5. jdk版本和java版本一样吗_jdk版本查看,以及java -version 和JAVA_HOME不一致问题
  6. MSP430开发笔记之五:硬件IO中断与IR红外接收
  7. c语言中根号绝对值,根号的绝对值怎么算?
  8. SAP HANA - 企业管理软件数据库表结构完整文档
  9. 新基建+新科技,Hightopo助力智慧港口数字化转型
  10. 彻底搞懂 python 中文乱码问题_彻底搞懂 python 中文乱码问题(深入分析)