优化和路径规划新适配

This commit is contained in:
2026-07-11 16:46:53 +08:00
parent 2124f3bc02
commit 1a4d0aedfd
43 changed files with 2454 additions and 685 deletions

View File

@@ -58,4 +58,7 @@ class HttpApiConsts {
// 获取无人机详情
static const String getUAVDetail = "$baseUrl/iot/UAV/getUAVDetail";
// 飞行任务命令控制(暂停、返航等)
static const String flightTaskCommand = "$baseUrl/iot/UAV/flightTaskCommand";
}

View File

@@ -1,4 +1,6 @@
import '../env/env_config.dart';
class TCPConsts {
static const String TCP_IP = "1.95.137.212";
static const int TCP_PORT = 59016;
static String get TCP_IP => EnvConfig.tcpIp;
static int get TCP_PORT => EnvConfig.tcpPort;
}

View File

@@ -1,4 +1,5 @@
import 'package:dio/dio.dart';
import 'package:flutter/widgets.dart';
import 'package:get_it/get_it.dart';
import 'package:go_router/go_router.dart';
import 'package:maibu_satabot_v2/core/infrastructure/logging/sentry_logger_impl.dart';
@@ -90,6 +91,8 @@ import '../../features/v2/device_list/domain/usecases/get_drone_station_list_use
import '../../features/v2/device_list/domain/usecases/get_video_stream_usecase.dart';
import '../../features/v2/device_list/domain/usecases/get_uav_video_stream_usecase.dart';
import '../../features/v2/device_list/domain/usecases/update_flight_task_status_usecase.dart';
import '../../features/v2/device_list/domain/usecases/pause_flight_task_usecase.dart';
import '../../features/v2/device_list/domain/usecases/return_home_usecase.dart';
import '../../features/v2/device_list/presentation/bloc/drone_station_bloc.dart';
import '../../features/v2/device_list/presentation/bloc/robot_list_bloc.dart';
import '../../features/v2/device_list/presentation/bloc/device_realtime_bloc.dart';
@@ -192,7 +195,10 @@ Future<void> init() async {
/// 1.3 Log工具Sentry
sl.registerLazySingleton<ILoggerService>(() => SentryLoggerImpl());
/// 1.4 --- MQTT Data Sources ---
/// 1.4 --- Route Observer (路由监听器) ---
sl.registerLazySingleton<RouteObserver>(() => RouteObserver<ModalRoute<void>>());
/// 1.5 --- MQTT Data Sources ---
sl.registerFactory<DroneOsdDataSource>(
() =>
DroneOsdDataSourceImpl(sl<MqttClient>(instanceName: 'droneOsdClient')),
@@ -358,6 +364,12 @@ Future<void> init() async {
sl.registerLazySingleton<UpdateFlightTaskStatusUseCase>(
() => UpdateFlightTaskStatusUseCase(sl()),
);
sl.registerLazySingleton<PauseFlightTaskUseCase>(
() => PauseFlightTaskUseCase(sl()),
);
sl.registerLazySingleton<ReturnHomeUseCase>(
() => ReturnHomeUseCase(sl()),
);
sl.registerFactory<DroneStationBloc>(
() => DroneStationBloc(sl(), sl(), sl(), sl()),
);

View File

@@ -1,7 +1,7 @@
class EnvConfig {
static const String environment = String.fromEnvironment(
'ENV',
defaultValue: 'dev',
defaultValue: 'prod',
);
static String get sentryDsn {
@@ -13,4 +13,15 @@ class EnvConfig {
}
static bool get isProduction => environment == 'prod';
/// TCP 服务器配置
static String get tcpIp => '1.95.137.212';
static int get tcpPort {
// 测试服: 59016, 生产服: 9001
if (environment == 'prod') {
return 9001;
}
return 9001; // TCP 端口
}
}

View File

@@ -833,21 +833,24 @@ class TcpClient {
return;
}
isUserSwitch = true;
_isSwitching = true; // 🔥 关键修复:防止旧 socket 的 onDone/onError 触发重连
_connecting = true; // 🔥 防止 connect() 并发创建新连接
debugPrint('🔌 [TCP-connectBySwitch] 设置 _connecting=true');
// 🔥 关键修复:如果 TCP 已连接,先断开旧连接再创建新连接
// 原因:旧连接可能是 _handleResume() 创建的“空连接”(没有关联设备),
// 服务端残留的 session 与当前连接不匹配,导致推送 have_logged_in
// 🔥 核心优化:如果 TCP 已连接,复用现有连接,只调 HTTP switchDevice
// 不再销毁重建,避免推送空窗期导致延迟
if (_socket != null) {
debugPrint('🔌 [TCP-connectBySwitch] 检测到已有连接,先断开再创建新连接(确保服务端 session 干净)');
stopHeartbeat();
_socket!.destroy();
_socket = null;
_isSwitching = false; // 防止 onDone 触发重连
debugPrint('✅ [TCP-connectBySwitch] 已有连接,复用现有连接,只调 HTTP switchDevice: $deviceName');
_logger.logWithLevel('✅ [TCP-connectBySwitch] 复用连接,HTTP切换设备: $deviceName', shouldLog: true);
try {
await switchDeviceUseCase.deviceRepository.switchDevice("app", deviceName);
debugPrint('✅ [TCP-connectBySwitch] HTTP切换成功: $deviceName');
} catch (e) {
debugPrint('❌ [TCP-connectBySwitch] HTTP切换失败: $e');
_logger.logWithLevel('❌ [TCP-connectBySwitch] HTTP切换失败: $e', shouldLog: true);
}
return;
}
isUserSwitch = true;
_connecting = true; // 🔥 防止 connect() 并发创建新连接
debugPrint('🔌 [TCP-connectBySwitch] 无现有连接,开始新建');
// debugPrint('🔌被动 [TCP] 开始连接:$host:$port'); // ✅ 必须看到这条
_logger.logWithLevel('🔌被动 [TCP] 开始连接:$host:$port');
@@ -995,6 +998,7 @@ class TcpClient {
_lastAuthPacketSentAt = DateTime.now(); // 🔥 记录发送 0x03 的时间
_socket!.add(builder.takeBytes());
await _socket!.flush(); // 🔥 关键修复:强制flush,确保认证包立即到达服务端
//debugPrint('🔑 被动[TCP] 已发送认证包 (0x03): $authString');
_logger.logWithLevel('🔑 被动[TCP] 已发送认证包 (0x03): $authString');