using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using OrpaonVision.Core.Results; using OrpaonVision.SiteApp.Runtime.Contracts; using OrpaonVision.SiteApp.Runtime.Options; using OrpaonVision.SiteApp.Runtime.Services; namespace OrpaonVision.SiteApp.Runtime.Services; /// /// 海康相机服务适配器,将IHikCameraService适配到ICameraService接口。 /// public sealed class HikCameraAdapter : ICameraService { private readonly ILogger _logger; private readonly IHikCameraService _hikCameraService; private readonly RuntimeOptions _options; /// /// 构造函数。 /// public HikCameraAdapter( ILogger logger, IHikCameraService hikCameraService, IOptions options) { _logger = logger; _hikCameraService = hikCameraService; _options = options.Value; } /// public Result CaptureFrame() { try { // 确保相机已连接 if (!_hikCameraService.IsConnected) { var connectResult = ConnectDefaultCamera(); if (!connectResult.Succeeded) { return Result.Fail(connectResult.Code, connectResult.Message, connectResult.Errors.ToArray()); } } // 确保相机正在采集 var frameResult = _hikCameraService.GetLatestFrameWithTimestamp(); if (!frameResult.Succeeded) { return Result.Fail(frameResult.Code, frameResult.Message, frameResult.Errors.ToArray()); } var frame = frameResult.Data; frame.FrameId = Guid.NewGuid(); frame.CameraId = _options.CameraId; return Result.Success(frame, message: "相机采图成功。"); } catch (Exception ex) { var traceId = Guid.NewGuid().ToString("N"); _logger.LogError(ex, "相机采图适配失败。TraceId: {TraceId}", traceId); var result = Result.FromException(ex, "CAMERA_ADAPTER_CAPTURE_FAILED", "相机采图适配失败。", traceId); return Result.FailWithTrace(result.Code, result.Message, result.TraceId ?? traceId, result.Errors.ToArray()); } } /// /// 连接默认相机。 /// private Result ConnectDefaultCamera() { try { _logger.LogInformation("正在连接默认相机..."); // 枚举设备 var enumResult = _hikCameraService.EnumerateDevices(); if (!enumResult.Succeeded || enumResult.Data.Count == 0) { return Result.Fail("CAMERA_NO_DEVICES", "未发现可用的相机设备。"); } // 尝试连接第一个设备 var firstDevice = enumResult.Data.First(); var connectResult = _hikCameraService.ConnectToDevice(firstDevice); if (!connectResult.Succeeded) { return connectResult; } // 设置相机参数 var setParamsResult = _hikCameraService.SetCameraParameters( width: 1920, height: 1080, pixelFormat: "BGR8Packed", triggerMode: 0); if (!setParamsResult.Succeeded) { _logger.LogWarning("设置相机参数失败: {Message}", setParamsResult.Message); } // 开始采集 var startGrabResult = _hikCameraService.StartGrabbing(); if (!startGrabResult.Succeeded) { return startGrabResult; } _logger.LogInformation("默认相机连接并启动采集成功"); return Result.Success(message: "默认相机连接成功。"); } catch (Exception ex) { var traceId = Guid.NewGuid().ToString("N"); _logger.LogError(ex, "连接默认相机失败。TraceId: {TraceId}", traceId); var result = Result.FromException(ex, "CAMERA_CONNECT_DEFAULT_FAILED", "连接默认相机失败。", traceId); return Result.FailWithTrace(result.Code, result.Message, result.TraceId ?? traceId, result.Errors.ToArray()); } } /// /// 初始化相机服务。 /// public Result Initialize() { try { _logger.LogInformation("正在初始化海康相机适配器..."); // 检查连接状态 if (_hikCameraService.IsConnected) { _logger.LogInformation("相机已连接,无需重新连接"); return Result.Success(message: "相机适配器初始化成功。"); } // 连接默认相机 var connectResult = ConnectDefaultCamera(); if (!connectResult.Succeeded) { return connectResult; } _logger.LogInformation("海康相机适配器初始化成功"); return Result.Success(message: "相机适配器初始化成功。"); } catch (Exception ex) { var traceId = Guid.NewGuid().ToString("N"); _logger.LogError(ex, "初始化海康相机适配器失败。TraceId: {TraceId}", traceId); var result = Result.FromException(ex, "CAMERA_ADAPTER_INIT_FAILED", "初始化相机适配器失败。", traceId); return Result.FailWithTrace(result.Code, result.Message, result.TraceId ?? traceId, result.Errors.ToArray()); } } /// /// 清理资源。 /// public void Cleanup() { try { if (_hikCameraService.IsConnected) { _hikCameraService.Disconnect(); _logger.LogInformation("相机适配器清理完成"); } } catch (Exception ex) { _logger.LogError(ex, "清理相机适配器时发生异常"); } } }