Browse Source

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

weicu
fdp 1 year ago
parent
commit
863013b13f
  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 { try {
// 保存设备地址信息 // 保存设备地址信息
if (macAddress != null) { if (macAddress != null) {
@ -1040,11 +1043,15 @@ class BleManager extends GetxService {
// 从蓝牙管理器获取设备名称 // 从蓝牙管理器获取设备名称
final bluetoothManager = Get.find<BluetoothManager>(); final bluetoothManager = Get.find<BluetoothManager>();
_currentDeviceName = bluetoothManager.currentDevice?.name ?? ""; _currentDeviceName = bluetoothManager.currentDevice?.name ?? "";
Logger.info( Logger.info(
'保存设备信息: address=$currentDeviceAddress, name=$_currentDeviceName'); '保存设备信息: address=$currentDeviceAddress, name=$_currentDeviceName');
} }
return await _bleService.registerBackgroundScan(macAddress: macAddress); return await _bleService.registerBackgroundScan(
macAddress: macAddress,
uuids: uuids,
);
} catch (e) { } catch (e) {
Logger.error('注册后台扫描失败: ${e.toString()}'); Logger.error('注册后台扫描失败: ${e.toString()}');
return false; return false;

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

@ -710,7 +710,9 @@ class PairingController extends GetxController with WidgetsBindingObserver {
if (_verifiedDeviceAddress != null) { if (_verifiedDeviceAddress != null) {
// await _bleManager.connect(); // await _bleManager.connect();
final success = await _bleManager.registerBackgroundScan( final success = await _bleManager.registerBackgroundScan(
macAddress: _verifiedDeviceAddress); macAddress: _verifiedDeviceAddress,
uuids: AppConfig.allproductUuids(),
);
if (!success && _currentState.value == PairingState.waitingBle) { if (!success && _currentState.value == PairingState.waitingBle) {
_setError( _setError(
ErrorType.bleTimeout, 'blePairingStartupFailed'.tr); //BLE配对启动失败 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 android.os.ParcelUuid
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import android.util.Log import android.util.Log
import java.util.UUID
import java.util.regex.Pattern import java.util.regex.Pattern
/** /**
@ -375,8 +376,12 @@ class BleCompanionManager(private val context: Context) {
* *
* @param macAddress 可选的MAC地址,如果不提供则使用已保存的MAC地址 * @param macAddress 可选的MAC地址,如果不提供则使用已保存的MAC地址
*/ */
fun registerBackgroundScan() { fun registerBackgroundScan(
macAddress: String?,
uuids: List<String>?,
) {
try { try {
Log.d(TAG, "添加后台扫描过滤器UUID: $uuids, macAddress: $macAddress")
val mac = getPairedMacAddress() val mac = getPairedMacAddress()
if (mac.isNullOrEmpty()) { if (mac.isNullOrEmpty()) {
Log.e(TAG, "注册后台扫描失败: 没有配对的设备MAC地址") Log.e(TAG, "注册后台扫描失败: 没有配对的设备MAC地址")
@ -392,12 +397,43 @@ class BleCompanionManager(private val context: Context) {
return return
} }
unregisterBackgroundScan() unregisterBackgroundScan()
// 构建过滤器
val filter = ScanFilter.Builder() // 构建扫描过滤器 - 参考 registerBackgroundScan 的实现
.setDeviceAddress(mac) val filters = mutableListOf<ScanFilter>()
// .setServiceUuid(ParcelUuid(java.util.UUID.fromString("0000FEAA-0000-1000-8000-00805F9B34FB"))) // 如果提供了额外的UUID,也添加到过滤器中
//.setManufacturerData(0xEFAB, byteArrayOf(0xA0.toByte(), 0x01)) uuids?.forEach { uuidStr ->
.build() 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() 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") Log.i(TAG, "已注册后台扫描,目标设备MAC: $mac")
} catch (e: Exception) { } catch (e: Exception) {
Log.e(TAG, "注册后台扫描失败: ${e.message}", e) Log.e(TAG, "注册后台扫描失败: ${e.message}", e)
@ -514,4 +550,4 @@ class BleCompanionManager(private val context: Context) {
) )
return macPattern.matcher(macAddress).matches() 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("") result.success("")
} }
"registerBackgroundScan" -> { "registerBackgroundScan" -> {
bleCompanionManager.registerBackgroundScan() val macAddress = call.argument<String>("macAddress")
val uuids = call.argument<List<String>>("uuids")
bleCompanionManager.registerBackgroundScan(
macAddress,
uuids,
)
result.success(true) result.success(true)
} }
"unregisterBackgroundScan" -> { "unregisterBackgroundScan" -> {

14
local_plugins/ble_service/lib/ble_service.dart

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

Loading…
Cancel
Save