美文网首页
微信小程序之三:测试蓝牙连接新游手柄

微信小程序之三:测试蓝牙连接新游手柄

作者: 汀江秋雨 | 来源:发表于2018-03-08 20:45 被阅读0次

    20180308 by 慕容秋

    开发环境

    微信开发者工具 v1.02.1802270

    测试设备

    • 新游手柄 Q1
    • iPhone 6s Plus
    • 魅族 魅蓝 M1 E

    先简单介绍下流程:

    • 初始化小程序蓝牙模块 openBluetoothAdapter;
    • 获取手机系统已连接的蓝牙设备 getConnectedBluetoothDevices;
    • 建立BLE连接 createBLEConnection;
    • 获取BLE服务的UUID及相关特征值Characteristics的UUID,设置设备数据变化监听;
    • 向蓝牙设备发送测试数据 writeBLECharacteristicValue;
    1、初始化小程序蓝牙模块 openBluetoothAdapter

    小程序定义的这个方法名字很神奇,大家不要误解了,这里的open只是初始化小程序的蓝牙模块;手机系统蓝牙关闭或不支持蓝牙功能时,调用这个方法是会报错的。

      openBluetoothAdapter: function () {
        var that = this;
        wx.openBluetoothAdapter({
          success: function (res) {
            console.log(res)
            that.setData({
              debugMsg: res.errMsg
            })
            // 监听蓝牙适配器状态变化
            wx.onBluetoothAdapterStateChange(function (res) {
              console.log(res)
            })
            // 发现新设备
            wx.onBluetoothDeviceFound(function (devices) {
              console.log(devices)
            })
          },
    
          fail: function (res) {
            console.log(res)
            that.setData({
              debugMsg: res.errMsg
            })
          }
        })
      },
    
    2、获取手机系统已连接的蓝牙设备 getConnectedBluetoothDevices

    官方的参数说明里要求services必填,但是官方的示例代码里面是没有加入services,这点要注意下。我这边测试情况是:

    • iPhone6p 传入了services,就能获取系统已连接的有相关蓝牙设备;
    • Android的 魅蓝,不管有没有传services,都无法获取系统已连接的相关蓝牙设备;
      getConnectedBluetoothDevices: function () {
        var that = this;
        wx.getConnectedBluetoothDevices({
          services: [SERVICE_UUID],
          success: function (res) {
            console.log(res)
            // 连接第一个目标设备做测试
            if (res.devices[0]) {
              mDeviceID = res.devices[0].deviceId;
            }
          }
        })
      },
    
    3、建立BLE连接 createBLEConnection
      createBLEConnection: function (e) {
        var that = this;
        wx.createBLEConnection({
          // 这里的 deviceId 由 getConnectedBluetoothDevices 获取
          deviceId: mDeviceID,
          success: function (res) {
            console.log(res)
            // 获取BLE服务
            that.getBLEDeviceServices()
            // 监听BLE连接状态变化
            wx.onBLEConnectionStateChange(function (res) {
              // 该方法回调中可以用于处理连接意外断开等异常情况
              console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`)
            })
          },
          fail: function (res) {
            console.log(res)
            that.setData({
              debugMsg: res.errMsg
            })
          },
        })
      },
    
    4、获取BLE服务的UUID及相关特征值Characteristics的UUID,设置设备数据变化监听
      /**
       * 获取蓝牙设备所有 service(服务)
       */
      getBLEDeviceServices: function () {
        var that = this;
        wx.getBLEDeviceServices({
          deviceId: mDeviceID,
          success: function (res) {
            console.log('device services:', res.services)
    
            // 获取BLE服务的特征值characteristic
            that.getBLEDeviceCharacteristics()
          },
          fail: function (res) {
            console.log(res)
            that.setData({
              debugMsg: res.errMsg
            })
          },
        })
      },
    
      /**
       * 获取蓝牙设备某个服务中的所有 characteristic(特征值)
       */
      getBLEDeviceCharacteristics: function () {
        var that = this;
        wx.getBLEDeviceCharacteristics({
          deviceId: mDeviceID,
          serviceId: SERVICE_UUID,
          success: function (res) {
            console.log('device getBLEDeviceCharacteristics:', res.characteristics)
    
            // 设置设备Notify
            that.notifyBLECharacteristicValueChange() 
          },
          fail: function (res) {
            console.log(res)
            that.setData({
              debugMsg: res.errMsg
            })
          },
        })
      },
    
      ab2hex: function (buffer) {
        var hexArr = Array.prototype.map.call(
          new Uint8Array(buffer),
          function (bit) {
            return ('00' + bit.toString(16)).slice(-2)
          }
        )
        return hexArr.join('');
      },
    
      /**
       * 启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值。注意:必须设备的特征值支持notify或者
       * indicate才可以成功调用,具体参照characteristic 的 properties 属性
       */
      notifyBLECharacteristicValueChange: function () {
        var that = this;
        wx.notifyBLECharacteristicValueChange({
          state: true, // 启用 notify 功能
          deviceId: mDeviceID,
          serviceId: SERVICE_UUID,
          characteristicId: NOTIFY_UUID,
          success: function (res) {
            console.log(res)
            // 监听低功耗蓝牙设备的特征值变化。必须先启用notify接口才能接收到设备推送的notification。
            wx.onBLECharacteristicValueChange(function (res) {
              console.log(`characteristic ${res.characteristicId} has changed, now is ${res.value}`)
              console.log(that.ab2hex(res.value))
            })
          },
          fail: function (res) {
            console.log(res)
            that.setData({
              debugMsg: res.errMsg
            })
          },
        })
      },
    
    5、向蓝牙设备发送测试数据 writeBLECharacteristicValue
      writeBLECharacteristicValue: function () {
        var that = this;
        // 向蓝牙设备发送一个0x00的16进制数据
        let buffer = new ArrayBuffer(1)
        let dataView = new DataView(buffer)
        dataView.setUint8(0, 0)
    
        wx.writeBLECharacteristicValue({
          deviceId: mDeviceID,
          serviceId: SERVICE_UUID,
          characteristicId: WRITE_UUID,
          // 这里的value是ArrayBuffer类型
          value: buffer,
          success: function (res) {
            console.log('writeBLECharacteristicValue success', res.errMsg)
          },
          fail: function (res) {
            console.log(res)
            that.setData({
              debugMsg: res.errMsg
            })
          },
        })
      },
    

    小结

    • A、在iPhone 6s Plus 上测试通过;


    • B、在Android的魅族 魅蓝 M1E上测试有点问题,无法获取已连接的设备,无法监听设备数据变化;可能是我写的流程或者是设备的问题吧;


    • C、还有个东东就是,Android测试环境下,蓝牙设备连接状态变化时,微信相关的页面会重画,估计是微信Apk相关页面的android:configChanges配置不够完善;
    源码地址:

    https://gitee.com/muroqiu/weixin_Bluetooth

    相关文章

      网友评论

          本文标题:微信小程序之三:测试蓝牙连接新游手柄

          本文链接:https://www.haomeiwen.com/subject/ypvqxftx.html