using System; using System.Collections.Generic; using System.Threading.Tasks; using Protocol376Simulator.Interfaces; using Protocol376Simulator.Simulators; using Serilog; namespace Protocol376Simulator.Factory { /// /// 模拟器工厂类,负责创建和管理模拟器实例 /// public class SimulatorFactory { private static readonly Dictionary _simulators = new Dictionary(); private static string _serverAddress = "127.0.0.1"; private static int _serverPort = 10502; private static int _addressCounter = 1; /// /// 设置服务器地址和端口 /// /// 服务器地址 /// 服务器端口 public static void SetServerConfig(string serverAddress, int serverPort) { _serverAddress = serverAddress; _serverPort = serverPort; Log.Information("服务器配置已更新: {ServerAddress}:{ServerPort}", _serverAddress, _serverPort); } /// /// 创建集中器模拟器 /// /// 集中器地址 /// 创建的模拟器实例 public static ISimulator CreateConcentrator(string address) { // 检查地址是否已存在 if (_simulators.ContainsKey(address)) { Log.Warning("集中器地址 {Address} 已存在", address); return _simulators[address]; } // 创建新的模拟器实例 var simulator = new ConcentratorSimulator(address, _serverAddress, _serverPort); // 订阅事件 simulator.StatusChanged += (sender, status) => { Log.Information("集中器 (地址: {Address}) 状态变更: {Status}", address, status); }; // 添加到集合 _simulators[address] = simulator; Log.Information("已创建集中器 (地址: {Address})", address); return simulator; } /// /// 创建带自动生成地址的集中器模拟器 /// /// 创建的模拟器实例 public static ISimulator CreateConcentratorWithAutoAddress() { string address = GenerateNextAddress(); return CreateConcentrator(address); } /// /// 批量创建集中器模拟器 /// /// 创建数量 /// 创建的模拟器地址列表 public static List BatchCreateConcentrators(int count) { var addresses = new List(); for (int i = 0; i < count; i++) { string address = GenerateNextAddress(); CreateConcentrator(address); addresses.Add(address); } Log.Information("已批量创建 {Count} 个集中器", count); return addresses; } /// /// 生成下一个集中器地址 /// /// 生成的地址 private static string GenerateNextAddress() { // 生成9位十六进制地址,格式如:312001001 string address = $"31{_addressCounter:D7}"; _addressCounter++; return address; } /// /// 获取模拟器实例 /// /// 集中器地址 /// 模拟器实例,如果不存在则返回null public static ISimulator GetSimulator(string address) { if (_simulators.TryGetValue(address, out var simulator)) { return simulator; } Log.Warning("集中器地址 {Address} 不存在", address); return null; } /// /// 获取所有模拟器实例 /// /// 模拟器实例列表 public static Dictionary GetAllSimulators() { return _simulators; } /// /// 按范围获取模拟器地址 /// /// 范围表达式 /// 模拟器地址列表 public static List GetAddressesInRange(string range) { var addresses = new List(); // 如果是"all",返回所有地址 if (range.ToLower() == "all") { addresses.AddRange(_simulators.Keys); return addresses; } // 解析范围表达式 string[] parts = range.Split(','); foreach (var part in parts) { if (part.Contains("-")) { // 处理范围形式:"1-5" string[] rangeParts = part.Trim().Split('-'); if (rangeParts.Length == 2 && int.TryParse(rangeParts[0], out int start) && int.TryParse(rangeParts[1], out int end)) { // 将索引转换为地址 for (int i = start; i <= end; i++) { string address = $"31{i:D7}"; if (_simulators.ContainsKey(address)) { addresses.Add(address); } } } } else { // 处理单个地址形式 string address = part.Trim(); if (_simulators.ContainsKey(address)) { addresses.Add(address); } } } return addresses; } /// /// 按范围批量操作模拟器 /// /// 范围表达式 /// 操作委托 /// 操作任务 public static async Task BatchOperationAsync(string range, Func action) { var addresses = GetAddressesInRange(range); Log.Information("批量操作 {Count} 个集中器", addresses.Count); foreach (var address in addresses) { if (_simulators.TryGetValue(address, out var simulator)) { try { await action(simulator); } catch (Exception ex) { Log.Error(ex, "批量操作集中器 {Address} 时发生错误: {ErrorMessage}", address, ex.Message); } } } } /// /// 删除模拟器 /// /// 集中器地址 /// 是否成功删除 public static async Task RemoveSimulatorAsync(string address) { if (_simulators.TryGetValue(address, out var simulator)) { try { // 停止模拟器 await simulator.StopAsync(); // 从集合中移除 _simulators.Remove(address); Log.Information("已删除集中器 (地址: {Address})", address); return true; } catch (Exception ex) { Log.Error(ex, "删除集中器 {Address} 时发生错误: {ErrorMessage}", address, ex.Message); return false; } } return false; } /// /// 清空所有模拟器 /// public static async Task ClearAllSimulatorsAsync() { // 停止所有模拟器 foreach (var simulator in _simulators.Values) { try { await simulator.StopAsync(); } catch (Exception ex) { Log.Error(ex, "停止模拟器时发生错误: {ErrorMessage}", ex.Message); } } // 清空集合 _simulators.Clear(); // 重置地址计数器 _addressCounter = 1; Log.Information("已清空所有模拟器"); } } }