uni-app中uni.setBLEMTU只能设置MTU值,没有返回服务端支持的最大MTU

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

uni-app中uni.setBLEMTU只能设置MTU值,没有返回服务端支持的最大MTU

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

测试过的手机:

全部安卓设备

操作步骤:

只返回设置成功或失败,实际蓝牙服务端不支持设置的大小也会返回成功,无法知道蓝牙服务端最大支持的mtu大小,导致发送数据至服务端过大无法收到数据

预期结果:

设置成功或者失败应该都返回蓝牙服务端最大支持mtu大小,或者增加获取mtu大小API,可以参考微信小程序的API

实际结果:

只能设置mtu,不能获取mtu大小,或者监听mtu实际支持的大小

bug描述:

增加返回生效的mtu大小,或者增加一个getMTU API 微信小程序都有


2 回复

有什么方式解决这个问题么,偿试用plus.android 读取蓝牙mtu,实现不了


在uni-app中,使用uni.setBLEMTU方法确实只能用来设置MTU(Maximum Transmission Unit,最大传输单元)值,而不能直接获取服务端支持的最大MTU值。不过,我们可以通过一些逻辑和交互来间接确定服务端所支持的最大MTU。

以下是一个基本的实现思路:

  1. 初始化MTU设置:从较小的MTU值开始尝试,逐步增加,直到达到服务端支持的最大MTU。
  2. 错误处理:当尝试设置一个过大的MTU值时,服务端通常会返回错误,我们可以捕获这些错误来确定MTU的上限。

以下是一个简单的代码示例,展示了如何在uni-app中实现这一逻辑:

// 假设已经连接到了蓝牙设备,并且设备的id为deviceId
const deviceId = 'your-device-id';

// 尝试设置MTU的函数
function setMTU(deviceId, mtu) {
  return new Promise((resolve, reject) => {
    uni.setBLEMTU({
      deviceId: deviceId,
      mtu: mtu,
      success: (res) => {
        resolve(res);
      },
      fail: (err) => {
        reject(err);
      }
    });
  });
}

// 确定最大MTU的函数
async function determineMaxMTU(deviceId, startMTU = 23, maxMTU = 512, step = 16) {
  try {
    for (let mtu = startMTU; mtu <= maxMTU; mtu += step) {
      console.log(`Attempting to set MTU to ${mtu}`);
      const result = await setMTU(deviceId, mtu);
      console.log('MTU set successfully:', result);
      // 如果设置成功,可以尝试更大的MTU,或者认为这就是当前设备支持的最大MTU
      // 实际应用中,可能需要一个更复杂的策略来停止递增
      return mtu; // 假设我们在这里停止递增,并认为mtu是当前设备支持的最大MTU
    }
  } catch (error) {
    console.error('Failed to set MTU:', error);
    // 如果捕获到错误,我们可以认为前一个MTU值是服务端支持的最大值
    // 这里需要一些逻辑来回溯到上一个成功设置的MTU值
    // 例如,可以维护一个上一个成功MTU的变量
    // 但由于示例的简化,这里直接返回捕获错误前的MTU尝试值(需要注意这不是完全准确的)
    // 实际应用中,应该更加细致地处理错误和回溯逻辑
    return mtu - step; // 假设失败前的mtu-step是最后一个成功值
  }
}

// 使用示例
determineMaxMTU(deviceId).then(maxMTU => {
  console.log('Determined maximum MTU:', maxMTU);
}).catch(error => {
  console.error('Error determining maximum MTU:', error);
});

请注意,这个示例代码是简化的,并没有处理所有可能的错误情况和边界条件。在实际应用中,你需要更细致地处理错误,并确保逻辑的正确性。特别是,需要维护一个成功的MTU值,以便在失败时能够回溯到上一个成功设置的MTU。

回到顶部