Browse Source

修复后台扫描进程连接不上已经很慢的问题

newdev_shunjiawei
fdp 1 year ago
parent
commit
d844a67edd
  1. 11
      lib/data/services/ble_manager.dart
  2. 4
      lib/modules/pairing/controllers/pairing_controller.dart
  3. 54
      local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleCompanionManager.kt
  4. 7
      local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleServicePlugin.kt
  5. 14
      local_plugins/ble_service/lib/ble_service.dart

11
lib/data/services/ble_manager.dart

@ -1032,7 +1032,10 @@ class BleManager extends GetxService {
}
/// 注册后台扫描
Future<bool> registerBackgroundScan({String? macAddress}) async {
Future<bool> registerBackgroundScan({
String? macAddress,
List<String>? uuids,
}) async {
try {
// 保存设备地址信息
if (macAddress != null) {
@ -1040,11 +1043,15 @@ class BleManager extends GetxService {
// 从蓝牙管理器获取设备名称
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,
uuids: uuids,
);
} catch (e) {
Logger.error('注册后台扫描失败: ${e.toString()}');
return false;

4
lib/modules/pairing/controllers/pairing_controller.dart

@ -710,7 +710,9 @@ class PairingController extends GetxController with WidgetsBindingObserver {
if (_verifiedDeviceAddress != null) {
// await _bleManager.connect();
final success = await _bleManager.registerBackgroundScan(
macAddress: _verifiedDeviceAddress);
macAddress: _verifiedDeviceAddress,
uuids: AppConfig.allproductUuids(),
);
if (!success && _currentState.value == PairingState.waitingBle) {
_setError(
ErrorType.bleTimeout, 'blePairingStartupFailed'.tr); //BLE配对启动失败

54
local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleCompanionManager.kt

@ -18,6 +18,7 @@ import android.os.Build
import android.os.ParcelUuid
import androidx.annotation.RequiresApi
import android.util.Log
import java.util.UUID
import java.util.regex.Pattern
/**
@ -375,8 +376,12 @@ class BleCompanionManager(private val context: Context) {
*
* @param macAddress 可选的MAC地址,如果不提供则使用已保存的MAC地址
*/
fun registerBackgroundScan() {
fun registerBackgroundScan(
macAddress: String?,
uuids: List<String>?,
) {
try {
Log.d(TAG, "添加后台扫描过滤器UUID: $uuids, macAddress: $macAddress")
val mac = getPairedMacAddress()
if (mac.isNullOrEmpty()) {
Log.e(TAG, "注册后台扫描失败: 没有配对的设备MAC地址")
@ -392,12 +397,43 @@ class BleCompanionManager(private val context: Context) {
return
}
unregisterBackgroundScan()
// 构建过滤器
val filter = ScanFilter.Builder()
.setDeviceAddress(mac)
// .setServiceUuid(ParcelUuid(java.util.UUID.fromString("0000FEAA-0000-1000-8000-00805F9B34FB")))
//.setManufacturerData(0xEFAB, byteArrayOf(0xA0.toByte(), 0x01))
.build()
// 构建扫描过滤器 - 参考 registerBackgroundScan 的实现
val filters = mutableListOf<ScanFilter>()
// 如果提供了额外的UUID,也添加到过滤器中
uuids?.forEach { uuidStr ->
try {
val uuid = when {
uuidStr.length == 4 -> {
// 短UUID,转换为完整UUID
val fullUuid = "0000$uuidStr-0000-1000-8000-00805f9b34fb"
UUID.fromString(fullUuid)
}
uuidStr.length == 36 -> {
// 完整UUID
UUID.fromString(uuidStr)
}
else -> {
Log.w(TAG, "无效的UUID格式: $uuidStr")
return@forEach
}
}
val filter = ScanFilter.Builder()
.setServiceUuid(ParcelUuid(uuid))
.build()
filters.add(filter)
Log.d(TAG, "添加后台扫描过滤器UUID: $uuid")
} catch (e: IllegalArgumentException) {
Log.e(TAG, "构造UUID失败: $uuidStr", e)
}
}
// val filter = ScanFilter.Builder()
// //.setDeviceAddress(mac)
// // .setServiceUuid(ParcelUuid(java.util.UUID.fromString("0000FEAA-0000-1000-8000-00805F9B34FB")))
// //.setManufacturerData(0xEFAB, byteArrayOf(0xA0.toByte(), 0x01))
// .build()
// 扫描设置
val settings = ScanSettings.Builder()
@ -420,7 +456,7 @@ class BleCompanionManager(private val context: Context) {
)
// 启动后台扫描
bluetoothLeScanner.startScan(listOf(filter), settings, pendingIntent)
bluetoothLeScanner.startScan(filters, settings, pendingIntent)
Log.i(TAG, "已注册后台扫描,目标设备MAC: $mac")
} catch (e: Exception) {
Log.e(TAG, "注册后台扫描失败: ${e.message}", e)
@ -514,4 +550,4 @@ class BleCompanionManager(private val context: Context) {
)
return macPattern.matcher(macAddress).matches()
}
}
}

7
local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleServicePlugin.kt

@ -290,7 +290,12 @@ class BleServicePlugin : FlutterPlugin, MethodCallHandler, ActivityAware,
result.success("")
}
"registerBackgroundScan" -> {
bleCompanionManager.registerBackgroundScan()
val macAddress = call.argument<String>("macAddress")
val uuids = call.argument<List<String>>("uuids")
bleCompanionManager.registerBackgroundScan(
macAddress,
uuids,
)
result.success(true)
}
"unregisterBackgroundScan" -> {

14
local_plugins/ble_service/lib/ble_service.dart

@ -393,10 +393,18 @@ class BleService {
/// 这是确保设备可以在应用后台时被自动连接的关键功能
///
/// [macAddress] 可选的设备MAC地址,如果不提供则使用已关联的设备
Future<bool> registerBackgroundScan({String? macAddress}) async {
Future<bool> registerBackgroundScan({
String? macAddress,
List<String>? uuids,
}) async {
try {
final result =
await _methodChannel.invokeMethod<bool>('registerBackgroundScan');
final result = await _methodChannel.invokeMethod<bool>(
'registerBackgroundScan',
{
'macAddress': macAddress,
'uuids': uuids,
},
);
return result ?? false;
} catch (e) {
print('注册后台扫描失败: $e');

Loading…
Cancel
Save