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;
}
}