收藏
回答

为什么BLEPeripheralServer. startAdvertising()无法发送成功?

我使用下面的代码进行广播的发送,尝试过发送data也尝试过发送sendData,都无法发送成功,接收广播的地方接收不到,是否是我传递serverUuids的方式错误了?是否有发送广播的示例代码可以给我看一下,谢谢!


wx.openBluetoothAdapter({
      success: function(res) {
        wx.showToast({
          title: '打开蓝牙成功',
        });


        wx.createBLEPeripheralServer({
          success: function ({ server }){
            const data = ['1111', '1111', '1111', '1111', '1111', '1111', 'A9FF', '54CB', '6F6E', '0BEA', '5173', 'ADEA', '29C6'];
            const sendData = data.map(str => `0000${str}-0000-1000-8000-00805F9B34FB`);
            wx.showToast({
              title: '创建服务对象成功',
            });
            console.log('dsafasdfadsL:',server);
            console.log('dsafasdfadsL:', server.startAdvertising);
            server.startAdvertising({
              advertiseRequest: {
                connectable: false,
                serviceUuids: data,
              }
            });
          }
        });
      },
    })

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

2 个回答

  • 社区技术运营专员-娇华
    社区技术运营专员-娇华
    03-28

    你好,麻烦具体描述问题流程,提供出现问题的具体机型、微信版本号、系统版本号,以及能复现问题的代码片段https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html

    03-28
    有用
    回复 4
    • X&Y。
      X&Y。
      03-30
      我使用的是iphone 6s 、微信版本7.0.12、系统版本iOS13.3.1、代码片段为https://developers.weixin.qq.com/s/w9fj4emg7FgD
      03-30
      回复
    • X&Y。
      X&Y。
      03-30
      iOS我通过serversUUID的方式传递数据,android通过厂商数据信息的方式来传递
      03-30
      回复
    • X&Y。
      X&Y。
      03-30
      android 是可以发送成功的,但是发送的数据和搜索到的数据并不能对应的上,不知道是否底层对广播数据又进行了一层加密?
      03-30
      回复
    • Don't
      Don't
      06-27回复X&Y。
      请问一下你发送数据之后是在哪里查看发送的数据的呢
      06-27
      回复
  • DylanQ
    DylanQ
    03-30

    这里需要openBluetoothAdapter需要加上mode:'peripheral',否则ios无法成功调用从机接口,如下:

    wx.openBluetoothAdapter({
      mode:'peripheral',
      success:...
    )}
    


    此处文档未同步,正在修改,可以参考这个示例代码:

    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({
           mode: 'peripheral',
           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 () {
    
    
      }
    })
    


    03-30
    有用
    回复 11
    • X&Y。
      X&Y。
      04-07
      您好,我按照您的方法发送是可以成功了,但是数据不可控,我只是将startAdvertising方法中的buffer改为了下面的数据,但是我接收到的数据为下面的图片,并未找到我想要的数据。我是使用manufacturerData发送的。
      04-07
      回复
    • DylanQ
      DylanQ
      04-07回复X&Y。
      目前ios系统还不支持设置manufacturerData字段,这个字段只有安卓有效哈,ios的advertiseRequest目前仅支持deviceName和serviceUuids两个字段
      04-07
      回复
    • hiconnnn
      hiconnnn
      04-07回复DylanQ
      您好,请问下ios的serviceUuids如何使用?上述代码片段addService是何时调用?
      04-07
      回复
    • X&Y。
      X&Y。
      04-07回复DylanQ
      必须要addService的UUID在serviceUuids上传的才可以生效是吗?
      04-07
      回复
    • DylanQ
      DylanQ
      04-13回复hiconnnn
      serviceUuids在startAdvertising方法的advertiseRequest字段中添加,addService应在开始广播前调用
      04-13
      回复
    查看更多(6)
登录 后发表内容
问题标签