就是正常获取蓝牙服务
- 发布:2025-01-14 09:17
- 更新:2025-01-14 17:39
- 阅读:51
产品分类: uniapp/App
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: 1809
HBuilderX类型: 正式
HBuilderX版本号: 4.45
手机系统: Android
手机系统版本号: Android 11
手机厂商: OPPO
手机机型: A32
页面类型: vue
vue版本: vue2
打包方式: 云端
项目创建方式: HBuilderX
操作步骤:
预期结果:
返回services
返回services
实际结果:
services返回是空数组
services返回是空数组
bug描述:
这个问题,我看社区好早就有人提交了,怎么还没有处理好这个问题
没有获取到就重复执行,直到获取到或者到达最大重试次数为止
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
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