|
|
@ -6,6 +6,7 @@ import 'package:deep_voice/core/utils/logger.dart'; |
|
|
import 'package:get_storage/get_storage.dart'; |
|
|
import 'package:get_storage/get_storage.dart'; |
|
|
import 'dart:convert'; |
|
|
import 'dart:convert'; |
|
|
import 'package:agent_service/agent_service.dart'; |
|
|
import 'package:agent_service/agent_service.dart'; |
|
|
|
|
|
import 'bluetooth_manager.dart'; |
|
|
|
|
|
|
|
|
// 重新导出BLE连接状态常量,让外部可以通过BleManager访问 |
|
|
// 重新导出BLE连接状态常量,让外部可以通过BleManager访问 |
|
|
export 'package:ble_service/ble_service.dart' show BleConnectionState; |
|
|
export 'package:ble_service/ble_service.dart' show BleConnectionState; |
|
|
@ -107,6 +108,10 @@ class BleManager extends GetxService { |
|
|
final BleService _bleService = BleService(); |
|
|
final BleService _bleService = BleService(); |
|
|
// 经典蓝牙实例 |
|
|
// 经典蓝牙实例 |
|
|
|
|
|
|
|
|
|
|
|
// 当前连接的设备信息 |
|
|
|
|
|
String? _currentDeviceAddress; |
|
|
|
|
|
String? _currentDeviceName; |
|
|
|
|
|
|
|
|
// BLE连接状态 |
|
|
// BLE连接状态 |
|
|
final _connectionState = BleConnectionState.disconnected.obs; |
|
|
final _connectionState = BleConnectionState.disconnected.obs; |
|
|
int get connectionState => _connectionState.value; |
|
|
int get connectionState => _connectionState.value; |
|
|
@ -179,19 +184,8 @@ class BleManager extends GetxService { |
|
|
state == BleConnectionState.error) { |
|
|
state == BleConnectionState.error) { |
|
|
Logger.info('BLE设备已断开或发生错误'); |
|
|
Logger.info('BLE设备已断开或发生错误'); |
|
|
_isConnected.value = false; |
|
|
_isConnected.value = false; |
|
|
// 更新设备信息 |
|
|
// 断开连接时不清除设备信息,保留最后的电量信息 |
|
|
_updateDeviceInfoIfNeeded( |
|
|
// 只有在需要完全清除设备时才重置信息 |
|
|
batteryLevel: 0, |
|
|
|
|
|
leftEarBattery: 0, |
|
|
|
|
|
rightEarBattery: 0, |
|
|
|
|
|
caseBattery: 0, |
|
|
|
|
|
leftEarCharging: false, |
|
|
|
|
|
rightEarCharging: false, |
|
|
|
|
|
caseCharging: false, |
|
|
|
|
|
firmwareVersion: '', |
|
|
|
|
|
firmwareProductId: '', |
|
|
|
|
|
firmwareProductColor: '', |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -408,11 +402,14 @@ class BleManager extends GetxService { |
|
|
else if (deviceInfo.value == null && |
|
|
else if (deviceInfo.value == null && |
|
|
_isConnected.value && |
|
|
_isConnected.value && |
|
|
(firmwareVersion != null || batteryLevel != null)) { |
|
|
(firmwareVersion != null || batteryLevel != null)) { |
|
|
// 提示尝试创建设备信息但缺少必要信息 |
|
|
// 使用保存的设备信息创建新的DeviceInfo对象 |
|
|
Logger.warning('尝试更新设备信息,但设备基本信息不存在'); |
|
|
String deviceAddress = _currentDeviceAddress ?? ""; |
|
|
|
|
|
String deviceName = _currentDeviceName ?? ""; |
|
|
|
|
|
|
|
|
|
|
|
Logger.info('创建新的设备信息对象: address=$deviceAddress, name=$deviceName'); |
|
|
deviceInfo.value = DeviceInfo( |
|
|
deviceInfo.value = DeviceInfo( |
|
|
address: "", // 应确保从连接信息中获取真实值 |
|
|
address: deviceAddress, |
|
|
name: "", |
|
|
name: deviceName, |
|
|
batteryLevel: batteryLevel ?? 0, |
|
|
batteryLevel: batteryLevel ?? 0, |
|
|
leftEarBattery: leftEarBattery ?? 0, |
|
|
leftEarBattery: leftEarBattery ?? 0, |
|
|
rightEarBattery: rightEarBattery ?? 0, |
|
|
rightEarBattery: rightEarBattery ?? 0, |
|
|
@ -427,35 +424,59 @@ class BleManager extends GetxService { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// 清除设备信息(用于完全断开连接或切换设备时) |
|
|
|
|
|
void clearDeviceInfo() { |
|
|
|
|
|
Logger.info('清除设备信息'); |
|
|
|
|
|
deviceInfo.value = null; |
|
|
|
|
|
_currentDeviceAddress = null; |
|
|
|
|
|
_currentDeviceName = null; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/// 连接成功后获取设备信息 |
|
|
/// 连接成功后获取设备信息 |
|
|
Future<void> fetchDeviceInfo() async { |
|
|
Future<void> fetchDeviceInfo() async { |
|
|
Logger.info('开始获取BLE设备详细信息'); |
|
|
Logger.info('开始获取BLE设备详细信息'); |
|
|
|
|
|
|
|
|
try { |
|
|
try { |
|
|
// 获取电池信息 |
|
|
// 确保设备信息对象存在 |
|
|
final batteryResult = await _bleService.getBatteryInfo(); |
|
|
if (deviceInfo.value == null && _isConnected.value) { |
|
|
if (batteryResult) { |
|
|
// 创建初始设备信息对象 |
|
|
Logger.info('电池信息获取指令已发送'); |
|
|
String deviceAddress = _currentDeviceAddress ?? ""; |
|
|
} else { |
|
|
String deviceName = _currentDeviceName ?? ""; |
|
|
|
|
|
|
|
|
|
|
|
Logger.info('初始化设备信息对象: address=$deviceAddress, name=$deviceName'); |
|
|
|
|
|
deviceInfo.value = DeviceInfo( |
|
|
|
|
|
address: deviceAddress, |
|
|
|
|
|
name: deviceName, |
|
|
|
|
|
batteryLevel: 0, |
|
|
|
|
|
leftEarBattery: 0, |
|
|
|
|
|
rightEarBattery: 0, |
|
|
|
|
|
caseBattery: 0, |
|
|
|
|
|
leftEarCharging: false, |
|
|
|
|
|
rightEarCharging: false, |
|
|
|
|
|
caseCharging: false, |
|
|
|
|
|
firmwareVersion: '', |
|
|
|
|
|
firmwareProductId: '', |
|
|
|
|
|
firmwareProductColor: '', |
|
|
|
|
|
); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 并行获取所有设备信息,不使用延迟 |
|
|
|
|
|
final results = await Future.wait([ |
|
|
|
|
|
_bleService.getBatteryInfo(), |
|
|
|
|
|
_bleService.getDeviceVersion(), |
|
|
|
|
|
_bleService.getProductId(), |
|
|
|
|
|
]); |
|
|
|
|
|
|
|
|
|
|
|
Logger.info('设备信息获取结果: 电池=${results[0]}, 版本=${results[1]}, 产品ID=${results[2]}'); |
|
|
|
|
|
|
|
|
|
|
|
if (!results[0]) { |
|
|
Logger.warning('电池信息获取指令发送失败'); |
|
|
Logger.warning('电池信息获取指令发送失败'); |
|
|
} |
|
|
} |
|
|
// 添加延迟 |
|
|
if (!results[1]) { |
|
|
await Future.delayed(const Duration(seconds: 1)); |
|
|
|
|
|
// 获取设备版本信息 |
|
|
|
|
|
final versionResult = await _bleService.getDeviceVersion(); |
|
|
|
|
|
if (versionResult) { |
|
|
|
|
|
Logger.info('版本信息获取指令已发送'); |
|
|
|
|
|
} else { |
|
|
|
|
|
Logger.warning('版本信息获取指令发送失败'); |
|
|
Logger.warning('版本信息获取指令发送失败'); |
|
|
} |
|
|
} |
|
|
// 添加延迟 |
|
|
if (!results[2]) { |
|
|
await Future.delayed(const Duration(seconds: 1)); |
|
|
Logger.warning('产品ID获取指令发送失败'); |
|
|
// 获取产品id |
|
|
|
|
|
final productIdResult = await _bleService.getProductId(); |
|
|
|
|
|
if (productIdResult) { |
|
|
|
|
|
Logger.info('产品id获取指令已发送'); |
|
|
|
|
|
} else { |
|
|
|
|
|
Logger.warning('产品id获取指令发送失败'); |
|
|
|
|
|
} |
|
|
} |
|
|
} catch (e) { |
|
|
} catch (e) { |
|
|
Logger.error('获取BLE设备信息失败: ${e.toString()}'); |
|
|
Logger.error('获取BLE设备信息失败: ${e.toString()}'); |
|
|
@ -576,6 +597,8 @@ class BleManager extends GetxService { |
|
|
Logger.info('BLE服务停止成功'); |
|
|
Logger.info('BLE服务停止成功'); |
|
|
_isConnected.value = false; |
|
|
_isConnected.value = false; |
|
|
_connectionState.value = BleConnectionState.disconnected; |
|
|
_connectionState.value = BleConnectionState.disconnected; |
|
|
|
|
|
// 停止服务时清除设备信息 |
|
|
|
|
|
clearDeviceInfo(); |
|
|
} else { |
|
|
} else { |
|
|
Logger.error('BLE服务停止失败'); |
|
|
Logger.error('BLE服务停止失败'); |
|
|
} |
|
|
} |
|
|
@ -756,6 +779,15 @@ class BleManager extends GetxService { |
|
|
/// 注册后台扫描 |
|
|
/// 注册后台扫描 |
|
|
Future<bool> registerBackgroundScan({String? macAddress}) async { |
|
|
Future<bool> registerBackgroundScan({String? macAddress}) async { |
|
|
try { |
|
|
try { |
|
|
|
|
|
// 保存设备地址信息 |
|
|
|
|
|
if (macAddress != null) { |
|
|
|
|
|
_currentDeviceAddress = macAddress; |
|
|
|
|
|
// 从蓝牙管理器获取设备名称 |
|
|
|
|
|
final bluetoothManager = Get.find<BluetoothManager>(); |
|
|
|
|
|
_currentDeviceName = bluetoothManager.currentDevice?.name ?? ""; |
|
|
|
|
|
Logger.info('保存设备信息: address=$_currentDeviceAddress, name=$_currentDeviceName'); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
return await _bleService.registerBackgroundScan(macAddress: macAddress); |
|
|
return await _bleService.registerBackgroundScan(macAddress: macAddress); |
|
|
} catch (e) { |
|
|
} catch (e) { |
|
|
Logger.error('注册后台扫描失败: ${e.toString()}'); |
|
|
Logger.error('注册后台扫描失败: ${e.toString()}'); |
|
|
|