微信小程序【蓝牙功能开发】具体流程

蓝牙简介

大家认识的可能有蓝牙1.0、2.0、3.0、4.0以至于5.x的以数字结尾的蓝牙版本号,而实际上,在最新的标准中,已经不再使用数字版本号作为蓝牙版本的区分了,取而代之的是经典蓝牙与低功耗蓝牙(BLE)这两种区别。

蓝牙设备工作流程

1.发现设备

2.配对/绑定设备

3.建立连接

4.数据通信

1.发现设备

  • 经典蓝牙:发现其蓝牙设备调用BluetoothAdapter的startDiscovery()方法
  • 低功耗蓝牙:发现其蓝牙设备调用BluetoothAdapter的startLeScan()方法在实际应用中,StartDiscovery和StartLeScan分开扫,前者扫传统蓝牙,后者扫低功耗蓝牙。

2.配对/绑定

配对是建立两者的对应关系,产生一个密钥用来加密与鉴别连接,绑定指允许两台设备配对的时候给对方一个长期的一套安全密钥,把这层关系保存固定下来并进行了强化

3.建立连接

在蓝牙设备中,存在着物理地址,也叫作蓝牙的MAC地址,这个地址是唯一的,就像咱们网络上的IP地址。同时还存在着一个叫做UUID的东西,可以把它理解为是IP地址中的端口号,这两者合起来就是蓝牙的唯一身份标识。

  • 经典蓝牙建立连接就是Socket的连接的建立,找到对应的BluetoothDevice,createRfcommSocketToServiceRecord(UUID) 再调用方法connect()建立了经典蓝牙设备之间的连接通道。
  • BLE设备建立连接

    1.PROFILE profile可以理解为一种规范,一个标准的通信协议,它存在于蓝牙设备中。蓝牙组织规定了一些标准的profile,每个profile中会包含多个service,每个service代表设备的一种能力。 
    2、SERVICE service可以理解为一个服务,在ble设备中,通过有多个服务,例如电量信息服务、系统信息服务等,每个service中又包含多个characteristic特征值。每个具体的characteristic特征值才是ble通信的主题。比如当前的电量是80%,所以会通过电量的characteristic特征值存在从机的profile里,这样主机就可以通过这个characteristic来读取80%这个数据
    3、CHARACTERISTIC characteristic特征值,ble设备的通信均是通过characteristic来实现,可以理解为一个标签,通过这个标签可以获取或者写入想要的内容。
    4、UUID UUID,统一识别码,我们刚才提到的service和characteristic,都需要一个唯一的uuid来标识

4.数据通信

经典蓝牙数据通信

  • 当建立连接后,就可以使用BluetoothSocket的两个方法
    1.getOutputStream()方法写入需要发送的数据。 
    2.getInputStream()读取发送回来的数据。
  • 想要实现主设备对从设备的数据发送,则需要直接读取获取到的从设备的Characteristic
    1.通过BLE从设备对应的Service_UUID获取对应的BluetoothGattService 
    2.调用BluetoothGattService和对应的Characteristic_UUID获取相应的BluetoothGattCharacteristic, 
    3.设置需要发送的命令值,调用BluetoothGattCharacteristic的方法setValue(value)进行设置,其中value一般为byte[] 
    4.BLE设备的返回值,还需要设置开启Notification,然后调用readCharacteristic(characteristic)方法进行数据的读取

微信小程序Api

 

1.初始化设备蓝牙模块 openBluetoothAdapter()

 		wx.openBluetoothAdapter({
          	success: function(res) {
            // 初始化成功
            that.getBluetoothAdapterState()
          },
          fail: function(err) {
            // 初始化失败
            that.errorMessage('蓝牙初始化失败')
          }
        })

2. 获取蓝牙适配器状态:判断蓝牙是否可用 getBluetoothAdapterState()

	wx.getBluetoothAdapterState({

        success: function(res) {
          // 检查蓝牙状态正常
          that.startBluetoothDevicesDiscovery() 
        },
        fail(res) {
          // 检查蓝牙状态错误
          that.errorMessage('蓝牙适配器状态错误')
        }
     })
    

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

      wx.startBluetoothDevicesDiscovery({
        success: function(res) {
          // 蓝牙设备列表正常
          // 获取蓝牙设备列表
          that.getBluetoothDevices()
        },
        fail(res) {
          that.errorMessage('获取蓝牙设备列表失败')
        }
      })

4.获取蓝牙外围设备列表 getBluetoothDevices()

	  setTimeout(() => {//不延时拿不到所有的设备
        wx.getBluetoothDevices({
          services: [],
          allowDuplicatesKey: false,
          interval: 0,
          success: function(res) {
            //res.devices 设备列表 *rssi:信号强度  *deviceId:设备id
            let {deviceId} = that.getDevice(res.devices);
			that.createBLEConnection(deviceId)
          },
          fail(res) {
            console.log(res, '获取蓝牙设备列表失败')
          }
        })
      }, 3000)

5. 创建连接 连接低功耗蓝牙设备 createBLEConnection(deviceId)

	wx.createBLEConnection({
        deviceId:deviceId,
        success:res =>{
          console.log(`创建蓝牙连接成功:${res}`)
		  wx.stopBluetoothDevicesDiscovery();//停止搜索(寻找设备需要花费大量资源)
		  that.getBLEDeviceServices(deviceId)	
		}
	})

6.获取蓝牙设备所有服务 getBLEDeviceServices(deviceId) 

		setTimeout(()=>{
            wx.getBLEDeviceServices({
              deviceId:deviceId,
              success:res=>{
				let {uuid} = that.getService(res.devices);
				that.getBLEDeviceCharacteristics(deviceId,uuid)
			  }
            })
		},600)

7.获取蓝牙设备某个服务中所有特征值  getBLEDeviceCharacteristics(deviceId,serviceId)

			wx.getBLEDeviceCharacteristics({
                  deviceId:deviceId,
                  serviceId:serviceId,
                  success:res=>{
                    let {uuid} = that.getService(res.characteristics);
					that.notifyBLECharacteristicValueChange(deviceId,serviceId,uuid)
					
				  }
			})

8. 启用低功耗蓝牙设备特征值变化时的 notify 功能 notifyBLECharacteristicValueChange(deviceId,serviceId,characteristicId)

			      wx.notifyBLECharacteristicValueChange({
                      state: true, // 启用 notify 功能
                      deviceId:deviceId,
                      serviceId:serviceId,
                      characteristicId:characteristicId,
                      success(res) {
                        console.log('notifyBLECharacteristicValueChange success')        
                        // 对象用来表示通用的、固定长度的原始二进制数据缓冲区。
                        //不能直接操作 ArrayBuffer 的内容,而是要通过类型数组对象或 DataView 对象来操作
                        let buffer = new ArrayBuffer(8)         
                        // DataView 视图是一个可以从 二进制ArrayBuffer 对象中读写多种数值类型的底层接口
                        let dataView = new DataView(buffer)
						dataView.setUint8(0, 0x20);//xx指令
						dataView.setUint8(7, 0x43);
						that.writeBLECharacteristicValue(deviceId,serviceId,characteristicId,buffer)
					  }
				  })

9. 发送信息到蓝牙设备 writeBLECharacteristicValue(deviceId,serviceId,characteristicId,buffer)

接收数据和发送数据时,注意BLE限制了发送数据包的大小,现在20byte。具体参考官方文档: https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.writeBLECharacteristicValue.html

						wx.writeBLECharacteristicValue({ // 必须先启用 notifyBLECharacteristicValueChange 才能监听到设备
                          deviceId:deviceId,
                          serviceId:serviceId,
                          characteristicId:characteristicId,
                          // 这里的value是 ArrayBuffer 类型
                          value: buffer,// 蓝牙设备特征值对应的二进制值
                          success(res) {
                            console.log('writeBLECharacteristicValue success', res)
                            wx.showToast({
                              title: '操作成功',
                              duration: 2000
                            });
                          },
                        })

总结

1.初始化蓝牙,

2.开始搜寻附近的蓝牙外围设备,

3.监听寻找到新设备的事件,

4.搜寻到需要的蓝牙,停止搜寻附近的蓝牙外围设备,

5.连接蓝牙设备,

6.获取蓝牙设备所有服务(service),

7.获取蓝牙设备某个服务中所有特征值(characteristic),

8.启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值。注意:必须设备的特征值支持 notify 或者 indicate  才可以成功调用

9.向低功耗蓝牙设备特征值中写入二进制数据

PS:该流程只适用于低功耗(BLE)蓝牙设备的连接/信息传输

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值