海康摄像机抓拍SDK集成java(包括windows和linux) - Go语言中文社区

海康摄像机抓拍SDK集成java(包括windows和linux)


近期在做违停球机抓拍功能,所以对海康的sdk进行集成,并且部署到Linux和Windows服务器上。

海康sdk及demo下载地址

1、下载对应版本的sdk

在这里插入图片描述
每一个demo里面都有sdk说明文档,可以查询相关接口的具体信息。
在这里插入图片描述

2、整合demo中的代码

Windows版本

2.1 在自己的项目中新建一个package,将 CH-HCNetSDKV6.0.2.35_build20190411_Win64Demo示例4- Java 开发示例2-报警布防监听AlarmJavaDemosrcalarmjavademo 中的 HCNetSDK.java 接口类复制到新建的包下,然后再在新建的包下新建一个类,命名Path.java(类名随便起)。
2.2 将在解压之后的文件夹中的库文件中的所有文件复制到一个 纯英文 路径下的文件夹内,在刚才新建的Path类中。
在这里插入图片描述
上图中的路径随意
在这里插入图片描述
2.3 修改 HCNetSDK.java 中的 dll 库文件路径
在这里插入图片描述
上图中PATH是刚刚Path类中定义的路径,后面的一部分是HCNetSDK.dll文件的路径,根据实际情况自己配。
在这里插入图片描述
2.4 如果您的项目是Spring Boot项目 那么就将demo项目中的如下两个jar包拷到自己的项目中、
在这里插入图片描述
在这里插入图片描述
并在pom.xml文件中引入

<dependency>
    <groupId>com.sun.jna.examples</groupId>
    <artifactId>test</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${basedir}/src/main/resources/lib/examples.jar</systemPath>
</dependency>
<dependency>
    <groupId>com.sun.jna</groupId>
    <artifactId>test</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${basedir}/src/main/resources/lib/jna.jar</systemPath>
</dependency>

在这里插入图片描述

<compilerArguments>
    <extdirs>${project.basedir}/src/resources/lib</extdirs>
</compilerArguments>

在这里插入图片描述

<resource>
    <directory>srcmainresourceslib</directory>
    <targetPath>BOOT-INFlib</targetPath>
</resource>

2.5 开始写自己的代码,大概流程是 sdk初始化,用户注册设备,用户开启布防,接收报警违规信息,出发抓拍,保存图片,上传违规记录。(说不明白,直接上代码吧 # — #)

package cn.ruiyuan.enforcecheck.hik;

import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import org.springframework.stereotype.Component;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;


import static cn.ruiyuan.enforcecheck.hik.Path.IMAGEPATH;

@SuppressWarnings("Duplicates")
//@Component
public class WinHikTest {

    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();//设备信息
    private static NativeLong startChan = new NativeLong(-1); // start channel number

    static FMSGCallBack fMSFCallBack;//报警回调函数实现
    static FMSGCallBack_V31 fMSFCallBack_V31;//报警回调函数实现

    FGPSDataCallback fGpsCallBack;//GPS信息查询回调函数实现

    public static class FMSGCallBack implements HCNetSDK.FMSGCallBack
    {
        //报警信息回调函数

        public void invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser)
        {
            AlarmDataHandle(lCommand, pAlarmer, pAlarmInfo, dwBufLen, pUser);
        }
    }

    //交通事件打印处理
    public static void AlarmDataHandle(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser)
    {
        try {
            String sAlarmType = new String();
            String[] newRow = new String[3];
            //报警时间
            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是传的报警类型
            switch (lCommand)
            {
                case HCNetSDK.COMM_ALARM_V40:
                    HCNetSDK.NET_DVR_ALARMINFO_V40 struAlarmInfoV40 = new HCNetSDK.NET_DVR_ALARMINFO_V40();
                    struAlarmInfoV40.write();
                    Pointer pInfoV40 = struAlarmInfoV40.getPointer();
                    pInfoV40.write(0, pAlarmInfo.getByteArray(0, struAlarmInfoV40.size()), 0, struAlarmInfoV40.size());
                    struAlarmInfoV40.read();


                    switch (struAlarmInfoV40.struAlarmFixedHeader.dwAlarmType)
                    {
                        case 0:
                            struAlarmInfoV40.struAlarmFixedHeader.ustruAlarm.setType(HCNetSDK.struIOAlarm.class);
                            struAlarmInfoV40.read();
                            sAlarmType = sAlarmType + new String(":信号量报警") + ","+ "报警输入口:" + struAlarmInfoV40.struAlarmFixedHeader.ustruAlarm.struioAlarm.dwAlarmInputNo;
                            break;
                        case 1:
                            sAlarmType = sAlarmType + new String(":硬盘满");
                            break;
                        case 2:
                            sAlarmType = sAlarmType + new String(":信号丢失");
                            break;
                        case 3:
                            struAlarmInfoV40.struAlarmFixedHeader.ustruAlarm.setType(HCNetSDK.struAlarmChannel.class);
                            struAlarmInfoV40.read();
                            int iChanNum = struAlarmInfoV40.struAlarmFixedHeader.ustruAlarm.sstrualarmChannel.dwAlarmChanNum;
                            sAlarmType = sAlarmType + new String(":移动侦测") + ","+ "报警通道个数:" + iChanNum + ","+ "报警通道号:";

                            for (int i=0; i<iChanNum; i++)
                            {
                                byte[] byChannel = struAlarmInfoV40.pAlarmData.getByteArray(i*4, 4);

                                int iChanneNo = 0;
                                for(int j=0;j<4;j++)
                                {
                                    int ioffset = j*8;
                                    int iByte = byChannel[j]&0xff;
                                    iChanneNo = iChanneNo + (iByte << ioffset);
                                }

                                sAlarmType= sAlarmType + "+ch["+ iChanneNo +"]";
                            }

                            break;
                        case 4:
                            sAlarmType = sAlarmType + new String(":硬盘未格式化");
                            break;
                        case 5:
                            sAlarmType = sAlarmType + new String(":读写硬盘出错");
                            break;
                        case 6:
                            sAlarmType = sAlarmType + new String(":遮挡报警");
                            break;
                        case 7:
                            sAlarmType = sAlarmType + new String(":制式不匹配");
                            break;
                        case 8:
                            sAlarmType = sAlarmType + new String(":非法访问");
                            break;
                    }

                    newRow[0] = dateFormat.format(today);
                    //报警类型
                    newRow[1] = sAlarmType;
                    //报警设备IP地址
                    sIP = new String(pAlarmer.sDeviceIP).split("", 2);
                    newRow[2] = sIP[0];
//                    alarmTableModel.insertRow(0, newRow);
                    System.out.println("A1: "+newRow);

                    break;
                case HCNetSDK.COMM_ALARM_V30:
                    HCNetSDK.NET_DVR_ALARMINFO_V30 strAlarmInfoV30 = new HCNetSDK.NET_DVR_ALARMINFO_V30();
                    strAlarmInfoV30.write();
                    Pointer pInfoV30 = strAlarmInfoV30.getPointer();
                    pInfoV30.write(0, pAlarmInfo.getByteArray(0, strAlarmInfoV30.size()), 0, strAlarmInfoV30.size());
                    strAlarmInfoV30.read();
                    switch (strAlarmInfoV30.dwAlarmType)
                    {
                        case 0:
                            sAlarmType = sAlarmType + new String(":信号量报警") + ","+ "报警输入口:" + (strAlarmInfoV30.dwAlarmInputNumber+1);
                            break;
                        case 1:
                            sAlarmType = sAlarmType + new String(":硬盘满");
                            break;
                        case 2:
                            sAlarmType = sAlarmType + new String(":信号丢失");
                            break;
                        case 3:
                            sAlarmType = sAlarmType + new String(":移动侦测") + ","+ "报警通道:";
                            for (int i=0; i<64; i++)
                            {
                                if (strAlarmInfoV30.byChannel[i] == 1)
                                {
                                    sAlarmType=sAlarmType + "ch"+(i+1)+" ";
                                }
                            }
                            break;
                        case 4:
                            sAlarmType = sAlarmType + new String(":硬盘未格式化");
                            break;
                        case 5:
                            sAlarmType = sAlarmType + new String(":读写硬盘出错");
                            break;
                        case 6:
                            sAlarmType = sAlarmType + new String(":遮挡报警");
                            break;
                        case 7:
                            sAlarmType = sAlarmType + new String(":制式不匹配");
                            break;
                        case 8:
                            sAlarmType = sAlarmType + new String(":非法访问");
                            break;
                    }
                    newRow[0] = dateFormat.format(today);
                    //报警类型
                    newRow[1] = sAlarmType;
                    //报警设备IP地址
                    sIP = new String(pAlarmer.sDeviceIP).split("", 2);
                    newRow[2] = sIP[0];
//                    alarmTableModel.insertRow(0, newRow);
                    System.out.println("A2: "+newRow);
                    break;
                case HCNetSDK.COMM_ALARM_RULE:
                    HCNetSDK.NET_VCA_RULE_ALARM strVcaAlarm = new HCNetSDK.NET_VCA_RULE_ALARM();
                    strVcaAlarm.write();
                    Pointer pVcaInfo = strVcaAlarm.getPointer();
                    pVcaInfo.write(0, pAlarmInfo.getByteArray(0, strVcaAlarm.size()), 0, strVcaAlarm.size());
                    strVcaAlarm.read();

                    switch (strVcaAlarm.struRuleInfo.wEventTypeEx)
                    {
                        case 1:
                            sAlarmType = sAlarmType + new String(":穿越警戒面") + "," +
                                    "_wPort:" + strVcaAlarm.struDevInfo.wPort +
                                    "_byChannel:" + strVcaAlarm.struDevInfo.byChannel +
                                    "_byIvmsChannel:" +  strVcaAlarm.struDevInfo.byIvmsChannel +
                                    "_Dev IP:" + new String(strVcaAlarm.struDevInfo.struDevIP.sIpV4);
                            break;
                        case 2:
                            sAlarmType = sAlarmType + new String(":目标进入区域") + "," +
                                    "_wPort:" + strVcaAlarm.struDevInfo.wPort +
                                    "_byChannel:" + strVcaAlarm.struDevInfo.byChannel +
                                    "_byIvmsChannel:" +  strVcaAlarm.struDevInfo.byIvmsChannel +
                                    "_Dev IP:" + new String(strVcaAlarm.struDevInfo.struDevIP.sIpV4);
                            break;
                        case 3:
                            sAlarmType = sAlarmType + new String(":目标离开区域") + "," +
                                    "_wPort:" + strVcaAlarm.struDevInfo.wPort +
                                    "_byChannel:" + strVcaAlarm.struDevInfo.byChannel +
                                    "_byIvmsChannel:" +  strVcaAlarm.struDevInfo.byIvmsChannel +
                                    "_Dev IP:" + new String(strVcaAlarm.struDevInfo.struDevIP.sIpV4);
                            break;
                        default:
                            sAlarmType = sAlarmType + new String(":其他行为分析报警,事件类型:")
                                    + strVcaAlarm.struRuleInfo.wEventTypeEx +
                                    "_wPort:" + strVcaAlarm.struDevInfo.wPort +
                                    "_byChannel:" + strVcaAlarm.struDevInfo.byChannel +
                                    "_byIvmsChannel:" +  strVcaAlarm.struDevInfo.byIvmsChannel +
                                    "_Dev IP:" + new String(strVcaAlarm.struDevInfo.struDevIP.sIpV4);
                            break;
                    }
                    newRow[0] = dateFormat.format(today);
                    //报警类型
                    newRow[1] = sAlarmType;
                    //报警设备IP地址
                    sIP = new String(pAlarmer.sDeviceIP).split("", 2);
                    newRow[2] = sIP[0];
//                    alarmTableModel.insertRow(0, newRow);
                    System.out.println("A3: "+newRow);

                    if(strVcaAlarm.dwPicDataLen>0)
                    {
                        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
                        String newName = sf.format(new Date());
                        FileOutputStream fout;
                        try {
                            fout = new FileOutputStream(".\pic\"+ new String(pAlarmer.sDeviceIP).trim()
                                    + "wEventTypeEx[" + strVcaAlarm.struRuleInfo.wEventTypeEx +
                        
                        
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_37924554/article/details/105706727
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢