From 08d6ebad9c005bc4f2d0bae87b528e3eac8990f6 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Wed, 10 Sep 2025 18:10:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/pairing_controller.dart | 38 +++++++++---------- .../chat_api/ChatApiService.kt | 24 +++++++++++- 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/lib/modules/pairing/controllers/pairing_controller.dart b/lib/modules/pairing/controllers/pairing_controller.dart index 90735dddc..df9198b89 100644 --- a/lib/modules/pairing/controllers/pairing_controller.dart +++ b/lib/modules/pairing/controllers/pairing_controller.dart @@ -1,18 +1,17 @@ -import 'dart:io'; -import 'dart:async'; - import 'package:app_settings/app_settings.dart'; +import 'package:voitrans/data/models/appconfig_model.dart'; +import '/data/models/appconfig.dart'; +import '/data/models/user_Info.dart'; +import '/data/services/network/api.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'dart:async'; import 'package:permission_handler/permission_handler.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../../routes/app_routes.dart'; import '../../../core/utils/logger.dart'; -import '/data/models/appconfig_model.dart'; -import '/data/models/appconfig.dart'; -import '/data/models/user_Info.dart'; -import '/data/services/network/api.dart'; +import 'dart:io'; import '../../../data/services/bluetooth_manager.dart'; import '../../../data/services/ble_manager.dart'; import '../../../core/utils/permission_util.dart'; @@ -348,7 +347,7 @@ class PairingController extends GetxController with WidgetsBindingObserver { void _handleBleStateChange(int state) { if (_currentState.value == PairingState.waitingBle) { if (state == 2) { - // 2代表BLE已连接 + // BLE已连接 _bleTimeoutTimer?.cancel(); _transition(PairingState.completed); } @@ -502,33 +501,32 @@ class PairingController extends GetxController with WidgetsBindingObserver { /// 检查当前状态并决定下一步 void _checkCurrentStatus() async { try { - // 1. 并行检查蓝牙状态、权限、设备连接 + // 1. 检查蓝牙状态 final results = await Future.wait([ - _checkBluetoothState(), // 检查蓝牙是否开启 - _checkPermissions(), // 检查蓝牙相关权限 - _bluetoothManager.refreshDeviceConnection(), // 刷新设备连接状态 + _checkBluetoothState(), // 检查蓝牙状态 + _checkPermissions(), // 检查权限 + _bluetoothManager.refreshDeviceConnection(), // 刷新设备连接 ]); final isBluetoothOk = results[0] as bool; final arePermissionsOk = results[1] as bool; - //蓝牙没开 if (!isBluetoothOk) { _setError( ErrorType.bluetoothOff, 'connectDeepSoundViaSystemBluetooth'.tr); return; } - //权限不够 + // 2. 检查权限 if (!arePermissionsOk) { _setError(ErrorType.noPermission, 'pleaseGrantNecessaryPermissions'.tr); return; } - // 2. 先刷新设备连接状态,确保获取最新的连接信息 - //await _bluetoothManager.refreshDeviceConnection(); + // 3. 先刷新设备连接状态,确保获取最新的连接信息 + await _bluetoothManager.refreshDeviceConnection(); - // 3. 检查经典蓝牙连接 + // 4. 检查经典蓝牙连接 final classicDevice = _bluetoothManager.currentDevice; if (classicDevice == null) { _transition(PairingState.waitingClassic); @@ -545,7 +543,7 @@ class PairingController extends GetxController with WidgetsBindingObserver { } } - /// 检查蓝牙状态是否开启 + /// 新增一个辅助方法来检查蓝牙状态 Future _checkBluetoothState() async { return _bluetoothManager.bluetoothState != 'off'; } @@ -729,7 +727,7 @@ class PairingController extends GetxController with WidgetsBindingObserver { // 检查设备名称是否包含 DeepSound 或 DeapSound final deviceName = device.name; DBProduct? product; - + // 检查是否已有BLE绑定的设备 /// 检查是否已有BLE绑定的设备 if (AppConfig.config.products.isNotEmpty) { final match = AppConfig.config.products.where( @@ -898,7 +896,7 @@ class PairingController extends GetxController with WidgetsBindingObserver { await Future.delayed(Duration(seconds: 1)); } _bleManager.stopScan(); - if (product != null && product.devicetype == 2) { + if (product != null && product.devicetype != 0) { //ble设备 必须要扫描到结果 return 0; } else { diff --git a/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/ChatApiService.kt b/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/ChatApiService.kt index 866248973..83e3a3522 100644 --- a/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/ChatApiService.kt +++ b/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/ChatApiService.kt @@ -600,7 +600,29 @@ class ChatApiService(private val context: android.content.Context? = null) : Cor _mcpClient?.parseJsonArguments(argumentsJson) ?: emptyMap() } // 调用MCP工具 - val toolResult = _mcpClient?.callTool(functionName, arguments) + val toolResult = try { + withTimeout(60000) { // 60秒超时 + _mcpClient?.callTool(functionName, arguments) + } + } catch (e: TimeoutCancellationException) { + Log.w("ChatApiService", "[Session: $sessionid] MCP工具调用超时: $functionName") + mapOf( + "content" to listOf(mapOf( + "type" to "text", + "text" to "Tool call timeout: $functionName" + )), + "isError" to true + ) + } catch (e: Exception) { + Log.e("ChatApiService", "[Session: $sessionid] MCP工具调用异常: $functionName", e) + mapOf( + "content" to listOf(mapOf( + "type" to "text", + "text" to "Tool call failed: ${e.message}" + )), + "isError" to true + ) + } Log.d("ChatApiService", "[Session: $sessionid] AI调用工具结果: $functionName, 参数: $arguments, 结果: $toolResult") // 处理结果 if (toolResult != null) {