Browse Source

Merge branch 'new_dev' of https://github.com/deepcloud2048/deep_voice into new_dev

weicu
tanlongsheng 1 year ago
parent
commit
83ec9eaa95
  1. 4
      lib/data/services/ble_manager.dart
  2. 4
      lib/data/services/network/nw_api.dart
  3. 2
      lib/modules/pairing/controllers/pairing_controller.dart
  4. 61
      local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleService.kt
  5. 3
      local_plugins/ble_service/android/src/main/kotlin/com/yunqiinnovation/ble_service/BleServicePlugin.kt
  6. 5
      local_plugins/ble_service/lib/ble_service.dart
  7. 6
      macos/Podfile.lock

4
lib/data/services/ble_manager.dart

@ -768,9 +768,9 @@ class BleManager extends GetxService {
} }
/// 验证设备是否可以配对 /// 验证设备是否可以配对
Future<void> startScan() async { Future<void> startScan(String devicename) async {
try { try {
await _bleService.startScan(); await _bleService.startScan(devicename);
} catch (e) { } catch (e) {
Logger.error('开始扫描设备: ${e.toString()}'); Logger.error('开始扫描设备: ${e.toString()}');
} }

4
lib/data/services/network/nw_api.dart

@ -1,5 +1,5 @@
class NWApi { class NWApi {
// static const baseApi = "https://www.deapsound.com"; // static const baseApi = "https://www.deapsound.com";
static const baseApi = "https://api.deapsound.com"; // static const baseApi = "https://api.deapsound.com";
// static const baseApi = "https://api.ideapsound.com"; static const baseApi = "https://api.ideapsound.com";
} }

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

@ -566,7 +566,7 @@ class PairingController extends GetxController {
final deviceName = device.name; final deviceName = device.name;
print('获取到 deviceName: $deviceName'); print('获取到 deviceName: $deviceName');
if (deviceName.contains('DeepSound') || deviceName.contains('DeapSound')) { if (deviceName.contains('DeepSound') || deviceName.contains('DeapSound')) {
await _bleManager.startScan(); await _bleManager.startScan(deviceName);
await Future.delayed(const Duration(seconds: 1)); await Future.delayed(const Duration(seconds: 1));
// 尝试最多读取 3 次设备信息,每次间隔 1 秒 // 尝试最多读取 3 次设备信息,每次间隔 1 秒
Map<String, String>? deviceinfo; Map<String, String>? deviceinfo;

61
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设备 * 开始主动扫描BLE设备
* @param timeout 扫描超时时间(毫秒) * @param timeout 扫描超时时间(毫秒)
* @return 是否成功开始扫描 * @return 是否成功开始扫描
*/ */
fun startScan(timeout: Long = 15000): Boolean { fun startScan(deviceName:String,timeout: Long = 15000): Boolean {
// Log.i(TAG, "liwei---------startScan 1 $deviceName")
if (!isInitialized) { if (!isInitialized) {
Log.e(TAG, "BLE服务未初始化") Log.e(TAG, "BLE服务未初始化")
return false 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 if (isScanning) return false
// Log.i(TAG, "liwei---------startScan 4")
Log.i(TAG, "开始主动扫描BLE设备...") Log.i(TAG, "开始主动扫描BLE设备...")
scanResults.clear() 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() val filter = ScanFilter.Builder()
// 建议用 Service UUID 或 Device Name 替代 Manufacturer Data
// .setServiceUuid(ParcelUuid(BleConst.PRIMARY_SERVICE_UUID)) // .setServiceUuid(ParcelUuid(BleConst.PRIMARY_SERVICE_UUID))
.setManufacturerData(0xEFAB, byteArrayOf(0xA0.toByte(), 0x01)) // .setDeviceName(deviceName) // 更通用、更安全
.build() .build()
val settings = ScanSettings.Builder() val settings = ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
// .setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH) .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES) // 推荐:不会触发权限问题
.setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH) // 使用ALL_MATCHES获取所有结果 .setReportDelay(0)
.setReportDelay(0) // 立即报告结果
.build() .build()
// Log.i(TAG, "liwei---------startScan 7")
try { try {
scanner.startScan(listOf(filter), settings, scanCallback) scanner.startScan(listOf(filter), settings, scanCallback)
isScanning = true isScanning = true
// Log.i(TAG, "liwei---------startScan 8")
// 设置扫描超时 // 设置扫描超时
scanHandler.postDelayed({ scanHandler.postDelayed({
Log.d(TAG, "扫描超时,停止扫描") Log.d(TAG, "扫描超时,停止扫描")
stopScan() stopScan()
}, timeout) }, timeout)
// Log.i(TAG, "liwei---------startScan 9")
return true return true
} catch (e: Exception) { } catch (e: Exception) {
Log.e(TAG, "启动扫描失败: ${e.message}", e) Log.e(TAG, "启动扫描失败: ${e.message}", e)
// Log.i(TAG, "liwei---------startScan 10")
isScanning = false isScanning = false
return false return false
} }
@ -296,6 +323,7 @@ object BleService {
override fun onScanFailed(errorCode: Int) { override fun onScanFailed(errorCode: Int) {
Log.e(TAG, "扫描失败 error=$errorCode") Log.e(TAG, "扫描失败 error=$errorCode")
stopScan()
isScanning = false isScanning = false
} }
} }
@ -306,6 +334,7 @@ object BleService {
val idx = scanResults.indexOfFirst { it.device.address == address } val idx = scanResults.indexOfFirst { it.device.address == address }
Log.d(TAG, "获取设备信息:${address} idx:$idx") Log.d(TAG, "获取设备信息:${address} idx:$idx")
if (idx >= 0){ if (idx >= 0){
stopScan()
val result = scanResults[idx]; val result = scanResults[idx];
return printDeviceInfo(result) return printDeviceInfo(result)
} }
@ -321,10 +350,10 @@ object BleService {
val serviceUuids = val serviceUuids =
scanRecord?.serviceUuids?.joinToString(", ") { it.uuid.toString() } ?: "无" scanRecord?.serviceUuids?.joinToString(", ") { it.uuid.toString() } ?: "无"
Log.d( // Log.d(
TAG, "liwei--------- 扫描到设备: 名称=${device.name ?: "未知"}, 地址=${device.address}, " + // TAG, "liwei--------- 扫描到设备: 名称=${device.name ?: "未知"}, 地址=${device.address}, " +
"RSSI=${result.rssi}, 服务UUID=[$serviceUuids]" // "RSSI=${result.rssi}, 服务UUID=[$serviceUuids]"
) // )
val info = mutableMapOf( val info = mutableMapOf(
"name" to (device.name ?: "未知"), "name" to (device.name ?: "未知"),
"address" to device.address "address" to device.address
@ -333,7 +362,7 @@ object BleService {
val scanData = scanRecord?.bytes val scanData = scanRecord?.bytes
if (scanData != null) { if (scanData != null) {
val hexString = scanData.joinToString("") { String.format("%02X", it) } val hexString = scanData.joinToString("") { String.format("%02X", it) }
Log.d(TAG, "liwei------------ 广播数据: $hexString") // Log.d(TAG, "liwei------------ 广播数据: $hexString")
info["hex"] = hexString info["hex"] = hexString
// 解析服务数据 // 解析服务数据
scanRecord.serviceData?.forEach { (uuid, data) -> scanRecord.serviceData?.forEach { (uuid, data) ->

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

@ -295,7 +295,8 @@ class BleServicePlugin : FlutterPlugin, MethodCallHandler, ActivityAware,
} }
} }
"startScan" -> { "startScan" -> {
val connected = BleService.startScan() val devicename = call.argument<String>("devicename")?:""
val connected = BleService.startScan(devicename)
result.success(connected) result.success(connected)
} }
"getDeviceInfo" -> { "getDeviceInfo" -> {

5
local_plugins/ble_service/lib/ble_service.dart

@ -282,9 +282,10 @@ class BleService {
} }
/// 断开连接 /// 断开连接
Future<bool> startScan() async { Future<bool> startScan(String devicename) async {
try { try {
final result = await _methodChannel.invokeMethod<bool>('startScan'); final result = await _methodChannel
.invokeMethod<bool>('startScan', {'devicename': devicename});
return result ?? false; return result ?? false;
} catch (e) { } catch (e) {
print('开启扫描ble设备失败: $e'); print('开启扫描ble设备失败: $e');

6
macos/Podfile.lock

@ -1,8 +1,6 @@
PODS: PODS:
- app_settings (5.1.1): - app_settings (5.1.1):
- FlutterMacOS - FlutterMacOS
- device_info_plus (0.0.1):
- FlutterMacOS
- facebook_auth_desktop (0.0.3): - facebook_auth_desktop (0.0.3):
- FlutterMacOS - FlutterMacOS
- flutter_image_compress_macos (1.0.0): - flutter_image_compress_macos (1.0.0):
@ -21,7 +19,6 @@ PODS:
DEPENDENCIES: DEPENDENCIES:
- app_settings (from `Flutter/ephemeral/.symlinks/plugins/app_settings/macos`) - 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`) - 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_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`) - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`)
@ -34,8 +31,6 @@ DEPENDENCIES:
EXTERNAL SOURCES: EXTERNAL SOURCES:
app_settings: app_settings:
:path: Flutter/ephemeral/.symlinks/plugins/app_settings/macos :path: Flutter/ephemeral/.symlinks/plugins/app_settings/macos
device_info_plus:
:path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos
facebook_auth_desktop: facebook_auth_desktop:
:path: Flutter/ephemeral/.symlinks/plugins/facebook_auth_desktop/macos :path: Flutter/ephemeral/.symlinks/plugins/facebook_auth_desktop/macos
flutter_image_compress_macos: flutter_image_compress_macos:
@ -55,7 +50,6 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS: SPEC CHECKSUMS:
app_settings: cd21e176b56f8172043640ade81322a98896bff4 app_settings: cd21e176b56f8172043640ade81322a98896bff4
device_info_plus: a56e6e74dbbd2bb92f2da12c64ddd4f67a749041
facebook_auth_desktop: bf89ccf460c903de45e86fa0c7878b8b62db65fb facebook_auth_desktop: bf89ccf460c903de45e86fa0c7878b8b62db65fb
flutter_image_compress_macos: e68daf54bb4bf2144c580fd4d151c949cbf492f0 flutter_image_compress_macos: e68daf54bb4bf2144c580fd4d151c949cbf492f0
flutter_local_notifications: 13862b132e32eb858dea558a86d45d08daeacfe7 flutter_local_notifications: 13862b132e32eb858dea558a86d45d08daeacfe7

Loading…
Cancel
Save