|
|
|
@ -437,28 +437,54 @@ public class ImageCaptureService {
|
|
|
|
return false;
|
|
|
|
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);
|
|
|
|
log.info("开始拍照,相机: {}, 保存路径: {}, 最大重试: {} 次", ip, savePath, maxRetries);
|
|
|
|
|
|
|
|
|
|
|
|
int attempt = 0;
|
|
|
|
int attempt = 0;
|
|
|
|
int lastErrorCode = 0;
|
|
|
|
int lastErrorCode = 0;
|
|
|
|
|
|
|
|
|
|
|
|
while (attempt < maxRetries) {
|
|
|
|
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++;
|
|
|
|
attempt++;
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
// 获取PayloadSize
|
|
|
|
// 获取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 设备列表
|
|
|
|
* @param stDeviceList 设备列表
|
|
|
|
|