前阵子做uniapp项目遇到一个bug
uniapp前端使用下面的代码获取蓝牙设备服务时候显示为空,如下图设备服务是个空数组
解决办法:刚连接设备后,延时一段时间获取蓝牙设备服务
1.连接蓝牙设备
调用 uni.createBLEConnection 接口
const connectDevice = (device) => {
// 连接设备
uni.createBLEConnection({
deviceId: device.deviceId,
success(res) {
console.log("设备连接成功:", res);
uni.showToast({
title: `已连接 ${device.name}`,
icon: "success",
});
uni.getConnectedBluetoothDevices({
success(res) {
// 获取设备的服务和特征值
getDeviceServices(device.deviceId);
},
fail(err) {
console.error("获取连接设备失败:", err);
},
});
},
fail(err) {
console.error("设备连接失败:", err);
uni.showModal({
title: "连接失败",
content: `无法连接到设备 ${device.name},请重试。`,
showCancel: false,
});
},
});
};
2.获取蓝牙设备服务
const getDeviceServices = (deviceId) => {
uni.getBLEDeviceServices({
deviceId,
success(res) {
console.log("设备的服务:", res.services);
// 获取每个服务的特征值
res.services.forEach((service) => {
getDeviceCharacteristics(deviceId, service.uuid);
});
},
fail(err) {
console.log("获取服务失败:", err);
},
});
};
第二步调用 uni.getBLEDeviceServices 接口获取到res.services是个空数组,可能是在刚连接蓝牙设备的时候立即获取不到设备的服务。在连接成功后,我们可以尝试使用定时器延时获取蓝牙设备的服务,代码更改为:
加上定时器,设置延时10s(时长自己决定)
const getDeviceServices = (deviceId) => {
setTimeout(()=>{
uni.getBLEDeviceServices({
deviceId,
success(res) {
console.log("设备的服务:", res.services);
// 获取每个服务的特征值
res.services.forEach((service) => {
getDeviceCharacteristics(deviceId, service.uuid);
});
},
fail(err) {
console.log("获取服务失败:", err);
},
});
}, 10000)
};
然后神奇地发现,设备服务输出正常了。
参考链接:uni.getBLEDeviceServices android 下无法获取不到services(急急急) - DCloud问答