BLE蓝牙GAP、GATT介绍

随着智能穿戴式设备、智能医疗以及智能家居的普及,蓝牙开发在移动开中显得非常的重要,本文主要讲解下BLE蓝牙4.0在移动开发中的应用。需要注意的一点,BLE蓝牙只能支持Android 4.3以上的系统 (SDK>=18)。
BLE前身是NOKIA开发的Wibree技术,主要用于实现移动智能终端与周边配件之间的持续连接,是功耗极低的短距离无线通信技术,并且有效传输距离被提升到了100米以上,同时只需要一颗纽扣电池就可以工作数年之久,以上诸多技术优势使得BLE的发展前景相当可观。
BLE技术“完成”一次连接( 即扫描其它设备、建立链路、发送数据、认证和适当地结束)只需3ms。而标准蓝牙技术完成相同的连接周期需要数百毫秒。应用BLE蓝牙4.0首先必须了解的两个协议:GAP(通用访问协议)、GATT(通用属性协议)。两个协议都隶属于Host层,直接关系到应用层开发,与BLE开发人员的关系比较密切,其分别负责连接前数据广播和连接后的数据传输。
一、GAP(Generic Access Profile)
GAP(Generic Access Profile)主要用来控制设备连接和广播,GAP 使你的设备被其他设备可见,并决定了你的设备是否可以或者怎样与交互设备进行通讯。GAP层有4种不同类型的广播:通用的、定向的、不可连接的以及可发现的。设备每次广播时,会在3个广播信道上发送相同的报文。这些报文被称为一个广播事件。除了定向报文以外,其他广播事件均可以选择20ms - 10.28s不等的间隔。通常,一个广播中的设备会每一秒广播一次,广播事件之间的时间称为广播间隔,主机可以控制该间隔。例如 Beacon 设备就只是向外广播,不支持连接,小米手环就等设备就可以与中心设备连接。
大部分情况下,外设通过广播自己来让中心设备发现自己,并建立 GATT 连接,从而进行更多的数据交换。也有些情况是不需要连接的,只要外设广播自己的数据即可,用这种方式主要目的是让外围设备,把自己的信息发送给多个中心设备。使用广播这种方式最典型的应用就是苹果的 iBeacon。
二、 GATT(Generic Attribute Profile)
GATT(Generic Attribute Profile)在ATT(Attribute Protocol)的基础上构建,为属性协议传输和存储数据建立了一些通用操作和框架。
GATT 通信的双方是 C/S 关系。外设作为 GATT 服务端(Server),它维护了 ATT 的查找表以及 service 和 characteristic 的定义。中心设备是 GATT 客户端(Client),它向 Server 发起请求。需要注意的是,所有的通信事件,都是由客户端(也叫中心设备,Master)发起,并且接收服务端(也叫外围设备,Slave)的响应。
一旦两个设备建立起了连接,GATT 就开始起作用了,这也意味着,你必需首先完成前面的 GAP 协议。这里需要说明的是,GATT 连接必需先经过 GAP 协议。实际上,我们在 Android 开发中,可以直接使用设备的 MAC 地址,发起连接,可以不经过扫描的步骤。这并不意味不需要经过 GAP,实际上在芯片级别已经给你做好了,蓝牙芯片发起连接,总是先扫描设备,扫描到了才会发起连接。
GATT 事务是建立在嵌套的Profiles, Services 和 Characteristics之上的的,如下图。
BLE蓝牙GAP、GATT介绍_第1张图片

1)Profile Profile 并不是实际存在于 BLE 外设上的,它只是一个被 Bluetooth SIG 或者外设设计者预先定义的 Service 的集合。例如心率Profile(Heart Rate Profile)就是结合了 Heart Rate Service 和 Device Information Service。
2)Service Service 是把数据分成一个个的独立逻辑项,它包含一个或者多个 Characteristic。每个 Service 有一个 UUID 唯一标识。例如Heart Rate Service包含 3 个 Characteristic:Heart Rate Measurement, Body Sensor Location 和 Heart Rate Control Point。
3)Characteristic 在 GATT 事务中的最低界别的是 Characteristic,Characteristic 是最小的逻辑数据单元,当然它可能包含一个组关联的数据,例如加速度计的 X/Y/Z 三轴值。
实际上,和 BLE 外设打交道,主要是通过 Characteristic。你可以从 Characteristic 读取数据,也可以往 Characteristic 写数据。这样就实现了双向的通信。所以你可以自己实现一个类似串口(UART)的 Sevice,这个 Service 中包含两个 Characteristic,一个被配置只读的通道(RX),另一个配置为只写的通道(TX)。

你可能感兴趣的:(android)