说明
本Demo在海康官网SDK的基础上,做了模块化和接口再封装,让代码变得更加简洁好用
官网的SDK是在C语言基础上直接翻译过来的,使用起来稍微有些繁琐
核心代码
暂时只对初始化、登录、布警、报警图片获取等功能做了简化
@Override
protected void onPermissionResult() {
//初始化
boolean initRet = HCNetSDKJNAInstance.getInstance().NET_DVR_Init();
Console.info("HikNetSDK", "Init", initRet);
//登录
int userId = HikNetSDK.login("192.168.5.2", "8000", "admin", "aodun2012");
Console.info("HikNetSDK", "Login", userId);
//布警
int alarmHandle = HikNetSDK.setupAlarm(userId);
Console.info("HikNetSDK", "SetupAlarm", alarmHandle);
//报警事件回调
boolean setupAlarmEventCallbackRet = HikNetSDK.setupAlarmEventCallback((command, alarmer, pAlarmInfo, bufferLength, pUser) -> {
String time = Times.now();
String ip = new String(alarmer.sDeviceIP).trim();
Console.info("HikNetSDK", "AlarmEventCallback", time, ip, "0x" + Integer.toHexString(command));
//人脸抓拍
if (command == HCNetSDKByJNA.COMM_UPLOAD_FACESNAP_RESULT) {
HCNetSDKByJNA.NET_VCA_FACESNAP_RESULT result = new HCNetSDKByJNA.NET_VCA_FACESNAP_RESULT(pAlarmInfo);
result.read();
Console.info("HikNetSDK", "FACESNAP_RESULT", result.dwFacePicLen, result.dwBackgroundPicLen);
byte[] faceBytes = result.pBuffer1.getPointer().getByteArray(0, result.dwFacePicLen);
String facePicFile = AndroidFile.getAndroidExternalFile("1.jpg");
Files.writeToFile(facePicFile, faceBytes);
byte[] backgroundBytes = result.pBuffer2.getPointer().getByteArray(0, result.dwBackgroundPicLen);
String backgroundPicFile = AndroidFile.getAndroidExternalFile("2.jpg");
Files.writeToFile(backgroundPicFile, backgroundBytes);
}
//交通抓拍
if (command == HCNetSDKByJNA.COMM_UPLOAD_PLATE_RESULT) {
HCNetSDKByJNA.NET_DVR_PLATE_RESULT result = new HCNetSDKByJNA.NET_DVR_PLATE_RESULT(pAlarmInfo);
result.read();
byte[] plateNumberBytes = result.struPlateInfo.sLicense;
String plate = new String(plateNumberBytes).trim();
Console.info("HikNetSDK", "PLATE_RESULT", plate, result.dwCarPicLen, result.dwFarCarPicLen);
byte[] plateBytes = result.pBuffer1.getPointer().getByteArray(0, result.dwCarPicLen);
String platePicFile = AndroidFile.getAndroidExternalFile("3.jpg");
Files.writeToFile(platePicFile, plateBytes);
byte[] backgroundBytes = result.pBuffer2.getPointer().getByteArray(0, result.dwFarCarPicLen);
String backgroundPicFile = AndroidFile.getAndroidExternalFile("4.jpg");
Files.writeToFile(backgroundPicFile, backgroundBytes);
}
});
Console.info("HikNetSDK", "SetupAlarmEventCallback", setupAlarmEventCallbackRet);
}
package com.hcnetsdk;
import com.hcnetsdk.jna.HCNetSDKByJNA;
import com.hcnetsdk.jna.HCNetSDKJNAInstance;
import com.hik.netsdk.SimpleDemo.Control.DevManageGuider;
import com.hikvision.netsdk.HCNetSDK;
import com.hikvision.netsdk.NET_DVR_SETUPALARM_PARAM;
import com.sun.jna.Pointer;
@SuppressWarnings("all")
public class HikNetSDK {
//登录
public static int login(String ip, String port, String username, String password) {
DevManageGuider.DevNetInfo info = new DevManageGuider.DevNetInfo();
info.m_szIp = ip;
info.m_szPort = port;
info.m_szUserName = username;
info.m_szPassword = password;
int userId = login(info);
return userId;
}
//登录
protected static int login(DevManageGuider.DevNetInfo struDevNetInfo) {
HCNetSDKByJNA.NET_DVR_USER_LOGIN_INFO loginInfo = new HCNetSDKByJNA.NET_DVR_USER_LOGIN_INFO();
System.arraycopy(struDevNetInfo.m_szIp.getBytes(), 0, loginInfo.sDeviceAddress, 0, struDevNetInfo.m_szIp.length());
System.arraycopy(struDevNetInfo.m_szUserName.getBytes(), 0, loginInfo.sUserName, 0, struDevNetInfo.m_szUserName.length());
System.arraycopy(struDevNetInfo.m_szPassword.getBytes(), 0, loginInfo.sPassword, 0, struDevNetInfo.m_szPassword.length());
loginInfo.wPort = (short) Integer.parseInt(struDevNetInfo.m_szPort);
HCNetSDKByJNA.NET_DVR_DEVICEINFO_V40 deviceInfo = new HCNetSDKByJNA.NET_DVR_DEVICEINFO_V40();
loginInfo.write();
int userId = HCNetSDKJNAInstance.getInstance().NET_DVR_Login_V40(loginInfo.getPointer(), deviceInfo.getPointer());
return userId;
}
//布警
public static int setupAlarm(int userId) {
NET_DVR_SETUPALARM_PARAM struSetupAlarmParam = new NET_DVR_SETUPALARM_PARAM();
struSetupAlarmParam.byAlarmInfoType = 0;
struSetupAlarmParam.byLevel = 1;
int alarmHandle = HCNetSDK.getInstance().NET_DVR_SetupAlarmChan_V41(userId, struSetupAlarmParam);
return alarmHandle;
}
//监听报警事件
public static boolean setupAlarmEventCallback(HCNetSDKByJNA.FMSGCallBack callback) {
boolean ret = HCNetSDKJNAInstance.getInstance().NET_DVR_SetDVRMessageCallBack_V30(callback, Pointer.NULL);
return ret;
}
}
源码下载
海康网络SDK-Android