ard-work/src/main/java/com/ruoyi/device/camera/service/ICameraSdkService.java
@@ -3,9 +3,6 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.device.camera.domain.ArdCameras; import com.ruoyi.device.camera.domain.CameraCmd; import org.springframework.scheduling.annotation.Async; import javax.servlet.http.HttpServletResponse; import java.util.Map; public interface ICameraSdkService { @@ -108,6 +105,10 @@ //本地录像开始 AjaxResult localRecordStart(CameraCmd cmd); //本地录像停止 AjaxResult localRecordStop(CameraCmd cmd); //修正俯仰值 Double correctPitch(CameraCmd cmd); } ard-work/src/main/java/com/ruoyi/device/camera/service/impl/CameraSdkServiceImpl.java
@@ -18,6 +18,8 @@ import com.ruoyi.device.camera.factory.CameraSDKFactory; import com.ruoyi.device.noguidezone.domain.ArdCameraNoGuideZone; import com.ruoyi.device.noguidezone.service.IArdCameraNoGuideZoneService; import com.ruoyi.device.terrain.domain.ArdTerrainMark; import com.ruoyi.device.terrain.service.IArdTerrainMarkService; import com.ruoyi.utils.gis.GisUtil; import com.ruoyi.utils.gis.Point; import com.ruoyi.utils.sdk.common.GlobalVariable; @@ -26,8 +28,10 @@ import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; /** @@ -49,6 +53,8 @@ private IArdAlarmpointsWellService ardAlarmpointsWellService; @Resource private IArdCameraNoGuideZoneService ardCameraNoGuideZoneService; @Resource private IArdTerrainMarkService ardTerrainMarkService; /** * 启动线程方法,用于执行初始化登录相机的逻辑 @@ -505,6 +511,37 @@ } } /** * @return * @Author 刘苏义 * @Description 修正俯仰值(根据相机ID获取500米范围内的地形参数集合,计算平均值加上T值) * @Date 2024/6/22 11:16 * @Param */ @Override public Double correctPitch(CameraCmd cmd) { Double pitchAngle = 0.0; try { double[] targetPositions = cmd.getTargetPosition(); ArdTerrainMark ardTerrainMark = new ArdTerrainMark(); ardTerrainMark.setCameraId(cmd.getCameraId()); List<ArdTerrainMark> ardTerrainMarks = ardTerrainMarkService.selectArdTerrainMarkList(ardTerrainMark); //过滤500米范围内的集合 ardTerrainMarks = ardTerrainMarks.stream().filter(n -> GisUtil.getDistance(targetPositions, new double[]{n.getLongitude(), n.getLatitude(), n.getAltitude()}) <= 500).collect(Collectors.toList()); //计算T平均值 OptionalDouble averageT = ardTerrainMarks.stream().mapToDouble(ArdTerrainMark::getT).average(); // 输出 if (averageT.isPresent()) { pitchAngle = averageT.getAsDouble(); log.debug("修正俯仰值:" + pitchAngle); } } catch (Exception ex) { log.error("修正俯仰值异常:" + ex.getMessage()); } return pitchAngle; } //引导指向井 @Override public AjaxResult guideTargetWell(CameraCmd cmd) { @@ -549,17 +586,17 @@ case 1: if (ardWellGuideCamera.getP1() != null) { ptzMap = new HashMap<>(); ptzMap.put("p", ardWellGuideCamera.getP1()); ptzMap.put("t", ardWellGuideCamera.getT1()); ptzMap.put("z", ardWellGuideCamera.getZ1()); ptzMap.put("p" , ardWellGuideCamera.getP1()); ptzMap.put("t" , ardWellGuideCamera.getT1()); ptzMap.put("z" , ardWellGuideCamera.getZ1()); } break; case 2: if (ardWellGuideCamera.getP2() != null) { ptzMap = new HashMap<>(); ptzMap.put("p", ardWellGuideCamera.getP2()); ptzMap.put("t", ardWellGuideCamera.getT2()); ptzMap.put("z", ardWellGuideCamera.getZ2()); ptzMap.put("p" , ardWellGuideCamera.getP2()); ptzMap.put("t" , ardWellGuideCamera.getT2()); ptzMap.put("z" , ardWellGuideCamera.getZ2()); } break; @@ -587,9 +624,9 @@ } //按井坐标开始引导 if (!guideTargetPosition(cmd).get("code").equals(200)) { return AjaxResult.warn("井坐标引导失败", "cameraId:" + cameraId); return AjaxResult.warn("井坐标引导失败" , "cameraId:" + cameraId); } return AjaxResult.success("井坐标引导成功", "cameraId:" + cameraId); return AjaxResult.success("井坐标引导成功" , "cameraId:" + cameraId); } ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java
@@ -16,6 +16,7 @@ import com.ruoyi.device.camera.domain.ArdCameras; import com.ruoyi.device.camera.domain.CameraCmd; import com.ruoyi.device.camera.service.IArdCamerasService; import com.ruoyi.device.camera.service.ICameraSdkService; import com.ruoyi.device.channel.domain.ArdChannel; import com.ruoyi.device.channel.service.IArdChannelService; import com.ruoyi.media.domain.Vtdu; @@ -74,6 +75,9 @@ private IArdChannelService ardChannelService; @Resource private IVtduService vtduService; @Resource ICameraSdkService cameraSdkService; @Value("${minio.endpoint}") private String minioEndPoint; @Resource @@ -407,9 +411,9 @@ float t = (float) dh_ptz_location_info.nPTZTilt / 10 * -1; String nPTZTilt = df.format(t < 0 ? t + 360 : t); String nPTZZoom = df.format((float) dh_ptz_location_info.nPTZZoom); ptzMap.put("p", nPTZPan); ptzMap.put("t", nPTZTilt); ptzMap.put("z", nPTZZoom); ptzMap.put("p" , nPTZPan); ptzMap.put("t" , nPTZTilt); ptzMap.put("z" , nPTZZoom); return AjaxResult.success(ptzMap); } @@ -587,7 +591,7 @@ // return false; //} log.debug("本地录像开始"); return AjaxResult.success("本地录像开始", lRealHandle); return AjaxResult.success("本地录像开始" , lRealHandle); } catch (Exception ex) { log.error("本地录像开始异常" + ex.getMessage()); return AjaxResult.error("本地录像开始异常" + ex.getMessage()); @@ -781,8 +785,11 @@ double[] cameraPositon = new double[]{cameras.getLongitude(), cameras.getLatitude(), cameras.getAltitude()}; double[] targetPositions = cmd.getTargetPosition(); double[] cameraPTZ = GisUtil.getCameraPTZ(cameraPositon, targetPositions, 20, 150); //修正俯仰 double correctPitch = cameraSdkService.correctPitch(cmd); double newt = cameraPTZ[1] + correctPitch; int p = (int) (cameraPTZ[0] * 10); int t = (int) (cameraPTZ[1] * 10); int t = (int) (newt * 10); int z = (int) (cameraPTZ[2]); boolean bool = netsdk.CLIENT_DHPTZControlEx(loginId, chanNo - 1, NetSDKLib.NET_EXTPTZ_ControlType.NET_EXTPTZ_EXACTGOTO, p, t, z, 0); if (!bool) { @@ -1103,10 +1110,10 @@ int nHeight = cfg_encode_info.stuMainStream[0].stuVideoFormat.nHeight; String resolution = nWidth + "*" + nHeight; float nFrameRate = cfg_encode_info.stuMainStream[0].stuVideoFormat.nFrameRate; map.put("resolution", resolution);//分辨率 map.put("videoBitrate", String.valueOf(nBitRate));//比特率 map.put("videoEncType", videoEncType);//编码 map.put("nFrameRate", String.valueOf(nFrameRate));//帧率 map.put("resolution" , resolution);//分辨率 map.put("videoBitrate" , String.valueOf(nBitRate));//比特率 map.put("videoEncType" , videoEncType);//编码 map.put("nFrameRate" , String.valueOf(nFrameRate));//帧率 } } catch (Exception ex) { log.error("取码流压缩参数异常:" + ex.getMessage()); @@ -1133,8 +1140,8 @@ float nAngelH = (float) dh_out_ptz_view_range_status.nAngelH / 10; float nAngelV = (float) dh_out_ptz_view_range_status.nAngelV / 10; Map<String, Object> map = getPtz(cmd);//获取ptz map.put("fHorFieldAngle", nAngelH);// 水平视场角 map.put("fVerFieldAngle", nAngelV);// 垂直视场角 map.put("fHorFieldAngle" , nAngelH);// 水平视场角 map.put("fVerFieldAngle" , nAngelV);// 垂直视场角 return AjaxResult.success(map); } catch (Exception ex) { log.error("获取云台可视域异常" + ex.getMessage()); ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
@@ -15,8 +15,11 @@ import com.ruoyi.device.camera.factory.CameraSDK; import com.ruoyi.device.camera.domain.ArdCameras; import com.ruoyi.device.camera.domain.CameraCmd; import com.ruoyi.device.camera.service.ICameraSdkService; import com.ruoyi.device.channel.domain.ArdChannel; import com.ruoyi.device.channel.service.IArdChannelService; import com.ruoyi.device.terrain.domain.ArdTerrainMark; import com.ruoyi.device.terrain.service.IArdTerrainMarkService; import com.ruoyi.media.domain.Vtdu; import com.ruoyi.media.service.IVtduService; import com.ruoyi.utils.gis.GisUtil; @@ -43,6 +46,7 @@ import java.text.DecimalFormat; import java.util.*; import java.util.concurrent.PriorityBlockingQueue; import java.util.stream.Collectors; import static com.ruoyi.utils.sdk.hiksdk.lib.HCNetSDK.*; import static com.ruoyi.utils.sdk.hiksdk.lib.HCNetSDK.NET_DVR_GET_GISINFO; @@ -64,7 +68,8 @@ private IVtduService vtduService; @Resource private QueueHandler queueHandler; @Resource ICameraSdkService cameraSdkService; public Object _lock = new Object(); public static HCNetSDK hCNetSDK = HCNetSDK.hCNetSDK; private static HCNetSDK.FExceptionCallBack fExceptionCallBack;//异常回调 @@ -89,7 +94,7 @@ String WIN_PATH = System.getProperty("user.dir") + File.separator + "ardLog" + File.separator + "logs" + File.separator; hCNetSDK.NET_DVR_SetLogToFile(3, WIN_PATH, true); } else { hCNetSDK.NET_DVR_SetLogToFile(3, "/home/ardLog/hiklog", true); hCNetSDK.NET_DVR_SetLogToFile(3, "/home/ardLog/hiklog" , true); } String m_sDeviceIP = camera.getIp(); String m_sUsername = camera.getUsername(); @@ -168,7 +173,7 @@ createGuideQueue(camera); return AjaxResult.success("设备登录成功"); } catch (Exception ex) { log.error("设备登录异常", ex); log.error("设备登录异常" , ex); return AjaxResult.error("设备登录异常" + ex.getMessage()); } } @@ -195,7 +200,7 @@ String WIN_PATH = System.getProperty("user.dir") + File.separator + "ardLog" + File.separator + "logs" + File.separator; hCNetSDK.NET_DVR_SetLogToFile(3, WIN_PATH, true); } else { hCNetSDK.NET_DVR_SetLogToFile(3, "/home/ardLog/hiklog", true); hCNetSDK.NET_DVR_SetLogToFile(3, "/home/ardLog/hiklog" , true); } String m_sDeviceIP = camera.getIp(); String m_sUsername = camera.getUsername(); @@ -274,7 +279,7 @@ createGuideQueue(camera); return AjaxResult.success("设备登录成功"); } catch (Exception ex) { log.error("注册设备异常", ex); log.error("注册设备异常" , ex); return AjaxResult.error("注册设备异常" + ex.getMessage()); } } @@ -868,10 +873,10 @@ nFrameRate = "未知"; break; } map.put("resolution", resolution);//分辨率 map.put("videoBitrate", videoBitrate);//比特率 map.put("videoEncType", videoEncType);//编码 map.put("nFrameRate", nFrameRate);//帧率 map.put("resolution" , resolution);//分辨率 map.put("videoBitrate" , videoBitrate);//比特率 map.put("videoEncType" , videoEncType);//编码 map.put("nFrameRate" , nFrameRate);//帧率 } else { int code = hCNetSDK.NET_DVR_GetLastError(); @@ -924,9 +929,9 @@ double z = d.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue(); //log.debug("T垂直参数为: " + p + "P水平参数为: " + t + "Z变倍参数为: " + z); Map<String, Object> ptzMap = new HashMap<>(); ptzMap.put("p", p); ptzMap.put("t", t); ptzMap.put("z", z); ptzMap.put("p" , p); ptzMap.put("t" , t); ptzMap.put("z" , z); return AjaxResult.success(ptzMap); } @@ -973,9 +978,9 @@ float fTilt = lpPTZAbsoluteEX_cfg.struPTZCtrl.fTilt; float t = fTilt < 0 ? fTilt + 360 : fTilt; float z = lpPTZAbsoluteEX_cfg.struPTZCtrl.fZoom; ptzMap.put("p", p); ptzMap.put("t", t); ptzMap.put("z", z); ptzMap.put("p" , p); ptzMap.put("t" , t); ptzMap.put("z" , z); return AjaxResult.success(ptzMap); } catch (Exception ex) { log.error("获取高精度PTZ绝对位置异常:" + ex.getMessage()); @@ -1080,7 +1085,7 @@ return AjaxResult.success("设置高精度PTZ参数成功"); } catch (Exception ex) { log.error("设置高精度PTZ参数异常", ex); log.error("设置高精度PTZ参数异常" , ex); return AjaxResult.error("设置高精度PTZ参数异常:" + ex); } } @@ -1102,7 +1107,10 @@ double[] targetPositions = cmd.getTargetPosition(); double[] cameraPTZ = GisUtil.getCameraPTZ(cameraPositon, targetPositions, 20, 150); String p = String.valueOf((int) (cameraPTZ[0] * 10)); String t = String.valueOf((int) (cameraPTZ[1] * 10)); //修正俯仰 double correctPitch = cameraSdkService.correctPitch(cmd); double newt = cameraPTZ[1] + correctPitch; String t = String.valueOf((int) (newt * 10)); String z = String.valueOf((int) (cameraPTZ[2] * 10)); m_ptzPosCurrent.wPanPos = (short) (Integer.parseInt(p, 16)); m_ptzPosCurrent.wTiltPos = (short) (Integer.parseInt(t, 16)); @@ -1224,12 +1232,12 @@ String wZoomPosMax = df.format((float) Integer.parseInt(Integer.toHexString(m_ptzPosCurrent.wZoomPosMax)) / 10); String wZoomPosMin = df.format((float) Integer.parseInt(Integer.toHexString(m_ptzPosCurrent.wZoomPosMin)) / 10); Map<String, Object> ptzScopeMap = new HashMap<>(); ptzScopeMap.put("pMax", wPanPosMax); ptzScopeMap.put("pMin", wPanPosMin); ptzScopeMap.put("tMax", wTiltPosMax); ptzScopeMap.put("tMin", wTiltPosMin); ptzScopeMap.put("zMax", wZoomPosMax); ptzScopeMap.put("zMin", wZoomPosMin); ptzScopeMap.put("pMax" , wPanPosMax); ptzScopeMap.put("pMin" , wPanPosMin); ptzScopeMap.put("tMax" , wTiltPosMax); ptzScopeMap.put("tMin" , wTiltPosMin); ptzScopeMap.put("zMax" , wZoomPosMax); ptzScopeMap.put("zMin" , wZoomPosMin); return AjaxResult.success(ptzScopeMap); } } @@ -1325,7 +1333,7 @@ boolean bool = hCNetSDK.NET_DVR_SetDVRConfig(userId, NET_DVR_SET_CCDPARAMCFG, chanNo, point, struDayNigh.size()); if (!bool) { int code = hCNetSDK.NET_DVR_GetLastError(); log.error("切换红外失败 ErrorCode:{},ErrorInfo:{}", code, SdkErrorCodeEnum.getDescByCode(code)); log.error("切换红外失败 ErrorCode:{},ErrorInfo:{}" , code, SdkErrorCodeEnum.getDescByCode(code)); return AjaxResult.warn("切换红外失败:" + SdkErrorCodeEnum.getDescByCode(code) + "(" + code + ")"); } log.debug("切换红外成功"); @@ -1860,8 +1868,7 @@ Pointer pStrPicCfg = strPicCfg.getPointer(); NativeLong lChannel = new NativeLong(chanNo); IntByReference pInt = new IntByReference(0); boolean b_GetPicCfg = hCNetSDK.NET_DVR_GetDVRConfig(camera.getLoginId(), HCNetSDK.NET_DVR_GET_PICCFG_V40, lChannel.intValue(), pStrPicCfg, strPicCfg.size(), pInt); boolean b_GetPicCfg = hCNetSDK.NET_DVR_GetDVRConfig(camera.getLoginId(), HCNetSDK.NET_DVR_GET_PICCFG_V40, lChannel.intValue(), pStrPicCfg, strPicCfg.size(), pInt); if (!b_GetPicCfg) { // log.error("获取图像参数失败,错误码:" + hCNetSDK.NET_DVR_GetLastError()); } @@ -1926,11 +1933,11 @@ } struGisInfo.read(); Map<String, Object> map = new HashMap<>(); map.put("p", struGisInfo.struPtzPos.fPanPos); map.put("t", struGisInfo.struPtzPos.fTiltPos < 0 ? struGisInfo.struPtzPos.fTiltPos + 360 : struGisInfo.struPtzPos.fTiltPos); map.put("z", struGisInfo.struPtzPos.fZoomPos); map.put("fHorFieldAngle", struGisInfo.fHorizontalValue);// 水平视场角 map.put("fVerFieldAngle", struGisInfo.fVerticalValue);// 垂直视场角 map.put("p" , struGisInfo.struPtzPos.fPanPos); map.put("t" , struGisInfo.struPtzPos.fTiltPos < 0 ? struGisInfo.struPtzPos.fTiltPos + 360 : struGisInfo.struPtzPos.fTiltPos); map.put("z" , struGisInfo.struPtzPos.fZoomPos); map.put("fHorFieldAngle" , struGisInfo.fHorizontalValue);// 水平视场角 map.put("fVerFieldAngle" , struGisInfo.fVerticalValue);// 垂直视场角 return AjaxResult.success(map); } @@ -1990,7 +1997,7 @@ return AjaxResult.warn("本地录像取流失败:" + SdkErrorCodeEnum.getDescByCode(code) + "(" + code + ")"); } log.debug("本地录像开始"); return AjaxResult.success("录像开始", lRealHandle); return AjaxResult.success("录像开始" , lRealHandle); } catch (Exception ex) { log.error("本地录像开始异常" + ex.getMessage()); return AjaxResult.error("本地录像开始异常" + ex.getMessage());