1. 低功耗蓝牙
从蓝牙4.0开始包含了两个标准,传统蓝牙(Classic Buletooth)和低功耗蓝牙(Bluetooth Low Energy)以下简称 BLE。
- 传统蓝牙支持音频和数据两大类协议,所以更适合音乐等数据量大的应用场景;传统蓝牙有3个功率级别,Class1、Class2、Class3,分别支持100m、10m、1m的传输距离。
- BLE 更适用于实时性比较高,数据传输量小的场景,如遥控灯;BLE 无功率级别,一般发送功率在7dBm,一般在空旷距离,达到20m应该是没有问题的。
2. BLE 的基本概念
2.1 GATT
说到 BLE 就不得不提一下 GATT (Generic Attribute Profile) 通用属性协议。GATT是一个在蓝牙连接之上的发送和接收很短的数据段的通用规范,GATT 按照层级定义了三个概念:Service、Characteristic 和描述 Descriptor,这些合起来称为一个 Profile。
2.2 GAP
GAP(Generic Access Profile)通用访问协议,用来控制设备连接和广播。GAP 使你的设备被其他设备可见,并决定了你的设备是否可以或者怎样与合同设备进行交互。
在 GAP 中外围设备通过两种方式向外广播数据: Advertising Data Payload(广播数据)和 Scan Response Data Payload(扫描回复),每种数据最长可以包含 31 byte。这里广播数据是必需的,因为外设必需不停的向外广播,让中心设备知道它的存在。扫描回复是可选的,中心设备可以向外设请求扫描回复,这里包含一些设备额外的信息,例如设备的名字。
2.3 Service
Characteristic 的集合。比如某个 Service 可能叫“电量管理”,它可能包含多个Characteristics。
2.4 Characteristic
Characteristic 可以理解为一个数据类型,包含了一个 value 和零至多个对该 value 的描述。
2.5 Descriptor (可选)
对 Characteristic 的描述,例如范围、计量单位等。
2.6 UUID
统一识别码,service 和 characteristic 都需要一个唯一的 uuid 来标识, 它是 128bit 的值,为了便于识别和阅读,一般标示程如下的形式,8-4-4-12 的16进制标示。
各种概念具体的描述请参考这里
3. 如何在小程序中使用
第一步先开启蓝牙配器
wx.openBluetoothAdapter({
success: () => {
this.startDiscovery()
}
})
复制代码
开始搜寻附近的蓝牙外围设备
wx.startBluetoothDevicesDiscovery({
services: ['xxxx'], // 用来过滤掉其他蓝牙设备
allowDuplicatesKey: false,
interval: 2000,
success: () => {
this.onDeviceFound()
}
})
复制代码
搜寻到的设备会在此方法中回调
wx.onBluetoothDeviceFound(({ devices }) => {
this.filterInvalidDevice(devices)
})
复制代码
这里有一点要注意 iOS 获取到的deviceId 为UUID, 而安卓是设备的MacId,如要获取到MacId,可将advertisData字段的arrayBuffer转为16进制的字符串
通过 deviceId 连接设备
wx.createBLEConnection({
deviceId,
success: () => {
this.getBLEDeviceServices(deviceId)
}
})
复制代码
连接设备后就可以获取services
wx.getBLEDeviceServices({
deviceId,
success: (res) => {
this.setData({ services: res.services })
}
})
复制代码
通过指定的serviceId获取characteristics
上面做了这么多其实我们的终极目标就是要获取到指定的characteristics
, 通过对他的value
进行读写来与蓝牙设备交互
wx.getBLEDeviceCharacteristics({
deviceId: this.data.deviceId,
serviceId: this.data.serviceId,
success: (res) => {
/*
res.properties
read: 可读,
write: 可写,
notify:可监听设备产生的变化
indicate: 与notify的区别在与indicate有确认机制,只有设备受到了确认ack才会继续发送后面的内容
*/
}
})
复制代码
4. 引用
- https://www.race604.com/android-ble-in-action/
- https://developers.weixin.qq.com/miniprogram/dev/api/wx.writeBLECharacteristicValue.html