1、下载SDK (海康开放平台)
根据不同系统及操作位数下载对应的sdk,并解压好,放到一固定位置项目中需要用到
2、idea创建springboot项目
项目结构如上图,hkdll(windos的sdk)
3、将sdk中的 两个 jna.jar
和examples.jar
打入本地仓库方便maven引用
<!--海康威视-->
<dependency>
<groupId>net.java.jna</groupId>
<artifactId>jna</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>net.java.examples</groupId>
<artifactId>examples</artifactId>
<version>1.0.0</version>
</dependency>
mvn install:install-file -DgroupId=net.java.jna -DartifactId=jna -Dversion=1.0.0 -Dpackaging=jar -Dfile=C:/Users/bwx686365/Desktop/DeskTable/lib/jna.jar
4、将sdk中demo的HCNetSDK.java拷贝到项目中
截图是我为了兼容Linux和Windows修改后的样子
修改类面的路径 windos和Linux加载的不一样
HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(PropertyUtil.getPath() + "HCNetSDK.dll", HCNetSDK.class);
5、初始化资源
/**资源初始化
* @return
*/
public int initDevice() {
if (!hCNetSDK.NET_DVR_Init()) {
//初始化失败
return 1;
}
return 0;
}
6、注册设备
/**
* 设备注册
* @param ip
* @param name
* @param password
* @param lUserID
* @return
*/
public int deviceRegister(int lUserID,String ip ,String name, String password,String port){
//注册之前先注销已注册的用户
if (lUserID > -1) {
//先注销
hCNetSDK.NET_DVR_Logout(lUserID);
lUserID = -1;
}
//ip地址
m_sDeviceIP = ip;
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_sUsername = name;
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_sPassword = password;
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 = (short) Integer.parseInt(port);
//是否异步登录:0- 否,1- 是
m_strLoginInfo.bUseAsynLogin = false;
m_strLoginInfo.write();
lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
if (lUserID == -1) {
log.info("注册失败,错误号====={}" , hCNetSDK.NET_DVR_GetLastError());
return -1;
} else {
log.info("注册成功");
return lUserID;
}
}
7、 建立布防上传通道
/**
* 建立布防上传通道
*/
public int setupAlarmChan(int lUserID,int lAlarmHandle) {
if (lUserID == -1) {
log.info("请先注册");
return lUserID;
}
if (lAlarmHandle < 0) {
//尚未布防,需要布防
if (fMSFCallBack_V31 == null) {
fMSFCallBack_V31 = new FMSGCallBack_V31();
Pointer pUser = null;
if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUser)) {
log.info("设置回调函数失败!", hCNetSDK.NET_DVR_GetLastError());
}
}
HCNetSDK.NET_DVR_SETUPALARM_PARAM m_strAlarmInfo = new HCNetSDK.NET_DVR_SETUPALARM_PARAM();
m_strAlarmInfo.dwSize = m_strAlarmInfo.size();
//智能交通布防优先级:0- 一等级(高),1- 二等级(中),2- 三等级(低)
m_strAlarmInfo.byLevel = 1;
//智能交通报警信息上传类型:0- 老报警信息(NET_DVR_PLATE_RESULT), 1- 新报警信息(NET_ITS_PLATE_RESULT)
m_strAlarmInfo.byAlarmInfoType = 1;
//布防类型(仅针对门禁主机、人证设备):0-客户端布防(会断网续传),1-实时布防(只上传实时数据)
m_strAlarmInfo.byDeployType = 1;
m_strAlarmInfo.write();
lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID, m_strAlarmInfo);
if (lAlarmHandle == -1) {
log.info("布防失败,错误码=========={}", hCNetSDK.NET_DVR_GetLastError());
//注销 释放sdk资源
logout(lUserID);
return lAlarmHandle;
} else {
log.info("布防成功");
return lAlarmHandle;
}
}
return lAlarmHandle;
}
8、接收设备上传递的报警信息
/**
* 接收设备上传的报警信息
* @param lCommand 上传消息类型
* @param pAlarmer 报警设备信息
* @param pAlarmInfo 报警信息
* @param dwBufLen 报警信息缓存大小
* @param pUser 用户数据
* @return
*/
public void alarmDataHandle(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
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=0x") + Integer.toHexString(lCommand);
//lCommand是传的报警类型
switch (lCommand) {
//客流统计
case HCNetSDK.COMM_ALARM_PDC:
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);
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;
}
newRow[0] = dateFormat.format(today);
//报警类型
newRow[1] = sAlarmType;
//报警设备IP地址
sIP = new String(strPDCResult.struDevInfo.struDevIP.sIpV4).split("\0", 2);
newRow[2] = sIP[0];
log.info("客流信息数量======{}", Arrays.toString(newRow));
break;
case HCNetSDK.COMM_UPLOAD_FACESNAP_RESULT:
//实时人脸抓拍上传
HCNetSDK.NET_VCA_FACESNAP_RESULT strFaceSnapInfo = new HCNetSDK.NET_VCA_FACESNAP_RESULT();
strFaceSnapInfo.write();
Pointer pFaceSnapInfo = strFaceSnapInfo.getPointer();
pFaceSnapInfo.write(0, pAlarmInfo.getByteArray(0, strFaceSnapInfo.size()), 0, strFaceSnapInfo.size());
strFaceSnapInfo.read();
sAlarmType = sAlarmType + ":人脸抓拍上传[人脸评分:" + strFaceSnapInfo.dwFaceScore + ",年龄:" + strFaceSnapInfo.struFeature.byAge + ",性别:" + strFaceSnapInfo.struFeature.bySex + "]";
newRow[0] = dateFormat.format(today);
//报警类型
newRow[1] = sAlarmType;
//报警设备IP地址
sIP = new String(strFaceSnapInfo.struDevInfo.struDevIP.sIpV4).split("\0", 2);
newRow[2] = sIP[0];
log.info("人脸抓拍========{}",Arrays.toString(newRow));
//设置日期格式
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
// new Date()为获取当前系统时间
String time = df.format(new Date());
//人脸图片写文件
File file = new File(System.getProperty("user.dir") + "\\pic\\");
if (!file.exists()){
file.mkdir();
}
try {
FileOutputStream big = new FileOutputStream(System.getProperty("user.dir") + "\\pic\\" + time + "background.jpg");
if (strFaceSnapInfo.dwFacePicLen > 0) {
if (strFaceSnapInfo.dwFacePicLen > 0) {
try {
big.write(strFaceSnapInfo.pBuffer2.getByteArray(0, strFaceSnapInfo.dwBackgroundPicLen), 0, strFaceSnapInfo.dwBackgroundPicLen);
big.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
break;
default:
newRow[0] = dateFormat.format(today);
//报警类型
newRow[1] = sAlarmType;
//报警设备IP地址
sIP = new String(pAlarmer.sDeviceIP).split("\0", 2);
newRow[2] = sIP[0];
log.info("其他报警信息=========={}",Arrays.toString(newRow));
break;
}
}
9、报警回调函数
public class FMSGCallBack_V31 implements HCNetSDK.FMSGCallBack_V31 {
//报警信息回调函数
//lCommand 上传消息类型 pAlarmer 报警设备信息 pAlarmInfo 报警信息 dwBufLen 报警信息缓存大小 pUser 用户数据
@Override
public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
alarmDataHandle(lCommand, pAlarmer, pAlarmInfo, dwBufLen, pUser);
return true;
}
}
10、撤防
/**
* 报警撤防
*/
public int closeAlarmChan(int lAlarmHandle) {
if (lAlarmHandle > -1) {
if (hCNetSDK.NET_DVR_CloseAlarmChan_V30(lAlarmHandle)) {
log.info("撤防成功");
lAlarmHandle = -1;
return lAlarmHandle;
}
return lAlarmHandle;
}
return lAlarmHandle;
}
11、注销
/**
* 注销
* @param lUserID
*/
public void logout(int lUserID){
//注销
hCNetSDK.NET_DVR_Logout(lUserID);
//释放SDK资源
hCNetSDK.NET_DVR_Cleanup();
}
测试代码
public static void main(String[] args) {
HCNetAlarm hcNetAlarm = new HCNetAlarm();
int lAlarmHandle = -1;
int row = hcNetAlarm.initDevice();
if (row == 1){
log.info("初始化失败");
}
//设置连接超时时间与重连功能
hCNetSDK.NET_DVR_SetConnectTime(2000,1);
hCNetSDK.NET_DVR_SetReconnect(10000,true);
//注册
hcNetAlarm.deviceRegister(lUserID,"设备ip","设备登录名","设备登录密码","端口号");
//设置报警回调函数
//建立报警上传通道(启用布防)
//布防参数
hcNetAlarm.setupAlarmChan();
try {
//等待设备上传报警信息
log.info("等待设备上传报警信息====================");
Thread.sleep(100*60*60);
} catch (InterruptedException e) {
e.printStackTrace();
}
//撤销布防上传通道
hcNetAlarm.closeAlarmChan();
//注销 释放sdk资源
hcNetAlarm.logout();
}
至此Windows 的sdk整合完成,关于Linux的和Windows大同小异,下一篇写上兼容windos和Linux的