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()" + "\n" + 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\n" + 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)\n" + hCNetSDK.NET_DVR_GetLastError() + "\n" + 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("\0", 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("\0", 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("\0", 2);
return true;
} catch (Exception e) {
// Logger.getLogger(MemberFlowUPloadCallBackImpl.class.getName()).log(PlatformLogger.Level.SEVERE, null, e);
return false;
}
}
這是拍到的圖片,車身一張,車牌一張(已打碼處理)