|
|
@ -27,6 +27,8 @@ class BleCommands { |
|
|
static const int GET_BATTERY_INFO = 0x04; |
|
|
static const int GET_BATTERY_INFO = 0x04; |
|
|
static const int CONTROL_CODEC = 0x05; |
|
|
static const int CONTROL_CODEC = 0x05; |
|
|
static const int GET_WAKEUP_VERSION = 0x08; |
|
|
static const int GET_WAKEUP_VERSION = 0x08; |
|
|
|
|
|
static const int GET_VOICE_WAKEUP_STATUS = 0x14; |
|
|
|
|
|
static const int SET_VOICE_WAKEUP_STATUS = 0x15; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/// 判断编解码控制指令是否成功 |
|
|
/// 判断编解码控制指令是否成功 |
|
|
@ -216,6 +218,15 @@ class BleManager extends GetxService { |
|
|
bool _awaitingCodecOpen = false; //是否正在等待编码器打开的成功应答 |
|
|
bool _awaitingCodecOpen = false; //是否正在等待编码器打开的成功应答 |
|
|
bool _awaitingCodecClose = false; //是否正在等待编码器关闭的成功应答 |
|
|
bool _awaitingCodecClose = false; //是否正在等待编码器关闭的成功应答 |
|
|
|
|
|
|
|
|
|
|
|
// 语音唤醒状态 |
|
|
|
|
|
final _voiceWakeupEnabled = true.obs; // 唤醒开关状态,默认开启 |
|
|
|
|
|
bool get voiceWakeupEnabled => _voiceWakeupEnabled.value; |
|
|
|
|
|
RxBool get voiceWakeupEnabledRx => _voiceWakeupEnabled; |
|
|
|
|
|
|
|
|
|
|
|
final _voiceWakeupSupported = false.obs; // 耳机是否支持语音唤醒功能 |
|
|
|
|
|
bool get voiceWakeupSupported => _voiceWakeupSupported.value; |
|
|
|
|
|
RxBool get voiceWakeupSupportedRx => _voiceWakeupSupported; |
|
|
|
|
|
|
|
|
// 订阅 |
|
|
// 订阅 |
|
|
StreamSubscription<dynamic>? _statusSubscription; |
|
|
StreamSubscription<dynamic>? _statusSubscription; |
|
|
StreamSubscription<dynamic>? _dataSubscription; |
|
|
StreamSubscription<dynamic>? _dataSubscription; |
|
|
@ -275,14 +286,7 @@ class BleManager extends GetxService { |
|
|
Logger.info('lxm--BLE设备已连接'); |
|
|
Logger.info('lxm--BLE设备已连接'); |
|
|
_isConnected.value = true; |
|
|
_isConnected.value = true; |
|
|
|
|
|
|
|
|
// 在连接成功后延迟 300 毫秒获取设备信息(可根据需要调整时间) |
|
|
// 设备信息(含唤醒状态)由 HomeController.fetchDeviceInfo() 统一查询 |
|
|
Future.delayed(const Duration(milliseconds: 300), () { |
|
|
|
|
|
// 可选:检查是否仍处于连接状态 |
|
|
|
|
|
if (_isConnected.value) { |
|
|
|
|
|
Logger.info('lxm--连接后延迟获取设备信息(当前被注释)'); |
|
|
|
|
|
// fetchDeviceInfo(); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
} else if (state == BleConnectionState.disconnected || |
|
|
} else if (state == BleConnectionState.disconnected || |
|
|
state == BleConnectionState.error) { |
|
|
state == BleConnectionState.error) { |
|
|
Logger.info('lxm--BLE设备已断开或发生错误'); |
|
|
Logger.info('lxm--BLE设备已断开或发生错误'); |
|
|
@ -290,6 +294,9 @@ class BleManager extends GetxService { |
|
|
_awaitingCodecOpen = false; |
|
|
_awaitingCodecOpen = false; |
|
|
_awaitingCodecClose = false; |
|
|
_awaitingCodecClose = false; |
|
|
_isCodecActive.value = false; |
|
|
_isCodecActive.value = false; |
|
|
|
|
|
_voiceWakeupSupported.value = false; |
|
|
|
|
|
_voiceWakeupEnabled.value = true; |
|
|
|
|
|
Logger.info('[VoiceWakeup] 断开连接,重置 supported=false, enabled=true'); |
|
|
Logger.info('lxm--断开连接时重置设备信息为0'); |
|
|
Logger.info('lxm--断开连接时重置设备信息为0'); |
|
|
_updateDeviceInfoIfNeeded( |
|
|
_updateDeviceInfoIfNeeded( |
|
|
batteryLevel: 0, |
|
|
batteryLevel: 0, |
|
|
@ -447,6 +454,14 @@ class BleManager extends GetxService { |
|
|
Logger.info('lxm--处理唤醒语音版本命令'); |
|
|
Logger.info('lxm--处理唤醒语音版本命令'); |
|
|
_updateWakeupVersionFromData(data); |
|
|
_updateWakeupVersionFromData(data); |
|
|
break; |
|
|
break; |
|
|
|
|
|
case BleCommands.GET_VOICE_WAKEUP_STATUS: |
|
|
|
|
|
Logger.info('[VoiceWakeup] 收到查询响应(0x14), data: $data'); |
|
|
|
|
|
_updateVoiceWakeupStatusFromData(data); |
|
|
|
|
|
break; |
|
|
|
|
|
case BleCommands.SET_VOICE_WAKEUP_STATUS: |
|
|
|
|
|
Logger.info('[VoiceWakeup] 收到设置响应(0x15), data: $data'); |
|
|
|
|
|
_updateVoiceWakeupSetResultFromData(data); |
|
|
|
|
|
break; |
|
|
default: |
|
|
default: |
|
|
Logger.warning('lxm--未处理的命令ID: $commandId,数据: $data'); |
|
|
Logger.warning('lxm--未处理的命令ID: $commandId,数据: $data'); |
|
|
print(" 未处理的命令ID: $commandId,$data"); |
|
|
print(" 未处理的命令ID: $commandId,$data"); |
|
|
@ -636,6 +651,64 @@ class BleManager extends GetxService { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// 更新语音唤醒状态(0x14 查询响应) |
|
|
|
|
|
void _updateVoiceWakeupStatusFromData(Map<dynamic, dynamic> data) { |
|
|
|
|
|
try { |
|
|
|
|
|
if (!data.containsKey('voiceWakeupEnabled')) { |
|
|
|
|
|
Logger.warning('[VoiceWakeup] 查询响应数据不完整,缺少 voiceWakeupEnabled'); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
final bool enabled = data['voiceWakeupEnabled'] as bool? ?? true; |
|
|
|
|
|
_voiceWakeupEnabled.value = enabled; |
|
|
|
|
|
_voiceWakeupSupported.value = true; |
|
|
|
|
|
Logger.info('[VoiceWakeup] 查询成功 → supported=true, enabled=${enabled ? "开启" : "关闭"}'); |
|
|
|
|
|
} catch (e) { |
|
|
|
|
|
Logger.error('[VoiceWakeup] 解析查询响应异常: ${e.toString()}'); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// 处理设置语音唤醒的响应(0x15 设置响应) |
|
|
|
|
|
void _updateVoiceWakeupSetResultFromData(Map<dynamic, dynamic> data) { |
|
|
|
|
|
try { |
|
|
|
|
|
final bool setSuccess = data['voiceWakeupSetSuccess'] as bool? ?? false; |
|
|
|
|
|
if (setSuccess) { |
|
|
|
|
|
Logger.info('[VoiceWakeup] 设置成功 → enabled=${_voiceWakeupEnabled.value ? "开启" : "关闭"}'); |
|
|
|
|
|
} else { |
|
|
|
|
|
Logger.warning('[VoiceWakeup] 设置失败 → supported=false,开关置灰'); |
|
|
|
|
|
_voiceWakeupSupported.value = false; |
|
|
|
|
|
} |
|
|
|
|
|
} catch (e) { |
|
|
|
|
|
Logger.error('[VoiceWakeup] 解析设置响应异常: ${e.toString()}'); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// 查询语音唤醒状态 |
|
|
|
|
|
Future<bool> queryVoiceWakeupStatus() async { |
|
|
|
|
|
Logger.info('[VoiceWakeup] 发送查询命令(0x14)...'); |
|
|
|
|
|
final result = await _bleService.getVoiceWakeupStatus(); |
|
|
|
|
|
if (!result) { |
|
|
|
|
|
_voiceWakeupSupported.value = false; |
|
|
|
|
|
Logger.warning('[VoiceWakeup] 查询命令发送失败 → supported=false,设备可能不支持'); |
|
|
|
|
|
} else { |
|
|
|
|
|
Logger.info('[VoiceWakeup] 查询命令发送成功,等待设备响应...'); |
|
|
|
|
|
} |
|
|
|
|
|
return result; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// 设置语音唤醒状态 |
|
|
|
|
|
Future<bool> setVoiceWakeupStatus(bool enabled) async { |
|
|
|
|
|
Logger.info('[VoiceWakeup] 发送设置命令(0x15), enabled=${enabled ? "开启" : "关闭"}...'); |
|
|
|
|
|
_voiceWakeupEnabled.value = enabled; // 乐观更新 |
|
|
|
|
|
final result = await _bleService.setVoiceWakeupStatus(enabled); |
|
|
|
|
|
if (!result) { |
|
|
|
|
|
_voiceWakeupSupported.value = false; |
|
|
|
|
|
Logger.warning('[VoiceWakeup] 设置命令发送失败 → supported=false,开关置灰'); |
|
|
|
|
|
} else { |
|
|
|
|
|
Logger.info('[VoiceWakeup] 设置命令发送成功,等待设备响应...'); |
|
|
|
|
|
} |
|
|
|
|
|
return result; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/// 更新设备信息(如果已存在设备) |
|
|
/// 更新设备信息(如果已存在设备) |
|
|
void _updateDeviceInfoIfNeeded({ |
|
|
void _updateDeviceInfoIfNeeded({ |
|
|
int? batteryLevel, |
|
|
int? batteryLevel, |
|
|
@ -783,10 +856,11 @@ class BleManager extends GetxService { |
|
|
_bleService.getBatteryInfo(), |
|
|
_bleService.getBatteryInfo(), |
|
|
_bleService.getDeviceVersion(), |
|
|
_bleService.getDeviceVersion(), |
|
|
_bleService.getProductId(), |
|
|
_bleService.getProductId(), |
|
|
|
|
|
_bleService.getVoiceWakeupStatus(), |
|
|
]); |
|
|
]); |
|
|
|
|
|
|
|
|
Logger.info( |
|
|
Logger.info( |
|
|
'设备信息获取结果: 电池=${results[0]}, 版本=${results[1]}, 产品ID=${results[2]}'); |
|
|
'设备信息获取结果: 电池=${results[0]}, 版本=${results[1]}, 产品ID=${results[2]}, 唤醒状态=${results[3]}'); |
|
|
|
|
|
|
|
|
if (!results[0]) { |
|
|
if (!results[0]) { |
|
|
Logger.warning('电池信息获取指令发送失败'); |
|
|
Logger.warning('电池信息获取指令发送失败'); |
|
|
@ -797,6 +871,10 @@ class BleManager extends GetxService { |
|
|
if (!results[2]) { |
|
|
if (!results[2]) { |
|
|
Logger.warning('产品ID获取指令发送失败'); |
|
|
Logger.warning('产品ID获取指令发送失败'); |
|
|
} |
|
|
} |
|
|
|
|
|
if (!results[3]) { |
|
|
|
|
|
Logger.warning('语音唤醒状态获取指令发送失败'); |
|
|
|
|
|
_voiceWakeupSupported.value = false; |
|
|
|
|
|
} |
|
|
} catch (e) { |
|
|
} catch (e) { |
|
|
Logger.error('获取BLE设备信息失败: ${e.toString()}'); |
|
|
Logger.error('获取BLE设备信息失败: ${e.toString()}'); |
|
|
} |
|
|
} |
|
|
|