fix(ble): 搜索列表不再跳动,设备按首次发现顺序稳定展示

两处根因:列表按 RSSI 排序,信号逐包抖动导致卡片反复换位;
变更签名含 RSSI,同一设备每收到一个广播包就整表刷新。
改为组内保持插入序(00F4 服务命中组仍排前),签名剔除 RSSI。
This commit is contained in:
ozh 2026-10-15 11:09:33 +08:00
parent ccb088ba9c
commit 461bfc748b
1 changed files with 4 additions and 4 deletions

View File

@ -106,9 +106,9 @@ export function createBluetoothDiscovery(options = {}) {
return left.hasTargetService ? -1 : 1
}
const leftSignal = typeof left.RSSI === 'number' ? left.RSSI : -999
const rightSignal = typeof right.RSSI === 'number' ? right.RSSI : -999
return rightSignal - leftSignal
// 同组内保持首次发现顺序(对象键插入序稳定)。
// 不按 RSSI 排序:信号强度逐包抖动会让卡片反复换位跳动
return 0
})
}
@ -248,13 +248,13 @@ export function createBluetoothDiscovery(options = {}) {
function getDeviceStableSignature(device = {}) {
return [
device.deviceId || '',
device.RSSI ?? '',
device.name || '',
device.localName || '',
Array.isArray(device.advertisServiceUUIDs)
? device.advertisServiceUUIDs.map((item) => normalizeUuid(item)).sort().join('|')
: '',
device.advertisData ? JSON.stringify(Array.from(new Uint8Array(device.advertisData))) : ''
// RSSI 逐包抖动,不参与变更签名:避免同一设备反复触发列表刷新
].join('#')
}