uni-app 低功耗蓝牙安卓基座调试 uni.getBLEDeviceServices() 获取不到蓝牙服务 延迟处理后仍大概率无法获取

uni-app 低功耗蓝牙安卓基座调试 uni.getBLEDeviceServices() 获取不到蓝牙服务 延迟处理后仍大概率无法获取

操作步骤

就是正常获取蓝牙服务

预期结果

返回services

实际结果

services返回是空数组

bug描述

这个问题,我看社区好早就有人提交了,怎么还没有处理好这个问题

项目 信息
产品分类 uniapp/App
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 1809
HBuilderX类型 正式
HBuilderX版本号 4.45
手机系统 Android
手机系统版本号 Android 11
手机厂商 OPPO
手机机型 A32
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

更多关于uni-app 低功耗蓝牙安卓基座调试 uni.getBLEDeviceServices() 获取不到蓝牙服务 延迟处理后仍大概率无法获取的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

这个方法你不能只执行一遍,要间隔一段时间,多次执行,比如间隔50毫秒,最大重试200次这样

更多关于uni-app 低功耗蓝牙安卓基座调试 uni.getBLEDeviceServices() 获取不到蓝牙服务 延迟处理后仍大概率无法获取的实战教程也可以访问 https://www.itying.com/category-93-b0.html


我在实际的测试过程中发现,每次都是前两次只要不返回services,主动断开连接(关闭蓝牙设备的蓝牙),第三次就一定能成功获取到。你说的这种方式没试过,我都是设置2000毫秒的间隔循环获取,但是基本大概率是获取不到

回复 1***@163.com: 因为蓝牙连接这种传输是不可靠的,可能受到信号干扰、电压不稳等因素导致数据丢失,所以我是采取增加执行频率来提高成功率,除了这个方法需要这样,getBLEDeviceCharacteristics方法也是如此,另外发送和接收数据包时,也是要多次重复发送,直到接收端确认接收到完整数据包后才结束传输。

回复 JSRTSDF: 按你说的50毫秒执行一次,没有成功过。反正目前能获取到的就是我上面说的连三次,第三次是一定能获取到这个services,就是不知道这个是什么原理,前两次都不用调很多次uni.getBLEDeviceServices(),直接手动断开连接,重新连就是了

没有获取到就重复执行,直到获取到或者到达最大重试次数为止 const getBLEDeviceServices = (deviceId) => {
const getServices = () => {
return new Promise(resolve => {
uni.getBLEDeviceServices({
deviceId,
success: res => {
resolve(res);
},
fail: (res) => {
console.log(‘getBLEDeviceServices fail’, res);
showMessage(res.errCode, ‘getBLEDeviceServices’);
resolve(false);
}
})
})
}
return new Promise(async (resolve) => {
let loop = true;
// 重试次数
let retry = 0;
let res = false;
do {
retry++;
res = await getServices();
setTimeout(() => {
if (res && res.services.length > 0) {
loop = false;
resolve(res);
}
if (!res || retry > 1000) {
loop = false;
resolve(false);
}

        }, 50)  
    } while ((res && res.services.length === 0) && loop);  
})  

}

我试了你这种方式,公司的测试机就是不行,不知道是不是手机太老了,拿另一个测试机,你这种方式可以获取到;我自己手机荣耀magic 5 是第一次就能获取到services,就没有这个问题。

回复 1***@163.com: 成功建立蓝牙连接后,mtu设置的传输字节数是多少? 尝试调小mtu

在处理 uni-app 低功耗蓝牙(BLE)开发时,uni.getBLEDeviceServices() 方法用于获取蓝牙设备的服务列表。如果在安卓基座上调试时遇到无法获取蓝牙服务的问题,即使加入了延迟处理仍然大概率失败,这可能是由于多种原因导致的。下面我将提供一个代码示例,并结合可能的解决思路,希望能帮助你定位问题。

代码示例

首先,确保你已经正确初始化蓝牙适配器并扫描到设备。以下是一个简化的代码流程示例:

// 初始化蓝牙适配器
uni.openBluetoothAdapter({
  success: function (res) {
    console.log('蓝牙适配器初始化成功', res);
    uni.startBluetoothDevicesDiscovery({
      allowDuplicatesKey: false,
      success: function (discRes) {
        console.log('开始扫描蓝牙设备', discRes);

        // 假设已扫描到设备,设备ID为deviceId
        let deviceId = '你的设备ID';

        // 连接设备
        uni.createBLEConnection({
          deviceId: deviceId,
          success: function (connRes) {
            console.log('蓝牙设备连接成功', connRes);

            // 延迟处理,尝试解决获取服务失败的问题
            setTimeout(() => {
              uni.getBLEDeviceServices({
                deviceId: deviceId,
                success: function (serviceRes) {
                  console.log('获取蓝牙设备服务成功', serviceRes.services);
                },
                fail: function (err) {
                  console.error('获取蓝牙设备服务失败', err);
                }
              });
            }, 3000); // 延迟3秒再尝试获取服务
          },
          fail: function (err) {
            console.error('蓝牙设备连接失败', err);
          }
        });
      },
      fail: function (err) {
        console.error('扫描蓝牙设备失败', err);
      }
    });
  },
  fail: function (err) {
    console.error('蓝牙适配器初始化失败', err);
  }
});

解决思路

  1. 确认设备ID正确:确保传递给 uni.createBLEConnectionuni.getBLEDeviceServices 的设备ID是正确的。

  2. 检查设备支持:确认目标设备是否支持BLE,并且服务列表不是空的。

  3. 权限问题:检查应用是否有足够的权限访问蓝牙设备。在Android上,你可能需要在 AndroidManifest.xml 中声明蓝牙权限。

  4. 系统兼容性问题:尝试在不同的安卓版本和设备上测试,以排除系统兼容性问题。

  5. 日志与调试:使用 console.logconsole.error 记录更多调试信息,以便更精确地定位问题。

  6. 错误处理:增强错误处理逻辑,对于 fail 回调中的错误信息进行详细记录和分析。

通过上述代码示例和解决思路,希望能帮助你解决在uni-app中遇到的蓝牙服务获取问题。如果问题依旧存在,建议深入检查设备固件、系统日志或联系设备厂商获取支持。

回到顶部