using System; using System.Collections.Generic; using System.Linq; namespace CoreAgent.ProtocolClient.Models { /// /// TMSI匹配处理器 /// 负责处理TMSI匹配和UE链的构建,从根节点获取IMSI并分配给整个链 /// public class TmsiMatchProcessor { /// /// TMSI到UE ID的映射表 /// private readonly Dictionary _tmsiToUeId; /// /// 请求TMSI到UE ID的映射表 /// private readonly Dictionary _requestTmsiToUeId; /// /// IMSI到UE ID的映射表 /// private readonly Dictionary> _imsiToUeId; /// /// 构造函数 /// /// TMSI到UE ID的映射表 /// 请求TMSI到UE ID的映射表 /// IMSI到UE ID的映射表 public TmsiMatchProcessor( Dictionary tmsiToUeId, Dictionary requestTmsiToUeId, Dictionary> imsiToUeId) { _tmsiToUeId = tmsiToUeId ?? new Dictionary(); _requestTmsiToUeId = requestTmsiToUeId ?? new Dictionary(); _imsiToUeId = imsiToUeId ?? new Dictionary>(); } /// /// 生成TMSI匹配结果 /// 先构建树形结构,从根节点获取IMSI,然后平铺成列表 /// /// TMSI匹配结果列表 public List GenerateTmsiMatches() { var matches = new List(); // 构建UE链的树形结构 var ueChains = BuildUeChains(); // 遍历RequestTmsiToUeId,查找在TmsiToUeId中是否有相同的TMSI foreach (var requestKvp in _requestTmsiToUeId) { uint tmsi = requestKvp.Key; int requestUeId = requestKvp.Value; // 检查TmsiToUeId中是否存在相同的TMSI if (_tmsiToUeId.TryGetValue(tmsi, out int receiveUeId)) { // 从UE链中获取IMSI string imsi = GetImsiFromUeChain(receiveUeId, ueChains); // 创建匹配结果 var matchResult = new TmsiMatchResult(tmsi, requestUeId, receiveUeId, imsi); matches.Add(matchResult); } } return matches; } /// /// 构建UE链的树形结构 /// 根据RequestTmsiToUeId和TmsiToUeId的映射关系构建链式结构 /// /// UE链的字典,键为链的根节点UE ID,值为链中的所有UE ID private Dictionary> BuildUeChains() { var ueChains = new Dictionary>(); var processedUeIds = new HashSet(); // 遍历所有TMSI匹配关系,构建链式结构 foreach (var requestKvp in _tmsiToUeId) { uint tmsi = requestKvp.Key; int requestUeId = requestKvp.Value; if (_requestTmsiToUeId.TryGetValue(tmsi, out int receiveUeId)) { // 如果这个UE ID还没有被处理过 if (!processedUeIds.Contains(requestUeId) && !processedUeIds.Contains(receiveUeId)) { var chain = BuildChainFromUe(requestUeId, receiveUeId); if (chain.Count > 0) { // 使用链的根节点(最外层节点)作为键 int rootUeId = chain[0]; ueChains[rootUeId] = chain; // 标记所有UE ID为已处理 foreach (int ueId in chain) { processedUeIds.Add(ueId); } } } } } return ueChains; } /// /// 从指定的UE ID开始构建链式结构 /// /// 请求UE ID /// 接收UE ID /// 链中的所有UE ID列表 private List BuildChainFromUe(int requestUeId, int receiveUeId) { var chain = new List(); var visited = new HashSet(); // 从requestUeId开始,沿着链式关系查找 int currentUeId = requestUeId; while (currentUeId > 0 && !visited.Contains(currentUeId)) { chain.Add(currentUeId); visited.Add(currentUeId); // 查找下一个UE ID(在TmsiToUeId中查找当前UE ID作为receiveUeId的情况) currentUeId = FindNextUeIdInChain(currentUeId); } return chain; } /// /// 在链中查找下一个UE ID /// /// 当前UE ID /// 下一个UE ID,如果没有找到则返回-1 private int FindNextUeIdInChain(int currentUeId) { // 在RequestTmsiToUeId中查找当前UE ID作为receiveUeId的情况 foreach (var kvp in _requestTmsiToUeId) { if (_tmsiToUeId.TryGetValue(kvp.Key, out int receiveUeId) && receiveUeId == currentUeId) { return kvp.Value; // 返回对应的requestUeId } } return -1; // 没有找到下一个UE ID } /// /// 从UE链中获取IMSI /// 优先从链的根节点(最外层节点)获取IMSI /// /// 当前UE ID /// UE链字典 /// 对应的IMSI,如果未找到则返回空字符串 private string GetImsiFromUeChain(int ueId, Dictionary> ueChains) { // 查找当前UE ID所在的链 foreach (var chain in ueChains.Values) { if (chain.Contains(ueId)) { // 从链的根节点(最外层节点)开始查找IMSI foreach (int chainUeId in chain) { string imsi = GetImsiForUeId(chainUeId); if (!string.IsNullOrEmpty(imsi)) { return imsi; } } break; } } return string.Empty; } /// /// 根据UE ID获取对应的IMSI /// 优先查找当前UE ID,如果未找到则查找整个UE链中的IMSI /// /// UE ID /// 对应的IMSI,如果未找到则返回空字符串 private string GetImsiForUeId(int ueId) { // 1. 首先查找当前UE ID对应的IMSI foreach (var imsiMapping in _imsiToUeId) { if (imsiMapping.Value.Contains(ueId)) { return imsiMapping.Key; } } // 2. 如果当前UE ID没有IMSI,查找整个UE链中的IMSI // 遍历所有IMSI映射,查找是否有任何UE ID对应的IMSI foreach (var imsiMapping in _imsiToUeId) { if (!string.IsNullOrEmpty(imsiMapping.Key)) { return imsiMapping.Key; } } return string.Empty; } /// /// 获取UE链的统计信息 /// /// UE链统计信息 public UeChainStats GetUeChainStats() { var ueChains = BuildUeChains(); return new UeChainStats { TotalChains = ueChains.Count, TotalUeIds = ueChains.Values.Sum(chain => chain.Count), AverageChainLength = ueChains.Count > 0 ? (double)ueChains.Values.Sum(chain => chain.Count) / ueChains.Count : 0, MaxChainLength = ueChains.Count > 0 ? ueChains.Values.Max(chain => chain.Count) : 0, MinChainLength = ueChains.Count > 0 ? ueChains.Values.Min(chain => chain.Count) : 0 }; } /// /// 获取所有UE链的详细信息 /// /// UE链详细信息列表 public List GetUeChainDetails() { var ueChains = BuildUeChains(); var chainInfos = new List(); foreach (var kvp in ueChains) { int rootUeId = kvp.Key; var chain = kvp.Value; string imsi = GetImsiFromUeChain(rootUeId, ueChains); chainInfos.Add(new UeChainInfo { RootUeId = rootUeId, ChainLength = chain.Count, UeIds = chain.ToList(), Imsi = imsi }); } return chainInfos; } } /// /// UE链统计信息 /// public class UeChainStats { /// /// 总链数 /// public int TotalChains { get; set; } /// /// 总UE ID数 /// public int TotalUeIds { get; set; } /// /// 平均链长度 /// public double AverageChainLength { get; set; } /// /// 最大链长度 /// public int MaxChainLength { get; set; } /// /// 最小链长度 /// public int MinChainLength { get; set; } } /// /// UE链详细信息 /// public class UeChainInfo { /// /// 根节点UE ID /// public int RootUeId { get; set; } /// /// 链长度 /// public int ChainLength { get; set; } /// /// 链中的所有UE ID /// public List UeIds { get; set; } = new List(); /// /// 对应的IMSI /// public string Imsi { get; set; } = string.Empty; } }