You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

219 lines
5.8 KiB

using Newtonsoft.Json;
namespace CoreAgent.Domain.Models.Protocol;
/// <summary>
/// 用户网络身份信息
/// 用于存储移动网络用户的基本身份和位置信息
/// 遵循DDD(领域驱动设计)原则,作为领域模型的一部分
/// </summary>
public class UserNetworkIdentity
{
/// <summary>
/// 公共陆地移动网络标识
/// </summary>
[JsonProperty("plmn")]
public string? Plmn { get; set; }
/// <summary>
/// 旧的临时移动用户标识
/// </summary>
[JsonProperty("oldTmsi")]
public string? OldTmsi { get; set; }
/// <summary>
/// 临时移动用户标识
/// </summary>
[JsonProperty("tmsi")]
public string? Tmsi { get; set; }
/// <summary>
/// 国际移动用户标识
/// </summary>
[JsonProperty("imsi")]
public string? Imsi { get; set; }
/// <summary>
/// 小区ID
/// </summary>
[JsonProperty("cellId")]
public int? CellId { get; set; }
/// <summary>
/// 用户设备ID
/// </summary>
[JsonProperty("ueId")]
public int? UeId { get; set; }
/// <summary>
/// 初始化用户网络身份信息的新实例
/// </summary>
public UserNetworkIdentity()
{
}
/// <summary>
/// 初始化用户网络身份信息的新实例
/// </summary>
/// <param name="plmn">公共陆地移动网络标识</param>
/// <param name="oldTmsi">旧的临时移动用户标识</param>
/// <param name="tmsi">临时移动用户标识</param>
/// <param name="imsi">国际移动用户标识</param>
/// <param name="cellId">小区ID</param>
/// <param name="ueId">用户设备ID</param>
public UserNetworkIdentity(
string? plmn = null,
string? oldTmsi = null,
string? tmsi = null,
string? imsi = null,
int? cellId = null,
int? ueId = null)
{
Plmn = plmn;
OldTmsi = oldTmsi;
Tmsi = tmsi;
Imsi = imsi;
CellId = cellId;
UeId = ueId;
}
/// <summary>
/// 检查是否包含有效的用户身份信息
/// </summary>
/// <returns>是否包含有效信息</returns>
public bool HasValidIdentity()
{
return !string.IsNullOrWhiteSpace(Imsi) ||
!string.IsNullOrWhiteSpace(Tmsi) ||
UeId.HasValue;
}
/// <summary>
/// 检查是否包含位置信息
/// </summary>
/// <returns>是否包含位置信息</returns>
public bool HasLocationInfo()
{
return !string.IsNullOrWhiteSpace(Plmn) || CellId.HasValue;
}
/// <summary>
/// 获取用户身份摘要信息
/// </summary>
/// <returns>摘要信息</returns>
public string GetIdentitySummary()
{
var parts = new List<string>();
if (!string.IsNullOrWhiteSpace(Imsi))
parts.Add($"IMSI:{Imsi}");
if (!string.IsNullOrWhiteSpace(Tmsi))
parts.Add($"TMSI:{Tmsi}");
if (UeId.HasValue)
parts.Add($"UE:{UeId}");
if (!string.IsNullOrWhiteSpace(Plmn))
parts.Add($"PLMN:{Plmn}");
if (CellId.HasValue)
parts.Add($"Cell:{CellId}");
return parts.Count > 0 ? string.Join(" | ", parts) : "No Identity Info";
}
/// <summary>
/// 检查TMSI是否发生变化
/// </summary>
/// <returns>TMSI是否发生变化</returns>
public bool HasTmsiChanged()
{
return !string.IsNullOrWhiteSpace(OldTmsi) &&
!string.IsNullOrWhiteSpace(Tmsi) &&
!OldTmsi.Equals(Tmsi, StringComparison.OrdinalIgnoreCase);
}
/// <summary>
/// 获取TMSI变化信息
/// </summary>
/// <returns>TMSI变化信息</returns>
public string GetTmsiChangeInfo()
{
if (HasTmsiChanged())
{
return $"TMSI Changed: {OldTmsi} -> {Tmsi}";
}
return "TMSI Unchanged";
}
/// <summary>
/// 创建用户网络身份信息的副本
/// </summary>
/// <returns>新的用户网络身份信息</returns>
public UserNetworkIdentity Copy()
{
return new UserNetworkIdentity
{
Plmn = Plmn,
OldTmsi = OldTmsi,
Tmsi = Tmsi,
Imsi = Imsi,
CellId = CellId,
UeId = UeId
};
}
/// <summary>
/// 更新TMSI信息
/// </summary>
/// <param name="newTmsi">新的TMSI</param>
public void UpdateTmsi(string? newTmsi)
{
if (!string.IsNullOrWhiteSpace(Tmsi))
{
OldTmsi = Tmsi;
}
Tmsi = newTmsi;
}
/// <summary>
/// 转换为JSON字符串
/// </summary>
/// <returns>JSON字符串</returns>
public string ToJson()
{
return JsonConvert.SerializeObject(this, Formatting.Indented);
}
/// <summary>
/// 从JSON字符串创建用户网络身份信息
/// </summary>
/// <param name="json">JSON字符串</param>
/// <returns>用户网络身份信息</returns>
public static UserNetworkIdentity FromJson(string json)
{
return JsonConvert.DeserializeObject<UserNetworkIdentity>(json) ?? new UserNetworkIdentity();
}
/// <summary>
/// 合并另一个用户网络身份信息
/// </summary>
/// <param name="other">另一个用户网络身份信息</param>
/// <returns>合并后的用户网络身份信息</returns>
public UserNetworkIdentity Merge(UserNetworkIdentity other)
{
if (other == null)
return this;
return new UserNetworkIdentity
{
Plmn = Plmn ?? other.Plmn,
OldTmsi = OldTmsi ?? other.OldTmsi,
Tmsi = Tmsi ?? other.Tmsi,
Imsi = Imsi ?? other.Imsi,
CellId = CellId ?? other.CellId,
UeId = UeId ?? other.UeId
};
}
}