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

1 回复

更多关于uni-app蓝牙通信正常写入数据给蓝牙设备但提示写入错误,能监听到蓝牙设备返回数据的动作,但是监听结果为空的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个典型的iOS蓝牙通信中特征值权限配置问题。从错误代码和现象分析:

  1. 写入错误原因:iOS系统对蓝牙特征值的写入权限有严格要求。错误代码14表示特征值不支持写入操作,或者写入的数据格式/长度不符合设备要求。

  2. 监听数据为空:虽然成功开启了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))
    }
})
回到顶部