提交用户传输请求 - 基于实时资源占用决策
(self, request_data)
| 1238 | self.decision_trace_buffer.add(_interrupt_trace) |
| 1239 | |
| 1240 | def submit_request(self, request_data): |
| 1241 | """提交用户传输请求 - 基于实时资源占用决策""" |
| 1242 | with self.lock: |
| 1243 | # 智能选择LEO卫星 - 避免同类型请求集中在一颗卫星 |
| 1244 | # 统计各卫星当前负载(相同数据类型的请求数) |
| 1245 | data_type = request_data.get("data_type") |
| 1246 | # ⭐ 支持指定卫星ID |
| 1247 | satellite_id = request_data.get("satellite_id") |
| 1248 | if satellite_id: |
| 1249 | # 查找指定的卫星 |
| 1250 | satellite = None |
| 1251 | for sat in self.leo_satellites: |
| 1252 | if sat.sat_id == satellite_id: |
| 1253 | satellite = sat |
| 1254 | break |
| 1255 | if not satellite: |
| 1256 | # 标准化拒绝结果(结构与正常返回对齐),并补充日志与统计计数 |
| 1257 | reason = f"未找到指定的卫星: {satellite_id}" |
| 1258 | self.stats["total_requests"] += 1 |
| 1259 | self.stats["user_requests"] += 1 |
| 1260 | self.stats["rejected_requests"] += 1 |
| 1261 | self._record_rejection("SATELLITE_NOT_FOUND") |
| 1262 | self._log(f"请求被拒绝 - {reason}", level="normal") |
| 1263 | return { |
| 1264 | "status": "error", |
| 1265 | "reject_reason": reason, |
| 1266 | "error": reason, |
| 1267 | "available_satellites": [s.sat_id for s in self.leo_satellites], |
| 1268 | } |
| 1269 | else: |
| 1270 | # 如果没有指定卫星,使用负载均衡选择 |
| 1271 | satellite_loads = {} |
| 1272 | for sat in self.leo_satellites: |
| 1273 | # 统计该卫星上相同类型的活跃请求 |
| 1274 | load = sum(1 for r in self.transmission_requests |
| 1275 | if r.satellite_id == sat.sat_id |
| 1276 | and r.data_type == data_type |
| 1277 | and r.status in ["accepted", "transmitting"]) |
| 1278 | satellite_loads[sat.sat_id] = load |
| 1279 | |
| 1280 | # 选择负载最低的卫星(如果有多个则随机选一个) |
| 1281 | min_load = min(satellite_loads.values()) |
| 1282 | candidates = [sat for sat in self.leo_satellites if satellite_loads[sat.sat_id] == min_load] |
| 1283 | satellite = self.rng.choice(candidates) |
| 1284 | |
| 1285 | # ⭐ 处理选中的地面站列表(保存到请求对象,供后续调度使用) |
| 1286 | selected_ground_stations = request_data.get("selected_ground_stations", []) |
| 1287 | |
| 1288 | # ⭐ 处理时间段参数 |
| 1289 | start_time = request_data.get("start_time") |
| 1290 | end_time = request_data.get("end_time") |
| 1291 | |
| 1292 | # 如果前端传递的是偏移量,则计算实际时间 |
| 1293 | start_time_offset = request_data.get("start_time_offset") |
| 1294 | time_window_duration = request_data.get("time_window_duration") |
| 1295 | |
| 1296 | if start_time_offset is not None and time_window_duration is not None: |
| 1297 | # 基于当前仿真时间计算实际时间段 |