收藏
回答

设置MTU,wx.onBLEMTUChange并不会把最终协商的MTU回调。感觉这个api完全就没有

回答关注问题邀请回答
收藏

2 个回答

  • 还有王法吗
    还有王法吗
    2023-01-10


    有用,它会返回手机支持的最大单元(我的猜想),不知道咱们两个说的是不是一个意思,我是这么做的。

    wx.onBLEMTUChange(function (res) {
        console.log('bluetooth mtu is', res.mtu)
        wx.setBLEMTU({
            deviceId: device.deviceId,
            mtu: res.mtu,
            success(mtu) {
                console.log('设置最大传输单元成功 :', mtu)
            },
            fail(error) {
                console.warn('设置最大传输单元失败!', error)
            }
        });
    })
    // 协商设置蓝牙低功耗的最大传输单元 (Maximum Transmission Unit, MTU)。需在 wx.createBLEConnection 调用成功后调用。仅安卓系统 5.1 以上版本有效,iOS 因系统限制不支持。
    wx.setBLEMTU({
        deviceId: device.deviceId,
        mtu400,
        success(mtu) {
            console.log('设置最大传输单元成功 :', mtu)
        },
        fail(error) {
            console.warn('设置最大传输单元失败!', error)
        }
    });
    


    先走的:onBLEMTUChange,返回 247(我手机小米 13),然后再走的 setBLEMTU 报错,最后走的 onBLEMTUChange 里的 setBLEMTU 成功。

    又完善了一下代码:

    /**
     * 协商设置蓝牙低功耗的最大传输单元 (Maximum Transmission Unit, MTU)。需在 wx.createBLEConnection 调用成功后调用。仅安卓系统 5.1 以上版本有效,iOS 因系统限制不* 支持。
     * setBLEMTU 和 onBLEMTUChange 回调流程:先走 onBLEMTUChange 返回 247(我手机小米 13),然后再走的 setBLEMTU 报错,最后走的 onBLEMTUChange 里的 setBLEMTU 成功。
     * 注:onBLEMTUChange 先注册相当于监听函数,当 setBLEMTU 执行后才走 callBack
     * @param {String} deviceId          设备id
     * @param {Number} expectedValue     期望值
     */
    function setBLEMTU(deviceId, expectedValue{
        function _setBLEMTU(mtu{
            wx.setBLEMTU({
                deviceId,
                mtu,
                success(mtu) {
                    console.log('setBLEMTU 设置最大传输单元成功 :', mtu)
                },
                fail(error) {
                    console.warn('setBLEMTU 设置最大传输单元失败!', error)
                }
            })
        }
        wx.onBLEMTUChange(function (res{
            console.log('onBLEMTUChange mtu is', res.mtu)
              // 每包最大数。这个 res.mtu 应该是当前设备的最大值,我尝试,小米 13 是 247,当我传 248 就会设置报错。
              packageSize = res.mtu;
              // 期望值设置不成功就用 onBLEMTUChange 返回的最大值?设置 _setBLEMTU
              if (res.mtu !== expectedValue) {
                  _setBLEMTU(res.mtu)
              }
          });
          // 先尝试设置期望值
          _setBLEMTU(expectedValue);
      }
      
      // test 1
      setBLEMTU(500);
      // 结果 1、先 onBLEMTUChange 监听到,返回 res.mtu ,报 "setBLEMTU 设置最大传输单元失败!",再报 "setBLEMTU 设置最大传输单元成功 :"
      
      // test 2
      setBLEMTU(247);
      // 结果 1、先 onBLEMTUChange 监听到,返回 res.mtu ,报 "setBLEMTU 设置最大传输单元成功 :"
    






    2023-01-10
    有用 1
    回复 3
    • :
      2023-04-25
      我这样调用也没取到mtu值,是调用的方式不对吗?请指教下
      2023-04-25
      回复
    • 还有王法吗
      还有王法吗
      2023-05-06回复
      onBLEMTUChange,这个是值发生变化的监听,不是设置
      2023-05-06
      回复
    • 还有王法吗
      还有王法吗
      2023-05-06
      我这代码在 android 下没问题,ios 不执行,需要做兼容处理。
      2023-05-06
      回复
  • 。
    2023-12-29

    先setBLUMTU才会监听回调。但好奇怪我最大136,但只能传输128字节,超过128对方根本接收不到,就算传输额外需要3个字节,那也还剩5个字节。猜测是不是报头信息不能存放在131字节以外,那这种怎么解决啊

    2023-12-29
    有用
    回复 1
    • Xt
      Xt
      1天前
      分包
      1天前
      回复
登录 后发表内容