uni-app中uni.closeBLEConnection返回断开成功但实例仍在,重新连接蓝牙写数据会出现多个实例叠加问题

uni-app中uni.closeBLEConnection返回断开成功但实例仍在,重新连接蓝牙写数据会出现多个实例叠加问题

开发环境 版本号 项目创建方式
Windows win11 HBuilderX

操作步骤:

低功耗蓝牙连接成功写入数据成功后,监听低功耗蓝牙断开,然后重新连接低功耗蓝牙写入数据就会发现前一个实例还在,会叠加。直到关闭APP重新打开才能结束之前的实例

预期结果:

uni.closeBLEConnection 调用后能真正断开连接

实际结果:

回调成功,单实际上并未断开


更多关于uni-app中uni.closeBLEConnection返回断开成功但实例仍在,重新连接蓝牙写数据会出现多个实例叠加问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

问题解决了吗?我是IOS断开不了连接

更多关于uni-app中uni.closeBLEConnection返回断开成功但实例仍在,重新连接蓝牙写数据会出现多个实例叠加问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html


uni-app 中使用 uni.closeBLEConnection 断开蓝牙连接时,虽然返回了断开成功的回调,但蓝牙实例可能仍然存在,这会导致重新连接时出现多个实例叠加的问题。这种情况通常是由于蓝牙连接的资源没有完全释放或异步操作未完成导致的。

解决方案

  1. 确保断开连接后资源释放: 在调用 uni.closeBLEConnection 后,确保所有相关的资源(如事件监听器、定时器等)都被正确释放。可以通过手动清理资源来避免实例残留。

  2. 使用标志位控制连接状态: 在代码中引入一个标志位来记录当前的连接状态,确保在重新连接之前,前一个连接已经完全断开。

  3. 延迟重新连接: 在断开连接后,延迟一段时间再进行重新连接,以确保蓝牙实例已经完全释放。

  4. 检查蓝牙实例状态: 在重新连接之前,检查蓝牙实例的状态,确保没有残留的实例。

示例代码

let isConnected = false; // 连接状态标志位
let deviceId = null; // 设备ID

// 断开蓝牙连接
function disconnectBLE() {
    if (isConnected && deviceId) {
        uni.closeBLEConnection({
            deviceId: deviceId,
            success: (res) => {
                console.log('断开连接成功', res);
                isConnected = false;
                deviceId = null;
                // 延迟一段时间再重新连接
                setTimeout(() => {
                    connectBLE();
                }, 1000); // 延迟1秒
            },
            fail: (err) => {
                console.error('断开连接失败', err);
            }
        });
    }
}

// 连接蓝牙
function connectBLE() {
    if (!isConnected) {
        uni.createBLEConnection({
            deviceId: deviceId,
            success: (res) => {
                console.log('连接成功', res);
                isConnected = true;
                // 连接成功后进行数据写入等操作
                writeBLECharacteristicValue();
            },
            fail: (err) => {
                console.error('连接失败', err);
            }
        });
    }
}

// 写入数据
function writeBLECharacteristicValue() {
    if (isConnected) {
        const buffer = new ArrayBuffer(1);
        const dataView = new DataView(buffer);
        dataView.setUint8(0, 0x01); // 示例数据

        uni.writeBLECharacteristicValue({
            deviceId: deviceId,
            serviceId: 'your-service-id',
            characteristicId: 'your-characteristic-id',
            value: buffer,
            success: (res) => {
                console.log('写入数据成功', res);
            },
            fail: (err) => {
                console.error('写入数据失败', err);
            }
        });
    }
}

// 初始化连接
function initBLEConnection(targetDeviceId) {
    deviceId = targetDeviceId;
    connectBLE();
}

// 示例:初始化连接
initBLEConnection('your-device-id');

// 示例:断开连接
disconnectBLE();
回到顶部