收藏
回答

调用BLEPeripheralServer.addService报错

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 Bug 蓝牙设备 微信iOS客户端 7.0.11 2.10.3

建立本地作为外围设备的服务端之后,调用BLEPeripheralServer.addService

报错{errMsg: "addBLEPeripheralService:fail addBLEPeripheralService valueBase64String is empty."}


https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-peripheral/BLEPeripheralServer.addService.html

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

2 个回答

  • simonla
    simonla
    2020-03-23

    可以参考这份示例代码

    const uuid1 = '000018F0-0000-1000-8000-00805F9BAAFB'
    const uuid2 = '00002AF0-0000-1000-8000-00805F9BBBFB'
    const uuid3 = '00002AF1-0000-1000-8000-00805F9BCCFB'
    
    
    // ArrayBuffer转16进制字符串示例
    function ab2hex(buffer) {
      let hexArr = Array.prototype.map.call(
        new Uint8Array(buffer),
        function (bit) {
          return ('00' + bit.toString(16)).slice(-2)
        }
      )
      return hexArr.join('');
    }
    
    
    function inArray(arr, key, val) {
      for (let i = 0; i < arr.length; i++) {
        if (arr[i][key] === val) {
          return i;
        }
      }
      return -1;
    }
    
    
    // slave/slave.js
    Page({
    
    
      /**
       * 页面的初始数据
       */
      data: {
        connects: [],
        servers: []
      },
    
    
      /**
       * 生命周期函数--监听页面加载
       */
      onLoad: function (options) {
        wx.onBLEPeripheralConnectionStateChanged(res => {
          console.log('ConnectionStateChanged', res)
          const connects = this.data.connects
          const idx = inArray(connects, 'deviceId', res.deviceId)
          if (idx >= 0) {
            connects[idx] = res
          } else {
            connects.push(res)
          }
          this.setData({ connects })
        })
      },
    
    
      openBluetoothAdapter() {
        wx.openBluetoothAdapter({
          success: (res) => {
            console.log('openBluetoothAdapter success', res)
            this.createBLEPeripheralServer()
            wx.onBluetoothAdapterStateChange(function (res) {
              console.log('onBluetoothAdapterStateChange', res.available)
            })
          },
          fail: (res) => {
            if (res.errCode === 10001) {
             console.log("ble unavailable!")
            }
          }
        })
      },
    
    
      createBLEPeripheralServer() {
        wx.createBLEPeripheralServer().then(res => {
          console.log('createBLEPeripheralServer', res)
          this.data.servers.push(res.server)
          this.server = res.server
          this.setData({ serverId: this.server.serverId })
          this.server.onCharacteristicReadRequest(res => {
            const { serviceId, characteristicId, callbackId } = res
            const buffer = new ArrayBuffer(1)
            const dataView = new DataView(buffer)
            const newValue = Math.ceil(Math.random() * 10)
            dataView.setUint8(0, newValue)
            console.log('onCharacteristicReadRequest', res, newValue)
    
    
            this.server.writeCharacteristicValue({
              serviceId,
              characteristicId,
              value: buffer,
              needNotify: true,
              callbackId
            })
          })
          this.server.onCharacteristicWriteRequest(res => {
            console.log('onCharacteristicWriteRequest', res)
            const { serviceId, characteristicId, value, callbackId } = res
            this.server.writeCharacteristicValue({
              serviceId,
              characteristicId,
              value,
              needNotify: true,
              callbackId
            })
          })
        })
      },
      closeServer() {
        this.server.close()
      },
      onConfirm(e) {
        const n = e.detail.value * 1
        const buffer = new ArrayBuffer(1)
        const dataView = new DataView(buffer)
        dataView.setUint8(0, n)
        this.server.writeCharacteristicValue({
          serviceId: uuid1,
          characteristicId: uuid2,
          value: buffer,
          needNotify: true
        })
      },
      showInput() {
        this.setData({
          input: !this.data.input
        })
      },
      addService() {
        const buffer = new ArrayBuffer(2)
        const dataView = new DataView(buffer)
        dataView.setUint8(0, 9)
        dataView.setUint8(1, 11)
        const descriptorBuffer = new ArrayBuffer(2)
        const dataView2 = new DataView(descriptorBuffer)
        dataView2.setInt8(0, 1)
        dataView2.setInt8(1, 0)
    
    
        const service = {
          uuid: uuid1,
          characteristics: [{
            uuid: uuid2,
            properties: {
              write: false,
              read: true,
              notify: true,
              indicate: false
            },
            permission: {
              readable: true,
              writeable: false,
              readEncryptionRequired: false,
              writeEncryptionRequired: false
            },
            value: buffer,
            descriptors: [{
              uuid: uuid2,
              permission: {
                write: false,
                read: true
              },
              value: descriptorBuffer
            }]
          },
          {
              uuid: uuid3,
              properties: {
                write: true,
                read: false,
                notify: false,
                indicate: false
              },
              permission: {
                readable: false,
                writeable: true,
                readEncryptionRequired: false,
                writeEncryptionRequired: false
              },
              value: buffer,
              descriptors: [{
                uuid: uuid3,
                permission: {
                  write: true,
                  read: false
                },
                value: descriptorBuffer
              }]
            }]
        }
        this.server.addService({
          service
        }).then(res => {
          console.log('add Service', res)
        })
      },
      removeService() {
        this.server.removeService({
          serviceId: uuid1
        }).then(res => {
          console.log('removeService', res)
        })
      },
      startAdvertising() {
        const buffer = new ArrayBuffer(1)
        const dataView = new DataView(buffer)
        var hex = "7E9"
        var typedArray = new Uint8Array(hex.match(/[\da-f]{2}/gi).map(function (h) {
          return parseInt(h, 16)
        }))
    
    
        this.server.startAdvertising({
          advertiseRequest: {
            connectable: true,
            deviceName: '',
            serviceUuids: [uuid1],
            manufacturerData: [{
              manufacturerId: '0x004c',
              manufacturerSpecificData: typedArray.buffer
            }]
          },
          powerLevel: 'higt'
        }).then(res => {
          console.log('startAdvertising', res)
        }, res => {
          console.log("fail: ", res)
        })
      },
      stopAdvertising() {
        this.server.stopAdvertising()
      },
    
    
      closeBluetoothAdapter() {
        wx.closeBluetoothAdapter()
      },
    
    
      /**
       * 生命周期函数--监听页面初次渲染完成
       */
      onReady: function () {
    
    
      },
    
    
      /**
       * 生命周期函数--监听页面显示
       */
      onShow: function () {
    
    
      },
    
    
      /**
       * 生命周期函数--监听页面隐藏
       */
      onHide: function () {
    
    
      },
    
    
      /**
       * 生命周期函数--监听页面卸载
       */
      onUnload: function () {
        this.data.servers.forEach(server => {
          // server.close()
        })
      },
    
    
      /**
       * 页面相关事件处理函数--监听用户下拉动作
       */
      onPullDownRefresh: function () {
    
    
      },
    
    
      /**
       * 页面上拉触底事件的处理函数
       */
      onReachBottom: function () {
    
    
      },
    
    
      /**
       * 用户点击右上角分享
       */
      onShareAppMessage: function () {
    
    
      }
    })
    
    2020-03-23
    有用
    回复 3
    • 王立强
      王立强
      2020-05-10
      请问  此代码的来源有吗, 我需要一份完整的代码,目前这个代码包含一个错误 就是 startBLEPeripheralAdvertising:fail:data too large
      2020-05-10
      回复
    • simonla
      simonla
      2020-05-12回复王立强
      去掉manufactureData试试,可能这里超了MTU
      2020-05-12
      回复
    • 伟鹏
      伟鹏
      2020-05-18
      来源有吗,添加服务报错了,错误码errCode: 10020 ,
      errMsg: writeBLEPeripheralCharacteristicValue:fail writeValueToCharacteristics error 10020;
      2020-05-18
      回复
  • 疯狂的小辣椒
    疯狂的小辣椒
    2020-03-13

    你好,请问现在问题解决了么?没有的话,麻烦再复现一次,在手机微信那里上传下日志: 我->设置->帮助与反馈右上角有个上报日志的入口,麻烦提供一下微信号,时间点

    2020-03-13
    有用
    回复 3
    • 涂耀辉
      涂耀辉
      2020-03-16
      遇到了一样的问题,characteristics字段不加是能成功的,但是加了characteristics就会报同样的错,addService到底该怎么添加characteristics。。
      2020-03-16
      回复
    • 疯狂的小辣椒
      疯狂的小辣椒
      2020-03-17回复涂耀辉
      在你发布的帖子下补充下信息
      2020-03-17
      回复
    • 王立强
      王立强
      2020-05-10
      官方有广播的demo吗?
      2020-05-10
      回复
登录 后发表内容
问题标签