uni-app uni.startBluetoothDevicesDiscovery的services参数存在问题

uni-app uni.startBluetoothDevicesDiscovery的services参数存在问题

开发环境 版本号 项目创建方式
PC Windows11 专业版 CLI

产品分类:uniapp/App

PC开发环境操作系统:Windows

HBuilderX版本号:4.85

手机系统:Android

手机系统版本号:Android 15

手机厂商:小米

手机机型:15pro

页面类型:vue

vue版本:vue3

打包方式:云端

CLI版本号:3.0.0-4080520251106001

示例代码:

```js
uni.startBluetoothDevicesDiscovery({  
  services: ['A', 'B'],  
})  

uni.onBluetoothDeviceFound(e => {  
  console.log(e)  
})  

操作步骤:

  • 情况1:当手机设备发起搜索后,附近的蓝牙设备同一时刻仅存在a或b时
  • 情况2:当手机设备发起搜索后,如果附近的蓝牙设备同时存在a和b时

预期结果:

  • 情况1:可以在onBluetoothDeviceFound发现搜索的设备信息,并且过滤了无关设备。
  • 情况2:可以在onBluetoothDeviceFound发现搜索的设备信息,并且过滤了无关设备。

实际结果:

  • 情况1:可以在onBluetoothDeviceFound发现搜索的设备信息,并且过滤了无关设备。
  • 情况2:onBluetoothDeviceFound不会发现任何一台的设备信息。
  • 在情况2的场景下,只有将其中一种蓝牙设备全部关闭,才能回到情况1正常发现蓝牙设备。

bug描述: 假设有2台要搜索的蓝牙设备a和b,其主 service 的 uuid 分别为A和B,2种设备同时在线时,搜索时都发现不了。


更多关于uni-app uni.startBluetoothDevicesDiscovery的services参数存在问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app uni.startBluetoothDevicesDiscovery的services参数存在问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html


根据你的描述,这个问题确实属于uni.startBluetoothDevicesDiscovery的services参数在特定场景下的兼容性问题。

从技术实现来看,当services参数传入多个UUID时,Android底层蓝牙扫描可能会采用逻辑"与"的过滤策略,而非"或"逻辑。这意味着设备需要同时包含所有指定的UUID才会被返回,这在大多数蓝牙设备场景下是不合理的,因为单个外设通常不会同时包含多个不相关的服务。

建议的解决方案:

  1. 分次扫描策略:改为多次调用startBluetoothDevicesDiscovery,每次只传入单个service UUID
// 先扫描A设备
uni.startBluetoothDevicesDiscovery({
  services: ['A'],
  success: () => {
    uni.onBluetoothDeviceFound((e) => {
      // 处理A设备
    })
  }
})

// 再扫描B设备  
uni.startBluetoothDevicesDiscovery({
  services: ['B'],
  success: () => {
    uni.onBluetoothDevicesDiscovery((e) => {
      // 处理B设备
    })
  }
})
  1. 放弃services过滤:移除services参数,在onBluetoothDeviceFound回调中手动过滤
uni.startBluetoothDevicesDiscovery()

uni.onBluetoothDeviceFound((e) => {
  const device = e.devices[0]
  // 检查设备advertisServiceUUIDs是否包含A或B
  if (device.advertisServiceUUIDs?.includes('A') || 
      device.advertisServiceUUIDs?.includes('B')) {
    // 处理目标设备
  }
})
回到顶部