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
这个方法你不能只执行一遍,要间隔一段时间,多次执行,比如间隔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);
}
});
解决思路
-
确认设备ID正确:确保传递给
uni.createBLEConnection
和uni.getBLEDeviceServices
的设备ID是正确的。 -
检查设备支持:确认目标设备是否支持BLE,并且服务列表不是空的。
-
权限问题:检查应用是否有足够的权限访问蓝牙设备。在Android上,你可能需要在
AndroidManifest.xml
中声明蓝牙权限。 -
系统兼容性问题:尝试在不同的安卓版本和设备上测试,以排除系统兼容性问题。
-
日志与调试:使用
console.log
和console.error
记录更多调试信息,以便更精确地定位问题。 -
错误处理:增强错误处理逻辑,对于
fail
回调中的错误信息进行详细记录和分析。
通过上述代码示例和解决思路,希望能帮助你解决在uni-app中遇到的蓝牙服务获取问题。如果问题依旧存在,建议深入检查设备固件、系统日志或联系设备厂商获取支持。