diff --git a/src/main/java/com/example/lxcameraapi/service/IndustrialCamera/camera/hik/ImageCaptureService.java b/src/main/java/com/example/lxcameraapi/service/IndustrialCamera/camera/hik/ImageCaptureService.java index 0f00efc..201c910 100644 --- a/src/main/java/com/example/lxcameraapi/service/IndustrialCamera/camera/hik/ImageCaptureService.java +++ b/src/main/java/com/example/lxcameraapi/service/IndustrialCamera/camera/hik/ImageCaptureService.java @@ -437,28 +437,54 @@ public class ImageCaptureService { return false; } - // 获取相机句柄 - Handle hCamera = handleMap.get(ip); - if (hCamera == null) { - log.warn("相机 {} 句柄为空,尝试自动初始化...", ip); - if (!ensureCameraInitialized(ip)) { - log.error("相机 {} 自动初始化失败,无法拍照", ip); - return false; - } - hCamera = handleMap.get(ip); - if (hCamera == null) { - log.error("相机 {} 自动初始化后仍无法获取句柄", ip); - return false; - } - log.info("相机 {} 自动初始化成功", ip); - } - log.info("开始拍照,相机: {}, 保存路径: {}, 最大重试: {} 次", ip, savePath, maxRetries); int attempt = 0; int lastErrorCode = 0; while (attempt < maxRetries) { + + // 获取相机句柄 + Handle hCamera = handleMap.get(ip); + if (hCamera == null) { + log.warn("相机 {} 句柄为空,尝试自动初始化...", ip); + if (!ensureCameraInitialized(ip)) { + log.error("相机 {} 自动初始化失败,无法拍照", ip); + return false; + } + hCamera = handleMap.get(ip); + if (hCamera == null) { + log.error("相机 {} 自动初始化后仍无法获取句柄", ip); + return false; + } + log.info("相机 {} 自动初始化成功", ip); + } else { + // 句柄不为空时,检查句柄是否仍然有效 + if (!isHandleValid(hCamera)) { + log.warn("相机 {} 句柄已失效,移除旧句柄并重新初始化...", ip); + // 清理失效句柄 + try { + MvCameraControl.MV_CC_CloseDevice(hCamera); + MvCameraControl.MV_CC_DestroyHandle(hCamera); + } catch (Exception e) { + log.warn("清理失效句柄时发生异常", e); + } + handleMap.remove(ip); + + // 重新初始化 + if (!ensureCameraInitialized(ip)) { + log.error("相机 {} 重新初始化失败,无法拍照", ip); + return false; + } + hCamera = handleMap.get(ip); + if (hCamera == null) { + log.error("相机 {} 重新初始化后仍无法获取句柄", ip); + return false; + } + log.info("相机 {} 重新初始化成功", ip); + } + } + attempt++; try { // 获取PayloadSize @@ -572,6 +598,28 @@ public class ImageCaptureService { } } + /** + * 检查相机句柄是否有效(设备是否仍然连接) + * @param hCamera 相机句柄 + * @return 是否有效 + */ + private boolean isHandleValid(Handle hCamera) { + if (hCamera == null) { + return false; + } + try { + boolean nRet = MvCameraControl.MV_CC_IsDeviceConnected(hCamera); + if (nRet) { + return true; + } + log.warn("相机设备连接检查失败,errcode"); + return false; + } catch (Exception e) { + log.warn("检查句柄有效性时发生异常", e); + return false; + } + } + /** * 查找相机索引 * @param stDeviceList 设备列表