优化和路径规划新适配
This commit is contained in:
@@ -58,4 +58,7 @@ class HttpApiConsts {
|
||||
|
||||
// 获取无人机详情
|
||||
static const String getUAVDetail = "$baseUrl/iot/UAV/getUAVDetail";
|
||||
|
||||
// 飞行任务命令控制(暂停、返航等)
|
||||
static const String flightTaskCommand = "$baseUrl/iot/UAV/flightTaskCommand";
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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()),
|
||||
);
|
||||
|
||||
13
lib/core/env/env_config.dart
vendored
13
lib/core/env/env_config.dart
vendored
@@ -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 端口
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user