在小程序中使用低功耗蓝牙

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

转载于:https://juejin.im/post/5c7bb1756fb9a049c43e63f6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值