uni-app中uni.setBLEMTU设置传输单元为512返回成功后仍只能接收20个字节

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

uni-app中uni.setBLEMTU设置传输单元为512返回成功后仍只能接收20个字节

测试过的手机:

  • 华为 Mate 30
  • HUAWEI Pura 70 Pro+
  • iQOO11
  • 小米15
  • iQOO12

操作步骤:

  • 使用华为手机连接蓝牙后,设置uni.setBLEMTU,并使用uni.writeBLECharacteristicValue向低功耗蓝牙设备特征值中写入30个字节的数据

预期结果:

  • uni.writeBLECharacteristicValue发送的字节设备端能完整收到,并且能接受设备返回的数据

实际结果:

  • 只能发送22个字节左右的数据,设置的uni.setBLEMTU不生效,也无法完整接收到设备回复的数据,最大也只有22个字节左右,其他的安卓手机正常

bug描述:

  • 【报Bug】华为手机 uni.setBLEMTU 设置传输单元为512,返回成功后还是只能接收到20个字节。其余安卓手机正常

1 回复

在uni-app中使用uni.setBLEMTU设置蓝牙低功耗(BLE)的最大传输单元(MTU)时,理论上应该能够调整BLE设备的MTU大小以支持更大的数据传输。然而,如果遇到设置MTU为512字节后仍然只能接收20个字节的情况,这可能是由于BLE设备的固件限制、设备兼容性问题或代码实现问题。

以下是一个使用uni-app进行BLE通信,包括设置MTU的示例代码。请注意,如果设备本身不支持大于20字节的MTU,即使代码正确,也无法接收更大的数据包。

// 初始化蓝牙适配器
uni.openBLEAdapter({
  success: function (res) {
    console.log('蓝牙适配器初始化成功', res)
    
    // 开始扫描蓝牙设备
    uni.startBLEDevicesDiscovery({
      allowDuplicatesKey: false,
      success: function (res) {
        console.log('开始扫描蓝牙设备', res)
        
        // 停止扫描
        setTimeout(() => {
          uni.stopBLEDevicesDiscovery({
            success: function (res) {
              console.log('停止扫描蓝牙设备', res)
              
              // 连接蓝牙设备
              uni.createBLEConnection({
                deviceId: '你的设备ID', // 替换为你的设备ID
                success: function (res) {
                  console.log('蓝牙设备连接成功', res)
                  
                  // 设置MTU
                  uni.setBLEMTU({
                    deviceId: '你的设备ID', // 替换为你的设备ID
                    mtu: 512,
                    success: function (res) {
                      console.log('MTU设置成功', res)
                      
                      // 发送数据测试
                      uni.writeBLECharacteristicValue({
                        deviceId: '你的设备ID', // 替换为你的设备ID
                        serviceId: '你的服务ID', // 替换为你的服务ID
                        characteristicId: '你的特征值ID', // 替换为你的特征值ID
                        value: new ArrayBuffer(512), // 示例数据,实际应根据需要填充
                        success: function (res) {
                          console.log('数据发送成功', res)
                        },
                        fail: function (err) {
                          console.error('数据发送失败', err)
                        }
                      })
                    },
                    fail: function (err) {
                      console.error('MTU设置失败', err)
                    }
                  })
                },
                fail: function (err) {
                  console.error('蓝牙设备连接失败', err)
                }
              })
            }
          }, 3000) // 扫描3秒
        })
      }
    })
  },
  fail: function (err) {
    console.error('蓝牙适配器初始化失败', err)
  }
})

在上述代码中,我们首先初始化蓝牙适配器,然后开始扫描蓝牙设备并连接到目标设备。在连接成功后,我们尝试设置MTU为512字节,并发送一个512字节的数据包进行测试。

如果MTU设置成功但无法接收大于20字节的数据,可能需要检查以下几个方面:

  1. 确认BLE设备的固件和硬件是否支持MTU大于20字节。
  2. 检查BLE设备的特性(Characteristic)描述是否支持更大的MTU。
  3. 确保发送和接收的数据格式正确,没有因数据截断或格式错误导致的问题。

如果问题依旧存在,可能需要联系BLE设备的制造商获取更多支持。

回到顶部