流程图:

Python低功耗蓝牙 低功耗蓝牙连接过程_Python低功耗蓝牙

 

 

第一步:

  注:初始化蓝牙(并判断蓝牙是否已开启)

openBluetoothAdapter() {//可以做开始初始化蓝牙的触发按钮
     //开始前建议先关闭蓝牙模块
     this.closeBLEConnection();//断开与低功耗蓝牙设备的连接
     this.stopBluetoothDevicesDiscovery();//停止搜寻附近的蓝牙外围设备
     this.closeBluetoothAdapter();//关闭蓝牙模块
 
  wx.openBluetoothAdapter({
       success: (res) => {
         //成功 =》开始搜寻附近的蓝牙外围设备
         this.startBluetoothDevicesDiscovery()
       },
       fail: (res) => {
         if (res.errCode === 10001) {
               wx.showToast({
                 title: '请打开蓝牙定位',
                 icon: 'none',
                 duration: 2500//持续的时间
               });
               this.jshu();
           //监听蓝牙适配器状态变化事件
           wx.onBluetoothAdapterStateChange((res) => {
             //蓝牙适配器可用时
             if (res.available) {
               //再次=》开始搜寻附近的蓝牙外围设备
               this.startBluetoothDevicesDiscovery()
             }
           })
         }
       }
     })
 }

 

第二步:

  注:监听蓝牙适配器

//获取本机蓝牙适配器状态
   getBluetoothAdapterState() {
     wx.getBluetoothAdapterState({
       success: (res) => {
         if(res.available=="not available"){
           wx.showToast({
             title: '请打开蓝牙定位',
             icon: 'none',
             duration: 2500//持续的时间
           });
         }
         //成功=》正在搜索设备
         if (res.discovering) {
           //监听寻找到新设备
           this.onBluetoothDeviceFound()
           //蓝牙适配器可用
         } else if (res.available) {
           //再次=》开始搜寻附近的蓝牙外围设备
           this.startBluetoothDevicesDiscovery()
         }
       }
     })
   },

 

第三步:

  注:搜索附近的蓝牙外围设备

//开始搜寻附近的蓝牙外围设备
   startBluetoothDevicesDiscovery() { 

     if (this._discoveryStarted) {
       return
     }
     this._discoveryStarted = true
     wx.startBluetoothDevicesDiscovery({
       //是否允许重复上报同一设备
       allowDuplicatesKey: false,
       success: (res) => {
         //监听寻找到新设备
         this.onBluetoothDeviceFound()
       },
     })
   },

 

第四步:

  注:监听搜索到的设备

//监听寻找到新设备的事件  --
    onBluetoothDeviceFound() {
      var ths=this;
      wx.onBluetoothDeviceFound((res) => {
        //新搜索到的设备列表
        res.devices.forEach(device => {
          if (!device.name && !device.localName) {
            return
          }
          //再次可以对设备进行筛选
          //筛选后,调用链接设备方法链接
        //链接
         this.createBLEConnection(device.deviceId);
 
        })
      })
    },

 

第五步:

  注:链接低功耗蓝牙设备

//连接低功耗蓝牙设备
   createBLEConnection(e) {
     const deviceId = e
     wx.createBLEConnection({
       deviceId,
       success: (res) => {
         //获取蓝牙设备所有服务
         
         this.getBLEDeviceServices(deviceId)
        //已连接
       }
     })
     //停止搜寻附近的蓝牙外围设备
     this.stopBluetoothDevicesDiscovery()
   },

 

第六步:

  注:获取已连接的蓝牙所有服务

//获取蓝牙设备所有服务  --
   getBLEDeviceServices(deviceId) {
     wx.getBLEDeviceServices({
       deviceId,
       success: (res) => {
         console.log('数组长度:'+res.services.length)
         for (let i = 0; i < res.services.length; i++) {
         //筛选是否有需要使用的服务
           if (res.services[i].uuid.toUpperCase().indexOf("0000FFF0-0000-1000-8000-00805F9B34FB") != -1) {
             //获取设备特征值
               console.log("具有FFF0特性值-------")
             if (res.services[i].isPrimary) {
               //获取蓝牙设备某个服务中所有特征值
               this.getBLEDeviceCharacteristics(deviceId, res.services[i].uuid)
             }
           }
         }
       }
     })
   },

 

第七步:

  注:获取蓝牙设备某个服务中所有特征值

//获取蓝牙设备某个服务中所有特征值  --
   getBLEDeviceCharacteristics(deviceId, serviceId) {
       var ths=this;
     wx.getBLEDeviceCharacteristics({
       deviceId,
       serviceId,
       success: (res) => {
         // //循环设备特征值列表
         for (let i = 0; i < res.characteristics.length; i++) {
           let item = res.characteristics[i];
           //该特征值是否支持 read 操作
           if (item.properties.read) {
             //读取低功耗蓝牙设备的特征值的二进制数据值
             wx.readBLECharacteristicValue({
               deviceId,
               serviceId,
               characteristicId: item.uuid,
             })
           }
           //该特征值是否支持 write 操作
           if (item.properties.write) {
             this._deviceId = deviceId
             this._serviceId = serviceId
             this._characteristicId = item.uuid
             //向低功耗蓝牙设备特征值中写入二进制数据
             //如果想链接上后立刻写入命令,直接在这里调用要写入的命令
             ths.writeBLECharacteristicValue()  //停止测量
            
             console.log("支持write,执行了写入!!!")
           }
          //该特征值是否支持 notify || indicate 操作
           if (item.properties.notify || item.properties.indicate) {
             
             //启用低功耗蓝牙设备特征值变化时的 notify 功能
             wx.notifyBLECharacteristicValueChange({
               deviceId,
               serviceId,
               characteristicId: item.uuid,
               state: true,
               success (res) {
                 console.log('notify开启成功', res.errMsg)
               }
             })
           }
         }
         console.log(deviceId)
         console.log(this._serviceId )
         console.log(this._characteristicId)
       },
       fail(res) {
       }
     })
     // 操作之前先监听,保证第一时间获取数据
     wx.onBLEConnectionStateChange(function(res) {
       // 该方法回调中可以用于处理连接意外断开等异常情况
       // console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`)
       if(res.connected==false){
         console.log('已断开');
         ths.openBluetoothAdapter();//重新初始化蓝牙
       }
     })
     //接收蓝牙返回的参数
     wx.onBLECharacteristicValueChange((res) => {
       var value = ab2hex(res.value);//ab2hex(值)方法  注:ArrayBuffer转16进度 字符串 
      if (value.length === 40){
         //获取符合条件的返回的参数码
         let sys = parseInt(value.slice(28, 30),16);
          //获取到的返回值sys      
         
         //停止蓝牙
         this.stopBluetoothDevicesDiscovery();
       }
     })
   },

 

 

第八步:

  注:写入命令

//触发按钮
openBluetoothAdapters(){//开始检测
    //写入前先判断设备是否链接等,,
   //写入
    this.writeBLECharacteristicValuess();
  },

//例 写入
  writeBLECharacteristicValuess() {
    console.log('进入了写入开始!!!');
    let buffer = new ArrayBuffer(3)
    let dataView = new DataView(buffer)
    dataView.setUint8(0,0x60)
    dataView.setUint8(1,0x00)
    dataView.setUint8(2,0x01)
    console.log(buffer,'buffer')
    wx.writeBLECharacteristicValue({
      deviceId: this._deviceId,
      serviceId: this._serviceId,
      characteristicId: this._characteristicId,
      value: buffer,
      success: (res) => {
        console.log("写入成功"+res)
      }
    })
  },

 

第九步

  注:使用到的方法

  1. 关闭蓝牙模块
//关闭蓝牙模块
  closeBluetoothAdapter() {
    wx.closeBluetoothAdapter()
    this._discoveryStarted = false
 },
  1. 断开与低功耗蓝牙设备的连接
//断开与低功耗蓝牙设备的连接
    closeBLEConnection() {
      //如果设备还在执行就关闭设备     
      console.log('deviceId',this.data.deviceId);
      wx.closeBLEConnection({
        deviceId: this.data.deviceId
      })
    },
  1. 停止搜寻附近的蓝牙外围设备
//停止搜寻附近的蓝牙外围设备
  stopBluetoothDevicesDiscovery() {
    wx.stopBluetoothDevicesDiscovery()
  },
  1. 断开连接并停止扫描设备
jshu(){
    this.closeBLEConnection();//断开与低功耗蓝牙设备的连接
    this.stopBluetoothDevicesDiscovery();//停止搜寻附近的蓝牙外围设备
    // this.closeBluetoothAdapter();
  },
  1. ArrayBuffer转16进度
//直接写在page(上方)外
  
  // ArrayBuffer转16进度 字符串 示例
  function ab2hex(buffer) {
    var hexArr = Array.prototype.map.call(
      new Uint8Array(buffer),
      function (bit) {
        return ('00' + bit.toString(16)).slice(-2)
      }
   )
   return hexArr.join('');
 }

 

总结

  • Android需要开起定位和蓝牙,ios需要获取用户定位权限并开启蓝牙;
  • ios版本如果链接不上蓝牙,需要增加获取用户定位权限;
  • ios版本操控写入时,需要注意该设备服务的特征值不能写死、服务uuid必须大写等。