本文属于是个人在项目实践以后的总结,可能因为个人技术水平的问题,存在一些不完善的地方,还请各位指点一下。 项目首先需要获取海康威视的sdk,这个可以去海康威视开发者平台去下载。需要将sdk文件夹中的dll等文件复制到自己的项目中。
公司的项目是需要一次性启动多个设备进行布防,同时前端页面操作设备数据的时候需要进行重新布防。
海康威视工具类
//海康威视sdk文件的位置
static String WIN_PATH ="xxxx\resources\lib\HCNetSDK.dll";
static HCNetSDK hCNetSDK = (HCNetSDK) Native.loadLibrary(WIN_PATH , HCNetSDK.class);
static int lUserID = -1;//用户句柄 实现对设备登录
//项目中的方法
//1、初始化
public static int InitSDK(){
if (!hCNetSDK.NET_DVR_Init()) {
System.out.println("SDK初始化失败");
return -1;
}
return 1;
}
public static boolean SetDVRMessageCallBack(FMSGCallBack_V31 fMSFCallBack_V31,Pointer pUser){
return hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUser);
}
/**
* 注册登录
*
* @param m_sDeviceIP 设备ip
* @param m_sUsername 设备用户名
* @param m_sPassword 设备密码
* @param m_sPort 设备端口
* @return
*/
public static Integer login(String m_sDeviceIP, short m_sPort, String m_sUsername, String m_sPassword) {
// 初始化
HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();
lUserID = hCNetSDK.NET_DVR_Login_V30(m_sDeviceIP, m_sPort, m_sUsername, m_sPassword, m_strDeviceInfo);
System.out.println("UsID:" + lUserID);
if ((lUserID == -1) || (lUserID == 0xFFFFFFFF)) {
System.out.println("登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError());
hCNetSDK.NET_DVR_Cleanup();
return 0;
} else {
Map<String,String> maps =new HashMap<>();
maps.put("username",m_sUsername);
maps.put("password",m_sPassword);
if(IpUser.get(m_sDeviceIP) != null){
IpUser.remove(m_sDeviceIP);
}
IpUser.put(m_sDeviceIP,maps);
System.out.println(m_sDeviceIP+":设备登录成功!");
}
return lUserID;
}
/**
* 布防
*
* @param lUserID
* @return
*/
public static Integer setupAlarmChan(Integer lUserID, FMSGCallBack_V31 fmsgCallBack) {
//设置监听回调函数
if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fmsgCallBack, null)) {
System.out.println("设置回调函数失败");
}
//启用布防
int lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V30(lUserID);
if (lAlarmHandle< 0) {
hCNetSDK.NET_DVR_Logout(lUserID);
hCNetSDK.NET_DVR_Cleanup();
System.out.println("布防失败");
}
return lAlarmHandle;
}
/**
* 撤防
* @param lAlarmHandle 布防Id
* */
public boolean closeAlarmCha(Integer lAlarmHandle){
if(lAlarmHandle > -1){
if(!hCNetSDK.NET_DVR_CloseAlarmChan_V30(lAlarmHandle)){
System.out.println("撤防失败");
return false;
}else{
return true;
}
}else{
return false;
}
}
/**
* 注销
* @param IUserID 用户ID
* */
public Boolean logout(Integer IUserID){
hCNetSDK.NET_DVR_Logout(lUserID);
hCNetSDK.NET_DVR_Cleanup();
return true;
}
/**
*预警
**/
public static void alarmDataHandle(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser){
String sAlarmType = "lCommand=0x" + Integer.toHexString(lCommand);
//报警时间
String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
//序列号
String sSerialNumber = byteToString(pAlarmer.sSerialNumber);
//用户id
String lUserID = new String(String.valueOf(pAlarmer.lUserID));
//ip地址
String sDeviceIP = byteToString(pAlarmer.sDeviceIP);
String MonitoringSiteID;
System.out.println("报警事件类型: lCommand:" + Integer.toHexString(lCommand));
WarningEvent warningEvent=new WarningEvent();
WarningMessage message=null;
String type =null;
String IpName=null;
//lCommand是传的报警类型
switch (lCommand) {
//移动侦测
case HCNetSDK.COMM_ALARM_V30:
//报警类型
System.out.println("报警类型:移动侦测预警"+sAlarmType);
//设备序列号
System.out.println("设备序列号:"+sSerialNumber);
//用户id
System.out.println("用户id:"+ lUserID);
//设备ip
System.out.println("设备ip:"+sDeviceIP);
//当前时间
System.out.println("当前时间:"+date);
break;
}
}
方法类
将海康威视工具类中的方法进行整合,完成布放部分的接口
//equipment 为设备类,FMSGCallBack_V31为布放回调类
public Integer Task(Equipment equipment, FMSGCallBack_V31 fmsgCallBack){
String m_sDeviceIP =equipment.getIpAddress();
short m_sPort = Short.parseShort(equipment.getIpPort());
String m_sUsername = equipment.getUsername();
String m_sPassword = equipment.getPassword();
System.out.println(equipment.getName()+"正在连接。。。。。。。。。。");
Integer userId = HkwsCommonUtil.login(m_sDeviceIP,m_sPort,m_sUsername,m_sPassword);
if(userId != null){
if ((userId == -1) || (userId == 0xFFFFFFFF)){
System.out.println(m_sDeviceIP+"登录失败");
return -1;
}
if(HkwsCommonUtil.setupAlarmChan(userId,fmsgCallBack) == -1){
System.out.println(m_sDeviceIP+"布防失败");
}else{
System.out.println(m_sDeviceIP+"布防成功");
}
}
return userId;
}
FMSGCallBack_V31布防回调类
@Component
public class FMSGCallBack_V31 implements HCNetSDK.FMSGCallBack_V31 {
@Override
public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
//报警类型
HkwsCommonUtil.alarmDataHandle(lCommand,pAlarmer,pAlarmInfo,dwBufLen,pUser);
return true;
}
}
实现设备的注册和设置布放方法类
//布放回调函数需要是一个全局的
static FMSGCallBack_V31 fMSFCallBack_V31 = null;
public int executeAsyncTask(){
List<Equipment> list = service.GetLists();
//初始化SDK
if(HkwsCommonUtil.InitSDK() < 0){
return 0;
}
System.out.println("SDK初始化成功");
//设置报警回调函数
if (fMSFCallBack_V31 == null) {
fMSFCallBack_V31 = new FMSGCallBack_V31();
Pointer pUser = null;
if (!HkwsCommonUtil.SetDVRMessageCallBack(fMSFCallBack_V31, pUser)) {
System.out.println("设置回调函数失败!");
return 0;
}
}
maps=new HashMap<>();
for(Equipment equipment : list){
if(equipment.getStatus() == 1){
//当回调函数是全局的时候,每个设备的回调将反馈到一个上面,可以接收到所有的预警信息
Integer uid = hkwsProcess.Task(equipment,fMSFCallBack_V31);
//当设备登录失败的时候,将设备的状态修改成离线状态
if(uid != -1){
maps.put(equipment.getIpAddress(),uid);
}else{
//修改摄像头状态
equipment.setStatus(0);
service.saveOrUpdate(equipment);
}
}
}
if (maps.size() == list.size()){
return 1;
}else{
return 0;
}
}