蓝牙分为 经典蓝牙 和 低功耗蓝牙 。我们经常使用的蓝牙耳机和蓝牙音箱就属于经典蓝牙。低功耗蓝牙的简称为 BLE(Bluetooth Low Energy),是在蓝牙 4.0中引入的,相比经典蓝牙,其特点是功耗低,连接快,同时正是因为它功耗低,导致它的传输速率低,但它设计出来就是用来传输数据量不大的场景。BLE广泛用在可穿戴设备和物联网中。Android 系统在 4.3 版本开始支持 BLE ,在 Android 5.0 又进行了更新,支持更多的 BLE 功能。
本篇博客内容摘自下面两篇文章:
Introduction to Bluetooth Low Energy
GATT Profile 简介
GAP 是 Generic Access Profile(通用访问配置文件) 的首字母缩写,它控制蓝牙中的连接和广播。 GAP使您的设备对外界可见,并确定两个设备如何(或不能)相互交互。
GAP定义了设备的各种角色,其中有两个关键的角色是 中央设备(Central) 和 外围设备(Peripheral)。
外围设备 是小型,低功耗,资源有限的设备,可以连接到功能更强大的中央设备。 外围设备包括心率监测器,手环等。
中央设备 通常是手机或平板电脑等,具有更强的处理能力和内存。
在 GAP 中,外围设备通过两种方式向外广播数据: Advertising Data Payload(广播数据) 和 Scan Response Data Payload(扫描回复) ,两种数据格式是一样的,包含多达31个字节的数据。广播数据是必需的,因为外设必需不停的向外广播,让中心设备知道它的存在。扫描回复是可选的,中心设备可以向外设请求扫描回复,这里包含一些设备额外的信息,例如设备的名字。
GAP 的广播工作流程如下图:
外围设备将设置一个特定的广播时间间隔,每当此时间间隔过去,它将重新发送它的主要广告数据包。 较长的间隔可以省电,但也导致不容易搜索到设备。
当中心设备监听到这个广播数据时候,会通过发送 Scan Response Request,请求广播方发送扫描响应数据。
大部分情况下,外设通过广播自己来让中心设备发现自己,并建立 GATT 连接,从而进行更多的数据交换。也有些情况是不需要连接的,只要外设广播自己的数据即可。用这种方式主要目的是让外围设备,把自己的信息发送给多个中心设备。因为基于 GATT 连接的方式的,只能是一个外设连接一个中心设备。 使用广播这种方式最典型的应用就是苹果的 iBeacon。广播工作模式下的网络拓扑图如下:
GATT是 Generic Attribute Profile (通用属性配置文件) 的首字母缩写,它定义了两个蓝牙低功耗设备使用称为 Service (服务) 和 Characteristic (特征) 的概念来回传输数据的方式。它使用称为属性协议(ATT)的通用数据协议,该协议用于在一个简单的查找表中存储服务,特征和相关数据,使用表中每个条目的16位ID。
一旦在两个设备之间建立专用连接,GATT就会发挥作用,这意味着您已经完成了由GAP管理的广播流程。
GATT 连接是独占的。也就是一个 BLE 外设同时只能被一个中心设备连接。一旦外设被连接,它就会马上停止广播,这样它就对其他设备不可见了。当设备断开,它又开始广播。
建立 GATT 连接是中心设备和外设双向通信的唯一方式,中央设备可以向外围设备发送有意义的数据,反之亦然。
下图说明了蓝牙低功耗设备在连接环境中的工作方式。 外围设备一次只能连接到一个中央设备,但中央设备可以连接到多个外围设备。
如果需要在两个外围设备之间交换数据,则需要通过中央设备中转。
一旦建立起了连接,通信就是双向的了。对比前面的 GAP 广播的网络拓扑,GAP 通信是单向的。
GATT 通信的双方是 C/S 关系。外设作为 GATT 服务端(Server),它维持了 ATT 的查找表以及 service 和 characteristic 的定义。中心设备是 GATT 客户端(Client),它向 Server 发起请求。
所有通信事务都由主设备GATT客户端启动,后者从从设备GATT服务器接收响应。
一旦连接建立,外设将会给中心设备建议一个连接间隔(Connection Interval),这样,中心设备就会在每个连接间隔尝试去重新连接,检查是否有新的数据。但是,这个连接间隔只是一个建议,你的中心设备可能并不会严格按照这个间隔来执行,例如你的中心设备正在忙于连接其他的外设,或者中心设备资源太忙。
下图说明了外围设备(GATT服务器)和中央设备(GATT客户端)之间的数据交换过程,主设备启动每个事务:
BLE中的GATT事务基于名为Profiles,Services和Characteristics的高级嵌套对象,如下图所示:
Profile 并不是实际存在于 BLE 外设上的,它只是一个被 Bluetooth SIG 或者外设设计者预先定义的Service 的集合。例如心率Profile(Heart Rate Profile)就是结合了 Heart Rate Service 和 Device Information Service 。
Service 是把数据分成一个个的独立逻辑项,它包含一个或者多个 Characteristic。每个 Service 有一个 UUID 唯一标识。 UUID 有 16 bit 的,或者 128 bit 的。16 bit 的 UUID 是官方通过认证的,需要花钱购买,128 bit 是自定义的,这个就可以自己随便设置。
在 GATT 事务中的最低界别的是 Characteristic,Characteristic 是最小的逻辑数据单元,当然它可能包含一个组关联的数据,例如加速度计的 X/Y/Z 三轴值。
与 Service 类似,每个 Characteristic 用 16 bit 或者 128 bit 的 UUID 唯一标识。你可以免费使用 Bluetooth SIG 官方定义的标准 Characteristic,使用官方定义的,可以确保 BLE 的软件和硬件能相互理解。当然,你可以自定义 Characteristic,这样的话,就只有你自己的软件和外设能够相互理解。
与BLE 外设打交道,主要是通过 Characteristic。你可以从 Characteristic 读取数据,也可以往 Characteristic 写数据。这样就实现了双向的通信。所以你可以自己实现一个类似串口(UART)的 Sevice,这个 Service 中包含两个 Characteristic,一个被配置只读的通道(RX),另一个配置为只写的通道(TX)。