From 01fefe373a81c7b423ba7bc42c1e850a24953f57 Mon Sep 17 00:00:00 2001 From: ozh Date: Wed, 9 Sep 2026 19:00:54 +0800 Subject: [PATCH] =?UTF-8?q?fix(ble):=20=E6=94=BE=E5=BC=83=20services=20?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E6=89=AB=E6=8F=8F=E6=94=B9=E4=B8=BA=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E5=85=A8=E9=A2=91=E6=AE=B5=E6=89=AB=E6=8F=8F=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=90=9C=E4=B8=8D=E5=88=B0=E8=AE=BE=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 微信 startBluetoothDevicesDiscovery 的 services 参数只按 128 位完整 UUID 匹配广播包;目标设备广播的是 16 位短 UUID(0x00F4 等),部分 机型/基础库版本下过滤扫描直接收不到这些设备的广播——表现为一直 搜不出设备,或要等 4s 兜底计时器切到全扫后才出现(感知为"慢")。 - startSearch 直接以无 services 参数启动扫描,事件通道 (onBluetoothDeviceFound) 与轮询通道 (getBluetoothDevices) 双路取数, JS 层 matchTargetDevice(服务 UUID/名称关键词/广播包关键词三路匹配) 负责过滤,微信端只做采集 - 删除过滤扫描 4s 无结果回退机制(fallbackToUnfilteredDiscovery)及 相关定时器/常量/过滤 UUID 导出:不再有过滤阶段即无需回退 --- src/ble/discovery.js | 53 +++----------------------------------- src/constants/bluetooth.js | 6 ----- 2 files changed, 4 insertions(+), 55 deletions(-) diff --git a/src/ble/discovery.js b/src/ble/discovery.js index 54c2ed9..9d77669 100644 --- a/src/ble/discovery.js +++ b/src/ble/discovery.js @@ -1,7 +1,6 @@ import { BLUETOOTH_ERROR_MESSAGES, DEFAULT_BLUETOOTH_ERROR_MESSAGE, - DISCOVERY_FILTER_SERVICE_UUIDS, TARGET_SERVICE_UUID_FULL, TARGET_SERVICE_UUID_ALT_FULL, TARGET_SERVICE_UUID_COMPAT_FULL, @@ -11,7 +10,6 @@ import {DEVICE_PROFILE, createUnifiedBleController, shortUuid, uuidInList} from import {showToast} from '@/utils/toast' import Taro from '@tarojs/taro' -const FILTER_SCAN_TIMEOUT_MS = 4000 const RESTART_SCAN_DELAY_MS = 120 const DISCOVERY_POLL_INTERVAL_MS = 1200 const SCAN_DURATION_MS = 30000 @@ -80,7 +78,6 @@ export function createBluetoothDiscovery(options = {}) { let searchSessionId = 0 let acceptingDeviceEvents = false - let filterFallbackTimer = null let discoveryPollTimer = null let autoStopTimer = null let deviceListEmitTimer = null @@ -272,10 +269,6 @@ export function createBluetoothDiscovery(options = {}) { } } - function hasTargetDeviceInMap() { - return Object.values(deviceMap).some((item) => item.isTargetDevice) - } - function getDeviceStableSignature(device = {}) { return [ device.deviceId || '', @@ -289,15 +282,6 @@ export function createBluetoothDiscovery(options = {}) { ].join('#') } - function clearFallbackTimer() { - if (!filterFallbackTimer) { - return - } - - clearTimeout(filterFallbackTimer) - filterFallbackTimer = null - } - function clearDiscoveryPollTimer() { if (!discoveryPollTimer) { return @@ -609,31 +593,10 @@ export function createBluetoothDiscovery(options = {}) { discoveryPollTimer = setTimeout(run, 300) } - async function fallbackToUnfilteredDiscoveryIfNeeded(sessionId) { - clearFallbackTimer() - - filterFallbackTimer = setTimeout(async () => { - if (!isSearching || !acceptingDeviceEvents || sessionId !== searchSessionId || hasTargetDeviceInMap()) { - return - } - - try { - await stopDiscoverySilently() - await delay(RESTART_SCAN_DELAY_MS) - - if (!isSearching || !acceptingDeviceEvents || sessionId !== searchSessionId) { - return - } - - await startDiscoveryWithServices([]) - } catch (error) { - } - }, FILTER_SCAN_TIMEOUT_MS) - } - /** - * 设备搜索: - * 优先按 0xFFF4/0x00F4/0xF400 过滤;若无结果自动切到兜底扫描并轮询 getBluetoothDevices。 + * 设备搜索:先无过滤全频段扫描(onBluetoothDeviceFound 事件驱动 + getBluetoothDevices 轮询双通道), + * 命中关键词/服务 UUID 即入列。微信的 services 过滤只匹配 128 位完整 UUID, + * 对 16 位广播 UUID(0x00F4 等)的设备经常过滤过头导致搜不到,故不再走过滤扫描。 */ async function startSearch() { if (isSearching) { @@ -643,7 +606,6 @@ export function createBluetoothDiscovery(options = {}) { // 立即标记搜索中,防止 await 期间用户重复点击或 stopSearch 被覆盖 isSearching = true onSearchingChange(true) - clearFallbackTimer() clearDiscoveryPollTimer() clearAutoStopTimer() @@ -672,18 +634,13 @@ export function createBluetoothDiscovery(options = {}) { acceptingDeviceEvents = true - try { - await startDiscoveryWithServices(DISCOVERY_FILTER_SERVICE_UUIDS) - } catch (error) { - await startDiscoveryWithServices([]) - } + await startDiscoveryWithServices([]) if (sessionId !== searchSessionId) { return } startDiscoveryPolling(sessionId) - await fallbackToUnfilteredDiscoveryIfNeeded(sessionId) // 30s 自动停止搜索 autoStopTimer = setTimeout(() => { @@ -701,7 +658,6 @@ export function createBluetoothDiscovery(options = {}) { } async function stopSearch(showStopToast = true) { - clearFallbackTimer() clearDiscoveryPollTimer() clearAutoStopTimer() @@ -907,7 +863,6 @@ export function createBluetoothDiscovery(options = {}) { } function cleanupDiscovery() { - clearFallbackTimer() clearDiscoveryPollTimer() clearDeviceListEmitTimer() diff --git a/src/constants/bluetooth.js b/src/constants/bluetooth.js index 3e512fb..9876619 100644 --- a/src/constants/bluetooth.js +++ b/src/constants/bluetooth.js @@ -16,12 +16,6 @@ export const TARGET_SHORT_UUID_CANDIDATES = Object.freeze([ TARGET_SERVICE_UUID_COMPAT ]) -export const DISCOVERY_FILTER_SERVICE_UUIDS = Object.freeze([ - TARGET_SERVICE_UUID_COMPAT_FULL, - TARGET_SERVICE_UUID_FULL, - TARGET_SERVICE_UUID_ALT_FULL -]) - /** * 蓝牙常见错误提示映射。 */