uni-app createBLEConnection连接超时问题:当连接超时3次后,第4次连接调用直接报出超时的错误

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

uni-app createBLEConnection连接超时问题:当连接超时3次后,第4次连接调用直接报出超时的错误

蓝牙连接和获取特征码

连接蓝牙

// 连接蓝牙  
async linkDevice() {  
  const that = this;  
  const maxRetryCount = 3;  
  let retryCount = 0;  
  // 连接连接失败,重试3次  
  async function connectWithRetry() {  
    try {  
      const blueId = that.getBluetoothId();  
      await uni.openBluetoothAdapter();  
      await uni.getBluetoothAdapterState();  
      await uni.startBluetoothDevicesDiscovery();  
      const joinResult = await connectBluetooth(blueId);  

      uni.stopBluetoothDevicesDiscovery({  
        success(res) {  
          console.log("停止搜索成功", res);  
        },  
        fail(err) {  
          console.log("停止失败", err);  
        },  
      });  

      if (joinResult.err) {  
        throw new Error("连接失败");  
      }  

    } catch (err) {  
      console.log("初始化蓝牙失败", err);  
      if (retryCount < maxRetryCount) {  
        retryCount++;  
        console.log(`重试连接,当前第 ${retryCount} 次`);  
        await connectWithRetry();  
      } else {  
        // 达到最大重试次数,执行失败处理  
        uni.showModal({  
          title: "提示!",  
          content: "蓝牙连接失败,请重新操作设备!",  
          showCancel: false,  
          confirmText: "确定",  
          success: (res) => {  
            if (res.confirm) {  
              that.unlockingFailure();  
            }  
          },  
        });  
      }  
    }  
  }  

  // 开始首次连接尝试  
  await connectWithRetry();  
},  

/**  
 * 连接蓝牙 + 获取主服务 + 获取特征码  
 */  
export const connectBluetooth = async (deviceId) => {  
  console.log('deviceId---------------------', deviceId);  

  try {  
    // 连接蓝牙设备  
    await uni.createBLEConnection({  
      deviceId,  
      timeout: 3000,  
    });  

    // 获取主服务  
    const serviceId = await getServiceIdWithRetry(deviceId, 10);  

    // 获取特征码  
    const characteristicId = await getCharacteristicId(deviceId, serviceId);  

    // 返回设备数据  
    const deviceData = {  
      deviceId,  
      serviceId,  
      characteristicId,  
    };  
    return deviceData;  
  } catch (error) {  
    console.log('连接蓝牙发生错误', error);  
    // 连接失败  
    return {  
      err: true,  
      errName: error.toString(),  
      ...error,  
    };  
  }  
};

图片

图片

日志输出

图片是第4次重新操作设备的日志输出,可以看到在1秒钟内超时失败,重连3次都是超时。


1 回复

在处理 uni-appcreateBLEConnection 连接超时问题时,我们可以采取一系列措施来增强连接的稳定性和错误处理能力。以下是一个处理连接超时问题的代码示例,该示例将尝试连接3次,并在第4次直接报出超时错误。

首先,我们需要定义一些全局变量来跟踪连接尝试次数和连接状态:

let connectionAttempts = 0;
const MAX_ATTEMPTS = 3;

接下来,我们定义一个函数来尝试连接BLE设备,并在连接失败时增加尝试次数:

function connectToBLEDevice(deviceId) {
    return new Promise((resolve, reject) => {
        uni.createBLEConnection({
            deviceId: deviceId,
            success: (res) => {
                console.log('BLE device connected', res);
                connectionAttempts = 0; // Reset attempts on successful connection
                resolve(res);
            },
            fail: (err) => {
                console.error('BLE device connection failed', err);
                connectionAttempts++;
                if (connectionAttempts < MAX_ATTEMPTS) {
                    // Retry connection after a delay
                    setTimeout(() => connectToBLEDevice(deviceId).then(resolve, reject), 2000); // 2-second delay
                } else {
                    // Max attempts reached, reject promise with timeout error
                    reject(new Error('BLE connection timed out after ' + MAX_ATTEMPTS + ' attempts'));
                }
            }
        });
    });
}

在主逻辑中,我们可以调用这个函数并处理连接结果:

const deviceId = 'your-device-id-here';

connectToBLEDevice(deviceId)
    .then((connectionResult) => {
        // Successfully connected, perform further operations
        console.log('Successfully connected:', connectionResult);
    })
    .catch((error) => {
        // Handle connection error
        console.error('Connection error:', error.message);
        // Optionally, show an error message to the user or perform some cleanup
    });

在这个示例中,connectToBLEDevice 函数使用递归和 setTimeout 来处理连接超时并重试。如果连接在最大尝试次数内成功,它将重置尝试次数并解决Promise。如果达到最大尝试次数仍失败,它将拒绝Promise并抛出一个包含超时信息的错误。

请注意,实际的BLE连接可能受到多种因素的影响,包括设备状态、信号强度和网络干扰。因此,合理设置重试间隔和最大尝试次数对于确保用户体验的稳定性至关重要。此外,确保在实际应用中处理BLE连接的断开和错误情况,以便在连接丢失时能够适当地恢复或通知用户。

回到顶部