diff --git a/src/X1.Domain/Models/LteCellConfiguration/LteCellConfiguration.cs b/src/X1.Domain/Models/LteCellConfiguration/LteCellConfiguration.cs new file mode 100644 index 0000000..f69bdfc --- /dev/null +++ b/src/X1.Domain/Models/LteCellConfiguration/LteCellConfiguration.cs @@ -0,0 +1,308 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace X1.Domain.Models.LteCellConfiguration +{ + /// + /// 4G LTE小区配置主实体类 + /// + public class LteCellConfiguration + { + [JsonProperty("cell_id")] + public int? CellId { get; set; } + + [JsonProperty("n_id_cell")] + public int? NIdCell { get; set; } + + [JsonProperty("tac")] + public int? Tac { get; set; } + + [JsonProperty("plmn_list")] + public List PlmnList { get; set; } = new List(); + + [JsonProperty("cipher_algo_pref")] + public List CipherAlgoPref { get; set; } = new List(); + + [JsonProperty("integ_algo_pref")] + public List IntegAlgoPref { get; set; } = new List(); + + [JsonProperty("ims_emergency_support")] + public bool? ImsEmergencySupport { get; set; } + + [JsonProperty("ignore_ue_as_release")] + public bool? IgnoreUeAsRelease { get; set; } + + [JsonProperty("edrx")] + public bool? Edrx { get; set; } + + [JsonProperty("ue_count_max")] + public int? UeCountMax { get; set; } + + [JsonProperty("allow_cat0_ue")] + public bool? AllowCat0Ue { get; set; } + + [JsonProperty("inactivity_timer")] + public int? InactivityTimer { get; set; } + + [JsonProperty("cell_barred")] + public bool? CellBarred { get; set; } + + [JsonProperty("intra_freq_reselection")] + public bool? IntraFreqReselection { get; set; } + + [JsonProperty("q_rx_lev_min")] + public int? QRxLevMin { get; set; } + + [JsonProperty("q_rx_lev_min_offset")] + public int? QRxLevMinOffset { get; set; } + + [JsonProperty("p_max")] + public int? PMax { get; set; } + + [JsonProperty("pws_max_segment_len")] + public int? PwsMaxSegmentLen { get; set; } + + [JsonProperty("pws_si_periodicity")] + public int? PwsSiPeriodicity { get; set; } + + [JsonProperty("sib16_enable")] + public bool? Sib16Enable { get; set; } + + [JsonProperty("sib16_si_periodicity")] + public int? Sib16SiPeriodicity { get; set; } + + [JsonProperty("si_value_tag")] + public int? SiValueTag { get; set; } + + [JsonProperty("si_window_length")] + public int? SiWindowLength { get; set; } + + [JsonProperty("sib_sched_list")] + public List SibSchedList { get; set; } = new List(); + + [JsonProperty("cell_gain")] + public int? CellGain { get; set; } + + [JsonProperty("rf_port")] + public int? RfPort { get; set; } + + [JsonProperty("cyclic_prefix")] + public string? CyclicPrefix { get; set; } + + [JsonProperty("n_rb_dl")] + public int? NRbDl { get; set; } + + [JsonProperty("dl_earfcn")] + public int? DlEarfcn { get; set; } + + [JsonProperty("ul_earfcn")] + public int? UlEarfcn { get; set; } + + [JsonProperty("n_antenna_dl")] + public int? NAntennaDl { get; set; } + + [JsonProperty("n_antenna_ul")] + public int? NAntennaUl { get; set; } + + [JsonProperty("power_p_sync")] + public int? PowerPSync { get; set; } + + [JsonProperty("power_s_sync")] + public int? PowerSSync { get; set; } + + [JsonProperty("power_pbch")] + public int? PowerPbch { get; set; } + + [JsonProperty("power_pcfich")] + public int? PowerPcfich { get; set; } + + [JsonProperty("power_phich")] + public int? PowerPhich { get; set; } + + [JsonProperty("power_pdcch")] + public int? PowerPdcch { get; set; } + + [JsonProperty("power_pdsch_si")] + public int? PowerPdschSi { get; set; } + + [JsonProperty("p_srs_offset")] + public int? PSrsOffset { get; set; } + + [JsonProperty("transmission_mode")] + public int? TransmissionMode { get; set; } + + [JsonProperty("transmission_mode_opt")] + public int? TransmissionModeOpt { get; set; } + + [JsonProperty("manual_ref_signal_power")] + public bool? ManualRefSignalPower { get; set; } + + [JsonProperty("dpc")] + public bool? Dpc { get; set; } + + [JsonProperty("dpc_pusch_snr_target")] + public double? DpcPuschSnrTarget { get; set; } + + [JsonProperty("dpc_pucch_snr_target")] + public double? DpcPucchSnrTarget { get; set; } + + [JsonProperty("root_sequence_index")] + public int? RootSequenceIndex { get; set; } + + [JsonProperty("pusch_msg3_mcs")] + public int? PuschMsg3Mcs { get; set; } + + [JsonProperty("pusch_msg3_delta_power")] + public int? PuschMsg3DeltaPower { get; set; } + + [JsonProperty("rar_backoff_index")] + public int? RarBackoffIndex { get; set; } + + [JsonProperty("pdsch_dedicated")] + public PdschDedicatedConfig PdschDedicated { get; set; } = new PdschDedicatedConfig(); + + [JsonProperty("phich_duration")] + public string? PhichDuration { get; set; } + + [JsonProperty("phich_resource")] + public string? PhichResource { get; set; } + + [JsonProperty("pucch_dedicated")] + public PucchDedicatedConfig PucchDedicated { get; set; } = new PucchDedicatedConfig(); + + [JsonProperty("pusch_dedicated")] + public PuschDedicatedConfig PuschDedicated { get; set; } = new PuschDedicatedConfig(); + + [JsonProperty("srs_dedicated")] + public SrsDedicatedConfig SrsDedicated { get; set; } = new SrsDedicatedConfig(); + + [JsonProperty("m_ri")] + public int? MRi { get; set; } + + [JsonProperty("ap_cqi_period")] + public int? ApCqiPeriod { get; set; } + + [JsonProperty("simultaneousAckNackAndCQI")] + public bool? SimultaneousAckNackAndCQI { get; set; } + + [JsonProperty("simultaneousAckNackAndCQI_format3")] + public bool? SimultaneousAckNackAndCQIFormat3 { get; set; } + + [JsonProperty("cqi_period")] + public int? CqiPeriod { get; set; } + + [JsonProperty("cqi_adapt_fer")] + public double? CqiAdaptFer { get; set; } + + [JsonProperty("ul_snr_adapt_fer")] + public double? UlSnrAdaptFer { get; set; } + + [JsonProperty("si_coderate")] + public double? SiCoderate { get; set; } + + [JsonProperty("si_pdcch_format")] + public int? SiPdcchFormat { get; set; } + + [JsonProperty("sr_period")] + public int? SrPeriod { get; set; } + + [JsonProperty("n_symb_cch")] + public int? NSymbCch { get; set; } + + [JsonProperty("initial_cqi")] + public int? InitialCqi { get; set; } + + [JsonProperty("forced_cqi")] + public int? ForcedCqi { get; set; } + + [JsonProperty("force_dl_schedule")] + public bool? ForceDlSchedule { get; set; } + + [JsonProperty("force_full_bsr")] + public bool? ForceFullBsr { get; set; } + + [JsonProperty("dl_256qam")] + public bool? Dl256Qam { get; set; } + + [JsonProperty("dl_1024qam")] + public bool? Dl1024Qam { get; set; } + + [JsonProperty("ul_64qam")] + public bool? Ul64Qam { get; set; } + + [JsonProperty("ul_256qam")] + public bool? Ul256Qam { get; set; } + + [JsonProperty("pusch_max_its")] + public int? PuschMaxIts { get; set; } + + [JsonProperty("pusch_max_mcs")] + public int? PuschMaxMcs { get; set; } + + [JsonProperty("pdsch_mcs")] + public List PdschMcs { get; set; } = new List(); + + [JsonProperty("pdsch_fixed_rb_alloc")] + public List PdschFixedRbAlloc { get; set; } = new List(); + + [JsonProperty("pusch_mcs")] + public List PuschMcs { get; set; } = new List(); + + [JsonProperty("pusch_fixed_rb_alloc")] + public List PuschFixedRbAlloc { get; set; } = new List(); + + [JsonProperty("mac_config")] + public MacConfig MacConfig { get; set; } = new MacConfig(); + + [JsonProperty("gbr_ul_ratio")] + public double? GbrUlRatio { get; set; } + + [JsonProperty("gbr_dl_ratio")] + public double? GbrDlRatio { get; set; } + + [JsonProperty("ignore_gbr_congestion")] + public bool? IgnoreGbrCongestion { get; set; } + + [JsonProperty("srb_config")] + public List SrbConfig { get; set; } = new List(); + + [JsonProperty("drb_config")] + public string? DrbConfig { get; set; } + + [JsonProperty("t304")] + public int? T304 { get; set; } + + [JsonProperty("rrc_cnx_reject_waitTime")] + public int? RrcCnxRejectWaitTime { get; set; } + + [JsonProperty("rrc_cnx_reject_extWaitTime")] + public int? RrcCnxRejectExtWaitTime { get; set; } + + [JsonProperty("meas_gap_config")] + public string? MeasGapConfig { get; set; } + + [JsonProperty("forced_meas_gap_offset")] + public int? ForcedMeasGapOffset { get; set; } + + [JsonProperty("meas_config")] + public string? MeasConfig { get; set; } + + [JsonProperty("ho_from_meas")] + public bool? HoFromMeas { get; set; } + + [JsonProperty("ho_cfra")] + public bool? HoCfra { get; set; } + + [JsonProperty("scell_list")] + public List ScellList { get; set; } = new List(); + + [JsonProperty("scells_activation")] + public string? ScellsActivation { get; set; } + + [JsonProperty("ncell_list")] + public List NcellList { get; set; } = new List(); + + [JsonProperty("forced_ri")] + public int? ForcedRi { get; set; } + } +} diff --git a/src/X1.Domain/Models/LteCellConfiguration/LteCellConfigurationCollection.cs b/src/X1.Domain/Models/LteCellConfiguration/LteCellConfigurationCollection.cs new file mode 100644 index 0000000..95dc3d5 --- /dev/null +++ b/src/X1.Domain/Models/LteCellConfiguration/LteCellConfigurationCollection.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace X1.Domain.Models.LteCellConfiguration +{ + /// + /// LTE小区配置集合类 + /// + public class LteCellConfigurationCollection + { + /// + /// 小区配置列表 + /// + [JsonProperty("cells")] + public List Cells { get; set; } = new List(); + + /// + /// 配置版本 + /// + [JsonProperty("version")] + public string? Version { get; set; } + + /// + /// 配置描述 + /// + [JsonProperty("description")] + public string? Description { get; set; } + + /// + /// 创建时间 + /// + [JsonProperty("created_at")] + public string? CreatedAt { get; set; } + + /// + /// 更新时间 + /// + [JsonProperty("updated_at")] + public string? UpdatedAt { get; set; } + } +} + diff --git a/src/X1.Domain/Models/LteCellConfiguration/MacConfig.cs b/src/X1.Domain/Models/LteCellConfiguration/MacConfig.cs new file mode 100644 index 0000000..ec3fb75 --- /dev/null +++ b/src/X1.Domain/Models/LteCellConfiguration/MacConfig.cs @@ -0,0 +1,95 @@ +using Newtonsoft.Json; + +namespace X1.Domain.Models.LteCellConfiguration +{ + /// + /// MAC配置实体类 + /// + public class MacConfig + { + /// + /// 上行最大HARQ传输次数 + /// + [JsonProperty("ul_max_harq_tx")] + public int? UlMaxHarqTx { get; set; } + + /// + /// 下行最大HARQ传输次数 + /// + [JsonProperty("dl_max_harq_tx")] + public int? DlMaxHarqTx { get; set; } + + /// + /// 上行最大连续重传次数 + /// + [JsonProperty("ul_max_consecutive_retx")] + public int? UlMaxConsecutiveRetx { get; set; } + + /// + /// 下行最大连续重传次数 + /// + [JsonProperty("dl_max_consecutive_retx")] + public int? DlMaxConsecutiveRetx { get; set; } + + /// + /// 时间对齐传输定时器 + /// + [JsonProperty("time_alignment_tx_timer")] + public int? TimeAlignmentTxTimer { get; set; } + + /// + /// 专用时间对齐定时器 + /// + [JsonProperty("time_alignment_timer_dedicated")] + public int? TimeAlignmentTimerDedicated { get; set; } + + /// + /// 周期性BSR定时器 + /// + [JsonProperty("periodic_bsr_timer")] + public int? PeriodicBsrTimer { get; set; } + + /// + /// 重传BSR定时器 + /// + [JsonProperty("retx_bsr_timer")] + public int? RetxBsrTimer { get; set; } + + /// + /// 周期性PHR定时器 + /// + [JsonProperty("periodic_phr_timer")] + public int? PeriodicPhrTimer { get; set; } + + /// + /// 禁止PHR定时器 + /// + [JsonProperty("prohibit_phr_timer")] + public int? ProhibitPhrTimer { get; set; } + + /// + /// 下行路径损耗变化 + /// + [JsonProperty("dl_path_loss_change")] + public string? DlPathLossChange { get; set; } + + /// + /// 数据非活动定时器 + /// + [JsonProperty("data_inactivity_timer")] + public int? DataInactivityTimer { get; set; } + + /// + /// SR禁止定时器 + /// + [JsonProperty("sr_prohibit_timer")] + public int? SrProhibitTimer { get; set; } + + /// + /// 逻辑信道SR禁止定时器 + /// + [JsonProperty("logical_channel_sr_prohibit_timer")] + public int? LogicalChannelSrProhibitTimer { get; set; } + } +} + diff --git a/src/X1.Domain/Models/LteCellConfiguration/NcellConfig.cs b/src/X1.Domain/Models/LteCellConfiguration/NcellConfig.cs new file mode 100644 index 0000000..081a926 --- /dev/null +++ b/src/X1.Domain/Models/LteCellConfiguration/NcellConfig.cs @@ -0,0 +1,71 @@ +using Newtonsoft.Json; + +namespace X1.Domain.Models.LteCellConfiguration +{ + /// + /// 邻区配置实体类 + /// + public class NcellConfig + { + /// + /// 无线接入技术 + /// + [JsonProperty("rat")] + public string? Rat { get; set; } + + /// + /// 物理小区ID + /// + [JsonProperty("n_id_cell")] + public int? NIdCell { get; set; } + + /// + /// 下行EARFCN + /// + [JsonProperty("dl_earfcn")] + public int? DlEarfcn { get; set; } + + /// + /// PLMN标识 + /// + [JsonProperty("plmn")] + public string? Plmn { get; set; } + + /// + /// 小区ID + /// + [JsonProperty("cell_id")] + public int? CellId { get; set; } + + /// + /// 跟踪区域码 + /// + [JsonProperty("tac")] + public int? Tac { get; set; } + + /// + /// 允许测量带宽 + /// + [JsonProperty("allowed_meas_bandwidth")] + public int? AllowedMeasBandwidth { get; set; } + + /// + /// 天线端口1 + /// + [JsonProperty("antenna_port_1")] + public bool? AntennaPort1 { get; set; } + + /// + /// 邻区小区配置 + /// + [JsonProperty("neigh_cell_config")] + public int? NeighCellConfig { get; set; } + + /// + /// EPS回退目标 + /// + [JsonProperty("eps_fallback_target")] + public bool? EpsFallbackTarget { get; set; } + } +} + diff --git a/src/X1.Domain/Models/LteCellConfiguration/PdschDedicatedConfig.cs b/src/X1.Domain/Models/LteCellConfiguration/PdschDedicatedConfig.cs new file mode 100644 index 0000000..dfa15c3 --- /dev/null +++ b/src/X1.Domain/Models/LteCellConfiguration/PdschDedicatedConfig.cs @@ -0,0 +1,23 @@ +using Newtonsoft.Json; + +namespace X1.Domain.Models.LteCellConfiguration +{ + /// + /// PDSCH专用配置实体类 + /// + public class PdschDedicatedConfig + { + /// + /// P_A参数 + /// + [JsonProperty("p_a")] + public double? PA { get; set; } + + /// + /// P_B参数 + /// + [JsonProperty("p_b")] + public double? PB { get; set; } + } +} + diff --git a/src/X1.Domain/Models/LteCellConfiguration/PlmnConfig.cs b/src/X1.Domain/Models/LteCellConfiguration/PlmnConfig.cs new file mode 100644 index 0000000..0eb1a6d --- /dev/null +++ b/src/X1.Domain/Models/LteCellConfiguration/PlmnConfig.cs @@ -0,0 +1,35 @@ +using Newtonsoft.Json; + +namespace X1.Domain.Models.LteCellConfiguration +{ + /// + /// PLMN配置实体类 + /// + public class PlmnConfig + { + /// + /// PLMN标识 + /// + [JsonProperty("plmn")] + public string? Plmn { get; set; } + + /// + /// 保留标志 + /// + [JsonProperty("reserved")] + public bool? Reserved { get; set; } + + /// + /// CP CIoT选项 + /// + [JsonProperty("cp_ciot_opt")] + public bool? CpCiotOpt { get; set; } + + /// + /// 无PDN附着 + /// + [JsonProperty("attach_without_pdn")] + public bool? AttachWithoutPdn { get; set; } + } +} + diff --git a/src/X1.Domain/Models/LteCellConfiguration/PucchDedicatedConfig.cs b/src/X1.Domain/Models/LteCellConfiguration/PucchDedicatedConfig.cs new file mode 100644 index 0000000..fb36810 --- /dev/null +++ b/src/X1.Domain/Models/LteCellConfiguration/PucchDedicatedConfig.cs @@ -0,0 +1,41 @@ +using Newtonsoft.Json; + +namespace X1.Domain.Models.LteCellConfiguration +{ + /// + /// PUCCH专用配置实体类 + /// + public class PucchDedicatedConfig + { + /// + /// CQI PUCCH RB数量 + /// + [JsonProperty("cqi_pucch_n_rb")] + public int? CqiPucchNRb { get; set; } + + /// + /// N1 PUCCH SR计数 + /// + [JsonProperty("n1_pucch_sr_count")] + public int? N1PucchSrCount { get; set; } + + /// + /// ACK/NACK反馈模式CA + /// + [JsonProperty("ack_nack_feedback_mode_ca")] + public string? AckNackFeedbackModeCa { get; set; } + + /// + /// N1 PUCCH AN CS计数 + /// + [JsonProperty("n1_pucch_an_cs_count")] + public int? N1PucchAnCsCount { get; set; } + + /// + /// N3 PUCCH AN RB数量 + /// + [JsonProperty("n3_pucch_an_n_rb")] + public int? N3PucchAnNRb { get; set; } + } +} + diff --git a/src/X1.Domain/Models/LteCellConfiguration/PuschDedicatedConfig.cs b/src/X1.Domain/Models/LteCellConfiguration/PuschDedicatedConfig.cs new file mode 100644 index 0000000..5b52174 --- /dev/null +++ b/src/X1.Domain/Models/LteCellConfiguration/PuschDedicatedConfig.cs @@ -0,0 +1,29 @@ +using Newtonsoft.Json; + +namespace X1.Domain.Models.LteCellConfiguration +{ + /// + /// PUSCH专用配置实体类 + /// + public class PuschDedicatedConfig + { + /// + /// Beta偏移ACK索引 + /// + [JsonProperty("beta_offset_ack_index")] + public int? BetaOffsetAckIndex { get; set; } + + /// + /// Beta偏移RI索引 + /// + [JsonProperty("beta_offset_ri_index")] + public int? BetaOffsetRiIndex { get; set; } + + /// + /// Beta偏移CQI索引 + /// + [JsonProperty("beta_offset_cqi_index")] + public int? BetaOffsetCqiIndex { get; set; } + } +} + diff --git a/src/X1.Domain/Models/LteCellConfiguration/README.md b/src/X1.Domain/Models/LteCellConfiguration/README.md new file mode 100644 index 0000000..86a25ba --- /dev/null +++ b/src/X1.Domain/Models/LteCellConfiguration/README.md @@ -0,0 +1,130 @@ +# LTE小区配置实体类说明 + +## 概述 +本目录包含4G LTE小区配置相关的实体类,用于管理和处理LTE小区参数配置。 + +## 文件结构 + +### 主要实体类 +- `LteCellConfiguration.cs` - 主要的LTE小区配置实体类,包含所有小区参数 +- `LteCellConfigurationCollection.cs` - LTE小区配置集合类,用于管理多个小区配置 + +### 子配置实体类 +- `PlmnConfig.cs` - PLMN配置 +- `SibSchedConfig.cs` - SIB调度配置 +- `PdschDedicatedConfig.cs` - PDSCH专用配置 +- `PucchDedicatedConfig.cs` - PUCCH专用配置 +- `PuschDedicatedConfig.cs` - PUSCH专用配置 +- `SrsDedicatedConfig.cs` - SRS专用配置 +- `MacConfig.cs` - MAC层配置 +- `SrbConfig.cs` - SRB配置 +- `ScellConfig.cs` - 辅小区配置 +- `NcellConfig.cs` - 邻区配置 + +## 使用示例 + +### 创建小区配置 +```csharp +var cellConfig = new LteCellConfiguration +{ + CellId = 3, + NIdCell = 0, + Tac = 1, + PlmnList = new List + { + new PlmnConfig + { + Plmn = "46011", + Reserved = false, + CpCiotOpt = false, + AttachWithoutPdn = false + } + }, + // ... 其他配置参数 +}; +``` + +### 序列化为JSON +```csharp +var json = JsonConvert.SerializeObject(cellConfig, Formatting.Indented); +``` + +### 反序列化JSON +```csharp +var config = JsonConvert.DeserializeObject(json); +``` + +## 配置参数说明 + +### 基本信息 +- `CellId`: 小区ID +- `NIdCell`: 物理小区ID +- `Tac`: 跟踪区域码 +- `PlmnList`: PLMN列表 + +### 无线参数 +- `NRbDl`: 下行资源块数量 +- `DlEarfcn`: 下行EARFCN +- `UlEarfcn`: 上行EARFCN +- `NAntennaDl`: 下行天线数量 +- `NAntennaUl`: 上行天线数量 + +### 功率配置 +- `PowerPSync`: P-SCH功率 +- `PowerSSync`: S-SCH功率 +- `PowerPbch`: PBCH功率 +- `PowerPdcch`: PDCCH功率 + +### 专用配置 +- `PdschDedicated`: PDSCH专用配置 +- `PucchDedicated`: PUCCH专用配置 +- `PuschDedicated`: PUSCH专用配置 +- `SrsDedicated`: SRS专用配置 + +### 高级功能 +- `MacConfig`: MAC层配置 +- `SrbConfig`: SRB配置列表 +- `ScellList`: 辅小区列表 +- `NcellList`: 邻区列表 + +## 注意事项 +1. 所有实体类都使用了Newtonsoft.Json的JsonProperty特性,确保与JSON格式兼容 +2. 集合类型的属性都初始化为空列表,避免空引用异常 +3. 所有数值类型、布尔类型和字符串类型都使用可空类型,避免默认值导致的判断错误 +4. null值表示该参数未配置,便于区分默认值和未配置状态 +5. 配置参数的范围和有效性需要在业务逻辑中进行验证 +6. 使用可空类型时,在访问属性前需要检查是否为null + +## 可空类型使用示例 + +### 安全访问属性 +```csharp +// 检查属性是否为null +if (cellConfig.CellId.HasValue) +{ + Console.WriteLine($"小区ID: {cellConfig.CellId.Value}"); +} + +// 使用null合并运算符 +int cellId = cellConfig.CellId ?? 0; +bool isEnabled = cellConfig.CellBarred ?? false; +string prefix = cellConfig.CyclicPrefix ?? "normal"; +``` + +### 条件判断 +```csharp +// 检查布尔属性 +if (cellConfig.CellBarred == true) +{ + Console.WriteLine("小区被禁止"); +} +else if (cellConfig.CellBarred == false) +{ + Console.WriteLine("小区未被禁止"); +} +else +{ + Console.WriteLine("小区禁止状态未配置"); +} +``` + diff --git a/src/X1.Domain/Models/LteCellConfiguration/ScellConfig.cs b/src/X1.Domain/Models/LteCellConfiguration/ScellConfig.cs new file mode 100644 index 0000000..2d33bba --- /dev/null +++ b/src/X1.Domain/Models/LteCellConfiguration/ScellConfig.cs @@ -0,0 +1,35 @@ +using Newtonsoft.Json; + +namespace X1.Domain.Models.LteCellConfiguration +{ + /// + /// 辅小区配置实体类 + /// + public class ScellConfig + { + /// + /// 小区ID + /// + [JsonProperty("cell_id")] + public int? CellId { get; set; } + + /// + /// 跨载波调度 + /// + [JsonProperty("cross_carrier_scheduling")] + public bool? CrossCarrierScheduling { get; set; } + + /// + /// 调度小区ID + /// + [JsonProperty("scheduling_cell_id")] + public int? SchedulingCellId { get; set; } + + /// + /// 上行允许 + /// + [JsonProperty("ul_allowed")] + public bool? UlAllowed { get; set; } + } +} + diff --git a/src/X1.Domain/Models/LteCellConfiguration/SibSchedConfig.cs b/src/X1.Domain/Models/LteCellConfiguration/SibSchedConfig.cs new file mode 100644 index 0000000..f7d4f4b --- /dev/null +++ b/src/X1.Domain/Models/LteCellConfiguration/SibSchedConfig.cs @@ -0,0 +1,23 @@ +using Newtonsoft.Json; + +namespace X1.Domain.Models.LteCellConfiguration +{ + /// + /// SIB调度配置实体类 + /// + public class SibSchedConfig + { + /// + /// 配置文件路径 + /// + [JsonProperty("filename")] + public string? Filename { get; set; } + + /// + /// SI周期性 + /// + [JsonProperty("si_periodicity")] + public int? SiPeriodicity { get; set; } + } +} + diff --git a/src/X1.Domain/Models/LteCellConfiguration/SrbConfig.cs b/src/X1.Domain/Models/LteCellConfiguration/SrbConfig.cs new file mode 100644 index 0000000..16a7be0 --- /dev/null +++ b/src/X1.Domain/Models/LteCellConfiguration/SrbConfig.cs @@ -0,0 +1,35 @@ +using Newtonsoft.Json; + +namespace X1.Domain.Models.LteCellConfiguration +{ + /// + /// SRB配置实体类 + /// + public class SrbConfig + { + /// + /// SRB ID + /// + [JsonProperty("id")] + public int? Id { get; set; } + + /// + /// 最大重传阈值 + /// + [JsonProperty("maxRetxThreshold")] + public int? MaxRetxThreshold { get; set; } + + /// + /// 重排序定时器 + /// + [JsonProperty("t_Reordering")] + public int? TReordering { get; set; } + + /// + /// 轮询重传定时器 + /// + [JsonProperty("t_PollRetransmit")] + public int? TPollRetransmit { get; set; } + } +} + diff --git a/src/X1.Domain/Models/LteCellConfiguration/SrsDedicatedConfig.cs b/src/X1.Domain/Models/LteCellConfiguration/SrsDedicatedConfig.cs new file mode 100644 index 0000000..5cce9de --- /dev/null +++ b/src/X1.Domain/Models/LteCellConfiguration/SrsDedicatedConfig.cs @@ -0,0 +1,41 @@ +using Newtonsoft.Json; + +namespace X1.Domain.Models.LteCellConfiguration +{ + /// + /// SRS专用配置实体类 + /// + public class SrsDedicatedConfig + { + /// + /// SRS带宽配置 + /// + [JsonProperty("srs_bandwidth_config")] + public int? SrsBandwidthConfig { get; set; } + + /// + /// SRS子帧配置 + /// + [JsonProperty("srs_subframe_config")] + public int? SrsSubframeConfig { get; set; } + + /// + /// SRS周期 + /// + [JsonProperty("srs_period")] + public int? SrsPeriod { get; set; } + + /// + /// SRS带宽 + /// + [JsonProperty("srs_bandwidth")] + public int? SrsBandwidth { get; set; } + + /// + /// SRS跳频带宽 + /// + [JsonProperty("srs_hopping_bandwidth")] + public int? SrsHoppingBandwidth { get; set; } + } +} + diff --git a/src/X1.Domain/Models/NrCellConfiguration/CsiRsConfig.cs b/src/X1.Domain/Models/NrCellConfiguration/CsiRsConfig.cs new file mode 100644 index 0000000..0cb5cac --- /dev/null +++ b/src/X1.Domain/Models/NrCellConfiguration/CsiRsConfig.cs @@ -0,0 +1,257 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace X1.Domain.Models.NrCellConfiguration +{ + /// + /// 5G NR CSI-RS配置 + /// + public class CsiRsConfig + { + [JsonProperty("nzp_csi_rs_resource")] + public List? NzpCsiRsResource { get; set; } + + [JsonProperty("nzp_csi_rs_resource_set")] + public List? NzpCsiRsResourceSet { get; set; } + + [JsonProperty("csi_im_resource")] + public List? CsiImResource { get; set; } + + [JsonProperty("csi_im_resource_set")] + public List? CsiImResourceSet { get; set; } + + [JsonProperty("zp_csi_rs_resource")] + public List? ZpCsiRsResource { get; set; } + + [JsonProperty("p_zp_csi_rs_resource_set")] + public List? PZpCsiRsResourceSet { get; set; } + + [JsonProperty("csi_resource_config")] + public List? CsiResourceConfig { get; set; } + + [JsonProperty("csi_report_config")] + public List? CsiReportConfig { get; set; } + } + + /// + /// NZP CSI-RS资源 + /// + public class NzpCsiRsResource + { + [JsonProperty("csi_rs_id")] + public int? CsiRsId { get; set; } + + [JsonProperty("n_ports")] + public int? NPorts { get; set; } + + [JsonProperty("frequency_domain_allocation")] + public string? FrequencyDomainAllocation { get; set; } + + [JsonProperty("bitmap")] + public string? Bitmap { get; set; } + + [JsonProperty("cdm_type")] + public string? CdmType { get; set; } + + [JsonProperty("density")] + public double? Density { get; set; } + + [JsonProperty("first_symb")] + public int? FirstSymb { get; set; } + + [JsonProperty("rb_start")] + public int? RbStart { get; set; } + + [JsonProperty("l_crb")] + public int? LCrb { get; set; } + + [JsonProperty("power_control_offset")] + public int? PowerControlOffset { get; set; } + + [JsonProperty("power_control_offset_ss")] + public int? PowerControlOffsetSs { get; set; } + + [JsonProperty("scrambling_id")] + public int? ScramblingId { get; set; } + + [JsonProperty("period")] + public int? Period { get; set; } + + [JsonProperty("offset")] + public int? Offset { get; set; } + + [JsonProperty("qcl_info_periodic_csi_rs")] + public int? QclInfoPeriodicCsiRs { get; set; } + } + + /// + /// NZP CSI-RS资源集 + /// + public class NzpCsiRsResourceSet + { + [JsonProperty("csi_rs_set_id")] + public int? CsiRsSetId { get; set; } + + [JsonProperty("nzp_csi_rs_resources")] + public List? NzpCsiRsResources { get; set; } + + [JsonProperty("repetition")] + public bool? Repetition { get; set; } + + [JsonProperty("trs_info")] + public bool? TrsInfo { get; set; } + } + + /// + /// CSI-IM资源 + /// + public class CsiImResource + { + [JsonProperty("csi_im_id")] + public int? CsiImId { get; set; } + + [JsonProperty("pattern")] + public int? Pattern { get; set; } + + [JsonProperty("subcarrier_location")] + public int? SubcarrierLocation { get; set; } + + [JsonProperty("symbol_location")] + public int? SymbolLocation { get; set; } + + [JsonProperty("rb_start")] + public int? RbStart { get; set; } + + [JsonProperty("l_crb")] + public int? LCrb { get; set; } + + [JsonProperty("period")] + public int? Period { get; set; } + + [JsonProperty("offset")] + public int? Offset { get; set; } + } + + /// + /// CSI-IM资源集 + /// + public class CsiImResourceSet + { + [JsonProperty("csi_im_set_id")] + public int? CsiImSetId { get; set; } + + [JsonProperty("csi_im_resources")] + public List? CsiImResources { get; set; } + } + + /// + /// ZP CSI-RS资源 + /// + public class ZpCsiRsResource + { + [JsonProperty("csi_rs_id")] + public int? CsiRsId { get; set; } + + [JsonProperty("frequency_domain_allocation")] + public string? FrequencyDomainAllocation { get; set; } + + [JsonProperty("bitmap")] + public string? Bitmap { get; set; } + + [JsonProperty("n_ports")] + public int? NPorts { get; set; } + + [JsonProperty("cdm_type")] + public string? CdmType { get; set; } + + [JsonProperty("density")] + public double? Density { get; set; } + + [JsonProperty("first_symb")] + public int? FirstSymb { get; set; } + + [JsonProperty("rb_start")] + public int? RbStart { get; set; } + + [JsonProperty("l_crb")] + public int? LCrb { get; set; } + + [JsonProperty("period")] + public int? Period { get; set; } + + [JsonProperty("offset")] + public int? Offset { get; set; } + } + + /// + /// P-ZP CSI-RS资源集 + /// + public class PZpCsiRsResourceSet + { + [JsonProperty("zp_csi_rs_resources")] + public List? ZpCsiRsResources { get; set; } + } + + /// + /// CSI资源配置 + /// + public class CsiResourceConfig + { + [JsonProperty("csi_rsc_config_id")] + public int? CsiRscConfigId { get; set; } + + [JsonProperty("nzp_csi_rs_resource_set_list")] + public List? NzpCsiRsResourceSetList { get; set; } + + [JsonProperty("csi_im_resource_set_list")] + public List? CsiImResourceSetList { get; set; } + + [JsonProperty("resource_type")] + public string? ResourceType { get; set; } + } + + /// + /// CSI报告配置 + /// + public class CsiReportConfig + { + [JsonProperty("resources_for_channel_measurement")] + public int? ResourcesForChannelMeasurement { get; set; } + + [JsonProperty("csi_im_resources_for_interference")] + public int? CsiImResourcesForInterference { get; set; } + + [JsonProperty("report_config_type")] + public string? ReportConfigType { get; set; } + + [JsonProperty("period")] + public int? Period { get; set; } + + [JsonProperty("report_quantity")] + public string? ReportQuantity { get; set; } + + [JsonProperty("codebook_config")] + public CodebookConfig? CodebookConfig { get; set; } + + [JsonProperty("cqi_table")] + public int? CqiTable { get; set; } + + [JsonProperty("subband_size")] + public string? SubbandSize { get; set; } + } + + /// + /// 码本配置 + /// + public class CodebookConfig + { + [JsonProperty("codebook_type")] + public string? CodebookType { get; set; } + + [JsonProperty("sub_type")] + public string? SubType { get; set; } + + [JsonProperty("codebook_mode")] + public int? CodebookMode { get; set; } + } +} diff --git a/src/X1.Domain/Models/NrCellConfiguration/MacConfig.cs b/src/X1.Domain/Models/NrCellConfiguration/MacConfig.cs new file mode 100644 index 0000000..2f4b4d7 --- /dev/null +++ b/src/X1.Domain/Models/NrCellConfiguration/MacConfig.cs @@ -0,0 +1,52 @@ +using Newtonsoft.Json; + +namespace X1.Domain.Models.NrCellConfiguration +{ + /// + /// 5G NR MAC配置 + /// + public class MacConfig + { + [JsonProperty("msg3_max_harq_tx")] + public int? Msg3MaxHarqTx { get; set; } + + [JsonProperty("ul_max_harq_tx")] + public int? UlMaxHarqTx { get; set; } + + [JsonProperty("dl_max_harq_tx")] + public int? DlMaxHarqTx { get; set; } + + [JsonProperty("ul_max_consecutive_retx")] + public int? UlMaxConsecutiveRetx { get; set; } + + [JsonProperty("dl_max_consecutive_retx")] + public int? DlMaxConsecutiveRetx { get; set; } + + [JsonProperty("periodic_bsr_timer")] + public int? PeriodicBsrTimer { get; set; } + + [JsonProperty("retx_bsr_timer")] + public int? RetxBsrTimer { get; set; } + + [JsonProperty("periodic_phr_timer")] + public int? PeriodicPhrTimer { get; set; } + + [JsonProperty("prohibit_phr_timer")] + public int? ProhibitPhrTimer { get; set; } + + [JsonProperty("phr_tx_power_factor_change")] + public string? PhrTxPowerFactorChange { get; set; } + + [JsonProperty("sr_prohibit_timer")] + public int? SrProhibitTimer { get; set; } + + [JsonProperty("sr_trans_max")] + public int? SrTransMax { get; set; } + + [JsonProperty("time_alignment_tx_timer")] + public int? TimeAlignmentTxTimer { get; set; } + + [JsonProperty("time_alignment_timer_dedicated")] + public int? TimeAlignmentTimerDedicated { get; set; } + } +} diff --git a/src/X1.Domain/Models/NrCellConfiguration/NrCellConfiguration.cs b/src/X1.Domain/Models/NrCellConfiguration/NrCellConfiguration.cs new file mode 100644 index 0000000..4e246cd --- /dev/null +++ b/src/X1.Domain/Models/NrCellConfiguration/NrCellConfiguration.cs @@ -0,0 +1,212 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace X1.Domain.Models.NrCellConfiguration +{ + /// + /// 5G NR小区配置主实体类 + /// + public class NrCellConfiguration + { + [JsonProperty("plmn_list")] + public List? PlmnList { get; set; } + + [JsonProperty("cell_id")] + public int? CellId { get; set; } + + [JsonProperty("n_id_cell")] + public int? NIdCell { get; set; } + + [JsonProperty("ims_emergency_support")] + public bool? ImsEmergencySupport { get; set; } + + [JsonProperty("ignore_ue_as_release")] + public bool? IgnoreUeAsRelease { get; set; } + + [JsonProperty("compute_ber")] + public bool? ComputeBer { get; set; } + + [JsonProperty("ue_count_max")] + public int? UeCountMax { get; set; } + + [JsonProperty("cell_barred")] + public bool? CellBarred { get; set; } + + [JsonProperty("intra_freq_reselection")] + public bool? IntraFreqReselection { get; set; } + + [JsonProperty("q_rx_lev_min")] + public int? QRxLevMin { get; set; } + + [JsonProperty("delta_rx_lev_min")] + public int? DeltaRxLevMin { get; set; } + + [JsonProperty("root_sequence_index")] + public int? RootSequenceIndex { get; set; } + + [JsonProperty("q_qual_min")] + public int? QQualMin { get; set; } + + [JsonProperty("si_window_length")] + public int? SiWindowLength { get; set; } + + [JsonProperty("pws_max_segment_len")] + public int? PwsMaxSegmentLen { get; set; } + + [JsonProperty("pws_si_periodicity")] + public int? PwsSiPeriodicity { get; set; } + + [JsonProperty("paging")] + public PagingConfig? Paging { get; set; } + + [JsonProperty("subcarrier_spacing")] + public int? SubcarrierSpacing { get; set; } + + [JsonProperty("cipher_algo_pref")] + public List? CipherAlgoPref { get; set; } + + [JsonProperty("integ_algo_pref")] + public List? IntegAlgoPref { get; set; } + + [JsonProperty("gbr_ul_ratio")] + public double? GbrUlRatio { get; set; } + + [JsonProperty("gbr_dl_ratio")] + public double? GbrDlRatio { get; set; } + + [JsonProperty("ignore_gbr_congestion")] + public bool? IgnoreGbrCongestion { get; set; } + + [JsonProperty("srb3_support")] + public bool? Srb3Support { get; set; } + + [JsonProperty("srb_config")] + public List? SrbConfig { get; set; } + + [JsonProperty("cell_gain")] + public double? CellGain { get; set; } + + [JsonProperty("band")] + public int? Band { get; set; } + + [JsonProperty("dl_nr_arfcn")] + public int? DlNrArfcn { get; set; } + + [JsonProperty("n_antenna_dl")] + public int? NAntennaDl { get; set; } + + [JsonProperty("n_antenna_ul")] + public int? NAntennaUl { get; set; } + + [JsonProperty("bandwidth")] + public int? Bandwidth { get; set; } + + [JsonProperty("ul_frequency_shift_7p5_khz")] + public bool? UlFrequencyShift7p5Khz { get; set; } + + [JsonProperty("pdsch_harq_ack_max")] + public int? PdschHarqAckMax { get; set; } + + [JsonProperty("dmrs_type_a_pos")] + public int? DmrsTypeAPos { get; set; } + + [JsonProperty("p_max")] + public double? PMax { get; set; } + + [JsonProperty("rx_epre_in_dbfs")] + public bool? RxEpreInDbfs { get; set; } + + [JsonProperty("rx_epre_offset")] + public double? RxEpreOffset { get; set; } + + [JsonProperty("rach_ignore_count")] + public int? RachIgnoreCount { get; set; } + + [JsonProperty("rar_backoff_index")] + public int? RarBackoffIndex { get; set; } + + [JsonProperty("dummy_ue_contention_resolution_id")] + public bool? DummyUeContentionResolutionId { get; set; } + + [JsonProperty("alternate_retx_scheme")] + public bool? AlternateRetxScheme { get; set; } + + [JsonProperty("tdd_ul_dl_config")] + public TddUlDlConfig? TddUlDlConfig { get; set; } + + [JsonProperty("n_timing_advance_offset")] + public int? NTimingAdvanceOffset { get; set; } + + [JsonProperty("rf_port")] + public int? RfPort { get; set; } + + [JsonProperty("gscn")] + public int? Gscn { get; set; } + + [JsonProperty("ssb_period")] + public int? SsbPeriod { get; set; } + + [JsonProperty("ssb_pos_bitmap")] + public string? SsbPosBitmap { get; set; } + + [JsonProperty("ss_pbch_block_power")] + public int? SsPbchBlockPower { get; set; } + + [JsonProperty("manual_ref_signal_power")] + public bool? ManualRefSignalPower { get; set; } + + [JsonProperty("ssb_subcarrier_spacing")] + public int? SsbSubcarrierSpacing { get; set; } + + [JsonProperty("csi_rs")] + public CsiRsConfig? CsiRs { get; set; } + + [JsonProperty("prach")] + public PrachConfig? Prach { get; set; } + + [JsonProperty("pdcch")] + public PdcchConfig? Pdcch { get; set; } + + [JsonProperty("pdsch")] + public PdschConfig? Pdsch { get; set; } + + [JsonProperty("pucch")] + public PucchConfig? Pucch { get; set; } + + [JsonProperty("pusch")] + public PuschConfig? Pusch { get; set; } + + [JsonProperty("sr_period")] + public int? SrPeriod { get; set; } + + [JsonProperty("force_dl_schedule")] + public bool? ForceDlSchedule { get; set; } + + [JsonProperty("force_full_bsr")] + public bool? ForceFullBsr { get; set; } + + [JsonProperty("mac_config")] + public MacConfig? MacConfig { get; set; } + + [JsonProperty("inactivity_timer")] + public int? InactivityTimer { get; set; } + + [JsonProperty("eps_fallback_preferred_method")] + public string? EpsFallbackPreferredMethod { get; set; } + + [JsonProperty("ho_from_meas")] + public bool? HoFromMeas { get; set; } + + [JsonProperty("ho_cfra")] + public bool? HoCfra { get; set; } + + [JsonProperty("t304")] + public int? T304 { get; set; } + + [JsonProperty("timers_and_constants")] + public TimersAndConstants? TimersAndConstants { get; set; } + + [JsonProperty("drb_config")] + public string? DrbConfig { get; set; } + } +} diff --git a/src/X1.Domain/Models/NrCellConfiguration/NrCellConfigurationCollection.cs b/src/X1.Domain/Models/NrCellConfiguration/NrCellConfigurationCollection.cs new file mode 100644 index 0000000..0a24f33 --- /dev/null +++ b/src/X1.Domain/Models/NrCellConfiguration/NrCellConfigurationCollection.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace X1.Domain.Models.NrCellConfiguration +{ + /// + /// 5G NR小区配置集合 + /// + public class NrCellConfigurationCollection + { + [JsonProperty("nr_cells")] + public List NrCells { get; set; } = new List(); + + [JsonProperty("total_count")] + public int TotalCount => NrCells.Count; + } +} diff --git a/src/X1.Domain/Models/NrCellConfiguration/PagingConfig.cs b/src/X1.Domain/Models/NrCellConfiguration/PagingConfig.cs new file mode 100644 index 0000000..400fdc5 --- /dev/null +++ b/src/X1.Domain/Models/NrCellConfiguration/PagingConfig.cs @@ -0,0 +1,19 @@ +using Newtonsoft.Json; + +namespace X1.Domain.Models.NrCellConfiguration +{ + /// + /// 5G NR分页配置 + /// + public class PagingConfig + { + [JsonProperty("cycle")] + public int? Cycle { get; set; } + + [JsonProperty("n_frac")] + public int? NFrac { get; set; } + + [JsonProperty("ns")] + public int? Ns { get; set; } + } +} diff --git a/src/X1.Domain/Models/NrCellConfiguration/PdcchConfig.cs b/src/X1.Domain/Models/NrCellConfiguration/PdcchConfig.cs new file mode 100644 index 0000000..3f331aa --- /dev/null +++ b/src/X1.Domain/Models/NrCellConfiguration/PdcchConfig.cs @@ -0,0 +1,101 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace X1.Domain.Models.NrCellConfiguration +{ + /// + /// 5G NR PDCCH配置 + /// + public class PdcchConfig + { + [JsonProperty("css")] + public CssConfig? Css { get; set; } + + [JsonProperty("dedicated_coreset")] + public DedicatedCoreset? DedicatedCoreset { get; set; } + + [JsonProperty("uss")] + public UssConfig? Uss { get; set; } + + [JsonProperty("rar_al_index")] + public int? RarAlIndex { get; set; } + + [JsonProperty("al_index")] + public int? AlIndex { get; set; } + + [JsonProperty("n_rb_coreset0")] + public int? NRbCoreset0 { get; set; } + + [JsonProperty("n_symb_coreset0")] + public int? NSymbCoreset0 { get; set; } + + [JsonProperty("search_space0_index")] + public int? SearchSpace0Index { get; set; } + + [JsonProperty("si_al_index")] + public int? SiAlIndex { get; set; } + + [JsonProperty("paging_al_index")] + public int? PagingAlIndex { get; set; } + } + + /// + /// CSS配置 + /// + public class CssConfig + { + [JsonProperty("n_candidates")] + public List? NCandidates { get; set; } + + [JsonProperty("start_symb")] + public int? StartSymb { get; set; } + } + + /// + /// 专用CORESET配置 + /// + public class DedicatedCoreset + { + [JsonProperty("rb_start")] + public int? RbStart { get; set; } + + [JsonProperty("l_crb")] + public int? LCrb { get; set; } + + [JsonProperty("duration")] + public int? Duration { get; set; } + + [JsonProperty("interleaved")] + public bool? Interleaved { get; set; } + + [JsonProperty("shift_index")] + public int? ShiftIndex { get; set; } + + [JsonProperty("precoder_granularity")] + public string? PrecoderGranularity { get; set; } + + [JsonProperty("dmrs_scid")] + public int? DmrsScid { get; set; } + } + + /// + /// USS配置 + /// + public class UssConfig + { + [JsonProperty("n_candidates")] + public List? NCandidates { get; set; } + + [JsonProperty("start_symb")] + public int? StartSymb { get; set; } + + [JsonProperty("dci_0_1_and_1_1")] + public bool? Dci01And11 { get; set; } + + [JsonProperty("force_dci_0_0")] + public bool? ForceDci00 { get; set; } + + [JsonProperty("force_dci_1_0")] + public bool? ForceDci10 { get; set; } + } +} diff --git a/src/X1.Domain/Models/NrCellConfiguration/PdschConfig.cs b/src/X1.Domain/Models/NrCellConfiguration/PdschConfig.cs new file mode 100644 index 0000000..11efba1 --- /dev/null +++ b/src/X1.Domain/Models/NrCellConfiguration/PdschConfig.cs @@ -0,0 +1,95 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace X1.Domain.Models.NrCellConfiguration +{ + /// + /// 5G NR PDSCH配置 + /// + public class PdschConfig + { + [JsonProperty("mapping_type")] + public string? MappingType { get; set; } + + [JsonProperty("start_symb")] + public int? StartSymb { get; set; } + + [JsonProperty("n_symb")] + public int? NSymb { get; set; } + + [JsonProperty("dmrs_add_pos")] + public int? DmrsAddPos { get; set; } + + [JsonProperty("dmrs_max_len")] + public int? DmrsMaxLen { get; set; } + + [JsonProperty("dmrs_type")] + public int? DmrsType { get; set; } + + [JsonProperty("dmrs_scid0")] + public int? DmrsScid0 { get; set; } + + [JsonProperty("dmrs_scid1")] + public int? DmrsScid1 { get; set; } + + [JsonProperty("k0")] + public int? K0 { get; set; } + + [JsonProperty("k1")] + public List? K1 { get; set; } + + [JsonProperty("n_harq_process")] + public int? NHarqProcess { get; set; } + + [JsonProperty("mcs_table")] + public string? McsTable { get; set; } + + [JsonProperty("n_layer")] + public int? NLayer { get; set; } + + [JsonProperty("dmrs_len")] + public int? DmrsLen { get; set; } + + [JsonProperty("fixed_rb_alloc")] + public bool? FixedRbAlloc { get; set; } + + [JsonProperty("mcs")] + public int? Mcs { get; set; } + + [JsonProperty("data_scid")] + public int? DataScid { get; set; } + + [JsonProperty("n_scid")] + public int? NScid { get; set; } + + [JsonProperty("x_overhead")] + public int? XOverhead { get; set; } + + [JsonProperty("ra_type")] + public string? RaType { get; set; } + + [JsonProperty("vrb_to_prb_interleaver")] + public int? VrbToPrbInterleaver { get; set; } + + [JsonProperty("rar_mcs")] + public int? RarMcs { get; set; } + + [JsonProperty("rar_tb_scaling")] + public int? RarTbScaling { get; set; } + + [JsonProperty("cqi_adapt_fer")] + public double? CqiAdaptFer { get; set; } + + [JsonProperty("cqi_adapt_amp")] + public int? CqiAdaptAmp { get; set; } + + [JsonProperty("initial_cqi")] + public int? InitialCqi { get; set; } + + [JsonProperty("si_mcs")] + public int? SiMcs { get; set; } + + [JsonProperty("paging_mcs")] + public int? PagingMcs { get; set; } + } +} diff --git a/src/X1.Domain/Models/NrCellConfiguration/PlmnConfig.cs b/src/X1.Domain/Models/NrCellConfiguration/PlmnConfig.cs new file mode 100644 index 0000000..df1a517 --- /dev/null +++ b/src/X1.Domain/Models/NrCellConfiguration/PlmnConfig.cs @@ -0,0 +1,19 @@ +using Newtonsoft.Json; + +namespace X1.Domain.Models.NrCellConfiguration +{ + /// + /// 5G NR PLMN配置 + /// + public class PlmnConfig + { + [JsonProperty("plmn")] + public string? Plmn { get; set; } + + [JsonProperty("tac")] + public int? Tac { get; set; } + + [JsonProperty("reserved")] + public bool? Reserved { get; set; } + } +} diff --git a/src/X1.Domain/Models/NrCellConfiguration/PrachConfig.cs b/src/X1.Domain/Models/NrCellConfiguration/PrachConfig.cs new file mode 100644 index 0000000..82cec32 --- /dev/null +++ b/src/X1.Domain/Models/NrCellConfiguration/PrachConfig.cs @@ -0,0 +1,52 @@ +using Newtonsoft.Json; + +namespace X1.Domain.Models.NrCellConfiguration +{ + /// + /// 5G NR PRACH配置 + /// + public class PrachConfig + { + [JsonProperty("prach_config_index")] + public int? PrachConfigIndex { get; set; } + + [JsonProperty("msg1_subcarrier_spacing")] + public int? Msg1SubcarrierSpacing { get; set; } + + [JsonProperty("msg1_fdm")] + public int? Msg1Fdm { get; set; } + + [JsonProperty("msg1_frequency_start")] + public int? Msg1FrequencyStart { get; set; } + + [JsonProperty("zero_correlation_zone_config")] + public int? ZeroCorrelationZoneConfig { get; set; } + + [JsonProperty("preamble_received_target_power")] + public int? PreambleReceivedTargetPower { get; set; } + + [JsonProperty("preamble_trans_max")] + public int? PreambleTransMax { get; set; } + + [JsonProperty("power_ramping_step")] + public int? PowerRampingStep { get; set; } + + [JsonProperty("ra_response_window")] + public int? RaResponseWindow { get; set; } + + [JsonProperty("restricted_set_config")] + public string? RestrictedSetConfig { get; set; } + + [JsonProperty("ra_contention_resolution_timer")] + public int? RaContentionResolutionTimer { get; set; } + + [JsonProperty("ssb_per_prach_occasion")] + public string? SsbPerPrachOccasion { get; set; } + + [JsonProperty("cb_preambles_per_ssb")] + public int? CbPreamblesPerSsb { get; set; } + + [JsonProperty("total_number_of_ra_preambles")] + public int? TotalNumberOfRaPreambles { get; set; } + } +} diff --git a/src/X1.Domain/Models/NrCellConfiguration/PucchConfig.cs b/src/X1.Domain/Models/NrCellConfiguration/PucchConfig.cs new file mode 100644 index 0000000..2615953 --- /dev/null +++ b/src/X1.Domain/Models/NrCellConfiguration/PucchConfig.cs @@ -0,0 +1,91 @@ +using Newtonsoft.Json; + +namespace X1.Domain.Models.NrCellConfiguration +{ + /// + /// 5G NR PUCCH配置 + /// + public class PucchConfig + { + [JsonProperty("pucch_resource_common")] + public int? PucchResourceCommon { get; set; } + + [JsonProperty("pucch_group_hopping")] + public string? PucchGroupHopping { get; set; } + + [JsonProperty("hopping_id")] + public int? HoppingId { get; set; } + + [JsonProperty("p0_nominal")] + public int? P0Nominal { get; set; } + + [JsonProperty("short_pucch_an_rsc_count")] + public int? ShortPucchAnRscCount { get; set; } + + [JsonProperty("long_pucch_an_rsc_count")] + public int? LongPucchAnRscCount { get; set; } + + [JsonProperty("pucch02_min_start_symb")] + public int? Pucch02MinStartSymb { get; set; } + + [JsonProperty("pucch1")] + public Pucch1Config? Pucch1 { get; set; } + + [JsonProperty("pucch3")] + public Pucch3Config? Pucch3 { get; set; } + } + + /// + /// PUCCH1配置 + /// + public class Pucch1Config + { + [JsonProperty("n_cs")] + public int? NCs { get; set; } + + [JsonProperty("n_occ")] + public int? NOcc { get; set; } + + [JsonProperty("freq_hopping")] + public bool? FreqHopping { get; set; } + + [JsonProperty("start_symb")] + public int? StartSymb { get; set; } + + [JsonProperty("n_symb")] + public int? NSymb { get; set; } + } + + /// + /// PUCCH3配置 + /// + public class Pucch3Config + { + [JsonProperty("bpsk")] + public bool? Bpsk { get; set; } + + [JsonProperty("additional_dmrs")] + public bool? AdditionalDmrs { get; set; } + + [JsonProperty("freq_hopping")] + public bool? FreqHopping { get; set; } + + [JsonProperty("start_symb")] + public int? StartSymb { get; set; } + + [JsonProperty("n_symb")] + public int? NSymb { get; set; } + + [JsonProperty("max_code_rate")] + public string? MaxCodeRate { get; set; } + + [JsonProperty("simultaneous_harq_ack_csi")] + public bool? SimultaneousHarqAckCsi { get; set; } + + [JsonProperty("n_prb")] + public int? NPrb { get; set; } + + [JsonProperty("n_prb_csi")] + public int? NPrbCsi { get; set; } + } +} diff --git a/src/X1.Domain/Models/NrCellConfiguration/PuschConfig.cs b/src/X1.Domain/Models/NrCellConfiguration/PuschConfig.cs new file mode 100644 index 0000000..0eeac16 --- /dev/null +++ b/src/X1.Domain/Models/NrCellConfiguration/PuschConfig.cs @@ -0,0 +1,122 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace X1.Domain.Models.NrCellConfiguration +{ + /// + /// 5G NR PUSCH配置 + /// + public class PuschConfig + { + [JsonProperty("mapping_type")] + public string? MappingType { get; set; } + + [JsonProperty("n_symb")] + public int? NSymb { get; set; } + + [JsonProperty("dmrs_add_pos")] + public int? DmrsAddPos { get; set; } + + [JsonProperty("dmrs_max_len")] + public int? DmrsMaxLen { get; set; } + + [JsonProperty("dmrs_type")] + public int? DmrsType { get; set; } + + [JsonProperty("dmrs_scid0")] + public int? DmrsScid0 { get; set; } + + [JsonProperty("dmrs_scid1")] + public int? DmrsScid1 { get; set; } + + [JsonProperty("tf_precoding")] + public bool? TfPrecoding { get; set; } + + [JsonProperty("msg3_tf_precoding")] + public bool? Msg3TfPrecoding { get; set; } + + [JsonProperty("n_id_rs")] + public int? NIdRs { get; set; } + + [JsonProperty("group_hopping")] + public bool? GroupHopping { get; set; } + + [JsonProperty("sequence_hopping")] + public bool? SequenceHopping { get; set; } + + [JsonProperty("mcs_table")] + public string? McsTable { get; set; } + + [JsonProperty("mcs_table_tp")] + public string? McsTableTp { get; set; } + + [JsonProperty("tp_pi2_bpsk")] + public bool? TpPi2Bpsk { get; set; } + + [JsonProperty("partial_slots")] + public bool? PartialSlots { get; set; } + + [JsonProperty("ldpc_max_its")] + public int? LdpcMaxIts { get; set; } + + [JsonProperty("fixed_rb_alloc")] + public bool? FixedRbAlloc { get; set; } + + [JsonProperty("tx_config")] + public string? TxConfig { get; set; } + + [JsonProperty("codebook_subset")] + public string? CodebookSubset { get; set; } + + [JsonProperty("max_rank")] + public int? MaxRank { get; set; } + + [JsonProperty("n_layer")] + public int? NLayer { get; set; } + + [JsonProperty("mcs")] + public int? Mcs { get; set; } + + [JsonProperty("k2")] + public List? K2 { get; set; } + + [JsonProperty("msg3_k2")] + public int? Msg3K2 { get; set; } + + [JsonProperty("msg3_delta_power")] + public int? Msg3DeltaPower { get; set; } + + [JsonProperty("msg3_mcs")] + public int? Msg3Mcs { get; set; } + + [JsonProperty("msg3_alpha")] + public string? Msg3Alpha { get; set; } + + [JsonProperty("p0_nominal_with_grant")] + public int? P0NominalWithGrant { get; set; } + + [JsonProperty("alpha")] + public string? Alpha { get; set; } + + [JsonProperty("beta_offset_ack_index")] + public int? BetaOffsetAckIndex { get; set; } + + [JsonProperty("data_scid")] + public int? DataScid { get; set; } + + [JsonProperty("n_scid")] + public int? NScid { get; set; } + + [JsonProperty("x_overhead")] + public int? XOverhead { get; set; } + + [JsonProperty("cqi_adapt_amp")] + public int? CqiAdaptAmp { get; set; } + + [JsonProperty("uci_scaling")] + public double? UciScaling { get; set; } + + [JsonProperty("ul_snr_adapt_fer")] + public double? UlSnrAdaptFer { get; set; } + } +} diff --git a/src/X1.Domain/Models/NrCellConfiguration/README.md b/src/X1.Domain/Models/NrCellConfiguration/README.md new file mode 100644 index 0000000..7e099d6 --- /dev/null +++ b/src/X1.Domain/Models/NrCellConfiguration/README.md @@ -0,0 +1,95 @@ +# 5G NR小区配置模型 + +本目录包含5G NR(New Radio)小区配置的实体类定义,用于处理5G网络的小区配置参数。 + +## 文件结构 + +### 主要配置类 +- `NrCellConfiguration.cs` - 5G NR小区配置主实体类 +- `NrCellConfigurationCollection.cs` - 5G NR小区配置集合类 + +### 子配置类 +- `PlmnConfig.cs` - PLMN配置 +- `PagingConfig.cs` - 分页配置 +- `SrbConfig.cs` - SRB配置 +- `TddUlDlConfig.cs` - TDD UL/DL配置 +- `CsiRsConfig.cs` - CSI-RS配置 +- `PrachConfig.cs` - PRACH配置 +- `PdcchConfig.cs` - PDCCH配置 +- `PdschConfig.cs` - PDSCH配置 +- `PucchConfig.cs` - PUCCH配置 +- `PuschConfig.cs` - PUSCH配置 +- `MacConfig.cs` - MAC配置 +- `TimersAndConstants.cs` - 定时器和常量配置 + +## 主要特性 + +### 可空类型支持 +所有属性都支持可空类型(nullable),确保在配置参数缺失时不会出现异常。 + +### JSON序列化 +使用Newtonsoft.Json进行JSON序列化和反序列化,支持标准的JSON格式。 + +### 完整的5G NR参数 +包含5G NR网络所需的所有主要配置参数: +- 小区基本参数(小区ID、频段、带宽等) +- 物理层配置(PDCCH、PDSCH、PUCCH、PUSCH等) +- 信道配置(CSI-RS、PRACH等) +- MAC层配置 +- 定时器和常量配置 + +## 使用示例 + +```csharp +// 创建5G NR小区配置 +var nrCellConfig = new NrCellConfiguration +{ + CellId = 23, + NIdCell = 1, + Band = 78, + Bandwidth = 100, + DlNrArfcn = 630000, + SubcarrierSpacing = 30, + // ... 其他配置参数 +}; + +// 序列化为JSON +string json = JsonConvert.SerializeObject(nrCellConfig, Formatting.Indented); + +// 从JSON反序列化 +var config = JsonConvert.DeserializeObject(json); +``` + +## 配置参数说明 + +### 基本参数 +- `cell_id`: 小区ID +- `n_id_cell`: 小区物理层ID +- `band`: 频段号 +- `bandwidth`: 带宽(MHz) +- `dl_nr_arfcn`: 下行NR ARFCN + +### 物理层配置 +- `pdcch`: PDCCH配置 +- `pdsch`: PDSCH配置 +- `pucch`: PUCCH配置 +- `pusch`: PUSCH配置 +- `prach`: PRACH配置 + +### 信道配置 +- `csi_rs`: CSI-RS配置 +- `ssb_period`: SSB周期 +- `ssb_pos_bitmap`: SSB位置位图 + +### 其他配置 +- `mac_config`: MAC层配置 +- `timers_and_constants`: 定时器和常量 +- `srb_config`: SRB配置 +- `plmn_list`: PLMN列表 + +## 注意事项 + +1. 所有数值类型属性都支持可空类型,确保配置的灵活性 +2. 字符串类型属性也支持可空,避免空引用异常 +3. 集合类型属性在未初始化时默认为空列表 +4. 配置参数遵循3GPP 5G NR标准规范 diff --git a/src/X1.Domain/Models/NrCellConfiguration/SrbConfig.cs b/src/X1.Domain/Models/NrCellConfiguration/SrbConfig.cs new file mode 100644 index 0000000..e82046f --- /dev/null +++ b/src/X1.Domain/Models/NrCellConfiguration/SrbConfig.cs @@ -0,0 +1,22 @@ +using Newtonsoft.Json; + +namespace X1.Domain.Models.NrCellConfiguration +{ + /// + /// 5G NR SRB配置 + /// + public class SrbConfig + { + [JsonProperty("id")] + public int? Id { get; set; } + + [JsonProperty("maxRetxThreshold")] + public int? MaxRetxThreshold { get; set; } + + [JsonProperty("t_PollRetransmit")] + public int? TPollRetransmit { get; set; } + + [JsonProperty("t_Reassembly")] + public int? TReassembly { get; set; } + } +} diff --git a/src/X1.Domain/Models/NrCellConfiguration/TddUlDlConfig.cs b/src/X1.Domain/Models/NrCellConfiguration/TddUlDlConfig.cs new file mode 100644 index 0000000..85b4230 --- /dev/null +++ b/src/X1.Domain/Models/NrCellConfiguration/TddUlDlConfig.cs @@ -0,0 +1,37 @@ +using Newtonsoft.Json; + +namespace X1.Domain.Models.NrCellConfiguration +{ + /// + /// 5G NR TDD UL/DL配置 + /// + public class TddUlDlConfig + { + [JsonProperty("pattern1")] + public TddPattern? Pattern1 { get; set; } + + [JsonProperty("pattern2")] + public TddPattern? Pattern2 { get; set; } + } + + /// + /// TDD模式配置 + /// + public class TddPattern + { + [JsonProperty("period")] + public double? Period { get; set; } + + [JsonProperty("dl_slots")] + public int? DlSlots { get; set; } + + [JsonProperty("ul_slots")] + public int? UlSlots { get; set; } + + [JsonProperty("dl_symbols")] + public int? DlSymbols { get; set; } + + [JsonProperty("ul_symbols")] + public int? UlSymbols { get; set; } + } +} diff --git a/src/X1.Domain/Models/NrCellConfiguration/TimersAndConstants.cs b/src/X1.Domain/Models/NrCellConfiguration/TimersAndConstants.cs new file mode 100644 index 0000000..84f427f --- /dev/null +++ b/src/X1.Domain/Models/NrCellConfiguration/TimersAndConstants.cs @@ -0,0 +1,31 @@ +using Newtonsoft.Json; + +namespace X1.Domain.Models.NrCellConfiguration +{ + /// + /// 5G NR定时器和常量配置 + /// + public class TimersAndConstants + { + [JsonProperty("t300")] + public int? T300 { get; set; } + + [JsonProperty("t301")] + public int? T301 { get; set; } + + [JsonProperty("t310")] + public int? T310 { get; set; } + + [JsonProperty("n310")] + public int? N310 { get; set; } + + [JsonProperty("t311")] + public int? T311 { get; set; } + + [JsonProperty("n311")] + public int? N311 { get; set; } + + [JsonProperty("t319")] + public int? T319 { get; set; } + } +} diff --git a/src/X1.Domain/X1.Domain.csproj b/src/X1.Domain/X1.Domain.csproj index 9e4c638..89a3456 100644 --- a/src/X1.Domain/X1.Domain.csproj +++ b/src/X1.Domain/X1.Domain.csproj @@ -15,4 +15,8 @@ + + + +