• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Java二次开发海康SDK-对接门禁机

武飞扬头像
半自定义大剑仙
帮助2

写在最前

SDK版本:CH-HCNetSDKV6.1.6.45_build20210302_win64

参考文档:海康SDK使用手册_V6.1

对接测试设备型号:DS-K1T671M

设备序列号:E50247795

业务目标

使用门禁设备实现对人脸的抓拍,将抓拍的人脸与其对应的数据进行上传。

业务流程图:

学新通

业务流程节点解释:

1.初始化SDK(NET_DVR_Init):进行海康提供开发库的载入,使用海康官方提供的文件库,进入之后,修改载入路径就可以了。

2.设置报警回调函数(NET_DVR_SetDVRMessageCallBack_V31):初始完SDK之后,进行报警回调函数的设置,当设备进行人脸抓拍之后,上传报警信息到SDK,触发回调函数进行内部业务逻辑处理。对于(门禁设备)人脸侦测,回调函数中的报警类型(lCommand)为COMM_ALARM_ACS,,报警信息(pAlarmInfo)对应结构体:NET_DVR_ACS_ALARM_INFO。

3.用户注册(NET_DVR_Login_V40):填写设备对应的设备参数,进行设备的注册,注册成功会返回一个lUserID,使用这个lUserID进行下面一系列的操作。

4.获取设备能力集(NET_DVR_GetDeviceAbility):能力集类型DEVICE_ABILITY_INFO,获取智能通道分析能力集可以判断设备是否支持相关功能。(可选功能)

5.设置人脸抓拍参数(NET_DVR_SetDVRConfig) (可选功能)

6.获取人脸抓拍参数(NET_DVR_GetDVRConfig) (可选功能)

7.报警布防(NET_DVR_SetupAlarmChan_v41):布防即建立设备跟客户端之间报警上传的连接通道,这样设备发生报警之后通过该连接上传报警信息,SDK在报警回调函数中接收和处理报警信息数据即可。如果设备同时支持人脸侦测和人脸抓拍方式,调用该接口时,NET_DVR_SETUPALARM_PARAM布防参数中byFaceAlarmDetection赋值为0即选择设备上传的报警信息类型为人脸抓拍类型。

注意:在报警布防中需要设置连接的参数,设置不对或没有设置会提示连接设备失败。

8.报警回调函数里面接收和处理数据:报警类型:COMM_ALARM_ACS,报警信息结构体:NET_DVR_ACS_ALARM_INFO。对设备上传来的数据信息进行接收

9.报警撤防(NET_DVR_CloseAlarmChan_v30)

10.注销用户(NET_DVR_logout)

11.释放SDK资源(NET_DVR_Cleanup):关闭连接通道,释放资源。

代码示例

1.首先根据你需要开发的系统去海康官网下载对应的程序包。

比如我的win64

学新通

2. 创建好springboot项目,将这个程序包里面的库文件引进去。

学新通

3. 将程序包里面它提供的 HCNetSDK.java 复制到你的项目里面,并修改你刚才放的库文件路径,注意以.dll结尾

学新通

4. 接下来就是写 demo 测试连接

  1.  
    package com.example.testsdk;
  2.  
     
  3.  
    import org.slf4j.Logger;
  4.  
    import org.slf4j.LoggerFactory;
  5.  
     
  6.  
    import java.io.IOException;
  7.  
     
  8.  
    /**
  9.  
    * @author LH
  10.  
    * @date 2021/11/29 10:37
  11.  
    */
  12.  
    public class startHCNetAlarm {
  13.  
     
  14.  
    private static final Logger LOGGER = LoggerFactory.getLogger(startHCNetAlarm.class);
  15.  
    // 载入sdk库文件
  16.  
    static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
  17.  
     
  18.  
    public static void main(String[] args) throws IOException {
  19.  
     
  20.  
    HCNetAlarm hcNetAlarm = new HCNetAlarm();
  21.  
    // 资源初始化
  22.  
    int row = hcNetAlarm.initDevice();
  23.  
    if (row == 1) {
  24.  
    LOGGER.info("初始化失败");
  25.  
    }
  26.  
     
  27.  
    // 设置连接超时时间与重连功能
  28.  
    hCNetSDK.NET_DVR_SetConnectTime(2000, 1);
  29.  
    hCNetSDK.NET_DVR_SetReconnect(10000, true);
  30.  
    // 设备注册,注册成功返回一个唯一标识符 lUserID,根据这个进行设备的其它操作
  31.  
    int luserID = hcNetAlarm.deviceRegister(-1, "填你设备的ip地址", "设备用户名", "设备密码", "设备端口,一般默认8000");
  32.  
    System.out.println(luserID);
  33.  
    // 设置报警回调函数,建立报警上传通道(启用布防)
  34.  
    int lAlarmHandle = hcNetAlarm.setupAlarmChan(luserID, -1);
  35.  
    // 检查设备状态(是否在线),打印设备信息
  36.  
    hcNetAlarm.onlineState(luserID);
  37.  
    // 设备抓拍功能,
  38.  
    // hcNetAlarm.getDVRPic(luserID);
  39.  
    try {
  40.  
    // 等待设备上传报警信息
  41.  
    LOGGER.info("等待设备上传报警信息====================");
  42.  
    Thread.sleep(100 * 60 * 60);
  43.  
    } catch (InterruptedException e) {
  44.  
    e.printStackTrace();
  45.  
    }
  46.  
     
  47.  
    // 撤销布防上传通道
  48.  
    hcNetAlarm.closeAlarmChan(lAlarmHandle);
  49.  
    // 注销 释放sdk资源
  50.  
    hcNetAlarm.logout(luserID);
  51.  
    System.out.println("====== 设备注销 ======");
  52.  
    }
  53.  
    }
学新通
  1.  
    package com.example.testsdk;
  2.  
     
  3.  
    import com.sun.jna.NativeLong;
  4.  
    import com.sun.jna.Pointer;
  5.  
    import com.sun.jna.ptr.IntByReference;
  6.  
    import org.slf4j.Logger;
  7.  
    import org.slf4j.LoggerFactory;
  8.  
     
  9.  
    import java.io.File;
  10.  
    import java.io.FileNotFoundException;
  11.  
    import java.io.FileOutputStream;
  12.  
    import java.io.IOException;
  13.  
    import java.nio.ByteBuffer;
  14.  
    import java.text.DateFormat;
  15.  
    import java.text.SimpleDateFormat;
  16.  
    import java.util.Arrays;
  17.  
    import java.util.Date;
  18.  
     
  19.  
    /**
  20.  
    * @author LH
  21.  
    * @date 2021/11/29 9:06
  22.  
    */
  23.  
    public class HCNetAlarm {
  24.  
     
  25.  
    private static final Logger LOGGER = LoggerFactory.getLogger(HCNetAlarm.class);
  26.  
     
  27.  
    // 载入sdk库文件
  28.  
    static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;
  29.  
     
  30.  
    // 设备登录信息
  31.  
    HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();
  32.  
    // 设备信息
  33.  
    HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();
  34.  
    // 已登录设备的IP
  35.  
    String m_sDeviceIP;
  36.  
    // 设备用户名
  37.  
    String m_sUsername;
  38.  
    // 设备密码
  39.  
    String m_sPassword;
  40.  
    // 报警回调函数实现
  41.  
    public static HCNetSDK.FMSGCallBack_V31 fMSFCallBack_V31;
  42.  
     
  43.  
    /**
  44.  
    * sdk初始化
  45.  
    *
  46.  
    * @return
  47.  
    */
  48.  
    public int initDevice() {
  49.  
    if (!hCNetSDK.NET_DVR_Init()) {
  50.  
    // sdk初始化失败
  51.  
    return 1;
  52.  
    }
  53.  
    return 0;
  54.  
    }
  55.  
     
  56.  
    /**
  57.  
    * 注销
  58.  
    *
  59.  
    * @param lUserID 设备注册成功唯一标识符
  60.  
    */
  61.  
    public void logout(int lUserID) {
  62.  
    // 注销
  63.  
    hCNetSDK.NET_DVR_Logout(lUserID);
  64.  
    // 释放sdk资源
  65.  
    hCNetSDK.NET_DVR_Cleanup();
  66.  
    }
  67.  
     
  68.  
     
  69.  
    /**
  70.  
    * 设备注册
  71.  
    *
  72.  
    * @param ip 设备ip
  73.  
    * @param name 设备名
  74.  
    * @param password 设备密码
  75.  
    */
  76.  
    public int deviceRegister(int lUserID, String ip, String name, String password, String port) {
  77.  
    // 设备注册之前先进行判断,注销已注册的设备
  78.  
    if (lUserID > -1) {
  79.  
    // 先注销
  80.  
    hCNetSDK.NET_DVR_Logout(lUserID);
  81.  
    lUserID = -1;
  82.  
    }
  83.  
    // ip地址
  84.  
    m_sDeviceIP = ip;
  85.  
    m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
  86.  
    System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());
  87.  
    // 设备用户名
  88.  
    m_sUsername = name;
  89.  
    m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
  90.  
    System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());
  91.  
    // 设备密码
  92.  
    m_sPassword = password;
  93.  
    m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
  94.  
    System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());
  95.  
    m_strLoginInfo.wPort = (short) Integer.parseInt(port);
  96.  
    // 是否异步登录:0 - 否,1 - 是
  97.  
    m_strLoginInfo.bUseAsynLogin = false;
  98.  
    m_strLoginInfo.write();
  99.  
    // 设备注册调用 NET_DVR_Login_V40,注册成功得到唯一标识符 lUserID
  100.  
    // 设备注册失败,调用 NET_DVR_GetLastError,根据错误号判断错误类型
  101.  
    lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
  102.  
    if (lUserID == -1) {
  103.  
    LOGGER.info("设备注册失败,错误号:", hCNetSDK.NET_DVR_GetLastError());
  104.  
    return -1;
  105.  
    } else {
  106.  
    LOGGER.info("设备注册成功");
  107.  
    return lUserID;
  108.  
    }
  109.  
    }
  110.  
     
  111.  
    /**
  112.  
    * 设置报警信息回调函数,根据上传的数据进行回调触发
  113.  
    */
  114.  
    public class FMSGCallBack_V31 implements HCNetSDK.FMSGCallBack_V31 {
  115.  
    // lCommand 上传消息类型,这个是设备上传的数据类型,比如现在测试的门禁设备,回传回来的是 COMM_ALARM_ACS = 0x5002; 门禁主机报警信息
  116.  
    // pAlarmer 报警设备信息
  117.  
    // pAlarmInfo 报警信息 根据 lCommand 来选择接收的报警信息数据结构
  118.  
    // dwBufLen 报警信息缓存大小
  119.  
    // pUser 用户数据
  120.  
    @Override
  121.  
    public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
  122.  
    alarmDataHandle(lCommand, pAlarmer, pAlarmInfo, dwBufLen, pUser);
  123.  
    return true;
  124.  
    }
  125.  
    }
  126.  
     
  127.  
     
  128.  
    /**
  129.  
    * 建立布防上传通道,用于传输数据
  130.  
    *
  131.  
    * @param lUserID 唯一标识符
  132.  
    * @param lAlarmHandle 报警处理器
  133.  
    */
  134.  
    public int setupAlarmChan(int lUserID, int lAlarmHandle) {
  135.  
    // 根据设备注册生成的lUserID建立布防的上传通道,即数据的上传通道
  136.  
    if (lUserID == -1) {
  137.  
    LOGGER.info("请先注册");
  138.  
    return lUserID;
  139.  
    }
  140.  
    if (lAlarmHandle < 0) {
  141.  
    // 设备尚未布防,需要先进行布防
  142.  
    if (fMSFCallBack_V31 == null) {
  143.  
    fMSFCallBack_V31 = new FMSGCallBack_V31();
  144.  
    Pointer pUser = null;
  145.  
    if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUser)) {
  146.  
    LOGGER.info("设置回调函数失败!", hCNetSDK.NET_DVR_GetLastError());
  147.  
    }
  148.  
    }
  149.  
    // 这里需要对设备进行相应的参数设置,不设置或设置错误都会导致设备注册失败
  150.  
    HCNetSDK.NET_DVR_SETUPALARM_PARAM m_strAlarmInfo = new HCNetSDK.NET_DVR_SETUPALARM_PARAM();
  151.  
    m_strAlarmInfo.dwSize = m_strAlarmInfo.size();
  152.  
    // 智能交通布防优先级:0 - 一等级(高),1 - 二等级(中),2 - 三等级(低)
  153.  
    m_strAlarmInfo.byLevel = 1;
  154.  
    // 智能交通报警信息上传类型:0 - 老报警信息(NET_DVR_PLATE_RESULT), 1 - 新报警信息(NET_ITS_PLATE_RESULT)
  155.  
    m_strAlarmInfo.byAlarmInfoType = 1;
  156.  
    // 布防类型(仅针对门禁主机、人证设备):0 - 客户端布防(会断网续传),1 - 实时布防(只上传实时数据)
  157.  
    m_strAlarmInfo.byDeployType = 1;
  158.  
    // 抓拍,这个类型要设置为 0 ,最重要的一点设置
  159.  
    m_strAlarmInfo.byFaceAlarmDetection = 0;
  160.  
    m_strAlarmInfo.write();
  161.  
    // 布防成功,返回布防成功的数据传输通道号
  162.  
    lAlarmHandle = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID, m_strAlarmInfo);
  163.  
    if (lAlarmHandle == -1) {
  164.  
    LOGGER.info("设备布防失败,错误码=========={}", hCNetSDK.NET_DVR_GetLastError());
  165.  
    // 注销 释放sdk资源
  166.  
    logout(lUserID);
  167.  
    return lAlarmHandle;
  168.  
    } else {
  169.  
    LOGGER.info("设备布防成功");
  170.  
    return lAlarmHandle;
  171.  
    }
  172.  
    }
  173.  
    return lAlarmHandle;
  174.  
    }
  175.  
     
  176.  
    /**
  177.  
    * 报警撤防
  178.  
    *
  179.  
    * @param lAlarmHandle 报警处理器
  180.  
    */
  181.  
    public int closeAlarmChan(int lAlarmHandle) {
  182.  
    if (lAlarmHandle > -1) {
  183.  
    if (hCNetSDK.NET_DVR_CloseAlarmChan_V30(lAlarmHandle)) {
  184.  
    LOGGER.info("撤防成功");
  185.  
    lAlarmHandle = -1;
  186.  
    return lAlarmHandle;
  187.  
    }
  188.  
    return lAlarmHandle;
  189.  
    }
  190.  
    return lAlarmHandle;
  191.  
    }
  192.  
     
  193.  
    /**
  194.  
    * 接收设备上传的报警信息,进行上传数据的业务逻辑处理
  195.  
    *
  196.  
    * @param lCommand 上传消息类型
  197.  
    * @param pAlarmer 报警设备信息
  198.  
    * @param pAlarmInfo 报警信息
  199.  
    * @param dwBufLen 报警信息缓存大小
  200.  
    * @param pUser 用户数据
  201.  
    */
  202.  
    public void alarmDataHandle(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
  203.  
    System.out.println("报警监听中================================");
  204.  
    System.out.println(pAlarmInfo);
  205.  
     
  206.  
    String sAlarmType = new String();
  207.  
    String[] newRow = new String[3];
  208.  
    //报警时间
  209.  
    Date today = new Date();
  210.  
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  211.  
    String[] sIP = new String[2];
  212.  
     
  213.  
    sAlarmType = new String("lCommand=0x") Integer.toHexString(lCommand);
  214.  
    // lCommand是传的报警类型
  215.  
    switch (lCommand) {
  216.  
    // 摄像头实时人脸抓拍上传
  217.  
    case HCNetSDK.COMM_UPLOAD_FACESNAP_RESULT:
  218.  
    // 分配存储空间
  219.  
    HCNetSDK.NET_VCA_FACESNAP_RESULT strFaceSnapInfo = new HCNetSDK.NET_VCA_FACESNAP_RESULT();
  220.  
    strFaceSnapInfo.write();
  221.  
    Pointer pFaceSnapInfo = strFaceSnapInfo.getPointer();
  222.  
     
  223.  
    // 写入传入数据
  224.  
    pFaceSnapInfo.write(0, pAlarmInfo.getByteArray(0, strFaceSnapInfo.size()), 0, strFaceSnapInfo.size());
  225.  
    strFaceSnapInfo.read();
  226.  
    sAlarmType = sAlarmType ":人脸抓拍上传[人脸评分:" strFaceSnapInfo.dwFaceScore ",年龄:" strFaceSnapInfo.struFeature.byAge ",性别:" strFaceSnapInfo.struFeature.bySex "]";
  227.  
    newRow[0] = dateFormat.format(today);
  228.  
    // 报警类型
  229.  
    newRow[1] = sAlarmType;
  230.  
    // 报警设备IP地址
  231.  
    sIP = new String(strFaceSnapInfo.struDevInfo.struDevIP.sIpV4).split("\0", 2);
  232.  
    newRow[2] = sIP[0];
  233.  
    LOGGER.info("人脸抓拍========{}", Arrays.toString(newRow));
  234.  
    // 设置日期格式
  235.  
    SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
  236.  
    // new Date()为获取当前系统时间
  237.  
    String time = df.format(new Date());
  238.  
     
  239.  
    // 人脸图片写文件
  240.  
    File file = new File(System.getProperty("user.dir") "\\pic1\\");
  241.  
    if (!file.exists()) {
  242.  
    file.mkdir();
  243.  
    }
  244.  
    try {
  245.  
    FileOutputStream big = new FileOutputStream(System.getProperty("user.dir") "\\pic1\\" time "background.jpg");
  246.  
    if (strFaceSnapInfo.dwFacePicLen > 0) {
  247.  
    if (strFaceSnapInfo.dwFacePicLen > 0) {
  248.  
    try {
  249.  
    big.write(strFaceSnapInfo.pBuffer2.getByteArray(0, strFaceSnapInfo.dwBackgroundPicLen), 0, strFaceSnapInfo.dwBackgroundPicLen);
  250.  
    big.close();
  251.  
    } catch (IOException e) {
  252.  
    e.printStackTrace();
  253.  
    }
  254.  
    }
  255.  
    }
  256.  
    } catch (FileNotFoundException e) {
  257.  
    e.printStackTrace();
  258.  
    }
  259.  
    break;
  260.  
    // 门禁主机类型实时人脸抓拍上传,走这里
  261.  
    case HCNetSDK.COMM_ALARM_ACS:
  262.  
    // 分配存储空间
  263.  
    System.out.println("============ 这是门禁主机的报警信息 ============");
  264.  
    HCNetSDK.NET_DVR_ACS_ALARM_INFO strFaceSnapInfo1 = new HCNetSDK.NET_DVR_ACS_ALARM_INFO();
  265.  
    strFaceSnapInfo1.write();
  266.  
    Pointer pFaceSnapInfo1 = strFaceSnapInfo1.getPointer();
  267.  
     
  268.  
    // 写入传入数据
  269.  
    pFaceSnapInfo1.write(0, pAlarmInfo.getByteArray(0, strFaceSnapInfo1.size()), 0, strFaceSnapInfo1.size());
  270.  
    strFaceSnapInfo1.read();
  271.  
    // 设置日期格式
  272.  
    SimpleDateFormat df1 = new SimpleDateFormat("yyyyMMddHHmmss");
  273.  
    // new Date()为获取当前系统时间
  274.  
    String time1 = df1.format(new Date());
  275.  
     
  276.  
    // 人脸图片写文件
  277.  
    File file1 = new File(System.getProperty("user.dir") "\\pic3\\");
  278.  
    if (!file1.exists()) {
  279.  
    file1.mkdir();
  280.  
    }
  281.  
    try {
  282.  
    FileOutputStream big = new FileOutputStream(System.getProperty("user.dir") "\\pic3\\" time1 ".jpg");
  283.  
    if (strFaceSnapInfo1.dwPicDataLen > 0) {
  284.  
    System.out.println("========== 图片有数据 ========");
  285.  
    if (strFaceSnapInfo1.dwPicDataLen > 0) {
  286.  
    try {
  287.  
    System.out.println("============ 图片上传成功 =============");
  288.  
    big.write(strFaceSnapInfo1.pPicData.getByteArray(0, strFaceSnapInfo1.dwPicDataLen), 0, strFaceSnapInfo1.dwPicDataLen);
  289.  
    big.close();
  290.  
    System.out.println("设备唯一编码=================" strFaceSnapInfo1.struAcsEventInfo.byDeviceNo);
  291.  
    System.out.println("数据采集时间=================" strFaceSnapInfo1.struTime.dwYear strFaceSnapInfo1.struTime.dwMonth strFaceSnapInfo1.struTime.dwDay strFaceSnapInfo1.struTime.dwHour strFaceSnapInfo1.struTime.dwMinute strFaceSnapInfo1.struTime.dwSecond);
  292.  
    System.out.println("人员工号=================" strFaceSnapInfo1.struAcsEventInfo.dwEmployeeNo);
  293.  
    System.out.println("人员姓名=================" strFaceSnapInfo1.sNetUser);
  294.  
    System.out.println("通进类型(0:入场,1:离场)=================" strFaceSnapInfo1.struAcsEventInfo.dwDoorNo);
  295.  
    System.out.println("图片唯一标识(工号加时间)=================" strFaceSnapInfo1.struAcsEventInfo.dwEmployeeNo time1 ".jpg");
  296.  
    System.out.println("人员类型(0:白名单,1:访客,2:黑名单)=================" strFaceSnapInfo1.struAcsEventInfo.byCardType);
  297.  
    } catch (IOException e) {
  298.  
    e.printStackTrace();
  299.  
    }
  300.  
    }
  301.  
    }
  302.  
    } catch (FileNotFoundException e) {
  303.  
    e.printStackTrace();
  304.  
    }
  305.  
    break;
  306.  
    default:
  307.  
    newRow[0] = dateFormat.format(today);
  308.  
    // 报警类型
  309.  
    newRow[1] = sAlarmType;
  310.  
    // 报警设备IP地址
  311.  
    sIP = new String(pAlarmer.sDeviceIP).split("\0", 2);
  312.  
    newRow[2] = sIP[0];
  313.  
    LOGGER.info("其他报警信息=========={}", Arrays.toString(newRow));
  314.  
    break;
  315.  
    }
  316.  
    }
  317.  
     
  318.  
    // 抓拍图片
  319.  
    public static void getDVRPic(int userId) throws IOException {
  320.  
    // 设置通道号,其中 1 正常,-1不正常
  321.  
    NativeLong chanLong = new NativeLong(1);
  322.  
    // 返回Boolean值,判断是否获取设备能力
  323.  
    HCNetSDK.NET_DVR_WORKSTATE_V30 devwork = new HCNetSDK.NET_DVR_WORKSTATE_V30();
  324.  
    if (!hCNetSDK.NET_DVR_GetDVRWorkState_V30(userId, devwork)) {
  325.  
    System.out.println("返回设备状态失败");
  326.  
    }
  327.  
    // JPEG图像信息结构体
  328.  
    HCNetSDK.NET_DVR_JPEGPARA jpeg = new HCNetSDK.NET_DVR_JPEGPARA();
  329.  
    jpeg.wPicSize = 2; // 设置图片的分辨率
  330.  
    jpeg.wPicQuality = 2; // 设置图片质量
  331.  
    IntByReference a = new IntByReference();
  332.  
    SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmss");
  333.  
    Date date = new Date();
  334.  
    int random = (int) (Math.random() * 1000);
  335.  
    String fileNameString = sdf.format(date) random ".jpg";
  336.  
    // 设置字节缓存
  337.  
    ByteBuffer jpegBuffer = ByteBuffer.allocate(1024 * 1024);
  338.  
    // 抓图到文件
  339.  
    boolean is = hCNetSDK.NET_DVR_CaptureJPEGPicture(userId, chanLong.intValue(), jpeg, fileNameString);
  340.  
    if (is) {
  341.  
    System.out.println("图片抓取成功,返回长度:" a.getValue());
  342.  
    } else {
  343.  
    System.out.println("图片抓取失败:" hCNetSDK.NET_DVR_GetLastError());
  344.  
     
  345.  
    }
  346.  
    }
  347.  
     
  348.  
    /**
  349.  
    * 设备状态,是否在线,打印设备信息
  350.  
    */
  351.  
    public Boolean onlineState(int lUserID) {
  352.  
    HCNetAlarm hcNetAlarm = new HCNetAlarm();
  353.  
    int row = hcNetAlarm.initDevice();
  354.  
    if (row == 1) {
  355.  
    LOGGER.info("初始化失败");
  356.  
    }
  357.  
    // 检查设备在线状态
  358.  
    LOGGER.info("设备信息========={}", hcNetAlarm.m_strDeviceInfo.struDeviceV30);
  359.  
    boolean isOnLine = hCNetSDK.NET_DVR_RemoteControl(lUserID, 20005, null, 0);
  360.  
    LOGGER.info("checkDeviceOnLine---isOnLine============{}", isOnLine);
  361.  
    return isOnLine;
  362.  
    }
  363.  
    }
学新通

写在结尾

遇到的问题:无法上传图片。(官方文档有点坑)

可能原因:刚开始以为是设备不支持抓拍功能。

解决方式:一遍一遍地阅读官方文档,换了一个又一个接口,最后发现,官方文档上提示的抓拍功能流程图是基于海康摄像头的,但是我使用的设备是海康的门禁设备,两者虽然大体相似,但是还是有不同之处,对于不同的设备需要进行不同的判断。

如这次使用的设备是门禁设备,首先根据触发回调返回的lCommand 进行设备区分,本次测试返回的 lCommand = 0x5002, 即门禁主机报警信息,然后去官方文档上查看对应的sdk接收信息体,为NET_DVR_ACS_ALARM_INFO。这样才能正确接收设备传过来的数据,也能得到上传的图片及其对应的人员信息。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhiagkbf
系列文章
更多 icon
同类精品
更多 icon
继续加载