海康威视热成像实时测温java - 23版

在20年写了一篇实时测温demo博客,看来帮了不少人。今天刚好又有需求,需要采温。也碰到了不少问题,特此记录

1、环境

摄像头:海康 型号:DS-2TD2528T-7/Q  序列:EA0406775

服务器:winServer 

JDK8

2、调试

之前写的demo下载下来。

先把lib 放在D盘下,这边的lib仅限于win64的,如果是其他平台。

海康官网平台下载

后续把账号密码一改,直接发布试一下。

结果

排查故障

询问海康

配置开启功能

登录之后,配置

有些用户会发现,没有本地这一项,那么请看下图。下载插件,刷新即可。

等我配置好之后,重启之后还是code11。静下心来,自己研究程序。

应该是哪里传值不对。

海康的人让我下载Demo看下,其实就是他们的一个测试exe。间接了解海康测温原理,抓图分析。这个工具可以很明显是摄像头没有配置好,还是程序有问题。

这边可以看到,是程序自己没有配置好。

开始琢磨。byRuleID 规则ID是1,我不是很明白 ,dwChan通道ID 是2没有问题。

最后查看相关文档,规则ID 普通模式下只能是0。专家模式下如果只获取对应ID的温度就输入对应规则ID。看图

普通模式和专家模式是互斥的。

最后程序调整下。成功了

3、上代码

runnable

/**
 * @author cmy
 * @date 2023/9/14 14:03
 */
@Slf4j
public class ReadDataThread implements Runnable {

    HCNetSDK hCNetSDK;
    ThermInfoCallback thermInfoCallback;
    DeviceBean bean;

    public ReadDataThread(HCNetSDK hCNetSDK, ThermInfoCallback thermInfoCallback, DeviceBean bean){
        this.hCNetSDK = hCNetSDK;
        this.thermInfoCallback = thermInfoCallback;
        this.bean = bean;
    }

    @Override
    public void run() {
        HCNetSDK.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V30();

        NativeLong lUserID = new NativeLong(-1);
        lUserID = hCNetSDK.NET_DVR_Login_V30(bean.getIp(),
                bean.getPort(), bean.getUserName(), bean.getPassWord(), m_strDeviceInfo);

        if (lUserID.longValue() == -1){
            log.error(bean.getIp()+"登录失败,错误码为"+hCNetSDK.NET_DVR_GetLastError());
            return;
        }else{
            log.info(bean.getIp()+"登录成功!"+lUserID);
        }


        HCNetSDK.NET_DVR_REALTIME_THERMOMETRY_COND thermometry = new HCNetSDK.NET_DVR_REALTIME_THERMOMETRY_COND();
        thermometry.dwSize = thermometry.size();
        thermometry.byRuleID = 0;
        thermometry.dwChan = 2;
        thermometry.write();
        Pointer pUserData = new Memory(37);
        //TODO 传数据
        pUserData.setString(0, bean.getIp());
        pUserData.setInt(13,222);



        while (true){
            NativeLong lHandle = hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, 3629, thermometry.getPointer(), thermometry.size(), thermInfoCallback, pUserData);

            if (lHandle.intValue() < 0){
                log.error(bean.getIp()+"NET_DVR_GET_REALTIME_THERMOMETRY failed, error code: "+ hCNetSDK.NET_DVR_GetLastError());
                break;
            }else{
                log.info(bean.getIp()+"NET_DVR_GET_REALTIME_THERMOMETRY is successful!");
            }
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }



//        if(!hCNetSDK.NET_DVR_StopRemoteConfig(lHandle)){
//            log.error(bean.getIp()+"NET_DVR_StopRemoteConfig failed, error code:"+ hCNetSDK.NET_DVR_GetLastError());
//        }
//
//        boolean logoutStatus = hCNetSDK.NET_DVR_Logout(lUserID);
//        if(logoutStatus){
//            log.info(bean.getIp()+"Logout success");
//        }else{
//            log.error(bean.getIp()+"Logout fail");
//        }
    }
}

main

static HCNetSDK hCNetSDK = HCNetSDK.INSTANCE;

    @Override
    public void run() {
        boolean initStatus = hCNetSDK.NET_DVR_Init();
        if(initStatus){
            log.info("初始化成功");
        }else{
            log.error("初始化失败"+hCNetSDK.NET_DVR_GetCardLastError_Card());
        }
        hCNetSDK.NET_DVR_SetConnectTime(2000, 1);
        hCNetSDK.NET_DVR_SetReconnect(10000, true);
        hCNetSDK.NET_DVR_SetLogToFile(3,"D:\\log",false);


        List<DeviceBean> deviceList = new ArrayList<>(3);
        deviceList.add(new DeviceBean("192.168.1.70",(short) 8000,"admin","a12345678"));
        deviceList.add(new DeviceBean("192.168.1.81",(short) 8000,"admin","a12345678"));
        deviceList.add(new DeviceBean("192.168.1.91",(short) 8000,"admin","a12345678"));




            for(DeviceBean bean : deviceList){
                new Thread(new ReadDataThread(hCNetSDK, new ThermInfoCallback(), bean)).start();
            }


    }

callback

@Slf4j
public class ThermInfoCallback implements HCNetSDK.FRemoteConfigCallback {
    @Override
    public void invoke(int dwType, Pointer pBuffer, int dwBufLen, Pointer pUserData) {

        log.info("dwType:"+dwType+"dwBufLen:"+dwBufLen+"pUserData:"+pUserData.getString(0));

        switch (dwType){
            case 0:
                HCNetSDK.REMOTECONFIGSTATUS struCfgStatus  = new HCNetSDK.REMOTECONFIGSTATUS();
                struCfgStatus.write();
                Pointer pCfgStatus = struCfgStatus.getPointer();
                pCfgStatus.write(0, pBuffer.getByteArray(0, struCfgStatus.size()), 0,struCfgStatus.size());
                struCfgStatus.read();

                int iStatus = 0;
                for(int i=0;i<4;i++)
                {
                    int ioffset = i*8;
                    int iByte = struCfgStatus.byStatus[i]&0xff;
                    iStatus = iStatus + (iByte << ioffset);
                }

                switch (iStatus){
                    case 1000:
                        log.error("实时测温回调成功,dwStatus:" + iStatus);
                        break;
                    case 1001:
                        log.error("正在获取实时测温回调数据中,dwStatus:" + iStatus);
                        break;
                    case 1002:
                        int iErrorCode = 0;
                        for(int i=0;i<4;i++)
                        {
                            int ioffset = i*8;
                            int iByte = struCfgStatus.byErrorCode[i]&0xff;
                            iErrorCode = iErrorCode + (iByte << ioffset);
                        }
                        log.error(pUserData.getString(0)+"获取实时测温回调数据失败, dwStatus:" + iStatus + "错误号:" + iErrorCode);
                        break;
                    default:
                        break;
                }
                break;
            case 2:
                HCNetSDK.NET_DVR_THERMOMETRY_UPLOAD m_struThermometryInfo = new HCNetSDK.NET_DVR_THERMOMETRY_UPLOAD();
                m_struThermometryInfo.write();
                Pointer pInfoV30 = m_struThermometryInfo.getPointer();
                pInfoV30.write(0, pBuffer.getByteArray(0, m_struThermometryInfo.size()), 0,m_struThermometryInfo.size());
                m_struThermometryInfo.read();

                if(m_struThermometryInfo.byRuleCalibType == 0){
                    System.out.println("点测温信息:"+ m_struThermometryInfo.struPointThermCfg.fTemperature);
                }
                if(m_struThermometryInfo.byRuleCalibType == 1 || m_struThermometryInfo.byRuleCalibType == 2){
                    log.info("框/线测温信息:fMaxTemperature__"+m_struThermometryInfo.struLinePolygonThermCfg.fMaxTemperature);
                    log.info("   fMinTemperature__"+m_struThermometryInfo.struLinePolygonThermCfg.fMinTemperature);
                    log.info("  fAverageTemperature__"+m_struThermometryInfo.struLinePolygonThermCfg.fAverageTemperature);
                    log.info("   fTemperatureDiff__"+m_struThermometryInfo.struLinePolygonThermCfg.fTemperatureDiff);
                    log.info("    fCenterPointTemperature__"+m_struThermometryInfo.fCenterPointTemperature);
                }
                break;
            default:
                break;
        }

    }
}

在此说明一下pUserData传值到callback,看此博客Pointer传值

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值