From 27997194b6bddb41a4d127e4b96d951de80b3b20 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Wed, 8 Jul 2026 14:19:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=98=E5=B7=A5=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/pairing_controller.dart | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/lib/modules/pairing/controllers/pairing_controller.dart b/lib/modules/pairing/controllers/pairing_controller.dart index 6e40c7e2f..b5f9e9627 100644 --- a/lib/modules/pairing/controllers/pairing_controller.dart +++ b/lib/modules/pairing/controllers/pairing_controller.dart @@ -788,17 +788,9 @@ class PairingController extends GetxController with WidgetsBindingObserver { Future authbindingDevice(BluetoothDevice device) async { // 检查设备名称是否包含 DeepSound 或 DeapSound final deviceName = device.name; - DBProduct? product; - // 检查是否已有BLE绑定的设备 - // 检查是否已有BLE绑定的设备 - if (AppConfig.config.products.isNotEmpty) { - final match = AppConfig.config.products.where( - (d) => d.devicename.contains(deviceName), - ); - product = match.isNotEmpty ? match.first : null; - } + // 已移除“按设备名匹配 product”逻辑:设备名可被用户改名,不能作为是否支持的判据。 + // 是否支持的设备完全交给下面的 BLE 扫描(按 allproductUuids 过滤)+ 广播内 MAC 比对判定。 final currentBleState = await _bleManager.getConnectionState(); - final names = AppConfig.allproductNames(); final uuids = AppConfig.allproductUuids(); // 检查是否已有绑定的设备 print("device.address${device.address}"); @@ -867,7 +859,9 @@ class PairingController extends GetxController with WidgetsBindingObserver { } print( '获取到 deviceName: $deviceName address: ${device.address} uuids:$uuids'); - if (product != null && product.devicetype != 1) { + // 无条件做 BLE 扫描验证(不再依赖 product)。扫描按 allproductUuids 过滤, + // 命中后用广播内 MAC 与经典蓝牙地址比对确认,由此判定是否为支持的设备。 + { if (currentBleState == 2) { //已连接直接返回 return 9; @@ -895,7 +889,7 @@ class PairingController extends GetxController with WidgetsBindingObserver { // 找到匹配的设备,提取授权码 if (Platform.isIOS) { // iOS设备,提取13-22字节的授权码 - code = extractAndReverseBytes(hexData, 13, 22); + code = extractBytesBigEndian(hexData, 13, 22); _verifiedDevicePid = extractAndReverseBytesToInt(hexData, 4, 5); final pidHexIos = @@ -936,7 +930,7 @@ class PairingController extends GetxController with WidgetsBindingObserver { } } else if (Platform.isAndroid) { // Android设备,提取15-24字节的授权码 - code = extractAndReverseBytes(hexData, 15, 24); + code = extractBytesBigEndian(hexData, 15, 24); _verifiedDevicePid = extractAndReverseBytesToInt(hexData, 6, 7); final pidHexAndroid = @@ -989,10 +983,6 @@ class PairingController extends GetxController with WidgetsBindingObserver { await Future.delayed(Duration(seconds: 1)); } _bleManager.stopScan(); - // if (product != null && product.devicetype != 1) { - // //ble设备 必须要扫描到结果 - // return 0; - // } } return 0; //可以跳转1 @@ -1175,6 +1165,19 @@ class PairingController extends GetxController with WidgetsBindingObserver { .toUpperCase(); } + /// 大端模式:按原始字节顺序提取 [start, end](含 end),不反转 + String extractBytesBigEndian(String hex, int start, int end) { + List bytes = []; + for (int i = 0; i < hex.length; i += 2) { + bytes.add(int.parse(hex.substring(i, i + 2), radix: 16)); + } + List slice = bytes.sublist(start, end + 1); + return slice + .map((b) => b.toRadixString(16).padLeft(2, '0')) + .join() + .toUpperCase(); + } + int extractAndReverseBytesToInt(String hex, int start, int end) { List bytes = []; // 将十六进制字符串解析为字节列表