对接海康设备SDK,HCNetSDK的使用(以报警柱设备为例)
海康sdk,分windows版和linux版
JAVA版
1. HCNetSDK引入库HCNetSDK.dll的问题
一般spring boot项目,可以将HCNetSDK中初始化引入库可改为
HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(HCNetSDKPath.DLL_PATH +
"HCNetSDK.dll", HCNetSDK.class);
HCNetSDKPath类,获取当前项目地址
public class HCNetSDKPath {
public static String DLL_PATH;
static {
String path = (HCNetSDKPath.class.getResource("/").getPath()+"lib/").
replaceAll("%20", " ").substring(1).replace("bin", "lib").replace("/","\\");
System.out.println(path);
try {
DLL_PATH = java.net.URLDecoder.decode(path, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
2. SDK的调用
一般调用该sdk,需要先注册,之后再进行其他操作,如设置回调函数,设置回调异常(可获取设备上下线),布防,监听登,可根据自己所需功能来调用.
public void reg(){
//第一步调用,可以用bean的方式注入
HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
//初始化SDK
boolean initSuc = hCNetSDK.NET_DVR_Init();
//设置连接超时时间与重连功能
hCNetSDK.NET_DVR_SetConnectTime(2000,1);
hCNetSDK.NET_DVR_SetReconnect(10000,true);
int lUserID;//用户ID
NET_DVR_DEVICEINFO_V30 m_strDeviceInfo;//设备信息
NET_DVR_USER_LOGIN_INFO pLoginInfo;//登陆返回用户信息
String m_sDeviceIP = "127.0.0.1";//已登录设备的IP地址
int port = 8000;//设备端口号
String userName = "123";//用户名
String password = "123";//密码
m_strDeviceInfo = new NET_DVR_DEVICEINFO_V30 ();
//注册设备
lUserID = hCNetSDK.NET_DVR_Login_V30(m_sDeviceIP,(short)port,userName,password, m_strDeviceInfo);
//如果注册失败返回-1,获取错误码
if (lUserID<0){
System.out.println("Login failed, error code="+hCNetSDK.NET_DVR_GetLastError());
}
//设置报警回调函数
HCNetSDK.FMSGCallBack fmsgCallBack_v31= new FMSGCallBack();
boolean b = hCNetSDK.NET_DVR_SetDVRMessageCallBack_V30(fmsgCallBack_v31, null);
//如果设置报警回调失败,获取错误码
if (!b){
System.out.println("SetDVRMessageCallBack failed, error code="+hCNetSDK.NET_DVR_GetLastError());
}
//设置异常回调函数(可在回调函数中获取设备上下线状态等)
HCNetSDK.FExceptionCallBack fExceptionCallBack = new FExceptionCallBack();
hCNetSDK.NET_DVR_SetExceptionCallBack_V30(0,0,fExceptionCallBack,null);
//建立报警上传通道(布防)
//布防参数
NET_DVR_SETUPALARM_PARAM net_dvr_setupalarm_param=new NET_DVR_SETUPALARM_PARAM();
int nativeLong = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID, net_dvr_setupalarm_param);
//如果布防失败返回-1
if (nativeLong<0){
System.out.println("SetupAlarmChan failed, error code="+hCNetSDK.NET_DVR_GetLastError());
//注销
hCNetSDK.NET_DVR_Logout(lUserID);
//释放SDK资源
hCNetSDK.NET_DVR_Cleanup();
}
//启动监听
String sLocalIP = "127.0.0.1"//本地监听IP
short sPort = 8100;//端口号(自定义)
lListenHandle = hCNetSDK.NET_DVR_StartListen_V30(sLocalIP, sPort,fmsgCallBack, pUser);
if(lListenHandle < 0)
{
System.out.println("启动监听失败,错误号:" + hCNetSDK.NET_DVR_GetLastError());
}
try {
//等待设备上传报警信息
Thread.sleep(600001);
} catch (InterruptedException e) {
e.printStackTrace();
}
//撤销布防上传通道
if(!hCNetSDK.NET_DVR_CloseAlarmChan_V30(nativeLong)){
//注销
hCNetSDK.NET_DVR_Logout(lUserID);
//释放SDK资源
hCNetSDK.NET_DVR_Cleanup();
}
//停止监听 lListenHandle是启动监听时返回值
hCNetSDK.NET_DVR_StopListen_V30(lListenHandle)
//注销用户
hCNetSDK.NET_DVR_Logout(lUserID);
//释放SDK资源
hCNetSDK.NET_DVR_Cleanup();
}
3. 回调函数
3.1 报警消息回调
实现HCNetSDK.FMSGCallBack是报警回调,实现该方法,在设备有报警时,报警消息会传过来
/**
* 报警消息回调
*/
public class FMSGCallBack implements HCNetSDK.FMSGCallBack
{
//lCommand 上传消息类型 pAlarmer 报警设备信息 pAlarmInfo 报警信息 dwBufLen 报警信息缓存大小 pUser 用户数据
//报警信息回调函数
public void invoke(int lCommand, NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser)
{
switch (lCommand){
/**
* 这里根据SDK获取
*/
case HCNetSDK.COMM_ALARMHOST_CID_ALARM:
NET_DVR_CID_ALARM strPlateResult = new NET_DVR_CID_ALARM();
strPlateResult.write();
strPlateResult.read();
try {
//处理自己的业务
//报警消息是字节流,需自己处理
System.out.println("报警信息:"+new String(pAlarmInfo.getByteArray(0, strPlateResult.size()), "gbk"));
}catch (Exception e){
e.printStackTrace();
}
break;
}
System.out.println("报警信息结束");
}
}
3.2 异常消息回调
实现HCNetSDK.FExceptionCallBack方法
//接收异常消息的回调函数
public class FExceptionCallBack implements HCNetSDK.FExceptionCallBack {
//接收异常消息的回调函数的外部实现
@Override
public void invoke(int dwType, int lUserID, int lHandle, Pointer pUser) {
switch(dwType)
{
case EXCEPTION_EXCHANGE: //用户交互时异常
System.out.println("用户交互时异常!!!"+lHandle);
break;
case EXCEPTION_PREVIEW: //网络预览时异常
System.out.println("网络预览时网络异常!!!"+lHandle);
break;
case 0x8015: //预览时重连成功
System.out.println("预览时重连成功!!!"+lHandle);
break;
case 0x8017:
System.out.println("用户交互恢复!!!"+lHandle);
break;
default:
System.out.println("异常");
break;
}
}
}
linux版
linux的库和Windows不同,库的导入可根据海康文档导入
HCNetSDK类也无需像Windows改变获取库的路径
HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary("hcnetsdk",
HCNetSDK.class);