uni-app蓝牙通信正常写入数据给蓝牙设备但提示写入错误,能监听到蓝牙设备返回数据的动作,但是监听结果为空
uni-app蓝牙通信正常写入数据给蓝牙设备但提示写入错误,能监听到蓝牙设备返回数据的动作,但是监听结果为空
错误描述
IOS启动蓝牙监听,写入数据报错。但是设备能正常接收。 错误如下:
send-error-{"errMsg":"writeBLECharacteristicValue:fail Error Domain=CBATTErrorDomain Code=14 \"Unlikely error.\" UserInfo={NSLocalizedDescription=Unlikely error.},https://ask.dcloud.net.cn/article/282","errCode":10007,"code":10007}
接收到的数据打印如下:
value-succ{"characteristicId":"0000FFE1-0000-1000-8000-00805F9B34FB","deviceId":"78E496C9-3688-8D6C-B60D-B17D69A597C1","serviceId":"0000FFE0-0000-1000-8000-00805F9B34FB","value":{}}
value 是空的,但是确实每次都监听到了。
实现代码
启用 notify 功能
await uni.notifyBLECharacteristicValueChange({
state: true,
deviceId,
serviceId,
characteristicId,
success: res => {
console.log('notify-succ:' + JSON.stringify(res));
that.iGlobal.uploadlog('notify-succ' + JSON.stringify(res))
},
fail: err => {
console.log('notify-failed:' + JSON.stringify(err));
that.iGlobal.uploadlog('notify-failed' + JSON.stringify(err))
}
});
写入代码
that.iBluetooth.writeBLECharacteristicValue(encoded)
.then(res => {
that.iGlobal.uploadlog('woshou-' + JSON.stringify(res))
that.iGlobal.addCache('selectBlueTooth', that.iBluetooth, 30 * 36000);
setTimeout(() => {
that.iGlobal.togo2('../../pages/index/index')
}, 200);
})
.catch(error => {
that.iGlobal.uploadlog('woshou-' + JSON.stringify(error))
that.iGlobal.addCache('selectBlueTooth', that.iBluetooth, 30 * 36000);
setTimeout(() => {
that.iGlobal.togo2('../../pages/index/index')
}, 200);
});
更多关于uni-app蓝牙通信正常写入数据给蓝牙设备但提示写入错误,能监听到蓝牙设备返回数据的动作,但是监听结果为空的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于uni-app蓝牙通信正常写入数据给蓝牙设备但提示写入错误,能监听到蓝牙设备返回数据的动作,但是监听结果为空的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这是一个典型的iOS蓝牙通信中特征值权限配置问题。从错误代码和现象分析:
-
写入错误原因:iOS系统对蓝牙特征值的写入权限有严格要求。错误代码14表示特征值不支持写入操作,或者写入的数据格式/长度不符合设备要求。
-
监听数据为空:虽然成功开启了notify监听,但接收到的value为空对象,说明设备确实有数据返回,但数据解析可能存在问题。
解决方案:
首先检查特征值的属性配置。在调用getBLEDeviceCharacteristics获取设备特征值时,需要确认目标特征值的properties包含write和notify权限:
// 获取特征值后检查
characteristics.forEach(char => {
if (char.uuid === targetCharacteristicId) {
console.log('特征值属性:', char.properties)
// 需要包含write和notify
}
})
写入数据格式处理: iOS对写入数据有严格限制,需要将数据转换为ArrayBuffer:
// 确保数据正确编码
function stringToArrayBuffer(str) {
const buffer = new ArrayBuffer(str.length)
const dataView = new DataView(buffer)
for (let i = 0; i < str.length; i++) {
dataView.setUint8(i, str.charCodeAt(i))
}
return buffer
}
监听数据处理: 接收数据时需要正确解析ArrayBuffer:
uni.onBLECharacteristicValueChange(res => {
if (res.characteristicId === targetCharacteristicId) {
const value = new Uint8Array(res.value)
console.log('接收到数据:', Array.from(value))
}
})

