1***@163.com
1***@163.com
  • 发布:2025-01-14 09:17
  • 更新:2025-01-14 17:39
  • 阅读:51

【报Bug】uni.getBLEDeviceServices(),低功耗蓝牙安卓基座调试获取不到蓝牙服务,查看其他人说的延迟处理,还是大概率是获取不到蓝牙服务。

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 1809

HBuilderX类型: 正式

HBuilderX版本号: 4.45

手机系统: Android

手机系统版本号: Android 11

手机厂商: OPPO

手机机型: A32

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

操作步骤:

就是正常获取蓝牙服务

预期结果:

返回services

实际结果:

services返回是空数组

bug描述:

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

2025-01-14 09:17 负责人:无 分享
已邀请:
JSRTSDF

JSRTSDF

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

  • 1***@163.com (作者)

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

    2025-01-14 15:09

  • JSRTSDF

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

    2025-01-14 15:26

  • 1***@163.com (作者)

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

    2025-01-14 17:28

JSRTSDF

JSRTSDF

没有获取到就重复执行,直到获取到或者到达最大重试次数为止

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);  
    })  
}
  • 1***@163.com (作者)

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

    2025-01-15 11:48

  • JSRTSDF

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

    2025-01-15 14:13

要回复问题请先登录注册