小程序蓝牙发送数据超过20个字节解决方案

问题:做小程序项目的时候碰到往蓝牙设备写数据超过20个字节,ios没有返回结果
解答:在社区和网上搜了一圈都说要分包发送但是没有完整的示例,以下代码是我亲测有效的

function writeTest(msg){
  let buffer = hexStringToArrayBuffer(msg);
  let pos = 0;
  let bytes = buffer.byteLength;
  console.log("bytes", bytes)
  while (bytes > 0) {
    let tmpBuffer;
    if (bytes > 20) {
      return delay(0.25).then(() => {
        tmpBuffer = buffer.slice(pos, pos + 20);
        pos += 20;
        bytes -= 20;
        console.log("tmpBuffer", tmpBuffer)
        wx.writeBLECharacteristicValue({
          deviceId: deviceId,
          serviceId: serviceId,
          characteristicId: writeId,
          value: tmpBuffer,
          success(res) {
            console.log('第一次发送', res)
          }
        })
      })
    } else {
     return  delay(0.25).then(() => {
        tmpBuffer = buffer.slice(pos, pos + bytes);
        pos += bytes;
        bytes -= bytes;
        wx.writeBLECharacteristicValue({
          deviceId: deviceId,
          serviceId: serviceId,
          characteristicId: writeId,
          value: tmpBuffer,
          success(res) {
            console.log('第二次发送', res)
          },
          fail: function (res) {
            console.log('发送失败', res)
          }
        })
      })
    }
  }
}

这边有个关键点就是delay(0.25),一定要间隔相应的时间再发送,不然即使分包也接收不到正确的数据,回调数据可在onBLECharacteristicValueChange中查看。

function hexStringToArrayBuffer(str) {
  if (!str) {
    return new ArrayBuffer(0);
  }
  var buffer = new ArrayBuffer(str.length);
  let dataView = new DataView(buffer)
  let ind = 0;
  for (var i = 0, len = str.length; i < len; i += 2) {
    let code = parseInt(str.substr(i, 2), 16)
    dataView.setUint8(ind, code)
    ind++
  }
  return buffer;
}

function delay(ms, res) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve(res);
        }, ms);
    });
}

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值