using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using LTEMvcApp.Models;
using Newtonsoft.Json.Linq;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
namespace LTEMvcApp.Services
{
///
/// WebSocket管理器服务 - 管理多个LTE客户端连接
///
public class WebSocketManagerService
{
#region 私有字段
private readonly ConcurrentDictionary _clients;
private readonly ConcurrentDictionary _configs;
private readonly LogParserService _logParser;
private readonly ILogger _logger;
private readonly IServiceProvider _serviceProvider;
#endregion
#region 事件
///
/// 客户端连接事件
///
public event EventHandler? ClientConnected;
///
/// 客户端断开事件
///
public event EventHandler? ClientDisconnected;
///
/// 日志接收事件
///
public event EventHandler<(string clientName, List logs)>? LogsReceived;
///
/// 状态变化事件
///
public event EventHandler<(string clientName, ClientState state)>? StateChanged;
#endregion
#region 构造函数
///
/// 构造函数
///
public WebSocketManagerService(ILogger logger, LogParserService logParser, IServiceProvider serviceProvider)
{
_clients = new ConcurrentDictionary();
_configs = new ConcurrentDictionary();
_logParser = logParser;
_logger = logger;
_serviceProvider = serviceProvider;
_logger.LogInformation("WebSocketManagerService 初始化");
}
#endregion
#region 公共方法
///
/// 添加客户端配置
///
/// 客户端配置
/// 是否成功添加
public bool AddClientConfig(ClientConfig config)
{
if (string.IsNullOrEmpty(config.Name))
{
_logger.LogWarning("尝试添加空名称客户端配置");
return false;
}
_logger.LogInformation($"添加客户端配置: {config.Name}");
_configs[config.Name] = config;
return true;
}
///
/// 移除客户端配置
///
/// 客户端名称
/// 是否成功移除
public bool RemoveClientConfig(string clientName)
{
_logger.LogInformation($"移除客户端配置: {clientName}");
if (_configs.TryRemove(clientName, out _))
{
// 如果客户端正在运行,停止它
if (_clients.TryGetValue(clientName, out var client))
{
client.Stop();
_clients.TryRemove(clientName, out _);
}
return true;
}
return false;
}
///
/// 启动客户端
///
/// 客户端名称
/// 是否成功启动
public bool StartClient(string clientName)
{
_logger.LogInformation($"启动客户端: {clientName}");
if (!_configs.TryGetValue(clientName, out var config))
return false;
// 如果客户端已存在,先停止
if (_clients.TryGetValue(clientName, out var existingClient))
{
existingClient.Stop();
_clients.TryRemove(clientName, out _);
}
// 通过依赖注入获取ILogger
var logger = _serviceProvider.GetService(typeof(ILogger)) as ILogger;
var client = new LTEClientWebSocket(config, logger!);
// 订阅事件
client.ConnectionOpened += (sender, e) => OnClientConnected(client);
client.ConnectionClosed += (sender, e) => OnClientDisconnected(client);
client.LogsReceived += (sender, logs) => OnLogsReceived(clientName, logs);
client.StateChanged += (sender, state) => OnStateChanged(clientName, state);
// 启动客户端
client.Start();
// 添加到客户端列表
_clients[clientName] = client;
return true;
}
///
/// 停止客户端
///
/// 客户端名称
/// 是否成功停止
public bool StopClient(string clientName)
{
_logger.LogInformation($"停止客户端: {clientName}");
if (_clients.TryGetValue(clientName, out var client))
{
client.Stop();
_clients.TryRemove(clientName, out _);
return true;
}
return false;
}
///
/// 获取客户端状态
///
/// 客户端名称
/// 客户端状态
public ClientState? GetClientState(string clientName)
{
if (_clients.TryGetValue(clientName, out var client))
{
return client.State;
}
return null;
}
///
/// 获取所有客户端状态
///
/// 客户端状态字典
public Dictionary GetAllClientStates()
{
return _clients.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.State);
}
///
/// 获取客户端配置
///
/// 客户端名称
/// 客户端配置
public ClientConfig? GetClientConfig(string clientName)
{
_configs.TryGetValue(clientName, out var config);
return config;
}
///
/// 获取所有客户端配置
///
/// 客户端配置列表
public List GetAllClientConfigs()
{
return _configs.Values.ToList();
}
///
/// 获取客户端日志
///
/// 客户端名称
/// 客户端日志列表
public List? GetClientLogs(string clientName)
{
if (_clients.TryGetValue(clientName, out var client))
{
return client.Client.Logs;
}
return null;
}
///
/// 重置客户端日志
///
/// 客户端名称
/// 是否成功重置
public bool ResetClientLogs(string clientName)
{
if (_clients.TryGetValue(clientName, out var client))
{
client.ResetLogs();
return true;
}
return false;
}
///
/// 设置客户端日志配置
///
/// 客户端名称
/// 日志配置
/// 是否保存
/// 是否成功设置
public bool SetClientLogsConfig(string clientName, Dictionary logsConfig, bool save = false)
{
if (_clients.TryGetValue(clientName, out var client))
{
client.SetLogsConfig(logsConfig, save);
return true;
}
return false;
}
///
/// 播放/暂停客户端
///
/// 客户端名称
/// 是否成功操作
public bool PlayPauseClient(string clientName)
{
if (_clients.TryGetValue(clientName, out var client))
{
client.PlayPause();
return true;
}
return false;
}
///
/// 发送消息到客户端
///
/// 客户端名称
/// 消息
/// 回调
/// 消息ID
public int SendMessageToClient(string clientName, JObject message, Action? callback = null)
{
if (_clients.TryGetValue(clientName, out var client))
{
return client.SendMessage(message, callback);
}
return -1;
}
///
/// 获取连接统计信息
///
/// 连接统计信息
public ConnectionStatistics GetConnectionStatistics()
{
var stats = new ConnectionStatistics
{
TotalClients = _clients.Count,
ConnectedClients = _clients.Values.Count(c => c.IsConnected),
DisconnectedClients = _clients.Values.Count(c => !c.IsConnected),
TotalLogs = _clients.Values.Sum(c => c.Client.LogCount),
ClientStates = GetAllClientStates()
};
return stats;
}
///
/// 停止所有客户端
///
public void StopAllClients()
{
foreach (var client in _clients.Values)
{
client.Stop();
}
_clients.Clear();
}
///
/// 启动所有已配置的客户端
///
public void StartAllConfiguredClients()
{
foreach (var config in _configs.Values)
{
if (config.Enabled)
{
StartClient(config.Name);
}
}
}
#endregion
#region 私有方法
///
/// 客户端连接事件处理
///
private void OnClientConnected(LTEClientWebSocket client)
{
_logger.LogInformation($"客户端已连接: {client.Client.Config.Name}");
ClientConnected?.Invoke(this, client);
}
///
/// 客户端断开事件处理
///
private void OnClientDisconnected(LTEClientWebSocket client)
{
_logger.LogWarning($"客户端已断开: {client.Client.Config.Name}");
ClientDisconnected?.Invoke(this, client);
}
///
/// 日志接收事件处理
///
private void OnLogsReceived(string clientName, List logs)
{
_logger.LogInformation($"客户端 {clientName} 收到日志: {logs.Count} 条");
LogsReceived?.Invoke(this, (clientName, logs));
}
///
/// 状态变化事件处理
///
private void OnStateChanged(string clientName, ClientState state)
{
_logger.LogInformation($"客户端 {clientName} 状态变更: {state}");
StateChanged?.Invoke(this, (clientName, state));
}
#endregion
}
///
/// 连接统计信息
///
public class ConnectionStatistics
{
///
/// 总客户端数
///
public int TotalClients { get; set; }
///
/// 已连接客户端数
///
public int ConnectedClients { get; set; }
///
/// 未连接客户端数
///
public int DisconnectedClients { get; set; }
///
/// 总日志数
///
public int TotalLogs { get; set; }
///
/// 客户端状态字典
///
public Dictionary ClientStates { get; set; } = new();
}
}