diff --git a/CoreAgent.Infrastructure/Services/Network/NetworkProtocolLogObserver.cs b/CoreAgent.Infrastructure/Services/Network/NetworkProtocolLogObserver.cs index 2bb5c2b..993f6a4 100644 --- a/CoreAgent.Infrastructure/Services/Network/NetworkProtocolLogObserver.cs +++ b/CoreAgent.Infrastructure/Services/Network/NetworkProtocolLogObserver.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using CoreAgent.ProtocolClient.Models; using CoreAgent.ProtocolClient.ProtocolEngineCore; using CoreAgent.WebSocketTransport.Interfaces; +using CoreAgent.WebSocketTransport.Models; using Microsoft.Extensions.Logging; namespace CoreAgent.Infrastructure.Services.Network @@ -21,7 +22,68 @@ namespace CoreAgent.Infrastructure.Services.Network } public void OnProtocolLogsReceived(IEnumerable logDetails) { - _ChannelManager.SendChannel.TryWrite(logDetails); + var startTime = DateTime.UtcNow; + + // 空值检查 + if (logDetails == null) + { + _logger.LogWarning("接收到的协议日志为空"); + return; + } + + // 转换为列表以避免多次枚举 + var logList = logDetails.ToList(); + var logCount = logList.Count; + + // 空集合检查 + if (logCount == 0) + { + _logger.LogDebug("接收到的协议日志集合为空,跳过处理"); + return; + } + + try + { + _logger.LogDebug("开始处理协议日志,数量: {LogCount}", logCount); + + // 将 CoreAgent.ProtocolClient 的 TransferProtocolLog 转换为 WebSocket 传输层的 MessageTransferProtocolLog + var webSocketLogs = logList.Select(log => new MessageTransferProtocolLog + { + Id = log.Id, + LayerType = log.LayerType.ToString(), + MessageDetailJson = log.MessageDetailJson, + CellID = log.CellID, + IMSI = log.IMSI, + Direction = log.Direction, + UEID = log.UEID, + PLMN = log.PLMN, + TimeMs = log.TimeMs, + Timestamp = log.Timestamp, + Info = log.Info, + Message = log.Message + }); + + // 尝试写入通道并跟踪结果 + var writeSuccess = _ChannelManager.SendChannel.TryWrite(webSocketLogs); + var processingTime = DateTime.UtcNow - startTime; + + if (writeSuccess) + { + _logger.LogDebug("协议日志处理成功,数量: {LogCount}, 处理时间: {ProcessingTime}ms", + logCount, processingTime.TotalMilliseconds); + } + else + { + _logger.LogWarning("协议日志写入通道失败,数量: {LogCount}, 处理时间: {ProcessingTime}ms, 通道可能已满或已关闭", + logCount, processingTime.TotalMilliseconds); + } + } + catch (Exception ex) + { + var processingTime = DateTime.UtcNow - startTime; + _logger.LogError(ex, "协议日志处理异常,数量: {LogCount}, 处理时间: {ProcessingTime}ms", + logCount, processingTime.TotalMilliseconds); + } } } } diff --git a/CoreAgent.WebSocketTransport/Models/MessageTransferProtocolLog.cs b/CoreAgent.WebSocketTransport/Models/MessageTransferProtocolLog.cs new file mode 100644 index 0000000..c063043 --- /dev/null +++ b/CoreAgent.WebSocketTransport/Models/MessageTransferProtocolLog.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CoreAgent.WebSocketTransport.Models +{ + /// + /// 消息传输协议日志模型 + /// 用于在WebSocket传输层中传输协议日志数据 + /// 与CoreAgent.ProtocolClient中的TransferProtocolLog区分开 + /// + public class MessageTransferProtocolLog + { + /// + /// 主键ID + /// + public long Id { get; set; } + + /// + /// 协议层类型 + /// + public string LayerType { get; set; } = string.Empty; + + /// + /// 消息详情集合(JSON格式存储) + /// + public string? MessageDetailJson { get; set; } + + /// + /// 小区ID + /// + public int? CellID { get; set; } + + /// + /// 国际移动用户识别码 + /// + public string? IMSI { get; set; } + + /// + /// 日志方向类型 + /// + public int Direction { get; set; } + + /// + /// 用户设备ID + /// + public int? UEID { get; set; } + + /// + /// 公共陆地移动网络标识 + /// + public string? PLMN { get; set; } + + /// + /// 时间间隔(毫秒) + /// + public long TimeMs { get; set; } + + /// + /// 时间戳 + /// + public long Timestamp { get; set; } + + /// + /// 信息字段 + /// + public string? Info { get; set; } + + /// + /// 消息字段 + /// + public string? Message { get; set; } + + /// + /// 消息详情集合(用于业务逻辑) + /// + public IEnumerable? MessageDetail + { + get => !string.IsNullOrEmpty(MessageDetailJson) + ? Newtonsoft.Json.JsonConvert.DeserializeObject>(MessageDetailJson) + : null; + set => MessageDetailJson = value != null + ? Newtonsoft.Json.JsonConvert.SerializeObject(value) + : null; + } + + /// + /// 时间间隔(用于业务逻辑) + /// + public TimeSpan Time + { + get => TimeSpan.FromMilliseconds(TimeMs); + set => TimeMs = (long)value.TotalMilliseconds; + } + + + } +} \ No newline at end of file diff --git a/CoreAgent.WebSocketTransport/Models/ProtocolMessage.cs b/CoreAgent.WebSocketTransport/Models/ProtocolMessage.cs new file mode 100644 index 0000000..7655872 --- /dev/null +++ b/CoreAgent.WebSocketTransport/Models/ProtocolMessage.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CoreAgent.WebSocketTransport.Models +{ + partial class ProtocolMessage + { + /// + /// 消息类型 + /// + public string Type { get; set; } = "Protocol"; + + /// + /// 消息载荷 + /// + public HeartbeatPayload Payload { get; set; } = new HeartbeatPayload(); + } + + /// + /// 心跳消息载荷 + /// + public class ProtocolPayload + { + /// + /// 心跳消息内容 + /// + public string Message { get; set; } = "ping"; + } +} diff --git a/modify.md b/modify.md index db6d721..8b0542f 100644 --- a/modify.md +++ b/modify.md @@ -2,6 +2,99 @@ ## 2024年修改记录 +### 创建MessageTransferProtocolLog模型解决命名冲突 + +**修改时间**: 2024年 +**修改文件**: +- `CoreAgent.WebSocketTransport/Models/MessageTransferProtocolLog.cs` (新建) +- `CoreAgent.Infrastructure/Services/Network/NetworkProtocolLogObserver.cs` + +**修改内容**: + +1. **创建MessageTransferProtocolLog模型** + - 在 `CoreAgent.WebSocketTransport` 项目中创建新的协议日志模型 + - 与 `CoreAgent.ProtocolClient` 中的 `TransferProtocolLog` 区分开 + - 保持相同的字段结构,避免命名冲突 + - 专门用于WebSocket传输层的协议日志数据传输 + +2. **修改NetworkProtocolLogObserver转换逻辑** + - 在 `OnProtocolLogsReceived` 方法中添加类型转换 + - 将 `CoreAgent.ProtocolClient.TransferProtocolLog` 转换为 `CoreAgent.WebSocketTransport.MessageTransferProtocolLog` + - 保持所有字段的完整映射 + - 添加必要的using语句引用 + +3. **具体实现**: + ```csharp + // 时间跟踪和性能监控 + var startTime = DateTime.UtcNow; + + // 空值检查 + if (logDetails == null) + { + _logger.LogWarning("接收到的协议日志为空"); + return; + } + + // 转换为列表以避免多次枚举 + var logList = logDetails.ToList(); + var logCount = logList.Count; + + // 空集合检查 + if (logCount == 0) + { + _logger.LogDebug("接收到的协议日志集合为空,跳过处理"); + return; + } + + // 类型转换逻辑 + var webSocketLogs = logList.Select(log => new MessageTransferProtocolLog + { + Id = log.Id, + LayerType = log.LayerType.ToString(), + MessageDetailJson = log.MessageDetailJson, + CellID = log.CellID, + IMSI = log.IMSI, + Direction = log.Direction, + UEID = log.UEID, + PLMN = log.PLMN, + TimeMs = log.TimeMs, + Timestamp = log.Timestamp, + Info = log.Info, + Message = log.Message + }); + + // 通道写入状态监控 + var writeSuccess = _ChannelManager.SendChannel.TryWrite(webSocketLogs); + var processingTime = DateTime.UtcNow - startTime; + + if (writeSuccess) + { + _logger.LogDebug("协议日志处理成功,数量: {LogCount}, 处理时间: {ProcessingTime}ms", + logCount, processingTime.TotalMilliseconds); + } + else + { + _logger.LogWarning("协议日志写入通道失败,数量: {LogCount}, 处理时间: {ProcessingTime}ms, 通道可能已满或已关闭", + logCount, processingTime.TotalMilliseconds); + } + ``` + +4. **设计优势**: + - **命名清晰**:`MessageTransferProtocolLog` 明确表示用于消息传输 + - **避免冲突**:与原始 `TransferProtocolLog` 有明确区分 + - **职责分离**:WebSocket传输层有独立的协议日志模型 + - **类型安全**:通过显式转换确保类型安全 + - **易于维护**:清晰的命名约定便于理解和维护 + - **性能监控**:添加时间跟踪和通道写入状态监控 + - **错误处理**:完善的异常处理和日志记录 + - **Bug修复**:修复空引用检查和多次枚举的性能问题 + - **边界处理**:添加空集合检查,避免处理空集合 + +**影响范围**: +- WebSocket传输层协议日志处理 +- 协议日志观察者模式实现 +- 跨项目类型转换逻辑 + ### CellularNetworkService.StartNetworkAsync 方法添加协议客户端配置创建 **修改时间**: 2024年