java开发大华摄像头SDK实现动态报警

您好,实在不知道了。
大华摄像头的SDK
用java开发,实现人经过,动态报警功能

//初始化
      LoginModule.init(disConnect, haveReConnect);
//登录
            LoginModule.login("192.168.1.108", 37777, "admin", "qwer1234");
            fAlarmDataCB cbMessage = new fAlarmDataCB();
        netsdk.CLIENT_SetDVRMessCallBack(cbMessage, null);
        System.out.println("监听开始:" + netsdk.CLIENT_StartListenEx(LoginModule.m_hLoginHandle));
        try {
            Thread.sleep(500000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("登出");
        LoginModule.logout();

开始监听返回true
但不知道从哪里获取返回的报警信息,望解答

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/772603
  • 这篇博客你也可以参考下:虹软离线人脸识别java版本的SDK使用配置,也是整了半天才看明白一些,总结一下
  • 除此之外, 这篇博客: 使用腾讯云对象云存储进行上传文件(Java临时秘钥)及小程序SDK使用中的 官方方法一(推荐):后端通过获取临时密钥给到前端,前端计算签名 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    1. QCloundController.java
        // 临时秘钥配置
        TreeMap<String, Object> config = new TreeMap<String, Object>();
        Response credential = null; // 凭证结果
    
        try {
          config.put("SecretId", cosProperties.getSecretId());
          config.put("SecretKey", cosProperties.getSecretKey());
          config.put("durationSeconds", 1800); // 设置可使用事件1800秒 -> 30分钟
          config.put("bucket", cosProperties.getBucketName()); // 存储桶名
          config.put("region", cosProperties.getRegion()); // 地区
          // policy的resource => 前缀
          // 只允许访问: [avatar/*]
          config.put("allowPrefixes", new String[] {
                  cosProperties.getAvatarPrefix()
          });
    
          // 密钥的权限列表。必须在这里指定本次临时密钥所需要的权限。
          // 简单上传、表单上传和分片上传需要以下的权限,其他权限列表请看 https://cloud.tencent.com/document/product/436/31923
          config.put("allowActions", new String[] {
                  "name/cos:PutObject",// 简单上传
                  "name/cos:PostObject",// 表单上传、小程序上传
                  "name/cos:GetBucket", // 允许获取桶的对象列表
                  // 分片上传
                  "name/cos:InitiateMultipartUpload",
                  "name/cos:ListMultipartUploads",
                  "name/cos:ListParts",
                  "name/cos:UploadPart",
                  "name/cos:CompleteMultipartUpload"
          });
    
          //成功返回临时密钥信息,如下打印密钥信息
          credential = CosStsClient.getCredential(config);
        } catch (Exception e) {
          //失败抛出异常
          e.printStackTrace();
          throw new IllegalArgumentException("no valid secret !");
        }
        return Result.success(credential);
    

    allowPrefixes对应 policy的resource(原本是allowPrefix, 从源码中可以得出)

    allowActions对应policy的action

    policy更多了解:

    https://cloud.tencent.com/document/product/436/31923

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pg36OU2L-1632370381510)(/使用腾讯云对象云存储进行上传文件(Java临时秘钥)]12.png)

    2. 写完java后台就该写前端小程序了
    

    cos.ts

    // cos.ts
    const COS = require('cos-wx-sdk-v5');
    
    
    var cos = new COS({
      getAuthorization: function (options: any, callback: any) {
        console.log(options);
        
        wx.request({
          url: 'http://127.0.0.1:8080/qc/key',
          data: {
          },
          dataType: 'json',
          success: function (result: any) {
            var data = result.data.data;
            console.log(data);
            var credentials = data && data.credentials;
            if (!data || !credentials) return console.error('credentials invalid');
            callback({
              TmpSecretId: credentials.tmpSecretId,
              TmpSecretKey: credentials.tmpSecretKey,
              XCosSecurityToken: credentials.sessionToken,
              // 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
              StartTime: data.startTime, // 时间戳,单位秒,如:1580000000
              ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000900
            });
          }
        });
      }
    });
    
    export {
      cos
    }
    

    app.ts:app文件

    import { cos } from './COS/cos';
    
    App<IAppOption>({
      globalData: {
      },
      onLaunch() {
        cos.getBucket({
          Bucket: 'myblogspringboot-1300326898',
          Region: 'ap-nanjing',
          Prefix: 'avatar/', // 这里传入列出的myblogspringboot-1300326898/avatar下的所有文件
        }, function (err: any, data: any) {
          if (err) {
            console.log(err);
            return;
          }
          console.log(data, 2);
        });
      },
    })
    
    • 请求结果

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M9UMjP1U-1632370381511)(/使用腾讯云对象云存储进行上传文件(Java临时秘钥)]13.png)

  • 以下回答来自chatgpt:

    对于大华摄像头SDK实现人经过,动态报警功能,可以使用SDK提供的回调函数来获取报警信息。

    1.首先,需要先编写一个类来实现SDK提供的回调函数,例如:

    public class AlarmCallBack implements HCNetSDK.FMSGCallBack_V31 {
    
        @Override
        public void invoke(NativeLong lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen,
                           Pointer pUser) {
            switch (lCommand.intValue()) {
                case HCNetSDK.COMM_ALARM_RULE:
                    HCNetSDK.NET_VCA_RULE_ALARM pRule = new HCNetSDK.NET_VCA_RULE_ALARM(pAlarmInfo);
                    //可以在这里获取报警信息进行处理
                    break;
                //其他报警类型的处理
                default:
                    break;
            }
    
        }
    }
    

    2.在需要开启监听的地方,创建AlarmCallBack对象并注册为SDK的回调函数,例如:

    HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
    if (!hCNetSDK.NET_DVR_Init()) {
        //初始化SDK失败
        return false;
    }
    //登录设备
    //...
    //开启报警监听
    HCNetSDK.NET_DVR_SETUPALARM_PARAM setupAlarmParam = new HCNetSDK.NET_DVR_SETUPALARM_PARAM();
    setupAlarmParam.byAlarmInfoType = 1;  //低速网络下无法使用压缩版本的上传报警信息,需要使用纯IP方式上传,此处设置为1即可
    setupAlarmParam.byLevel = 1;  //报警信息分级,1表示普通级别
    NativeLong lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID, setupAlarmParam);
    if (lAlarmHandle.longValue() < 0) {
        //开启监听失败
        //...
    }
    //注册回调函数
    AlarmCallBack alarmCallBack = new AlarmCallBack();
    hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(alarmCallBack, null);
    

    3.在AlarmCallBack类中的invoke方法中,可以根据报警类型进行处理,例如:

    @Override
    public void invoke(NativeLong lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen,
                       Pointer pUser) {
        switch (lCommand.intValue()) {
            case HCNetSDK.COMM_ALARM_RULE:
                HCNetSDK.NET_VCA_RULE_ALARM pRule = new HCNetSDK.NET_VCA_RULE_ALARM(pAlarmInfo);
                //可以在这里获取报警信息进行处理
                //例如获取人脸坐标
                HCNetSDK.NET_VCA_RECT struRegion = pRule.struRegion;
                int dwFacePicLen = pRule.dwFacePicLen;
                Pointer pFacePicBuffer = pRule.pBuffer1;
                //使用OpenCV等开源库处理图片数据
                //...
                break;
            //其他报警类型的处理
            default:
                break;
        }
    
    }
    

    需要注意的是,该回调函数是在SDK线程中执行的,如果需要更新UI等操作,需要使用Android的Handler等方式进行处理。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^