uni-app中uni.setBLEMTU只能设置MTU值,没有返回服务端支持的最大MTU
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。
以下是一个基本的实现思路:
- 初始化MTU设置:从较小的MTU值开始尝试,逐步增加,直到达到服务端支持的最大MTU。
- 错误处理:当尝试设置一个过大的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。