Browse Source

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

newdev_shunjiawei
tanlongsheng 1 year ago
parent
commit
44234109ce
  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 {
await _bleService.startScan();
await _bleService.startScan(devicename);
} catch (e) {
Logger.error('开始扫描设备: ${e.toString()}');
}

4
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";
}

2
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<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设备
* @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,10 +350,10 @@ 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 ?: "未知"),
"address" to device.address
@ -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) ->

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" -> {
val connected = BleService.startScan()
val devicename = call.argument<String>("devicename")?:""
val connected = BleService.startScan(devicename)
result.success(connected)
}
"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 {
final result = await _methodChannel.invokeMethod<bool>('startScan');
final result = await _methodChannel
.invokeMethod<bool>('startScan', {'devicename': devicename});
return result ?? false;
} catch (e) {
print('开启扫描ble设备失败: $e');

6
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

Loading…
Cancel
Save