uni-app 安卓APP低功耗蓝牙写入数据经常失败 报10007错误
产品分类
uniapp/App
开发环境信息
项 | 详情 |
---|---|
PC开发环境操作系统 | Windows |
PC开发环境操作系统版本号 | 10 |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 3.99 |
手机系统 | Android |
手机系统版本号 | Android 13 |
手机厂商 | OPPO |
手机机型 | oppo reno 7 |
页面类型 | vue |
vue版本 | vue2 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
示例代码
setTimeout(() => {
console.log(that.characteristics)
console.log(that.connectedDeviceId)
console.log(that.services[getApp().globalData.services_code].uuid)
console.log(that.characteristics[getApp().globalData.Tcharacter_code].uuid)
uni.writeBLECharacteristicValue({
deviceId: that.connectedDeviceId,
serviceId: that.services[getApp().globalData.services_code].uuid,
characteristicId: that.characteristics[getApp().globalData.Tcharacter_code].uuid,
value: buffer,
success: function (res) {
setTimeout(() => {
console.log(res)
console.log('助手发送成功home信息')
}, 10)
},
fail: function (res) {
console.log(res)
console.log(that.connectedDeviceId)
console.log(that.services[getApp().globalData.services_code].uuid)
console.log(that.characteristics[getApp().globalData.Tcharacter_code].uuid)
console.log('助手发送失败home信息')
}
})
}, 1000)
操作步骤
连接蓝牙后,写入数据时有时报错10007有时正常。
预期结果
{"errMsg":"writeBLECharacteristicValue:ok"}
实际结果
{"errMsg":"writeBLECharacteristicValue:fail property not support","errCode":10007}
bug描述
使用uniapp开发低功耗蓝牙时,小程序端一切正常,但安卓APP端和安卓APP基座经常会写入数据失败提示10007错误:
{
"errMsg": "writeBLECharacteristicValue:fail property not support",
"errCode": 10007
}
但此时读到的特征值是有write权限的,失败一段时间后会突然又可以正常收发数据。基座端如果不断开手机连接会一直可以成功发送数据,APP端有时可以有时候不行。
8 回复
你好,这个问题解决了吗
并行调用多次会存在写失败的可能性。
会不会是因为你放在异步中,然后在重复调用。
请问解决了吗?我也有出现这个问题
写入失败时,在失败的回调里面,尝试用失败的这次的数据再写一次。
回复 不如摸鱼去: 写数据太慢了 写完全部数据得10分钟
回复 1***@qq.com: 用经典蓝牙
搜了半天,也没找到解决办法,加延迟,失败重写都不行啊
针对你提到的uni-app在安卓平台上使用低功耗蓝牙(BLE)写入数据时遇到的10007错误问题,这通常指示了一个通用的蓝牙操作失败,可能由多种原因引起,如设备连接状态不稳定、服务或特征值未正确识别、写入的数据格式不符合要求等。以下是一个简化的代码示例,展示了如何在uni-app中通过蓝牙API进行BLE设备的连接和数据写入,同时附带了一些调试和错误处理的思路。
1. 初始化蓝牙适配器并扫描设备
uni.openBluetoothAdapter({
success: function (res) {
console.log('蓝牙适配器初始化成功', res);
uni.startBluetoothDevicesDiscovery({
allowDuplicatesKey: false,
success: function (discoverRes) {
console.log('开始扫描设备', discoverRes);
// 假设设备已被发现并连接
// 连接设备逻辑省略...
}
});
},
fail: function (err) {
console.error('蓝牙适配器初始化失败', err);
}
});
2. 连接设备并获取服务
uni.createBLEConnection({
deviceId: 'your_device_id', // 替换为实际设备ID
success: function (connRes) {
console.log('设备连接成功', connRes);
uni.getBLEDeviceServices({
deviceId: 'your_device_id',
success: function (serviceRes) {
console.log('获取服务成功', serviceRes);
// 假设服务ID已知
const serviceId = 'your_service_id';
// 获取特征值
uni.getBLEDeviceCharacteristics({
deviceId: 'your_device_id',
serviceId: serviceId,
success: function (charRes) {
console.log('获取特征值成功', charRes);
// 假设特征值ID已知
const characteristicId = 'your_characteristic_id';
// 准备写入数据
writeValue(deviceId, serviceId, characteristicId);
}
});
}
});
},
fail: function (err) {
console.error('设备连接失败', err);
}
});
3. 写入数据
function writeValue(deviceId, serviceId, characteristicId) {
const value = new ArrayBuffer(4); // 示例数据,根据实际情况调整
const dataView = new DataView(value);
dataView.setUint32(0, 123456, true); // 示例写入值
uni.writeBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId,
value: value,
success: function (writeRes) {
console.log('数据写入成功', writeRes);
},
fail: function (err) {
if (err.errCode === 10007) {
console.error('写入数据失败,错误码10007', err);
// 可以尝试重新连接设备或重试写入操作
} else {
console.error('写入数据失败', err);
}
}
});
}
注意事项
- 确保设备ID、服务ID和特征值ID正确无误。
- 检查写入的数据格式是否符合设备要求。
- 对于错误码10007,可以考虑增加重试机制,或检查设备连接状态是否稳定。
- 使用
uni.onBLEConnectionStateChange
监听设备连接状态变化,以便及时处理连接断开的情况。