uni-app uni.writeBLECharacteristicValue API发送数据过长时不会正确报错

发布于 1周前 作者 nodeper 来自 Uni-App

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时,当传输的数据过长时,会提示成功,但是实际上并没有成功。


3 回复

有人看到吗,回复一下呗


在线等,很急

在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需要替换为实际的值。

回到顶部