using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.OpenApi.Models; using SHH.CameraSdk; // 引用你的业务核心 using SHH.NetMQ; namespace SHH.CameraService; public class Program { public static async Task Main(string[] args) { #region --- 1. 端口与身份计算 --- int processId = 1; // 从命令行参数解析进程ID(默认1) if (args.Length > 0 && int.TryParse(args[0], out int pid)) processId = pid; // 计算 Web 服务端口(基础5000 + 进程ID偏移) int port = 5000 + (processId - 1); Console.Title = $"SHH Gateway - Instance #{processId} (Port: {port})"; #endregion #region --- 2. 硬件环境预热 (【重要】必须在一切开始前调用) --- InitHardwareEnv(); #endregion #region --- 3. 构建 WebHost --- var builder = WebApplication.CreateBuilder(args); #region --- A. 注册 ZeroMQ 组件 (传输层) --- // 注册转发客户端(定向推送) string zmqBind = $"tcp://*:{5555 + (processId - 1)}"; // ★★★ 新增:注册指令总线服务 ★★★ string zmqTarget = "tcp://127.0.0.1:6000"; // 注册转发客户端(定向推送) builder.Services.AddSingleton(new ForwarderClient(zmqTarget)); // ★★★ 新增:注册指令总线服务 ★★★ builder.Services.AddHostedService(); // 注册分发服务器(广播) builder.Services.AddSingleton(new DistributorServer(zmqBind)); #endregion #region --- B. 注册核心业务服务 --- // 注册文件存储服务(进程隔离) builder.Services.AddSingleton(new FileStorageService(processId)); // CameraManager 注册为单例,生命周期由 CameraEngineWorker 管理 builder.Services.AddSingleton(); // 图像处理配置管理器(单例) builder.Services.AddSingleton(); // 显示窗口管理器(单例) builder.Services.AddSingleton(); #endregion #region --- C. 注册图像处理集群 (修复版) --- // 说明:通过责任链模式组装 Scale → Enhance 处理流程,确保顺序执行 // 1. 注册图像缩容集群(并行度4) builder.Services.AddSingleton(sp => { var configManager = sp.GetRequiredService(); return new ImageScaleCluster(4, configManager); }); // 2. 注册图像增强集群(并行度4) builder.Services.AddSingleton(sp => { var configManager = sp.GetRequiredService(); return new ImageEnhanceCluster(4, configManager); }); // 3. 注册管道配置服务(组装责任链) builder.Services.AddHostedService(); #endregion #region --- D. 注册 Web 基础服务 --- // 注册控制器(加载 SDK 中的 CamerasController、MonitorController) builder.Services.AddControllers() .AddApplicationPart(typeof(CamerasController).Assembly) // 加载 SDK 中的控制器 .AddApplicationPart(typeof(MonitorController).Assembly) .AddControllersAsServices(); // 注册全局操作日志过滤器(捕获 API 操作日志) builder.Services.AddScoped(); // 注册 Swagger 文档(区分实例ID) builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = $"Gateway #{processId}", Version = "v1" }); }); #endregion #region --- E. 注册后台服务 (Worker) --- // 1. 核心引擎工作者 (负责 StartAsync 和 ConfigureBusinessLogic) builder.Services.AddHostedService(); // 2.网络哨兵(负责断线重连)(监控设备断线重连,注册为单例) builder.Services.AddSingleton(); // 3. ZeroMQ 桥梁服务(转发帧数据到外部系统) builder.Services.AddHostedService(); #endregion #region --- F. 配置 CORS(允许所有跨域请求) --- builder.Services.AddCors(options => { options.AddPolicy("AllowAll", policy => { policy.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod(); }); }); #endregion #endregion #region --- 4. 启动应用 --- var app = builder.Build(); // 启用 Swagger 文档 app.UseSwagger(); app.UseSwaggerUI(); // 启用 CORS 策略 app.UseCors("AllowAll"); // 映射控制器路由 app.MapControllers(); // 输出启动信息 Console.WriteLine($"[System] 绑定 Web 端口: {port}"); Console.WriteLine($"[System] 绑定 ZMQ 端口: {zmqBind}"); // 启动 Web 应用 await app.RunAsync($"http://0.0.0.0:{port}"); #endregion } #region --- 辅助方法:硬件环境预热 --- /// /// 初始化硬件环境(海康 SDK 预热) /// static void InitHardwareEnv() { Console.WriteLine("=== 工业级视频 SDK 架构测试 (V3.5 框架版) ==="); Console.WriteLine("[硬件] 海康驱动预热中..."); try { // 初始化海康 SDK HikNativeMethods.NET_DVR_Init(); // 强制预热播放库(避免首次取流延迟) HikSdkManager.ForceWarmUp(); Console.WriteLine("[硬件] 预热完成。"); } catch (Exception ex) { Console.WriteLine($"[硬件] 预热失败: {ex.Message}"); // 不抛出异常,允许程序在无 DLL 环境下调试 } } #endregion }