海康抓拍机抓拍图片

1.下载官方sdk包,分清版本 

https://open.hikvision.com/download/5cda567cf47ae80dd41a54b3?type=10

2.把dll等库文件放入到项目目录中,

 把examples.jar ,  jna.jar放入同服务下resources下的lib目录中,通过pom文件读取

 3.官方sdk的不同demo中,HCNetSDK文件,拥有的函数类是不同的,如果你的HCNetSDK文件中查不到文档中的函数,可以换个demo查找.

    由于我集成了两个demo,为了方便,抓拍的HCNetSDK文件名修改为 ArmedHCNetSDK.

4.HCNetSDK要加载HCNetSDK.dll 库文件,不知道为什么,使用相对路径一直报错,索性使用绝对路径,播放库同理

5.前期准备完成,下面是抓拍代码,其中ip,username,pwd 用实体类存放,方便传入,大家测试时可以暂时写死,拍照的路径也可自主定义,一般在此报警信息中  COMM_ITS_PLATE_RESULT

public class SnapShort {
// private JTable jTableAlarm;
static ArmedHCNetSDK hCNetSDK = ArmedHCNetSDK.INSTANCE;
//alarmjavademo.HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo;//设备信息
ArmedHCNetSDK.NET_DVR_DEVICEINFO_V40 m_registerInfo;
ArmedHCNetSDK.NET_DVR_USER_LOGIN_INFO m_loginInfo;
//static alarmjavademo.HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new alarmjavademo.HCNetSDK.NET_DVR_USER_LOGIN_INFO();//设备登录信息
//static alarmjavademo.HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new alarmjavademo.HCNetSDK.NET_DVR_DEVICEINFO_V40();//设备信息
String m_sDeviceIP;//已登录设备的IP地址
String m_sUsername;//设备用户名
String m_sPassword;//设备密码,默认的好像是12345
static short m_sPort = 8000;//端口号,这是默认的
public NativeLong lUserID;//用户句柄
public NativeLong lAlarmHandle;//报警布防句柄
public int lListenHandle;//报警监听句柄
public NativeLong RemoteConfig;

public SnapShort(CameraInfo cameraInfo){
this.m_sDeviceIP = cameraInfo.getAddress();
this.m_sUsername = cameraInfo.getUserName();
this.m_sPassword = cameraInfo.getPwd();
}

//撤防
public void CloseAlarmChan() {
//报警撤防
if (lAlarmHandle.intValue() > -1) {
if (hCNetSDK.NET_DVR_CloseAlarmChan_V30(lAlarmHandle.intValue())) {
System.out.println("撤防成功");
lAlarmHandle = new NativeLong(-1);
}
}
}

public void initMemberFlowUpload(int remainMinuteTime) throws InterruptedException {
// 初始化
Boolean flag = hCNetSDK.NET_DVR_Init();
if (flag) {
System.out.println("初始化成功");
} else {
System.out.println("初始化失败");
}
//设置连接时间与重连时间
hCNetSDK.NET_DVR_SetConnectTime(2000, 1);
hCNetSDK.NET_DVR_SetReconnect(100000, true);
//设备信息, 输出参数
ArmedHCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new ArmedHCNetSDK.NET_DVR_DEVICEINFO_V40();
ArmedHCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new ArmedHCNetSDK.NET_DVR_USER_LOGIN_INFO();
// 注册设备-登录参数,包括设备地址、登录用户、密码等
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()" + " " + hCNetSDK.NET_DVR_GetErrorMsg(null));
hCNetSDK.NET_DVR_Cleanup();
return;
}
/* if (lUserID < 0) {
int a = hCNetSDK.NET_DVR_GetLastError();
System.out.println("登录注册失败"+a);
return ;
}else {
System.out.println("登录注册成功");
}*/
//获取能力集
// String xmlInput = "<ITCAbility>";
// Pointer pInBuf = null;
// //pInBuf.setChar(xmlInput.length());
// Pointer pOutBuf = null;
// int dwInLength = xmlInput.length();
// if (!hCNetSDK.NET_DVR_GetDeviceAbility(lUserID,0x011,pInBuf,dwInLength,pOutBuf,0)){
// System.out.println("能力集获取失败!"+hCNetSDK.NET_DVR_GetLastError());
// return;
// }

//设置报警回调函数
System.out.println("98行");
if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(this::MsesGCallBack, null)) {
System.out.println("设置回调函数失败" + hCNetSDK.NET_DVR_GetLastError());
return;
} else {
System.out.println("设置回调函数成功");
}
//启用布防
ArmedHCNetSDK.NET_DVR_SETUPALARM_PARAM lpSetupParam = new ArmedHCNetSDK.NET_DVR_SETUPALARM_PARAM();
lpSetupParam.dwSize = 0;
lpSetupParam.byLevel = 1;//布防优先级:0- 一等级(高),1- 二等级(中)
lpSetupParam.byAlarmInfoType = 1;//上传报警信息类型: 0- 老报警信息(NET_DVR_PLATE_RESULT), 1- 新报警信息(NET_ITS_PLATE_RESULT)
int lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID, lpSetupParam);
if (lAlarmHandle < 0) {
System.out.println("NET_DVR_SetupAlarmChan_V41 error, %d " + hCNetSDK.NET_DVR_GetLastError());
hCNetSDK.NET_DVR_Logout(lUserID);
//hCNetSDK.NET_DVR_Logout(lUserID);
hCNetSDK.NET_DVR_Cleanup();
return;
}
System.out.println("布防成功");

//启动监听----------------------------------------------
int iListenPort = 8100;
String m_sListenIP = m_sDeviceIP;
System.out.println("启动监听");
lListenHandle = hCNetSDK.NET_DVR_StartListen_V30(m_sListenIP, (short) iListenPort, this::MsesGCallBack, null);
if (lListenHandle < 0) {
JOptionPane.showMessageDialog(null, "启动监听失败,错误号:" + hCNetSDK.NET_DVR_GetLastError());
} else {
JOptionPane.showMessageDialog(null, "启动监听成功");
}



//-------------------识别任务提交-----------------
//hCNetSDK.NET_DVR_VEHICLE_RECOG_COND m_struVehRecogCond;
Thread.sleep(20000); //等待接收数据
//等待过程中,如果设备上传报警信息,在报警回调函数里面接收和处理报警信息
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) " + hCNetSDK.NET_DVR_GetLastError() + " " + hCNetSDK.NET_DVR_GetErrorMsg(null));
//hCNetSDK.NET_DVR_Logout(lUserID);
hCNetSDK.NET_DVR_Logout(lUserID);
hCNetSDK.NET_DVR_Cleanup();
return;
}

//注销用户
//hCNetSDK.NET_DVR_Logout(lUserID);
hCNetSDK.NET_DVR_Logout(lUserID);
//释放SDK资源
hCNetSDK.NET_DVR_Cleanup();
this.cancel();
System.gc();//主动回收垃圾
}
}, remainMinuteTime * 60 * 1000);// 这里毫秒
}

/**
* 回调函数
*/
public boolean MsesGCallBack(int lCommand, ArmedHCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
System.out.println("进入回调了");
try {
String sAlarmType = new String();
String[] newRow = new String[3];
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String[] sIP = new String[2];
// DefaultTableModel alarmTableModel = ((DefaultTableModel) jTableAlarm.getModel());//获取表格模型
switch (lCommand) {
case ArmedHCNetSDK.COMM_ITS_PARK_VEHICLE:
ArmedHCNetSDK.NET_ITS_PARK_VEHICLE strItsParkVehicle = new ArmedHCNetSDK.NET_ITS_PARK_VEHICLE();
strItsParkVehicle.write();
Pointer pItsParkVehicle = strItsParkVehicle.getPointer();
pItsParkVehicle.write(0, pAlarmInfo.getByteArray(0, strItsParkVehicle.size()), 0, strItsParkVehicle.size());
strItsParkVehicle.read();
String srtParkingNo = null;
String srtPlate = null;
try {
srtParkingNo = new String(strItsParkVehicle.byParkingNo).trim(); //车位编号
srtPlate = new String(strItsParkVehicle.struPlateInfo.sLicense, "GBK").trim(); //车牌号码
sAlarmType = sAlarmType + ",停产场数据,车位编号:" + srtParkingNo + ",车位状态:"
+ strItsParkVehicle.byLocationStatus + ",车牌:" + srtPlate;
System.out.println(sAlarmType + "sAlarmType");
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case ArmedHCNetSDK.COMM_UPLOAD_PLATE_RESULT:
ArmedHCNetSDK.NET_DVR_PLATE_RESULT strPlateResult = new ArmedHCNetSDK.NET_DVR_PLATE_RESULT();
strPlateResult.write();
Pointer pPlateInfo = strPlateResult.getPointer();
pPlateInfo.write(0, pAlarmInfo.getByteArray(0, strPlateResult.size()), 0, strPlateResult.size());
strPlateResult.read();
try {
String srt3 = new String(strPlateResult.struPlateInfo.sLicense, "GBK");
sAlarmType = sAlarmType + ":交通抓拍上传,车牌:" + srt3;
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
newRow[0] = dateFormat.format(new Date());
//报警类型
newRow[1] = sAlarmType;
//报警设备IP地址
sIP = new String(pAlarmer.sDeviceIP).split("", 2);
newRow[2] = sIP[0];
// alarmTableModel.insertRow(0, newRow);
if (strPlateResult.dwPicLen > 0) {
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
String newName = sf.format(new Date());
FileOutputStream fout;
try {
// fout = new FileOutputStream(".\pic\" + new String(pAlarmer.sDeviceIP).trim() + "_"
// + newName + "_plateResult.jpg");
fout = new FileOutputStream("E:\SnapshotPicture\"
+ newName + "_plateResult.jpg");
//将字节写入文件
long offset = 0;
ByteBuffer buffers = strPlateResult.pBuffer1.getByteBuffer(offset, strPlateResult.dwPicLen);
byte[] bytes = new byte[strPlateResult.dwPicLen];
buffers.rewind();
buffers.get(bytes);
fout.write(bytes);
fout.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
case ArmedHCNetSDK.COMM_ITS_PLATE_RESULT:
ArmedHCNetSDK.NET_ITS_PLATE_RESULT strItsPlateResult = new ArmedHCNetSDK.NET_ITS_PLATE_RESULT();
strItsPlateResult.write();
Pointer pItsPlateInfo = strItsPlateResult.getPointer();
pItsPlateInfo.write(0, pAlarmInfo.getByteArray(0, strItsPlateResult.size()), 0, strItsPlateResult.size());
strItsPlateResult.read();
try {
String srt3 = new String(strItsPlateResult.struPlateInfo.sLicense, "GBK");
sAlarmType = sAlarmType + ",车辆类型:" + strItsPlateResult.byVehicleType + ",交通抓拍上传,车牌:" + srt3;
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

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

for (int i = 0; i < strItsPlateResult.dwPicNum; i++) {
if (strItsPlateResult.struPicInfo[i].dwDataLen > 0) {
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
String newName = sf.format(new Date());
FileOutputStream fout;
try {
// String filename = ".\pic\" + new String(pAlarmer.sDeviceIP).trim() + "_"
// + newName + "_type[" + strItsPlateResult.struPicInfo[i].byType + "]_ItsPlate.jpg";
String filename = "E:\SnapshotPicture\" + new String(pAlarmer.sDeviceIP).trim() + "_"
+ newName + "_type[" + strItsPlateResult.struPicInfo[i].byType + "]_ItsPlate.jpg";
fout = new FileOutputStream(filename);
//将字节写入文件
long offset = 0;
ByteBuffer buffers = strItsPlateResult.struPicInfo[i].pBuffer.getByteBuffer(offset, strItsPlateResult.struPicInfo[i].dwDataLen);
byte[] bytes = new byte[strItsPlateResult.struPicInfo[i].dwDataLen];
buffers.rewind();
buffers.get(bytes);
fout.write(bytes);
fout.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
break;
}
System.out.println("sAlarmType---》" + sAlarmType);
//报警类型
//报警设备IP地址
//sIP = new String(strPDCResult.struDevInfo.struDevIP.sIpV4).split("", 2);
return true;
} catch (Exception e) {
// Logger.getLogger(MemberFlowUPloadCallBackImpl.class.getName()).log(PlatformLogger.Level.SEVERE, null, e);
return false;
}
}

这是拍到的图片,车身一张,车牌一张(已打码处理)

 

原文地址:https://www.cnblogs.com/lhn9527/p/14836278.html