SpringBoot通过海康威视sdk实现监控预警

2,172 阅读2分钟

本文属于是个人在项目实践以后的总结,可能因为个人技术水平的问题,存在一些不完善的地方,还请各位指点一下。 项目首先需要获取海康威视的sdk,这个可以去海康威视开发者平台去下载。需要将sdk文件夹中的dll等文件复制到自己的项目中。

image.png

公司的项目是需要一次性启动多个设备进行布防,同时前端页面操作设备数据的时候需要进行重新布防。

海康威视工具类

//海康威视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;
   }
}