diff --git a/lib/data/services/ble_manager.dart b/lib/data/services/ble_manager.dart index 42af34e4f..1c921fa07 100644 --- a/lib/data/services/ble_manager.dart +++ b/lib/data/services/ble_manager.dart @@ -768,9 +768,9 @@ class BleManager extends GetxService { } /// 验证设备是否可以配对 - Future startScan() async { + Future startScan(String devicename) async { try { - await _bleService.startScan(); + await _bleService.startScan(devicename); } catch (e) { Logger.error('开始扫描设备: ${e.toString()}'); } diff --git a/lib/data/services/network/nw_api.dart b/lib/data/services/network/nw_api.dart index 8feff1db5..69b0e9eef 100644 --- a/lib/data/services/network/nw_api.dart +++ b/lib/data/services/network/nw_api.dart @@ -1,5 +1,5 @@ class NWApi { // static const baseApi = "https://www.deapsound.com"; - static const baseApi = "https://api.deapsound.com"; - // static const baseApi = "https://api.ideapsound.com"; + // static const baseApi = "https://api.deapsound.com"; + static const baseApi = "https://api.ideapsound.com"; } diff --git a/lib/modules/pairing/controllers/pairing_controller.dart b/lib/modules/pairing/controllers/pairing_controller.dart index f4f3d602e..2bfcfcedb 100644 --- a/lib/modules/pairing/controllers/pairing_controller.dart +++ b/lib/modules/pairing/controllers/pairing_controller.dart @@ -566,7 +566,7 @@ class PairingController extends GetxController { final deviceName = device.name; print('获取到 deviceName: $deviceName'); if (deviceName.contains('DeepSound') || deviceName.contains('DeapSound')) { - await _bleManager.startScan(); + await _bleManager.startScan(deviceName); await Future.delayed(const Duration(seconds: 1)); // 尝试最多读取 3 次设备信息,每次间隔 1 秒 Map? deviceinfo; diff --git a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt index fe3584da5..e3cfd0786 100644 --- a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt +++ b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt @@ -189,48 +189,75 @@ object BleService { // ====================================================================================================== // 扫描功能 // ====================================================================================================== + fun reinitializeBle() { + val manager = context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager + bluetoothAdapter = manager.adapter // 重新获取新引用 + bluetoothLeScanner = bluetoothAdapter?.bluetoothLeScanner + } /** * 开始主动扫描BLE设备 * @param timeout 扫描超时时间(毫秒) * @return 是否成功开始扫描 */ - fun startScan(timeout: Long = 15000): Boolean { + fun startScan(deviceName:String,timeout: Long = 15000): Boolean { +// Log.i(TAG, "liwei---------startScan 1 $deviceName") if (!isInitialized) { Log.e(TAG, "BLE服务未初始化") return false } - +// Log.i(TAG, "liwei---------startScan 2") // 获取一个局部引用,避免并发访问问题 - val scanner = bluetoothLeScanner ?: return false +// val scanner = bluetoothLeScanner ?: return false + // 💡 每次都重新取最新实例 + val scanner = bluetoothLeScanner ?: run { + Log.e(TAG, "bluetoothLeScanner == null,尝试重启蓝牙") + reinitializeBle() + return false + } + +// Log.i(TAG, "liwei---------startScan 3") if (isScanning) return false +// Log.i(TAG, "liwei---------startScan 4") Log.i(TAG, "开始主动扫描BLE设备...") scanResults.clear() - +// Log.i(TAG, "liwei---------startScan 5") +// val filter = ScanFilter.Builder() +// // .setServiceUuid(ParcelUuid(BleConst.PRIMARY_SERVICE_UUID)) +// .setManufacturerData(0xEFAB, byteArrayOf(0xA0.toByte(), 0x01)) +// .build() +// Log.i(TAG, "liwei---------startScan 6") +// val settings = ScanSettings.Builder() +// .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) +// // .setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH) +// .setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH) // 使用ALL_MATCHES获取所有结果 +// .setReportDelay(0) // 立即报告结果 +// .build() val filter = ScanFilter.Builder() + // 建议用 Service UUID 或 Device Name 替代 Manufacturer Data // .setServiceUuid(ParcelUuid(BleConst.PRIMARY_SERVICE_UUID)) - .setManufacturerData(0xEFAB, byteArrayOf(0xA0.toByte(), 0x01)) +// .setDeviceName(deviceName) // 更通用、更安全 .build() val settings = ScanSettings.Builder() .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) - // .setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH) - .setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH) // 使用ALL_MATCHES获取所有结果 - .setReportDelay(0) // 立即报告结果 + .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES) // 推荐:不会触发权限问题 + .setReportDelay(0) .build() - +// Log.i(TAG, "liwei---------startScan 7") try { scanner.startScan(listOf(filter), settings, scanCallback) isScanning = true - +// Log.i(TAG, "liwei---------startScan 8") // 设置扫描超时 scanHandler.postDelayed({ Log.d(TAG, "扫描超时,停止扫描") stopScan() }, timeout) - +// Log.i(TAG, "liwei---------startScan 9") return true } catch (e: Exception) { Log.e(TAG, "启动扫描失败: ${e.message}", e) +// Log.i(TAG, "liwei---------startScan 10") isScanning = false return false } @@ -296,6 +323,7 @@ object BleService { override fun onScanFailed(errorCode: Int) { Log.e(TAG, "扫描失败 error=$errorCode") + stopScan() isScanning = false } } @@ -306,6 +334,7 @@ object BleService { val idx = scanResults.indexOfFirst { it.device.address == address } Log.d(TAG, "获取设备信息:${address} idx:$idx") if (idx >= 0){ + stopScan() val result = scanResults[idx]; return printDeviceInfo(result) } @@ -321,9 +350,9 @@ object BleService { val serviceUuids = scanRecord?.serviceUuids?.joinToString(", ") { it.uuid.toString() } ?: "无" - Log.d( - TAG, "liwei--------- 扫描到设备: 名称=${device.name ?: "未知"}, 地址=${device.address}, " + - "RSSI=${result.rssi}, 服务UUID=[$serviceUuids]" +// Log.d( +// TAG, "liwei--------- 扫描到设备: 名称=${device.name ?: "未知"}, 地址=${device.address}, " + +// "RSSI=${result.rssi}, 服务UUID=[$serviceUuids]" ) val info = mutableMapOf( "name" to (device.name ?: "未知"), @@ -333,7 +362,7 @@ object BleService { val scanData = scanRecord?.bytes if (scanData != null) { val hexString = scanData.joinToString("") { String.format("%02X", it) } - Log.d(TAG, "liwei------------ 广播数据: $hexString") +// Log.d(TAG, "liwei------------ 广播数据: $hexString") info["hex"] = hexString // 解析服务数据 scanRecord.serviceData?.forEach { (uuid, data) -> diff --git a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleServicePlugin.kt b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleServicePlugin.kt index 7cc6932ae..c70581d54 100644 --- a/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleServicePlugin.kt +++ b/local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleServicePlugin.kt @@ -295,7 +295,8 @@ class BleServicePlugin : FlutterPlugin, MethodCallHandler, ActivityAware, } } "startScan" -> { - val connected = BleService.startScan() + val devicename = call.argument("devicename")?:"" + val connected = BleService.startScan(devicename) result.success(connected) } "getDeviceInfo" -> { diff --git a/local_plugins/ble_service/lib/ble_service.dart b/local_plugins/ble_service/lib/ble_service.dart index 956e3a28e..a33ea1e94 100644 --- a/local_plugins/ble_service/lib/ble_service.dart +++ b/local_plugins/ble_service/lib/ble_service.dart @@ -282,9 +282,10 @@ class BleService { } /// 断开连接 - Future startScan() async { + Future startScan(String devicename) async { try { - final result = await _methodChannel.invokeMethod('startScan'); + final result = await _methodChannel + .invokeMethod('startScan', {'devicename': devicename}); return result ?? false; } catch (e) { print('开启扫描ble设备失败: $e'); diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 352cc6d03..ae0a8cb45 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -1,8 +1,6 @@ PODS: - app_settings (5.1.1): - FlutterMacOS - - device_info_plus (0.0.1): - - FlutterMacOS - facebook_auth_desktop (0.0.3): - FlutterMacOS - flutter_image_compress_macos (1.0.0): @@ -21,7 +19,6 @@ PODS: DEPENDENCIES: - app_settings (from `Flutter/ephemeral/.symlinks/plugins/app_settings/macos`) - - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) - facebook_auth_desktop (from `Flutter/ephemeral/.symlinks/plugins/facebook_auth_desktop/macos`) - flutter_image_compress_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_image_compress_macos/macos`) - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) @@ -34,8 +31,6 @@ DEPENDENCIES: EXTERNAL SOURCES: app_settings: :path: Flutter/ephemeral/.symlinks/plugins/app_settings/macos - device_info_plus: - :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos facebook_auth_desktop: :path: Flutter/ephemeral/.symlinks/plugins/facebook_auth_desktop/macos flutter_image_compress_macos: @@ -55,7 +50,6 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: app_settings: cd21e176b56f8172043640ade81322a98896bff4 - device_info_plus: a56e6e74dbbd2bb92f2da12c64ddd4f67a749041 facebook_auth_desktop: bf89ccf460c903de45e86fa0c7878b8b62db65fb flutter_image_compress_macos: e68daf54bb4bf2144c580fd4d151c949cbf492f0 flutter_local_notifications: 13862b132e32eb858dea558a86d45d08daeacfe7