概述

在Android 4.3 (API level 18)中,Android为我们提供了低功耗蓝牙的支持,最近很火的可穿戴设备的主要通信方式就是低功耗蓝牙。与传统蓝牙相比,其最主要的目的就是更低的功耗用于支持用户使用可穿戴设备,本篇博客主要介绍关于其的基础。

相关术语

Attribute Protocol (ATT):全称 attribute protocol,中文名“属性协议”。它是 BLE 通信的基础。ATT 把数据封装,向外暴露为“属性”,提供“属性”的为服务端,获取“属性”的为客户端。ATT 是专门为低功耗蓝牙设计的,结构非常简单,数据长度很短。

Generic Attribute Profile (GATT):全称 Generic Attribute Profile, 中文名“通用属性配置文件”。它是在ATT 的基础上,对 ATT 进行的进一步逻辑封装,定义数据的交互方式和含义。GATT是我们做 BLE 开发的时候直接接触的概念。

有关上面两个协议可以参看:GATT Profile 简介

Characteristic: 它定义了数值和操作,包含一个Characteristic声明、Characteristic属性、值、值的描述(Optional)。通常我们讲的 BLE 通信,其实就是对 Characteristic 的读写或者订阅通知。比如在实际操作过程中,我对某一个Characteristic进行读,就是获取这个Characteristic的value。

Descriptor:用于描述Characteristic的value。

Service:Service是一系列的Characteristic的集合。Service 是把数据分成一个个的独立逻辑项,它包含一个或者多个 Characteristic。每个 Service 有一个 UUID 唯一标识。 UUID 有 16 bit 的,或者 128 bit 的。16 bit 的 UUID 是官方通过认证的,需要花钱购买,128 bit 是自定义的,这个就可以自己随便设置。

基于GATT连接的方式

外设通过广播自己来让中心设备发现自己,并建立 GATT 连接,从而进行更多的数据交换。这里有且仅有两个角色,发起连接的一方,叫做中心设备—Central,被连接的设备,叫做外设—Peripheral。

  • 外围设备:这一般就是非常小或者简单的低功耗设备,用来提供数据,并连接到一个更加相对强大的中心设备,例如小米手环。
  • 中心设备:中心设备相对比较强大,用来连接其他外围设备,例如手机等。

GATT 连接需要特别注意的是:GATT 连接是独占的。也就是一个 BLE 外设同时只能被一个中心设备连接。一旦外设被连接,它就会马上停止广播,这样它就对其他设备不可见了。当设备断开,它又开始广播。中心设备和外设需要双向通信的话,唯一的方式就是建立 GATT 连接。

GATT 通信的双方是 C/S 关系。外设作为 GATT 服务端(Server),它维持了 ATT 的查找表以及 service 和 characteristic 的定义。中心设备是 GATT 客户端(Client),它向 Server 发起请求。需要注意的是,所有的通信事件,都是由客户端发起,并且接收服务端的响应。

基础使用

定义权限:

如果需要扫描BLE设备。那么还需要拥有定位权限。注:6.0以上需要动态申请定位权限

检查设备是否支持BLE设备(并不是检查是否支持蓝牙)

BluetoothAdapter : 系统蓝牙适配器,通过这个适配器,我们可以使用系统蓝牙

我们还可以使用BluetoothAdapter的静态方法

常用方法

开启蓝牙:通过下面这种方法,设备会弹出选择框让用户选择是否开启蓝牙,然后我们在onActivityResult回调中即可获知是否开启。

蓝牙广播

我们也可以监听BluetoothAdapter.ACTION_STATE_CHANGED广播,可以获取到蓝牙状态改变。

扫描BLE设备

我们可以使用adapter.startLeScan来进行蓝牙扫描,由于扫描蓝牙操作很耗电,所以当我们扫描到需要的设备时,停止扫描,扫描时设置一个超时时间。

说明:上面的回调中,rssi为信号强度指示,最大为0,一般都是负数,比如-50比-70信号要强。

连接BLE设备

在上面扫描的回调中我们能获取到BluetoothDevice,然后我们使用列表展示给用户,当用户选择时,使用下面的方法进行连接,主要关注第三个回调参数。因为我们的主要操作均在回调中完成。

注意:connectGatt方法有一个重载,可以设置通道,所以需要特殊判断版本,参看:FastBlestackoverflow

在下面的回调中我们就能获取到BluetoothGatt对象,这个对象则表示蓝牙设备之间的”连接”,我们可以通过gatt.writeCharacteristic()或gatt.readCharacteristic()等方法去进行通信。

获取GATT notifications

对于我们的app来说,由设备主动通知app信息发生改变是必须的,我们可以使用setCharacteristicNotification来打开Characteristic的通知,并且将描述设置为打开。代码如下

当一个通知到来的时候,onCharacteristicChanged会被回调。

关闭连接

参考链接:

Android BLE开发详解和FastBle源码解析

BLE guide

最后修改日期: 2018年7月12日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。