using Microsoft.AspNetCore.Mvc; using LTEMvcApp.Models; using LTEMvcApp.Services; using Newtonsoft.Json.Linq; using Microsoft.Extensions.Logging; using System.Threading.Tasks; using System.Linq; using System.Threading; namespace LTEMvcApp.Controllers { /// /// WebSocket控制器 - 提供LTE客户端WebSocket管理API /// [ApiController] [Route("api/[controller]")] public class WebSocketController : ControllerBase { private readonly WebSocketManagerService _webSocketManager; private readonly ILogger _logger; public WebSocketController(WebSocketManagerService webSocketManager, ILogger logger) { _webSocketManager = webSocketManager; _logger = logger; } /// /// 获取所有客户端状态 /// /// 客户端状态列表 [HttpGet("clients")] public ActionResult> GetClientStates() { _logger.LogInformation("获取所有客户端状态"); var states = _webSocketManager.GetAllClientStates(); return Ok(states); } /// /// 获取客户端配置 /// /// 客户端名称 /// 客户端配置 [HttpGet("clients/{clientName}/config")] public ActionResult GetClientConfig(string clientName) { var config = _webSocketManager.GetClientConfig(clientName); if (config == null) return NotFound($"客户端 '{clientName}' 不存在"); return Ok(config); } /// /// 获取所有客户端配置 /// /// 客户端配置列表 [HttpGet("configs")] public ActionResult> GetAllConfigs() { var configs = _webSocketManager.GetAllClientConfigs(); return Ok(configs); } /// /// 添加客户端配置 /// /// 客户端配置 /// 操作结果 [HttpPost("configs")] public ActionResult AddClientConfig([FromBody] ClientConfig config) { if (string.IsNullOrEmpty(config.Name)) return BadRequest("客户端名称不能为空"); var success = _webSocketManager.AddClientConfig(config); if (success) return Ok(new { message = $"客户端 '{config.Name}' 配置已添加" }); else return BadRequest("添加客户端配置失败"); } /// /// 启动客户端 /// /// 客户端名称 /// 操作结果 [HttpPost("clients/{clientName}/start")] public ActionResult StartClient(string clientName) { _logger.LogInformation($"API请求: 启动客户端 {clientName}"); var success = _webSocketManager.StartClient(clientName); if (success) { _logger.LogInformation($"客户端 {clientName} 启动成功"); return Ok(new { message = $"客户端 '{clientName}' 已启动" }); } else { _logger.LogWarning($"客户端 {clientName} 启动失败"); return BadRequest($"启动客户端 '{clientName}' 失败"); } } /// /// 停止客户端 /// /// 客户端名称 /// 操作结果 [HttpPost("clients/{clientName}/stop")] public ActionResult StopClient(string clientName) { var success = _webSocketManager.StopClient(clientName); if (success) return Ok(new { message = $"客户端 '{clientName}' 已停止" }); else return BadRequest($"停止客户端 '{clientName}' 失败"); } /// /// 播放/暂停客户端 /// /// 客户端名称 /// 操作结果 [HttpPost("clients/{clientName}/playpause")] public ActionResult PlayPauseClient(string clientName) { var success = _webSocketManager.PlayPauseClient(clientName); if (success) return Ok(new { message = $"客户端 '{clientName}' 播放/暂停状态已切换" }); else return BadRequest($"切换客户端 '{clientName}' 播放/暂停状态失败"); } /// /// 重置客户端日志 /// /// 客户端名称 /// 操作结果 [HttpPost("clients/{clientName}/reset-logs")] public ActionResult ResetClientLogs(string clientName) { var success = _webSocketManager.ResetClientLogs(clientName); if (success) return Ok(new { message = $"客户端 '{clientName}' 日志已重置" }); else return BadRequest($"重置客户端 '{clientName}' 日志失败"); } /// /// 获取客户端日志 /// /// 客户端名称 /// 日志数量限制 /// 日志列表 [HttpGet("clients/{clientName}/logs")] public ActionResult?> GetClientLogs(string clientName, [FromQuery] int limit = 100) { var logs = _webSocketManager.GetClientLogs(clientName); if (logs == null) return NotFound($"客户端 '{clientName}' 不存在或未连接"); // 限制返回的日志数量 var limitedLogs = logs.TakeLast(limit).ToList(); return Ok(limitedLogs); } /// /// 设置客户端日志配置 /// /// 客户端名称 /// 日志配置请求 /// 操作结果 [HttpPost("clients/{clientName}/logs-config")] public ActionResult SetClientLogsConfig(string clientName, [FromBody] LogsConfigRequest request) { var success = _webSocketManager.SetClientLogsConfig(clientName, request.Config, request.Save); if (success) return Ok(new { message = $"客户端 '{clientName}' 日志配置已更新" }); else return BadRequest($"更新客户端 '{clientName}' 日志配置失败"); } /// /// 发送消息到客户端 /// /// 客户端名称 /// 消息内容 /// 操作结果 [HttpPost("clients/{clientName}/send-message")] public ActionResult SendMessage(string clientName, [FromBody] JObject message) { var messageId = _webSocketManager.SendMessageToClient(clientName, message); if (messageId >= 0) return Ok(new { messageId, message = $"消息已发送到客户端 '{clientName}'" }); else return BadRequest($"发送消息到客户端 '{clientName}' 失败"); } /// /// 获取连接统计信息 /// /// 统计信息 [HttpGet("statistics")] public ActionResult GetStatistics() { var stats = _webSocketManager.GetConnectionStatistics(); return Ok(stats); } /// /// 启动所有已配置的客户端 /// /// 操作结果 [HttpPost("start-all")] public ActionResult StartAllClients() { _webSocketManager.StartAllConfiguredClients(); return Ok(new { message = "所有已配置的客户端已启动" }); } /// /// 停止所有客户端 /// /// 操作结果 [HttpPost("stop-all")] public ActionResult StopAllClients() { _webSocketManager.StopAllClients(); return Ok(new { message = "所有客户端已停止" }); } /// /// 移除客户端配置 /// /// 客户端名称 /// 操作结果 [HttpDelete("configs/{clientName}")] public ActionResult RemoveClientConfig(string clientName) { var success = _webSocketManager.RemoveClientConfig(clientName); if (success) return Ok(new { message = $"客户端 '{clientName}' 配置已移除" }); else return BadRequest($"移除客户端 '{clientName}' 配置失败"); } /// /// 使用 Server-Sent Events (SSE) 实时推送客户端消息 /// /// 客户端名称 [HttpGet("clients/{clientName}/messages/stream")] public async Task StreamClientMessages(string clientName) { Response.ContentType = "text/event-stream"; Response.Headers.Add("Cache-Control", "no-cache"); Response.Headers.Add("Connection", "keep-alive"); var client = _webSocketManager.GetClientInstance(clientName); if (client == null) { // 发送一个错误事件然后关闭 await SendSseEvent("error", new { message = "客户端未连接或不存在" }); return; } // 发送一个连接成功事件 await SendSseEvent("open", new { message = "成功连接到服务器事件流" }); int sentIndex = 0; int receivedIndex = 0; var cancellationToken = HttpContext.RequestAborted; while (!cancellationToken.IsCancellationRequested) { bool hasNewMessages = false; // 检查并高效地发送新的"已发送"消息 if (client.SentMessagesCount > sentIndex) { var newMessages = client.SentMessages.Skip(sentIndex).ToList(); if (newMessages.Any()) { await SendSseEvent("update", new { type = "sent", messages = newMessages, totalCount = client.SentMessagesCount }); sentIndex = client.SentMessagesCount; hasNewMessages = true; } } // 检查并高效地发送新的"已接收"消息 if (client.ReceivedMessagesCount > receivedIndex) { var newMessages = client.ReceivedMessages.Skip(receivedIndex).ToList(); if (newMessages.Any()) { await SendSseEvent("update", new { type = "received", messages = newMessages, totalCount = client.ReceivedMessagesCount }); receivedIndex = client.ReceivedMessagesCount; hasNewMessages = true; } } if (hasNewMessages) { await Response.Body.FlushAsync(cancellationToken); } await Task.Delay(250, cancellationToken); // 每250毫秒检查一次新消息 } } private async Task SendSseEvent(string eventName, object data) { var json = Newtonsoft.Json.JsonConvert.SerializeObject(data); await Response.WriteAsync($"event: {eventName}\n"); await Response.WriteAsync($"data: {json}\n\n"); } /// /// 获取测试客户端配置 /// /// 测试客户端配置 [HttpGet("test-client-config")] public ActionResult GetTestClientConfig() { var testConfig = _webSocketManager.GetTestClientConfig(); return Ok(testConfig); } /// /// 设置测试客户端配置 /// /// 测试客户端配置 /// 操作结果 [HttpPost("test-client-config")] public ActionResult SetTestClientConfig([FromBody] ClientConfig config) { if (string.IsNullOrEmpty(config.Name)) return BadRequest("客户端名称不能为空"); var success = _webSocketManager.SetTestClientConfig(config); if (success) return Ok(new { message = "测试客户端配置已更新" }); else return BadRequest("更新测试客户端配置失败"); } /// /// 启动测试客户端 /// /// 操作结果 [HttpPost("test-client/start")] public ActionResult StartTestClient() { var success = _webSocketManager.StartTestClient(); if (success) return Ok(new { message = "测试客户端已启动" }); else return BadRequest("启动测试客户端失败"); } /// /// 停止测试客户端 /// /// 操作结果 [HttpPost("test-client/stop")] public ActionResult StopTestClient() { _logger.LogInformation("API 请求: 停止测试客户端"); var success = _webSocketManager.StopTestClient(); if (success) return Ok(new { message = "测试客户端停止成功" }); else return BadRequest("停止测试客户端失败"); } /// /// 使用 Server-Sent Events (SSE) 实时推送全局日志 /// [HttpGet("logs/stream")] public async Task StreamLogs(CancellationToken cancellationToken) { Response.ContentType = "text/event-stream"; Response.Headers.Append("Cache-Control", "no-cache"); Response.Headers.Append("Connection", "keep-alive"); int logIndex = 0; // 首先,一次性推送所有已缓存的日志 var initialLogs = _webSocketManager.GetLogCache().ToList(); if (initialLogs.Any()) { await SendSseEvent("history", new { logs = initialLogs }); await Response.Body.FlushAsync(cancellationToken); logIndex = initialLogs.Count; } while (!cancellationToken.IsCancellationRequested) { var logCache = _webSocketManager.GetLogCache(); if (logCache.Count() > logIndex) { var newLogs = logCache.Skip(logIndex).ToList(); if (newLogs.Any()) { await SendSseEvent("new_logs", new { logs = newLogs }); await Response.Body.FlushAsync(cancellationToken); logIndex = logCache.Count(); } } await Task.Delay(250, cancellationToken); } } } /// /// 日志配置请求 /// public class LogsConfigRequest { /// /// 日志配置 /// public Dictionary Config { get; set; } = new(); /// /// 是否保存配置 /// public bool Save { get; set; } = false; } }