uni-app uni.writeBLECharacteristicValue API发送数据过长时不会正确报错
uni-app uni.writeBLECharacteristicValue API发送数据过长时不会正确报错
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | 10 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
HBuilderX类型:正式
HBuilderX版本号:4.43
手机系统:Android
手机系统版本号:Android 14
手机厂商:vivo
手机机型:vivox 70
页面类型:vue
vue版本:vue3
打包方式:云端
示例代码:
async writeBLECharacteristicValue({
commit,
state
}, command) {
try {
let value = str2ab(command)
const response = await new Promise((resolve, reject) => {
uni.writeBLECharacteristicValue({
deviceId: state.deviceId,
serviceId: state.serviceId,
characteristicId: state.writeCharacteristicId,
value: value,
writeType: "writeNoResponse",
success: resolve,
fail: reject
})
})
uni.showLoading({
title: "指令发送成功",
mask: true
})
commit("SET_COMMAND", command)
console.log("发送指令成功回调", response)
console.log("发送指令成功", command)
console.log("value", value)
} catch (e) {
console.log(e)
console.log("发送指令失败", command)
//TODO handle the exception
}
}
操作步骤:
async writeBLECharacteristicValue({
commit,
state
}, command) {
try {
let value = str2ab(command)
const response = await new Promise((resolve, reject) => {
uni.writeBLECharacteristicValue({
deviceId: state.deviceId,
serviceId: state.serviceId,
characteristicId: state.writeCharacteristicId,
value: value,
writeType: "writeNoResponse",
success: resolve,
fail: reject
})
})
uni.showLoading({
title: "指令发送成功",
mask: true
})
commit("SET_COMMAND", command)
console.log("发送指令成功回调", response)
console.log("发送指令成功", command)
console.log("value", value)
} catch (e) {
console.log(e)
console.log("发送指令失败", command)
//TODO handle the exception
}
}
预期结果:
如果成功请提示发送成功,因为过长发送失败请提示发送失败
实际结果:
无论什么情况都是成功
bug描述:
当使用uni.writeBLECharacteristicValue这个api时,当传输的数据过长时,会提示成功,但是实际上并没有成功。
有人看到吗,回复一下呗
在线等,很急
在uni-app中使用uni.writeBLECharacteristicValue
API进行蓝牙BLE设备特征值写入时,如果发送的数据过长,确实可能会遇到不正确报错或者数据截断的问题。这通常是由于BLE设备的限制或者API的使用不当导致的。为了确保数据的正确发送和处理潜在的错误,我们需要合理处理数据长度,并且做好错误捕获。
以下是一个示例代码,展示了如何使用uni.writeBLECharacteristicValue
API,并对可能的数据过长问题进行处理:
// 假设已经通过uni.createBLEConnection连接上了BLE设备,并且已经获取了serviceId和characteristicId
// 要写入的数据
const dataToWrite = new ArrayBuffer(256); // 示例数据,实际数据可能来自其他源
// 如果数据过长,这里可以进行数据分割处理,BLE设备通常有最大MTU(Maximum Transmission Unit)限制
const mtuSize = 20; // 假设MTU大小为20字节,实际情况需要根据设备文档确定
// 分割数据为多个块
function splitData(data, size) {
const dataView = new Uint8Array(data);
const chunks = [];
for (let i = 0; i < dataView.length; i += size) {
chunks.push(dataView.subarray(i, i + size));
}
return chunks;
}
const dataChunks = splitData(dataToWrite, mtuSize);
// 写入数据块
async function writeDataChunks(chunks, characteristicId) {
for (let chunk of chunks) {
try {
await uni.writeBLECharacteristicValue({
deviceId: 'your-device-id', // 替换为实际设备ID
serviceId: 'your-service-id', // 替换为实际serviceId
characteristicId: characteristicId,
value: chunk.buffer,
success: function (res) {
console.log('数据块写入成功:', res);
},
fail: function (err) {
console.error('数据块写入失败:', err);
}
});
} catch (error) {
console.error('写入过程中发生异常:', error);
}
}
}
// 调用写入函数
writeDataChunks(dataChunks, 'your-characteristic-id'); // 替换为实际characteristicId
在上面的代码中,我们首先定义了一个要写入的数据dataToWrite
,然后根据BLE设备的MTU大小将其分割为多个数据块。每个数据块通过uni.writeBLECharacteristicValue
API进行写入。如果写入失败,会在fail
回调中捕获错误,并在catch
块中处理可能的异常。
注意,mtuSize
的值需要根据具体的BLE设备文档来确定,不同的设备可能有不同的MTU限制。此外,deviceId
, serviceId
, 和characteristicId
需要替换为实际的值。