收藏
评论

(11)低功耗蓝牙能力官方

在无线通信领域,蓝牙是最基础又常用的能力。蓝牙组网十分简单,两设备间做个配对就可以建立起连接,其通信距离理论值为10米至100米以内,是近距离通信应用场景的首选。今天我们想跟大家分享小程序连接蓝牙的能力。




目前蓝牙最为普遍的两种规格为蓝牙基础率/增强数据率 (BR/EDR) 和低功耗 (LE) 蓝牙。


蓝牙基础率/增强数据率 (BR/EDR) 是经典的蓝牙协议,常用在对数据传输带宽有一定要求的场景上,比如需要传输音频数据的蓝牙音箱等;


低功耗 (LE) 蓝牙是从蓝牙4.0起支持的协议,特点就是耗电极低、传输速度更快,常用在对续航要求较高且只需小数据量传输的各种智能电子产品中,包括心率监测仪器、体温计、血糖仪、智能穿戴设备、胎压监测和电子烟等等,应用场景广泛,所以小程序在很早的版本(基础库 1.1.0)就优先支持了低功耗蓝牙能力。


我们在开发基于低功耗蓝牙接口的小程序时,需要先理解一下蓝牙在连接和通信过程中的一些概念。


工作模式


低功耗蓝牙协议给设备定义了若干角色,其中最主要的角色是:外围设备(Peripheral)中心设备(Central)


1

外围设备是用来提供数据,通过不停地向外广播数据,让中心设备发现自己。


2

中心设备会扫描外围设备,发现有外围设备存在后,可以与之建立连接,之后就可以使用外围设备提供的服务(Service)。一般而言,手机会担任中心设备的角色,利用外围设备提供的数据进行处理或展示等等。因此,小程序提供低功耗蓝牙接口是默认设定手机为中心设备的。


通信协议


在两个蓝牙设备建立连接之后,双方的数据交互是基于一个叫做 GATT (Generic Attribute Profile) 的规范,根据该规范可以定义出一个个配置文件(Profile),描述该蓝牙设备提供的服务(Service)。


在整个通信过程中,有三个最主要的概念:配置文件(Profile)、服务(Service)、特性(Characteristic)。


1

Profile 并不真实存在于蓝牙设备中,它只是被蓝牙标准预先定义的一些 Service 的集合,如果蓝牙设备之间要相互兼容,它们只要支持相同的 Profile 即可。一个蓝牙设备可以支持多个 Profile。


2

Service 可以理解为蓝牙设备提供的服务,一个设备可以提供多个服务,比如电量信息服务、系统信息服务等。每个 Service 又包含多个 Characteristic 特性值,比如电量信息服务就会有个 Characteristic 表示电量数据,同时还会有一个 16bit 或 128bit 的 UUID 唯一标识该服务,像微信硬件平台的蓝牙智能灯的主服务 UUID 为 0xFEE7。16 bit 的 UUID 实际上是 128 bit 的缩短版,接收方收到后会补上蓝牙的 UUID 基数,目的是为了提高传输效率。


3

Characteristic 是在 GATT 规范中最小的逻辑数据单元,由一个 value 和多个描述特性的 Desciptor 组成。实际上,在与蓝牙设备打交道,主要就是通过读写 Characteristic 的 value 完成。同样的,Characteristic 也是通过一个 16bit 或 128bit 的 UUID 唯一标识。


总结一下,如下图所示,我们可以简单地理解为:每个蓝牙设备可能提供多个 Service,每个 Service 可能有多个 Characteristic,我们根据蓝牙设备的协议用对应的 Characteristic 进行读写即可达到与其通信的目的。




在理解了上面的模式和概念后,接下来我们看看如何可以使用小程序提供的蓝牙接口。


Step 1 :扫描并发现蓝牙外围设备

扫描并发现蓝牙外设。如果蓝牙功能未开启,可监听蓝牙状态变化以便自动进入下一步,提升用户体验。




Step 2 :连接蓝牙外围设备

若之前连接过某个设备,可跳过扫描步骤,直接传入 deviceId 连接。




Step 3 :查找蓝牙外围设备的服务




Step 4 : 读写指定服务的特性值




基本上,小程序暴露出来的蓝牙接口都是系统级 API ,但在使用流程上对安卓和 iOS 两个平台做了统一,因此在使用这一套接口时也会出现一些因系统限制而导致的问题,在这里我们整理了一些常见的问题供开发者参考:


1

在安卓上,部分机型无定位权限或者是定位开关未打开时会搜不到设备。原因是蓝牙功能是可以获取到定位的,系统基于安全考量,使用蓝牙接口时必须要有定位权限,否则搜索不到;


2

在安卓上,部分机型获取设备服务时会多出 00001800 和 00001801 UUID 的服务,这是系统行为,注意不要使用这两个服务;


3

建立连接和关闭连接必须要成对调用。如果未能及时关闭连接释放资源,容易导致 state 133 GATT ERROR的异常;


4

与蓝牙设备通信的 MTU(最大传输单元)系统限定为 20 字节,如果超过则会出错,这里应该根据蓝牙设备协议进行分片传输。


更多有关小程序连接蓝牙功能的信息,可查阅[接口文档]



47766浏览
最后一次编辑于  2018-08-17
知识库内容非实时更新,可能已过期、失效或不适用于当前情形,请谨慎参考
收藏
反馈

30 个评论

  • 邓东
    邓东
    2018-06-04

    蓝牙基础率/增强数据率 (BR/EDR) 是经典的蓝牙协议,这种是市场上的蓝牙打印机所普遍使用的吧,微信为何优先支持一个没用的低功耗蓝牙呢?何时才能搞定经典蓝牙啊,等了很久了,等待这个连接打印机打印外卖订单呢。

    2018-06-04
    赞同 10
    回复
  • 欧元
    欧元
    2018-05-30

    建议新版本加上MACBook 蓝牙调试功能,目前调试只能写,就像调试代码看不到画面,瞎写一样难受。  手机看效果实在太低。


    目前有一些BUG 给你们罗列一下:

       

    1.手机如果重复打开小程序(前一个已经关闭的情况下),在打开蓝牙扫码后会无法扫码设备。  调用搜索函数后直接没有任何返回,停在哪里的。必须重启小程序才会出现。尤其是IOS会更加严重,直接开启扫码就消失了,没有任何回调。


    2.用于搜索函数过滤uuid 大部分情况下都是好使的,但是如果遇到兼容问题,例如新的android 8.1  那么过滤的uuid会变成128bit,这就导致写入的16Bit无法使用了,直接扫描不到设备。(为了兼容性问题被迫放弃过滤功能)


    3.目前使用的UUID其实全部都是128Bit的,如果全部都过滤成16bit的话使用起来会极大便利,因为我在操作自己的产品的时候,其实可以免除UUID服务和特征值获取这个步骤,让连接效率极大提升。


    4.连接状态函数目前也有点问题,连接成功目前指的是建立通信成功,但是服务其实还没有获取成功,这个时候如果只是获取了部分UUID特征值并进行写操作将会失败,只能在连接成功后还必须操作一个UUID来确认是否准备完成。  (因为信息不对,所以连接成功的作用就变得不太实用)


    5.读操作读回来的是  arraybuffer 数据,其实只是20字节的数据,为何不直接加个转换,默认是16进制数据,使用者也可以减少了一步转换,工作效率更高。目前直接获取的数据还无法直接看到,必须转一次。


    6.其实MACBook 能调试BLE才是最重要的,不能调试实在太难受了,效率极低,我只做蓝牙功能的小程序开发,以上是使用半年的感受。


    2018-05-30
    赞同 7
    回复 12
    • 欧元
      欧元
      2018-05-30

      7.搜索设备的函数有时候会没有效果,啥设备都搜索不到。目前不知道啥原因,要关掉蓝牙和微信重新扫码才能重新扫描到设备。  概率大概1/10

      2018-05-30
      2
      回复
    • 易
      2018-06-08

      可以加微信吗,请问小程序蓝牙如何监听已连接蓝牙的广播包啊,就是蓝牙设备有数据发过来立刻就能接收到,就像微信公众号的硬件平台一样,我没发现如何获取那个广播数据...没找到,谢谢了

      2018-06-08
      2
      回复
    • 欧元
      欧元
      2018-06-08回复

      已连接为啥还要收广播?

      2018-06-08
      回复
    • Wei
      Wei
      2018-06-13回复欧元

      这个问题我也发现过,从最早做微信公众号的蓝牙硬件开始,到现在微信公众号的蓝牙已经被微信放弃,无奈转战小程序来开发,还是一堆的坑,而且官方的人响应还很慢,基本不解决问题


      2018-06-13
      1
      回复
    • Wei
      Wei
      2018-06-13回复

      已连接的设备是不会再发广播包了。。。你这个要明白

      2018-06-13
      回复
    查看更多(7)
  • 空空
    空空
    2019-04-23

    强烈建议 提供接口实现手机作为外围设备模式

    2019-04-23
    赞同 3
    回复
  • 犇犇
    犇犇
    2018-06-06

    先把vivo手机连接蓝牙的bug解决一下吧!!

    2018-06-06
    赞同 3
    回复
  • ‍
    2018-06-01

    其实,连接都不是最懵的.当你要在安卓上联系读取才是最想让人死的..... 那个速度 让人心生怀疑....

    还有就是各厂家安卓非要打开各种 隐藏在不知道哪里的权限才能 使用BLE.... 客户根本找不到... 简直了

    2018-06-01
    赞同 2
    回复 2
    • ‍
      2018-06-01

      连续读取

      2018-06-01
      回复
    • 易
      2018-06-08回复

      可以加微信吗,请问小程序蓝牙如何监听已连接蓝牙的广播包啊,就是蓝牙设备有数据发过来立刻就能接收到,就像微信公众号的硬件平台一样,我没发现如何获取那个广播数据...没找到,谢谢了

      2018-06-08
      回复
  • 夏晴天
    夏晴天
    2018-05-31

    搜索到的蓝牙列表中为什么筛选掉了手机蓝牙设备(只有其他智能蓝牙设备)?使业务逻辑无法进行

    2018-05-31
    赞同 2
    回复 3
    • 备注
      备注
      2018-07-25

      这个问题你解决了吗


      2018-07-25
      回复
    • 夏晴天
      夏晴天
      2018-07-25回复备注

      并没有

      2018-07-25
      回复
    • 备注
      备注
      2018-07-25回复夏晴天

      我的也是只能搜索到一部分,去掉过滤后搜到很多但不能用

      2018-07-25
      回复
  • yuzj
    yuzj
    2019-01-17

    小程序啥时候可以支持蓝牙 广播 功能,   有计划吗

    2019-01-17
    赞同 1
    回复 2
    • 铭
      2022-11-24
      现在可以支持蓝牙广播啊
      2022-11-24
      回复
    • fighting
      fighting
      2023-09-18
      广播功能可以不用连接设备,也可以发送数据给设备可以接收到吗
      2023-09-18
      回复
  • ice
    ice
    2018-05-30

    请问监听的方法和写入的方法是异步进行的嘛,为什么经常不回调监听里的事件

    2018-05-30
    赞同 1
    回复
  • 🍑 🍑
    🍑 🍑
    2023-02-08

    请问外围设备如果想向小程序发送很多条数据,每条数据应该都超过20k,有几十条上百条这样子的话,能进行传输吗?再次重生,是蓝牙设备向小程序传输数据。

    2023-02-08
    赞同
    回复
  • 随心所往
    随心所往
    2021-09-02

    请问支持芯片BK3432的蓝牙吗

    2021-09-02
    赞同
    回复

正在加载...

登录 后发表内容