fix:调整蓝牙写入逻辑,增加重试机制;处理GATT错误133

This commit is contained in:
liyi 2025-04-26 15:16:39 +08:00
parent 6a848ac23e
commit de71435ba1

View File

@ -775,7 +775,7 @@ class BlueManage {
}
}
//
///
Future<void> writeCharacteristicWithResponse(List<int> value) async {
final List<BluetoothService> services =
await bluetoothConnectDevice!.discoverServices();
@ -785,30 +785,64 @@ class BlueManage {
in service.characteristics) {
if (characteristic.characteristicUuid == _characteristicIdWrite) {
try {
//
int retryCount = 0;
const int maxRetries = 3;
const int retryDelayMs = 500;
final List<int> valueList = value;
final List subData = splitList(valueList, _mtuSize!);
// AppLog.log('writeCharacteristicWithResponse _mtuSize:$_mtuSize 得到的分割数据:$subData');
for (int i = 0; i < subData.length; i++) {
if (characteristic.properties.writeWithoutResponse) {
// 使WRITE_NO_RESPONSE属性写入值
await characteristic.write(subData[i], withoutResponse: true);
} else if (characteristic.properties.write) {
// 使WRITE属性写入值
await characteristic.write(subData[i]);
} else {
//
throw Exception(
'This characteristic does not support writing.');
//
bool packetSent = false;
retryCount = 0;
while (!packetSent && retryCount < maxRetries) {
try {
if (characteristic.properties.writeWithoutResponse) {
await characteristic.write(subData[i], withoutResponse: true);
} else if (characteristic.properties.write) {
await characteristic.write(subData[i]);
} else {
//
throw Exception('This characteristic does not support writing.');
}
//
packetSent = true;
} catch (e) {
if (e.toString().contains('UNKNOWN_GATT_ERROR (133)') && retryCount < maxRetries - 1) {
// GATT错误133
retryCount++;
AppLog.log('蓝牙写入失败(GATT 133),数据包 ${i+1}/${subData.length} 正在重试 $retryCount/$maxRetries...');
await Future.delayed(Duration(milliseconds: retryDelayMs));
continue;
} else {
//
AppLog.log('APP写入失败: $e');
throw e;
}
}
}
if (!packetSent) {
throw Exception('蓝牙写入失败,数据包 ${i+1}/${subData.length} 已达到最大重试次数');
}
}
return; //
} on Exception catch (e, s) {
AppLog.log('APP写入失败: $e $s');
AppLog.log('APP写入失败: $e $s');
rethrow;
}
}
}
}
}
//
throw Exception('未找到适合写入的蓝牙特性');
}
//