namespace SHH.CameraSdk; public class ServiceConfig { // ========================================== // 1. 基础属性 // ========================================== public int ParentPid { get; private set; } public string AppId { get; private set; } = "Unknown_01"; public int NumericId { get; private set; } = 1; public int BasePort { get; private set; } = 5000; public int MaxPortRange { get; private set; } = 100; public NetworkMode Mode { get; private set; } = NetworkMode.Passive; public bool ShouldConnect => Mode == NetworkMode.Active || Mode == NetworkMode.Hybrid; // ========================================== // 2. 目标地址列表 (类型变了!) // ========================================== // ★★★ 修改点:从 List 变为 List ★★★ public List VideoEndpoints { get; private set; } = new List(); public List CommandEndpoints { get; private set; } = new List(); // ========================================== // 3. 工厂方法 (保持不变) // ========================================== public static ServiceConfig BuildFromArgs(string[] args) { var config = new ServiceConfig(); for (int i = 0; i < args.Length; i++) { var key = args[i].ToLower().Trim(); var value = (i + 1 < args.Length && !args[i + 1].StartsWith("--")) ? args[i + 1] : string.Empty; bool consumed = !string.IsNullOrEmpty(value); switch (key) { case "--pid": if (int.TryParse(value, out int pid)) config.ParentPid = pid; break; case "--appid": if (!string.IsNullOrWhiteSpace(value)) { config.AppId = value; config.NumericId = ParseIdFromAppId(value); } break; case "--uris": if (!string.IsNullOrWhiteSpace(value)) ParseSingleUriConfig(config, value); break; case "--mode": if (int.TryParse(value, out int m)) config.Mode = (NetworkMode)m; break; case "--ports": if (!string.IsNullOrWhiteSpace(value) && value.Contains(",")) { var parts = value.Split(','); if (parts.Length >= 1 && int.TryParse(parts[0], out int p)) config.BasePort = p; if (parts.Length >= 2 && int.TryParse(parts[1], out int r)) config.MaxPortRange = r; } break; } if (consumed) i++; } return config; } private static int ParseIdFromAppId(string appId) { if (string.IsNullOrWhiteSpace(appId)) return 1; int lastIdx = appId.LastIndexOf('_'); if (lastIdx >= 0 && lastIdx < appId.Length - 1) { if (int.TryParse(appId.Substring(lastIdx + 1), out int id)) return id; } return 1; } // ========================================== // 4. 解析算法实现 (核心修改) // ========================================== private static void ParseSingleUriConfig(ServiceConfig config, string rawValue) { var segments = rawValue.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); foreach (var segment in segments) { var parts = segment.Split(','); if (parts.Length < 3) continue; string ip = parts[0].Trim(); string portStr = parts[1].Trim(); string type = parts[2].Trim().ToLower(); // ★★★ 提取第四个字段作为备注 ★★★ string desc = parts.Length >= 4 ? parts[3].Trim() : "未命名终端"; if (int.TryParse(portStr, out int port)) { string zmqUri = $"tcp://{ip}:{port}"; // 构建对象 var endpoint = new ServiceEndpoint { Uri = zmqUri, Description = desc }; // 添加前检查 Uri 是否重复 (备注不参与排重) if (type == "video") { if (!config.VideoEndpoints.Any(e => e.Uri == zmqUri)) config.VideoEndpoints.Add(endpoint); } else if (type == "command" || type == "text") { if (!config.CommandEndpoints.Any(e => e.Uri == zmqUri)) config.CommandEndpoints.Add(endpoint); } } } } } /// /// [新增] 端点配置对象,包含地址和备注 /// public class ServiceEndpoint { /// /// ZeroMQ 连接地址 (e.g. "tcp://127.0.0.1:6001") /// public string Uri { get; set; } = string.Empty; /// /// 备注信息 (e.g. "调试机", "大屏") /// public string Description { get; set; } = string.Empty; /// /// ToString /// /// public override string ToString() => $"{Uri} ({Description})"; }