社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
每一个demo里面都有sdk说明文档,可以查询相关接口的具体信息。
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
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
-
发表于 2020-06-28 03:41:22
- 阅读 ( 2186 )
- 分类:Linux
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!