在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;}@Overridepublic 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;@Overridepublic 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 {@Overridepublic 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传值